---
title: "How to create custom fields on Account and Lead from HG custom Objects"
slug: "how-to-create-custom-fields-on-account-and-lead-from-hg-custom-objects"
updated: 2026-03-06T19:34:22Z
published: 2026-03-06T19:34:22Z
---

> ## Documentation Index
> Fetch the complete documentation index at: https://help.madkudu.com/llms.txt
> Use this file to discover all available pages before exploring further.

# How to create custom fields on Account and Lead from HG custom Objects

When you activate the **CRM enrichment capability** of the Salesforce integration, HG Insights populates three objects in your Salesforce org:

- **HG Technographic**
- **HG Firmographic**
- **HG IT Spend**

These objects are**linked to your Account and Lead**records via lookup fields.

By default, this data lives on the HG objects and is displayed through Visualforce components. But you’ll often want to surface key data points directly on the Account or Lead record itself - for example, a checkbox showing whether an account uses a specific product, or a field showing total IT spend.

This guide walks through the most common patterns, starting with no-code (Flow) approaches and including Apex alternatives for teams that need more control.

---

## Before You Start

- **Confirm your HG package version (CRM enrichemt).**
  - Go to **Setup** > **Installed Packages**and find “**HG** **Insights**.” Some fields (like Global HQ firmographics) require package version 1.10+.
- **Verify HG fields exist on your Account/Lead objects.** The HG package adds four fields to both Account and Lead that manage matching and enrichment. You should see these fields on your records:

| Field Label | API Name | Type | Purpose |
| --- | --- | --- | --- |
| HG Id | `HG_Insights__HG_Id__c` | Text(255) | Links the record to HG’s company database |
| HG Match Status | `HG_Insights__HG_Match_Status__c` | Text(100), External ID | Shows whether HG has matched this record (e.g., “Matched”) |
| HG Matched Date | `HG_Insights__HG_Matched_Date__c` | Date | When HG matched this record |
| HG Enrich Status | `HG_Insights__HG_Enrich_Status__c` | Picklist | Controls whether HG enriches this record with data |

If these fields aren’t populated, your HG integration may not be set up yet. The custom fields you build below depend on HG data being matched and flowing into your org.

- **Identify your use case** from the table below so you can jump to the right section.

| # | Use Case | Example | Recommended Approach |
| --- | --- | --- | --- |
| 1 | **Checkbox** - does this account/lead have a specific product? | “Uses Salesforce” = true | Flow (simplest) |
| 2 | **Rollup list** - show all installed products as a text list | “Installed Products” = “Salesforce; SAP; Oracle” | Flow or Apex |
| 3 | **Count** - how many products are installed? | “Product Install Count” = 12 | Flow (rollup) |
| 4 | **Spend amount** - surface IT spend on the parent record | “Total IT Spend” = $2,400,000 | Flow or Formula |
| 5 | **Formula field** - reference HG data from related records | Show employee range from Firmographic | Formula |

- **Choose your approach: Flow or Apex?** Each use case below includes both a Flow (no-code) approach and an Apex (code) approach.

|  | Flow (No Code) | Apex (Code) |
| --- | --- | --- |
| **Best for** | Most orgs. Admins can build and maintain these without developer help. | - Orgs with very large data volumes (100k+ technographic records) - or when you need to populate many fields at once. |
| **Who can do it** | Any Salesforce Admin | **Requires a Salesforce Developer or Admin with Apex experience.** |
| **Where it lives** | Built visually in Setup > Flows | Written as Apex Classes in Setup > Developer Console (or deployed via VS Code with Salesforce Extensions) |
| **Limitations** | **Can hit collection limits on** accounts with hundreds of product installs. Scheduled Flows help avoid this. | Requires deployment to production via a change set or CI/CD pipeline, and needs test classes for code coverage. |

---

## Step 1: Create Your Custom Field on Account or Lead

No matter which use case you’re building, you first need a custom field on the target object.

1. In Salesforce, go to **Setup > Object Manager > Account** (or **Lead**).
2. Click **Fields & Relationships > New**.
3. Choose the field type based on your use case:

| Use Case | Field Type | ***Example*** Field Label | ***Example*** API Name |
| --- | --- | --- | --- |
| Checkbox | Checkbox | Uses Salesforce | `Uses_Salesforce__c` |
| Rollup list | Text Area (Long) | Installed Products | `Installed_Products__c` |
| Count | Number | Product Install Count | `Product_Install_Count__c` |
| Spend amount | Currency | Total IT Spend | `Total_IT_Spend__c` |

1. Set field-level security so the right profiles can see it.
2. Add the field to your page layout.

---

## Use Case 1: Checkbox - “Does This Account Use [Product]?”

**Goal:** A checkbox on the Account (or Lead) that is `true` when a specific product appears in the account’s HG Technographic records.

### Flow Approach (No Code)

**Create a Record-Triggered Flow:**

1. In Salesforce, go to **Setup > Flows > New Flow > Record-Triggered Flow**.
2. Configure the trigger:
  - **Object:** `HG Technographic` (`HG_Insights__HGTechnographic__c`)
  - **Trigger:** A record is created or updated
  - **Entry Conditions:**
    - `HG_Insights__Product__c` **Equals**`Salesforce` (or your target product)
3. Add an **Update Records** element:
  - **Record:** The Account related to this technographic record
  - **How to Find:** Use `{!$Record.HG_Insights__Account__c}` to get the Account ID
  - **Field:** `Uses_Salesforce__c` = `true`
4. Save and activate.

**Handle deletions (unchecking when product is removed):**

1. Create a second Record-Triggered Flow on `HG Technographic`, triggered on **delete**.
2. Add a **Get Records** element to check if any *other* technographic records still exist for that product on the same Account.
3. If no records remain, update the Account checkbox to `false`.

**For Lead records:** Duplicate the Flow, but reference `HG_Insights__Lead__c` instead of `HG_Insights__Account__c`.

### Apex Approach (Advanced)

Use a batch class if you have a large volume of records or want to set checkboxes for multiple products at once.

```plaintext
public class PopulateProductCheckboxesBatch implements Database.Batchable<SObject> {

    public Database.QueryLocator start(Database.BatchableContext bc) {
        return Database.getQueryLocator([
            SELECT Id, Uses_Salesforce__c, Uses_AWS__c
            FROM Account
            WHERE Id IN (
                SELECT HG_Insights__Account__c
                FROM HG_Insights__HGTechnographic__c
            )
        ]);
    }

    public void execute(Database.BatchableContext bc, List<Account> accounts) {
        Set<Id> accountIds = new Set<Id>();
        for (Account a : accounts) {
            accountIds.add(a.Id);
        }

        // Get all technographic records for these accounts
        Map<Id, Set<String>> accountProducts = new Map<Id, Set<String>>();
        for (HG_Insights__HGTechnographic__c tech : [
            SELECT HG_Insights__Account__c, HG_Insights__Product__c
            FROM HG_Insights__HGTechnographic__c
            WHERE HG_Insights__Account__c IN :accountIds
        ]) {
            if (!accountProducts.containsKey(tech.HG_Insights__Account__c)) {
                accountProducts.put(tech.HG_Insights__Account__c, new Set<String>());
            }
            accountProducts.get(tech.HG_Insights__Account__c).add(tech.HG_Insights__Product__c);
        }

        // Set checkboxes
        for (Account a : accounts) {
            Set<String> products = accountProducts.get(a.Id);
            a.Uses_Salesforce__c = (products != null && products.contains('Salesforce'));
            a.Uses_AWS__c = (products != null && products.contains('Amazon Web Services'));
        }

        update accounts;
    }

    public void finish(Database.BatchableContext bc) {}
}
```

**To run manually:** Open Developer Console > Debug > Open Execute Anonymous Window (Cmd+E / Ctrl+E), then run:

```plaintext
Database.executeBatch(new PopulateProductCheckboxesBatch(), 200);
```

**To schedule (recommended):**

```plaintext
// Run daily at 2 AM
String cronExp = '0 0 2 * * ?';
System.schedule('HG Product Checkboxes', cronExp, new PopulateProductCheckboxesBatchScheduler());
```

---

## Use Case 2: Rollup List - All Installed Products as Text

**Goal:** A text field on Account showing all installed products separated by semicolons. Example: `Salesforce; SAP SD; Amazon Web Services; Slack`

### Flow Approach (No Code)

Salesforce Flows don’t natively concatenate child records into a single text field. You have two options:

**Option A: Use a Flow with a Loop**

1. Create a **Record-Triggered Flow** on `Account` (or a **Scheduled Flow** that runs nightly).
2. Add a **Get Records** element to retrieve all `HG Technographic` records where `HG_Insights__Account__c` = the Account ID.
3. Add a **Loop** element over those records.
4. Inside the loop, use an **Assignment** element to append `{!LoopVariable.HG_Insights__Product__c} ;` to a text variable.
5. After the loop, use an **Update Records** element to set `Installed_Products__c` to the concatenated text variable.

**Option B: Use a Scheduled Flow (recommended for large data volumes)**

Same logic as Option A, but triggered on a schedule (e.g., nightly) rather than on record changes. This avoids hitting Flow limits during large data loads.

### Apex Approach (Advanced)

```plaintext
public class PopulateInstalledProductsBatch implements Database.Batchable<SObject> {

    public Database.QueryLocator start(Database.BatchableContext bc) {
        return Database.getQueryLocator([
            SELECT Id, Installed_Products__c
            FROM Account
            WHERE Id IN (
                SELECT HG_Insights__Account__c
                FROM HG_Insights__HGTechnographic__c
            )
        ]);
    }

    public void execute(Database.BatchableContext bc, List<Account> accounts) {
        Set<Id> accountIds = new Set<Id>();
        for (Account a : accounts) {
            accountIds.add(a.Id);
        }

        Map<Id, List<String>> accountProducts = new Map<Id, List<String>>();
        for (HG_Insights__HGTechnographic__c tech : [
            SELECT HG_Insights__Account__c, HG_Insights__Product__c
            FROM HG_Insights__HGTechnographic__c
            WHERE HG_Insights__Account__c IN :accountIds
            ORDER BY HG_Insights__Product__c ASC
        ]) {
            if (!accountProducts.containsKey(tech.HG_Insights__Account__c)) {
                accountProducts.put(tech.HG_Insights__Account__c, new List<String>());
            }
            accountProducts.get(tech.HG_Insights__Account__c).add(tech.HG_Insights__Product__c);
        }

        for (Account a : accounts) {
            List<String> products = accountProducts.get(a.Id);
            a.Installed_Products__c = (products != null) ? String.join(products, '; ') : '';
        }

        update accounts;
    }

    public void finish(Database.BatchableContext bc) {}
}
```

---

## Use Case 3: Count of Installed Products

**Goal:** A number field showing how many products are installed for an account.

### Flow Approach (No Code)

1. Create a **Record-Triggered Flow** on `HG Technographic`, triggered on create and delete.
2. Add a **Get Records** element to retrieve all `HG Technographic` records for the same Account.
3. Use the **Count** of the Get Records result.
4. **Update Records:** Set `Product_Install_Count__c` on the Account to the count value.

### Alternative: Roll-Up Summary (if using Master-Detail)

If your org has converted the Account lookup to a Master-Detail relationship (not default), you can use a native Roll-Up Summary field instead of a Flow.

---

## Use Case 4: Surface IT Spend on Account

**Goal:** Show total IT spend directly on the Account record.

### Flow Approach (No Code)

1. Create a **Record-Triggered Flow** on `HG IT Spend`, triggered on create, update, and delete.
2. Add a **Get Records** element: all `HG IT Spend` records where `HG_Insights__Account__c` = the related Account.
3. Add a **Loop** with an **Assignment** to sum `HG_Insights__Spend_Category_Amount__c`.
4. **Update Records:** Set `Total_IT_Spend__c` on the Account to the sum.

**For a specific spend category only**, add a filter condition: - `HG_Insights__SpendDetailSpendCatName__c`**Equals** `Application Software` (or your target category)

---

## Use Case 5: Formula Fields

Formula fields are the simplest option when you only need data from the **first** related HG record (e.g., one Firmographic record per Account).

**Example: Show employee range from Firmographic on Account**

This only works if each Account has a single Firmographic record. Formula fields cannot aggregate across multiple child records.

For this pattern, it’s simpler to use a Flow that copies the value: 1. **Record-Triggered Flow** on `HG Firmographic`, triggered on create/update. 2. **Update Records:** Set `HG_Employee_Range__c` on the Account to `{!$Record.HG_Insights__EmployeesRange__c}`.

---

## Tips and Gotchas

- **Long Text Area limits:** If you’re building a rollup list (Use Case 2), use a Long Text Area field. Standard Text fields max out at 255 characters, which many accounts will exceed.
- **HG data refreshes:** HG data updates nightly. If you use Flows triggered on record changes, your custom fields will stay in sync automatically. If you use scheduled Flows or Apex batches, they only update on their schedule.
- **Testing:** After building your Flow or deploying Apex, pick a few Accounts you know have HG data and verify the fields populate correctly. Check the HG Visualforce component on the Account to cross-reference.
- **Running Apex batches manually:** Developer Console > Debug > Open Execute Anonymous Window, then: `Database.executeBatch(new YourBatchClassName(), 200);`
