contact/create
Create a new Contact record in Salesforce, optionally linked to an Account.
When to Use
- Create a contact when a prospect fills out a form and is linked to an existing account.
- Add a new stakeholder to an account during account expansion or renewal discussions.
- Sync contacts from an email marketing provider when a new subscriber confirms opt-in.
- Create a contact record when a business card is scanned at a conference.
- Add a contact after confirming webinar attendance and linking to the attendee's employer account.
Configuration
Connection
| Field | Type | Required | Description |
InstanceUrl | string | required | Salesforce org URL. |
AccessToken | string | required | Valid OAuth2 access token. |
Operation Fields
| Field | Type | Required | Description |
LastName | string | required | Contact's last name. |
FirstName | string | optional | Contact's first name. |
AccountId | string | optional | Salesforce Account ID to link this contact to. |
Email | string | optional | Email address. |
Phone | string | optional | Office phone number. |
MobilePhone | string | optional | Mobile phone number. |
Title | string | optional | Job title. |
Department | string | optional | Department within the company. |
MailingStreet | string | optional | Mailing street address. |
MailingCity | string | optional | Mailing city. |
MailingState | string | optional | Mailing state or province. |
MailingPostalCode | string | optional | Mailing postal code. |
MailingCountry | string | optional | Mailing country. |
Description | string | optional | Free-text notes. |
OwnerId | string | optional | Salesforce User ID to assign as contact owner. |
Sample Configuration
{
"Resource": "contact",
"Operation": "create",
"InstanceUrl": "https://myorg.my.salesforce.com",
"AccessToken": "{{credentials.salesforce.accessToken}}",
"FirstName": "Alex",
"LastName": "Rivera",
"AccountId": "{{nodes.CreateAccount.accountId}}",
"Email": "alex.rivera@acme.com",
"Phone": "+1-555-0300",
"Title": "Director of Procurement",
"Department": "Finance"
}
Validation Errors
| Error Code | Condition |
CFG_MISSING_INSTANCE | InstanceUrl is missing. |
CFG_MISSING_TOKEN | AccessToken is missing. |
VAL_MISSING_FIELD | LastName is missing. |
UNEXPECTED_ERROR | Unexpected exception during execution. |
Output
Success Port
| Field | Type | Description |
contactId | string | 18-character Salesforce Contact ID. |
createdAt | string | ISO 8601 creation timestamp. |
status | string | Always created. |
resource | string | Always contact. |
operation | string | Always create. |
Error Port
| Field | Type | Description |
errorCode | string | Machine-readable error code. |
message | string | Human-readable error description. |
Sample Output
{
"contactId": "0035g000006LmnOPQ",
"createdAt": "2026-05-26T11:30:00.000Z",
"status": "created",
"resource": "contact",
"operation": "create"
}
Expression Reference
| Expression | Description |
{{nodes.CreateContact.contactId}} | The new Contact's Salesforce ID. |
{{nodes.CreateContact.createdAt}} | Creation timestamp. |
{{nodes.CreateContact.errorCode}} | Error code from error port. |
Node Policies & GuardRails
| Policy | Detail |
| Credential storage | Store AccessToken in BizFirst Credentials Manager. |
| Account linkage | Always provide AccountId when the contact belongs to a known account. Orphaned contacts (no account) are valid but harder to manage at scale. |
| Duplicate prevention | Check for existing contacts by email via SOQL before creating to avoid duplicates. |
| Error port wiring | Always wire the error port. Duplicate rules and validation rules can block creation. |
| Sandbox testing | Test in sandbox before running in production. |
Examples
Create Contact from Form Submission
{
"FirstName": "{{trigger.firstName}}",
"LastName": "{{trigger.lastName}}",
"Email": "{{trigger.email}}",
"AccountId": "{{nodes.FindAccount.records[0].Id}}"
}
Add Stakeholder During Account Expansion
{
"FirstName": "{{trigger.contactFirst}}",
"LastName": "{{trigger.contactLast}}",
"Title": "{{trigger.title}}",
"AccountId": "{{trigger.accountId}}",
"Department": "{{trigger.department}}"
}
Sync Confirmed Webinar Attendees
// Loop over attendee list
{
"FirstName": "{{loop.current.firstName}}",
"LastName": "{{loop.current.lastName}}",
"Email": "{{loop.current.email}}",
"AccountId": "{{loop.current.resolvedAccountId}}",
"Description": "Webinar: {{variables.webinarName}} on {{variables.webinarDate}}"
}