> ## Knowledge Base Index
> Fetch the complete knowledge base index at: https://help.pipelaunch.com/sitemap.xml
> Use this file to discover available pages before exploring further.
> Pure-Markdown content can be obtained by appending a '.md' suffix to the content URLs listed in the sitemap (without the trailing slash).

# Enrich Agent - Installation and Usage Guide

## Overview

PipeLaunch Enrich Agent is a modular Salesforce package that enables you to parse and store enriched profile data (Person and Company profiles) from PipeLaunch's data enrichment services. The architecture follows a **Core + Addons** design, allowing you to install only the components you need.

![](https://storage.crisp.chat/users/helpdesk/website/-/3/4/8/a/348acba567d60c00/image_1zi5it.png)


## Installation

### Prerequisites

* Salesforce Production or Sandbox org
* System Administrator access
* Knowledge of which data structure you want to use (standard Enrich Agent objects or integration with existing packages)

### Installation Links

To receive installation links for the Enrich Agent packages, please contact our team:

**📧 Email**: support@pipelaunch.com

In your request, please specify:

* Which addons you're interested in (see Available Addons below)
* Your use case (Person enrichment, Company enrichment, or both)

Our team will provide you with the appropriate installation URLs for your needs.

### Installation Steps

1. **Install Core Package First**

    * Click the installation link provided by our team
    * Choose "Install for All Users" (recommended) or select specific profiles
    * Approve third-party access to be able to load profile pictures from the PipeLaunch API
    * Wait for installation to complete

2. **Install Addon Package(s)**

    * After Core is installed, install your chosen addon(s)
    * Follow the same installation process as Core
    * Each addon depends on Core and cannot be installed independently

3. **Assign Permission Set**
    * Navigate to **Setup → Permission Sets**
    * Find and open the **Enrich Agent** permission set
    * Click **Manage Assignments**
    * Add users who need to create/edit enriched data

## Core Package

### What's Included in Core

The Core package provides the foundation for all enrichment operations:

#### JSON Parsing & Data Structures

* **PersonProfileWrapper**: Parses Person Profile JSON from PipeLaunch
* **CompanyProfileWrapper**: Parses Company Profile JSON from PipeLaunch
* **Address, Email, Phone, and other wrappers**: Handle nested data structures

#### Request/Response Models

* **EnrichmentRecordCreationRequest**: Standardized input for record creation
* **EnrichmentRecordCreationResponse**: Standardized output with success/error info
* **EnrichmentFlowJsonRequest**: Flow-friendly input model
* **EnrichmentFlowCreateResponse**: Flow-friendly output model

#### Matching Services

* **CompanyMatchingService**: Find existing Account/Company records based on name, website, LinkedIn URL, etc.
* **CompanyMatchingFlowAction**: Flow-accessible company matching

### Core Permission Sets

#### Enrich Agent

**Purpose**: Full access for users who need to create and manage enriched data

**Grants Access To**:

* Create, read, update, delete enriched profile records
* Execute all Flow Actions
* Use all invocable methods

#### Enrich Agent Data Viewer

**Purpose**: Read-only access for users who only need to view enriched data

**Grants Access To**:

* Read enriched profile records
* View related data (education, employment, skills, etc.)
* No create/edit/delete permissions

## Available Addons

### Person Profile Addon

**Purpose**: Standard implementation for storing Person Profile data in custom Enrich Agent objects

**Custom Objects Created**:

* `EnrichAgentPersonProfile__c` - Main profile record
* `EnrichAgentPersonProfileEducation__c` - Education history
* `EnrichAgentPersonProfileExperience__c` - Employment history
* `EnrichAgentPersonProfileLanguage__c` - Languages spoken
* `EnrichAgentPersonProfileSkill__c` - Skills with endorsements

**Best For**:

* Organizations without existing ATS or recruiting packages
* Need for flexible custom profile data structure
* Want to track detailed endorsements and skills

**Flow Action Available**: ✅ `Create PersonProfile Records from JSON`

---

### Seven20 Addon

**Purpose**: Integration with Seven20 ATS (Applicant Tracking System) managed package

**Uses Existing Seven20 Objects**:

* `seven20__Employment_History__c` - Maps to experience data
* `seven20__Education_History__c` - Maps to education data
* Links to `seven20__Contact__c` records

**Requirements**:

* Seven20 package must be installed in your org
* Contact records must exist in Seven20 structure

**Best For**:

* Organizations already using Seven20 ATS
* Want to enrich existing candidate/contact records
* Need to maintain Seven20 data relationships

**Flow Action Available**: ✅ `Create Seven20 Records from PersonProfile JSON`

---

### Company Profile Addon

**Purpose**: Standard implementation for storing Company Profile data in custom Enrich Agent objects

**Custom Objects Created**:

* `EnrichAgentCompanyProfile__c` - Main company profile
* `EnrichAgentCompanyProfileAddress__c` - Company addresses
* Additional company-specific fields

**Best For**:

* Organizations tracking detailed company data
* Account enrichment workflows
* Lead routing based on company attributes

---

### Education Cloud Addon

**Purpose**: Integration with Salesforce Education Cloud

---

### Target Recruit Addon

**Purpose**: Integration with Target Recruit ATS

## Using Invocable Flow Actions

Enrich Agent provides Flow Actions that allow you to create enriched records directly from Salesforce Flows without writing code.

### Available Flow Actions

#### 1. Create PersonProfile Records from JSON

**Addon**: Person Profile
**Category**: Enrich Agent - Person Profile

**Use Case**: Parse PipeLaunch Person Profile JSON and create records in `EnrichAgentPersonProfile__c` and related objects.

**Input Variables**:

* `jsonData` (Text, Required) - The Person Profile JSON string from PipeLaunch
* `relatedContactId` (Text, Optional) - Salesforce Contact ID to link the profile to
* `relatedAccountId` (Text, Optional) - Salesforce Account ID to link the profile to
* `relatedLeadId` (Text, Optional) - Salesforce Lead ID to link the profile to
* `optionsJson` (Text, Optional) - Configuration options (see Options section below)

**Output Variables**:

* `isSuccess` (Boolean) - True if records were created successfully
* `enrichmentRecordId` (Text) - ID of the created EnrichAgentPersonProfile__c record
* `errorMessage` (Text) - Error details if isSuccess is false
* `summary` (Text) - Human-readable summary of the operation

**Example Flow**:

```
1. Get JSON from PipeLaunch API (or Platform Event)
2. Action: Create PersonProfile Records from JSON
   - jsonData: {!JsonFromAPI}
   - relatedContactId: {!Contact.Id}
   - optionsJson: {"PersonProfileRecordCreator":{"disableSkillCreation":false}}
3. Decision: Check {!isSuccess}
   - True: Update Contact with enrichmentRecordId
   - False: Send email with errorMessage
```

---

#### 2. Create Seven20 Records from PersonProfile JSON

**Addon**: Seven20
**Category**: Enrich Agent - Seven20

**Use Case**: Parse PipeLaunch Person Profile JSON and create records in Seven20 objects (`seven20__Employment_History__c`, `seven20__Education_History__c`).

**Input Variables**:

* `jsonData` (Text, Required) - The Person Profile JSON string from PipeLaunch
* `relatedContactId` (Text, Required) - Seven20 Contact ID
* `optionsJson` (Text, Optional) - Configuration options

**Output Variables**:

* `isSuccess` (Boolean) - True if records were created successfully
* `errorMessage` (Text) - Error details if isSuccess is false
* `summary` (Text) - Human-readable summary of the operation
* `enrichmentRecordId` (Text) - Always null (Seven20 doesn't create a main profile record)

**Example Flow**:

```
1. Get JSON from PipeLaunch API
2. Action: Create Seven20 Records from PersonProfile JSON
   - jsonData: {!JsonFromAPI}
   - relatedContactId: {!Seven20Contact.Id}
3. Decision: Check {!isSuccess}
   - True: Log success
   - False: Create task for manual review
```

---

#### 3. Enrich Agent: Find Matching Company (BETA)

**Package**: Core
**Category**: Enrichment

**Use Case**: Find existing Account or custom company records based on company name, website, LinkedIn URL, or domain before creating duplicates.

**Input Variables**:

* `companyName` (Text) - Company name to search for
* `website` (Text) - Company website URL
* `linkedinUrl` (Text) - Full LinkedIn company URL
* `linkedinId` (Text) - LinkedIn company ID
* `linkedinSlug` (Text) - LinkedIn company slug
* `domain` (Text) - Company domain (e.g., "pipelaunch.com")
* `objectName` (Text, Default: "Account") - Object to search (Account or custom object API name)
* `fieldMappingJson` (Text, Optional) - Custom field mapping JSON
* `recordTypeIds` (Text, Optional) - Comma-separated Record Type IDs to filter by

**Output Variables**:

* `matchesCount` (Number) - Total number of matches found
* `bestMatchId` (Text) - Record ID of the best match
* `bestMatchScore` (Number) - Confidence score (0-100)
* `bestMatchMessage` (Text) - Explanation of why this was the best match
* `matchIds` (Text) - Comma-separated list of all matching record IDs

**Example Flow**:

```
1. Get company data from enrichment source
2. Action: Find Matching Company
   - companyName: {!CompanyName}
   - website: {!Website}
   - objectName: "Account"
3. Decision: Check {!matchesCount} > 0
   - True: Update existing Account {!bestMatchId}
   - False: Create new Account
```

## Configuration Options (optionsJson)

Options allow you to control record creation behavior. Pass options as a JSON string to the `optionsJson` parameter.

### Person Profile Options

#### PersonProfileRecordCreator Options

Control the standard Person Profile addon behavior:

```json
{
    "PersonProfileRecordCreator": {
        "isDisabled": false,
        "duplicationBehavior": "AVOID_DUPLICATES",
        "disableCompanyMatching": false,
        "disableEducationCreation": false,
        "disableExperienceCreation": false,
        "disableLanguageCreation": false,
        "disableSkillCreation": false
    }
}
```

**Options Explained**:

* `isDisabled` - Skip this creator entirely (useful when using multiple addons)
* `duplicationBehavior` - "AVOID_DUPLICATES" (default) or "CREATE_DUPLICATES"
* `disableCompanyMatching` - Don't try to match employment/education to existing Accounts
* `disableEducationCreation` - Don't create education records
* `disableExperienceCreation` - Don't create employment records
* `disableLanguageCreation` - Don't create language records
* `disableSkillCreation` - Don't create skill records

**Example: Create Only Main Profile (No Related Records)**

```json
{
    "PersonProfileRecordCreator": {
        "disableEducationCreation": true,
        "disableExperienceCreation": true,
        "disableLanguageCreation": true,
        "disableSkillCreation": true
    }
}
```

**Example: Allow Duplicate Records**

```json
{
    "PersonProfileRecordCreator": {
        "duplicationBehavior": "CREATE_DUPLICATES"
    }
}
```

#### Seven20PersonProfileRecordCreator Options

Control the Seven20 addon behavior:

```json
{
    "Seven20PersonProfileRecordCreator": {
        "isDisabled": false,
        "duplicationBehavior": "AVOID_DUPLICATES"
    }
}
```

#### Combined Options

You can configure multiple creators at once:

```json
{
    "PersonProfileRecordCreator": {
        "disableSkillCreation": true
    },
    "Seven20PersonProfileRecordCreator": {
        "duplicationBehavior": "CREATE_DUPLICATES"
    }
}
```

## Working from Signals Logs

PipeLaunch Signals can trigger enrichment events that your Salesforce org receives via Platform Events or API callbacks. Here's how to build a Flow that processes these signals.

### Scenario: Person Profile Enrichment from Signal

**Setup**:

1. PipeLaunch Signals detects a new LinkedIn profile visit
2. Signals enriches the profile and sends JSON to your Salesforce org
3. Your Flow receives the data and creates records

### Flow Design Pattern

```
START: Platform Event Received (or Record-Triggered Flow)
│
├─ Get Variables
│  ├─ JSON Data from Signal
│  ├─ Contact/Lead ID (if known)
│  └─ Signal Type
│
├─ Decision: Is this a Person Profile Signal?
│  │
│  ├─ YES:
│  │  ├─ Action: Create PersonProfile Records from JSON
│  │  │  └─ Input: jsonData, relatedContactId, optionsJson
│  │  │
│  │  ├─ Decision: Was Creation Successful?
│  │  │  ├─ YES:
│  │  │  │  ├─ Update Contact/Lead with enrichmentRecordId
│  │  │  │  └─ Log success to custom object
│  │  │  └─ NO:
│  │  │     ├─ Create Task for manual review
│  │  │     └─ Send email notification
│  │  │
│  │  └─ END
│  │
│  └─ NO: Check other signal types
│
END
```

### Example: Auto-Enrichment Flow

**Trigger**: When a Lead or Contact is created with a LinkedIn URL

**Steps**:

1. Record-Triggered Flow on Lead/Contact (After Save)
2. Criteria: LinkedIn URL is not blank AND Enrich Agent Profile lookup is blank
3. Call PipeLaunch API (via HTTP Callout or middleware)
4. Get enriched JSON response
5. Action: Create PersonProfile Records from JSON
    * jsonData: {!APIResponse}
    * relatedContactId: {!$Record.Id}
6. Update {!$Record} with the enrichmentRecordId
7. Post Chatter message to record owner

### Example: Batch Enrichment from Signals Log

If you maintain a custom object to log incoming Signals:

**Object**: `Signal_Log__c`
**Fields**:

* `JSON_Data__c` (Long Text Area)
* `Contact__c` (Lookup)
* `Status__c` (Picklist: Pending, Processed, Failed)

**Flow**: Scheduled Flow (runs daily)

1. Get Records: Signal_Log__c WHERE Status = Pending
2. Loop through records
3. For each record:
    * Action: Create PersonProfile Records from JSON
    * Decision on success:
        * Update Status = Processed
        * Or Status = Failed with error message
4. Send summary email to admin

## Best Practices

### 1. Test in Sandbox First

Always test your Flows and enrichment processes in a Sandbox before deploying to Production.

### 2. Use Duplicate Prevention

Unless you have a specific reason to create duplicates, always use `"duplicationBehavior": "AVOID_DUPLICATES"` (the default).

### 3. Selective Record Creation

If you don't need all related records (skills, languages, etc.), disable their creation to reduce API limits and storage:

```json
{
    "PersonProfileRecordCreator": {
        "disableLanguageCreation": true,
        "disableSkillCreation": true
    }
}
```

### 4. Company Matching

Use the **Find Matching Company** action BEFORE creating employment/education records to ensure proper Account linkage.

### 5. Error Handling

Always check `isSuccess` in your Flow and handle failures gracefully:

* Create tasks for manual review
* Log errors to a custom object
* Send notifications to administrators

### 6. Permission Set Assignment

* Assign **Enrich Agent** permission set only to users who need to create data
* Use **Enrich Agent Data Viewer** for reporting users
* Automated processes (Flow, Apex) run in system context and don't need permission sets

### 7. Monitor API Limits

Enrichment creates multiple records per operation. Monitor your org's:

* DML statements
* SOQL queries
* API calls (if calling external enrichment services)

## Troubleshooting

### "Failed to parse JSON"

**Cause**: The JSON string is invalid or doesn't match the expected PersonProfileWrapper structure.

**Solution**:

* Validate JSON format using a JSON validator
* Check that the JSON comes from PipeLaunch in the correct format
* Review error message for specific parsing issues

### "No matching company found"

**Cause**: Company matching couldn't find an existing Account/Company record.

**Solution**:

* Verify the company name/website in the JSON
* Check that matching criteria are not too strict
* Create the company record first, then re-run enrichment

### "FLS Error" or "Insufficient Privileges"

**Cause**: User or automated process lacks field-level or object-level permissions.

**Solution**:

* Ensure **Enrich Agent** permission set is assigned
* For Flows, confirm the Flow runs in System Mode or user has proper access
* Check Field-Level Security on custom objects

### Records Created in Wrong Addon

**Cause**: Multiple addons installed and wrong Flow Action used.

**Solution**:

* Use **Create PersonProfile Records** for standard Enrich Agent objects
* Use **Create Seven20 Records** for Seven20 integration
* Check the Flow Action category to confirm correct addon

## Support

For questions, issues, or feature requests:

📧 **Email**: support@pipelaunch.com

Please include:

* Your Salesforce org ID
* Installed package versions
* Description of the issue
* Any error messages or screenshots
* Example JSON (with sensitive data redacted)

## Additional Resources

* [PipeLaunch Website](https://pipelaunch.com)

---

**Version**: 1.0
**Last Updated**: November 2025
**Document Owner**: PipeLaunch Support Team
