# Custom object

## Creating a digital twin of your CRM

Kernel integrates with Salesforce to keep your account data clean, enriched, and up-to-date.

You can choose whether Kernel syncs directly into your Salesforce Account records or into a dedicated custom object (`Kernel_Account__c`) that Kernel manages.

For the Custom objects, Kernel provides an unlocked package, which provides the Kernel object and associated [Kernel fields](/kernel-fields.md) out of the box.

{% hint style="info" %}
See [Salesforce integration](/integrations/salesforce-integration.md) for general information about Kernel's Salesforce integration.
{% endhint %}

By default, Kernel recommends the custom object approach, as it ensures Kernel owns the enrichment and cleaning process while maintaining a 1:1 mapping between your Accounts and Kernel-managed objects. This provides maximum flexibility and minimizes risk to your production Salesforce data.

For [corporate hierarchies](/concepts/corporate-hierarchies.md), we also create `Kernel_Account__c` records that you can turn into objects and link together. This way, you can have full hierarchy coverage while ensuring your CRM is clean.

## Custom Object

### Overview

Kernel integrates with Salesforce to keep your account data clean, enriched, and up-to-date. You can choose whether Kernel syncs directly into your Salesforce Account records or into a dedicated custom object (Kernel\_Account\_\_c) that Kernel manages.

By default, we recommend the custom object approach, as it ensures Kernel owns the enrichment and cleaning process while maintaining a 1:1 mapping between your Accounts and Kernel-managed records. This provides maximum flexibility and minimizes risk to your production Salesforce data.

For hierarchies we would also be creating `Kernel_Account__c` records that you can turn into `Account` and link together. This way, you can have full hierarchy coverage while ensuring your CRM is clean.

***

## 1. Reading from Salesforce

* Kernel connects to your Salesforce instance via an integration as configured per the Salesforce Integration documentation.
* Account records (with selected fields and filters) are read into Kernel’s platform.
* This data is then prepared for enrichment, cleaning, and deduplication.

## 2. Processing in Kernel

* Kernel applies enrichment (e.g., adding missing firmographic data, hierarchy modeling).
* Cleaning rules are applied to the standard fields.
* Duplicate records are flagged and grouped for review.

## 3. Writing Back to Salesforce

* Kernel writes updates back into Salesforce at a specified cadence.
* By default, the updates flow into the `Kernel_Account__c`.
* Optionally, you can configure Kernel to write directly into the Account records if that better fits your workflow.

<figure><img src="/files/i4b3qgKBb2sDtaBP9u41" alt=""><figcaption></figcaption></figure>

***

### The Custom Object (`Kernel_Account__c`)

When enabled, Kernel creates and maintains a custom object in your Salesforce org with the following properties:

* Object Name: `Kernel_Account__c`
* Relationship: Each `Kernel_Account__c` record is linked 1:1 with a Salesforce Account via a reference field (Account\_\_c).
* Data Stored:
  * All account attributes are copied to the record.
  * All Kernel-enriched fields (hierarchies, cleaned attributes, deduplication tags) are written here.
* Deduplication Support: Duplicates are linked via `Kernel_Duplicate_Account__c` (lookup to the primary) and classified by `Kernel_Duplicate_Type__c`.
* Hierarchy Modeling: Parent/child links are maintained on `Kernel_Account__c` via the parent and ultimate parent field groups.

See the full field list in the [Custom Object Reference](#custom-object-reference) section below.

### Hierarchy Handling

Kernel builds and maintains account hierarchies inside Kernel\_Account\_\_c.

* Missing parent or child nodes can be automatically created and synced as records of Kernel\_Account\_\_c. You can choose how to then create those in turn inside your CRM as accounts.

<br>

***

### Cleaning and Deduplication

* Cleaning data is stored in Kernel\_Account\_\_c.
* Duplicate groups are flagged so your team can merge or review them.
* Customers with merge permissions can take action directly in Salesforce.
* Alternatively, Kernel can provide merge lists for manual processing.

***

### Configuration Options

* Default Mode: Sync to Kernel\_Account\_\_c (recommended).
* Direct Mode: Write directly into Salesforce Accounts (optional, configurable).
* Future Extensions: Leads can be supported through a similar custom object (KernelLead\_\_c).

***

### Benefits of the Custom Object Approach

* Safe: Keeps Kernel enrichment separate from your core Account records.
* Flexible: Configure whether to use Accounts or custom objects per your needs.
* Transparent: Clear audit trail of which fields came from Kernel vs. Salesforce.

## Custom Object Reference

<table data-full-width="true"><thead><tr><th>Category</th><th>Field Label</th><th>Salesforce Name</th><th>Type</th><th>Length</th><th>Help Text</th></tr></thead><tbody><tr><td>Identity</td><td>KERN ID</td><td>Kernel_ID__c</td><td>Text</td><td>255</td><td>Unique Kernel identifier for this account</td></tr><tr><td>Identity</td><td>Kernel - Legal name (Reasoning)</td><td>Kernel_Legal_Name_Reasoning__c</td><td>Text Area (Long)</td><td>10000</td><td>Why Kernel chose this legal name</td></tr><tr><td>Identity</td><td>Kernel - Legal name</td><td>Kernel_Legal_Name__c</td><td>Text</td><td>255</td><td>Registered legal name of the entity</td></tr><tr><td>Identity</td><td>Kernel - LinkedIn URL</td><td>Kernel_Linkedin_Url__c</td><td>URL</td><td>255</td><td>LinkedIn company page URL</td></tr><tr><td>Identity</td><td>Kernel - Tracked</td><td>Kernel_Tracked__c</td><td>Checkbox</td><td>-</td><td>Whether Kernel will auto-refresh this account</td></tr><tr><td>Identity</td><td>Kernel - Website</td><td>Kernel_Website__c</td><td>URL</td><td>255</td><td>Primary website URL for the entity</td></tr><tr><td>Identity</td><td>Linked Account</td><td>Linked_Account_Field__c</td><td>Lookup (Account)</td><td>18</td><td>Lookup to the linked standard Account record</td></tr><tr><td>Firmographics</td><td>Kernel - Address</td><td>Kernel_Address__c</td><td>Text</td><td>255</td><td>HQ street address</td></tr><tr><td>Firmographics</td><td>Kernel - City</td><td>Kernel_City__c</td><td>Text</td><td>255</td><td>HQ city</td></tr><tr><td>Firmographics</td><td>Kernel - Country of incorporation</td><td>Kernel_Country_Of_Incorporation__c</td><td>Text</td><td>255</td><td>Country where the entity is legally registered</td></tr><tr><td>Firmographics</td><td>Kernel - Country</td><td>Kernel_Country__c</td><td>Text</td><td>255</td><td>HQ country</td></tr><tr><td>Firmographics</td><td>Kernel - Headcount (Confidence)</td><td>Kernel_Headcount_Confidence__c</td><td>Text</td><td>255</td><td>Headcount estimate confidence: LOW, MEDIUM, or HIGH</td></tr><tr><td>Firmographics</td><td>Kernel - Headcount (Reasoning)</td><td>Kernel_Headcount_Reasoning__c</td><td>Text Area (Long)</td><td>10000</td><td>Why Kernel estimated this headcount</td></tr><tr><td>Firmographics</td><td>Kernel - Headcount</td><td>Kernel_Headcount__c</td><td>Number</td><td>18</td><td>Estimated total employee headcount</td></tr><tr><td>Firmographics</td><td>Kernel - Location (Reasoning)</td><td>Kernel_Location_Reasoning__c</td><td>Text Area (Long)</td><td>10000</td><td>Why Kernel chose this HQ location</td></tr><tr><td>Firmographics</td><td>Kernel - Revenue (Reasoning)</td><td>Kernel_Revenue_Reasoning__c</td><td>Text Area (Long)</td><td>10000</td><td>Why Kernel estimated this revenue</td></tr><tr><td>Firmographics</td><td>Kernel - Revenue</td><td>Kernel_Revenue__c</td><td>Number</td><td>18,2</td><td>Estimated annual revenue in USD</td></tr><tr><td>Firmographics</td><td>Kernel - State</td><td>Kernel_State__c</td><td>Text</td><td>255</td><td>HQ state or province</td></tr><tr><td>Entity classification</td><td>Kernel - Entity category</td><td>Kernel_Entity_Category__c</td><td>Text</td><td>255</td><td>Entity type: Company, Government, Education, etc.</td></tr><tr><td>Entity classification</td><td>Kernel - Entity match (Confidence)</td><td>Kernel_Entity_Match_Confidence__c</td><td>Text</td><td>255</td><td>Entity match confidence: HIGH, MEDIUM, or LOW</td></tr><tr><td>Entity classification</td><td>Kernel - Entity match (Reasoning)</td><td>Kernel_Entity_Match_Reasoning__c</td><td>Text Area (Long)</td><td>10000</td><td>Why Kernel matched this entity to this identity</td></tr><tr><td>Entity classification</td><td>Kernel - Regional scope (Reasoning)</td><td>Kernel_Entity_Regional_Scope_Reason__c</td><td>Text Area (Long)</td><td>10000</td><td>Why Kernel flagged this as regional or not</td></tr><tr><td>Entity classification</td><td>Kernel - Regional subsidiary</td><td>Kernel_Entity_Regional_Scope__c</td><td>Checkbox</td><td>-</td><td>Whether this entity is a regional subsidiary</td></tr><tr><td>Entity classification</td><td>Kernel - Entity sub-category</td><td>Kernel_Entity_Sub_Category__c</td><td>Text</td><td>255</td><td>Entity sub-type within the main category</td></tr><tr><td>Entity classification</td><td>Kernel - Operational status (Reasoning)</td><td>Kernel_Operational_Status_Reasoning__c</td><td>Text Area (Long)</td><td>10000</td><td>Why Kernel assigned this operational status</td></tr><tr><td>Entity classification</td><td>Kernel - Operational status</td><td>Kernel_Operational_Status__c</td><td>Text</td><td>255</td><td>Operating status: Active, Out of Business, or Absorbed</td></tr><tr><td>Entity classification</td><td>Kernel - Regional scope</td><td>Kernel_Regional_Scope__c</td><td>Text</td><td>255</td><td>Region or country this subsidiary operates in</td></tr><tr><td>Vertical</td><td>Kernel - Main vertical (Reasoning)</td><td>Kernel_Main_Vertical_Reasoning__c</td><td>Text Area (Long)</td><td>10000</td><td>Why Kernel assigned this vertical</td></tr><tr><td>Vertical</td><td>Kernel - Main vertical</td><td>Kernel_Main_Vertical__c</td><td>Text Area</td><td>255</td><td>Industry vertical per your custom schema</td></tr><tr><td>Vertical</td><td>Kernel - Sub-vertical (Reasoning)</td><td>Kernel_Sub_Vertical_Reasoning__c</td><td>Text Area (Long)</td><td>10000</td><td>Why Kernel assigned this sub-vertical</td></tr><tr><td>Vertical</td><td>Kernel - Sub-vertical</td><td>Kernel_Sub_Vertical__c</td><td>Text Area</td><td>255</td><td>Industry sub-vertical per your custom schema</td></tr><tr><td>Risk</td><td>Kernel - Risk score</td><td>Kernel_Risk_Score__c</td><td>Number</td><td>18,2</td><td>Numeric risk score for acting on this account</td></tr><tr><td>Risk</td><td>Kernel - Risk tier</td><td>Kernel_Risk_Tier__c</td><td>Text</td><td>255</td><td>Risk tier derived from the risk score</td></tr><tr><td>Parent hierarchy</td><td>Kernel - Parent (Confidence)</td><td>Kernel_Parent_Confidence__c</td><td>Text</td><td>255</td><td>Parent identification confidence: HIGH, MEDIUM, or LOW</td></tr><tr><td>Parent hierarchy</td><td>Kernel - Parent country of incorporation</td><td>Kernel_Parent_Country_Incorp__c</td><td>Text</td><td>255</td><td>Country where the parent is legally registered</td></tr><tr><td>Parent hierarchy</td><td>Kernel - Parent entity category</td><td>Kernel_Parent_Entity_Category__c</td><td>Text</td><td>255</td><td>Parent entity type: Company, Education, Government, etc.</td></tr><tr><td>Parent hierarchy</td><td>Kernel - Parent entity sub-category</td><td>Kernel_Parent_Entity_Sub_Category__c</td><td>Text</td><td>255</td><td>Parent entity sub-type</td></tr><tr><td>Parent hierarchy</td><td>Kernel - Parent KERN ID</td><td>Kernel_Parent_Kern_Id__c</td><td>Text</td><td>255</td><td>Kernel ID of the immediate parent entity</td></tr><tr><td>Parent hierarchy</td><td>Kernel - Parent legal name</td><td>Kernel_Parent_Legal_Name__c</td><td>Text</td><td>255</td><td>Legal name of the immediate parent</td></tr><tr><td>Parent hierarchy</td><td>Kernel - Parent (Reasoning)</td><td>Kernel_Parent_Reasoning__c</td><td>Text Area (Long)</td><td>10000</td><td>Why Kernel identified this parent</td></tr><tr><td>Parent hierarchy</td><td>Kernel - Parent trading name</td><td>Kernel_Parent_Trading_Name__c</td><td>Text</td><td>255</td><td>Trading name of the immediate parent</td></tr><tr><td>Parent hierarchy</td><td>Kernel - Parent website</td><td>Kernel_Parent_Website__c</td><td>URL</td><td>255</td><td>Website of the immediate parent</td></tr><tr><td>Ultimate parent</td><td>Kernel - Top Parent Account ID</td><td>Kernel_Top_Parent_Account_Id__c</td><td>Text</td><td>255</td><td>Kernel ID of the ultimate parent in the corporate hierarchy. Used as the grouping key for hierarchy queries and as the BUILDING sentinel during async processing.</td></tr><tr><td>Ultimate parent</td><td>Kernel - Ultimate parent incorp. country</td><td>Kernel_Ult_Parent_Country_Incorp__c</td><td>Text</td><td>255</td><td>Country where the top-level parent is registered (ISO code)</td></tr><tr><td>Ultimate parent</td><td>Kernel - Ultimate parent account</td><td>Kernel_Ultimate_Parent_Account__c</td><td>Lookup (Account)</td><td>18</td><td>Lookup to the top-level parent account record</td></tr><tr><td>Ultimate parent</td><td>Kernel - Ultimate parent KERN ID</td><td>Kernel_Ultimate_Parent_Kern_Id__c</td><td>Text</td><td>255</td><td>Kernel ID of the top-level parent</td></tr><tr><td>Ultimate parent</td><td>Kernel - Ultimate parent legal name</td><td>Kernel_Ultimate_Parent_Legal_Name__c</td><td>Text</td><td>255</td><td>Legal name of the top-level parent</td></tr><tr><td>Ultimate parent</td><td>Kernel - Ultimate parent name</td><td>Kernel_Ultimate_Parent_Name__c</td><td>Text</td><td>255</td><td>Name of the top-level parent in the system</td></tr><tr><td>Ultimate parent</td><td>Kernel - Ultimate parent trading name</td><td>Kernel_Ultimate_Parent_Trading_Name__c</td><td>Text</td><td>255</td><td>Trading name of the top-level parent</td></tr><tr><td>Ultimate parent</td><td>Kernel - Ultimate parent URL</td><td>Kernel_Ultimate_Parent_Url__c</td><td>URL</td><td>255</td><td>Website of the top-level parent</td></tr><tr><td>Dedupe &#x26; cleaning</td><td>Kernel - Cleaning action (Reasoning)</td><td>Kernel_Cleaning_Action_Reasoning__c</td><td>Text Area (Long)</td><td>10000</td><td>Why Kernel recommended this cleanup action</td></tr><tr><td>Dedupe &#x26; cleaning</td><td>Kernel - Cleaning action</td><td>Kernel_Cleaning_Action__c</td><td>Text</td><td>255</td><td>Recommended data cleanup action</td></tr><tr><td>Dedupe &#x26; cleaning</td><td>Kernel - Duplicate account (Reasoning)</td><td>Kernel_Duplicate_Account_Reasoning__c</td><td>Text Area (Long)</td><td>10000</td><td>Why Kernel flagged this as a duplicate</td></tr><tr><td>Dedupe &#x26; cleaning</td><td>Kernel - Duplicate account</td><td>Kernel_Duplicate_Account__c</td><td>Lookup (Account)</td><td>18</td><td>Lookup to the primary account this is a duplicate of</td></tr><tr><td>Dedupe &#x26; cleaning</td><td>Kernel - Duplicate type</td><td>Kernel_Duplicate_Type__c</td><td>Text</td><td>255</td><td>Duplicate classification: PRIMARY, EXACT, REGIONAL, SUBDOMAIN, or POTENTIAL</td></tr></tbody></table>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.kernel.ai/custom-object.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
