CRM Integrations
Push form submissions directly into Salesforce, HubSpot, and Dynamics 365 to automate your sales pipeline.
CRM integrations connect your Buildorado workflows to your sales and customer relationship platforms. When a lead fills out a form, Buildorado can instantly create a contact, lead, or opportunity in your CRM without any manual data entry. This ensures every lead is captured the moment it arrives and your sales team can act on it immediately. All CRM integrations authenticate via OAuth 2.0 and store credentials with AES-256 encryption through AWS KMS.
Salesforce (Coming Soon)
Salesforce is the most widely used CRM platform. The Buildorado integration will let you create leads, contacts, and opportunities directly from workflow actions. This integration is currently in development and will be available in an upcoming release.
Setting Up Salesforce
- Navigate to Settings > Integrations in your Buildorado dashboard.
- Find Salesforce and click Connect.
- A Salesforce authorization popup appears. Sign in with your Salesforce account.
- Grant the following OAuth scopes:
api-- Access Salesforce data through APIsrefresh_token-- Allow Buildorado to maintain the connection
- Once authorized, Salesforce shows as Connected with your Salesforce organization name.
You can connect Salesforce sandbox environments for testing by selecting the sandbox login URL during authorization.
Operations
createLead
Create a new lead record in Salesforce.
| Field | Type | Required | Description |
|---|---|---|---|
firstName | string | No | Lead's first name |
lastName | string | Yes | Lead's last name (required by Salesforce) |
email | string | No | Lead's email address |
company | string | Yes | Company name (required by Salesforce) |
phone | string | No | Phone number |
title | string | No | Job title |
Output:
| Field | Type | Description |
|---|---|---|
id | string | The Salesforce record ID of the newly created lead |
success | boolean | Whether the operation succeeded |
createContact
Create a new contact record in Salesforce.
| Field | Type | Required | Description |
|---|---|---|---|
firstName | string | No | Contact's first name |
lastName | string | Yes | Contact's last name |
email | string | No | Email address |
accountId | string | No | Associate with an existing Salesforce account |
phone | string | No | Phone number |
Output:
| Field | Type | Description |
|---|---|---|
id | string | The Salesforce record ID of the newly created contact |
success | boolean | Whether the operation succeeded |
createOpportunity
Create a new opportunity in the Salesforce sales pipeline.
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Opportunity name |
stageName | string | Yes | Pipeline stage (e.g., Prospecting) |
closeDate | string | Yes | Expected close date in YYYY-MM-DD format |
amount | number | No | Deal value in the organization's currency |
accountId | string | No | Associated Salesforce account ID |
Output:
| Field | Type | Description |
|---|---|---|
id | string | The Salesforce record ID of the newly created opportunity |
success | boolean | Whether the operation succeeded |
Field Mapping Example
Map form fields to Salesforce lead fields in your workflow:
Form Field Salesforce Field
------ ------
{{form.firstName}} -- firstName
{{form.lastName}} -- lastName
{{form.email}} -- email
{{form.company}} -- company
{{form.phone}} -- phone
{{form.jobTitle}} -- titleRate Limits
| Limit | Value |
|---|---|
| Sustained rate | 100 requests per minute |
| Burst limit | 10 requests per second |
Salesforce enforces daily API call limits based on your Salesforce edition. Buildorado counts against these limits. Check your Salesforce API usage in Setup > System Overview to ensure you have sufficient capacity.
Tips for Salesforce
- Map the Salesforce record ID output to downstream nodes. For example, after creating a lead, you can reference
{{salesforce_1.id}}in a Slack notification. - For custom fields on your Salesforce objects, use the API field name (e.g.,
Custom_Score__c) rather than the display label. - Connect a sandbox account during development and switch to production when you publish the workflow.
HubSpot (Coming Soon)
HubSpot is a popular CRM and marketing platform. The Buildorado integration will let you create and update contacts and deals in your HubSpot account. This integration is currently in development and will be available in an upcoming release.
Setting Up HubSpot
- Navigate to Settings > Integrations and click Connect next to HubSpot.
- Sign in with your HubSpot account in the authorization popup.
- Select the HubSpot portal you want to connect.
- Grant the following OAuth scopes:
crm.objects.contacts.write-- Create and update contactscrm.objects.contacts.read-- Read contact datacrm.objects.companies.write-- Create and update companiescrm.objects.deals.write-- Create and update deals
- Once authorized, HubSpot shows as Connected with your portal name.
Operations
createContact
Create a new contact in HubSpot.
| Field | Type | Required | Description |
|---|---|---|---|
email | string | Yes | Contact email address (used as unique identifier) |
firstName | string | No | First name |
lastName | string | No | Last name |
phone | string | No | Phone number |
company | string | No | Company name |
Output:
| Field | Type | Description |
|---|---|---|
id | string | The HubSpot contact ID |
email | string | The contact's email address |
updateContact
Update an existing contact's properties.
| Field | Type | Required | Description |
|---|---|---|---|
contactId | string | Yes | HubSpot contact ID to update |
email | string | No | Updated email address |
firstName | string | No | Updated first name |
lastName | string | No | Updated last name |
phone | string | No | Updated phone number |
Output:
| Field | Type | Description |
|---|---|---|
id | string | The HubSpot contact ID |
createDeal
Create a new deal in the HubSpot sales pipeline.
| Field | Type | Required | Description |
|---|---|---|---|
dealName | string | Yes | Name of the deal |
amount | number | No | Deal value |
stage | string | No | Stage ID within the pipeline |
closeDate | string | No | Expected close date in YYYY-MM-DD format |
Output:
| Field | Type | Description |
|---|---|---|
id | string | The HubSpot deal ID |
dealName | string | The deal name |
Field Mapping Example
Form Field HubSpot Field
------ ------
{{form.email}} -- email
{{form.firstName}} -- firstName
{{form.lastName}} -- lastName
{{form.company}} -- company
{{form.phone}} -- phoneCommon Pattern: Create Contact Then Deal
A typical CRM workflow creates the contact first, then uses the returned contact ID to create an associated deal:
[Form: Sales Inquiry]
-- [HubSpot: createContact]
email: {{form.email}}
firstName: {{form.firstName}}
lastName: {{form.lastName}}
-- [HubSpot: createDeal]
dealName: "{{form.company}} - {{form.product}}"
amount: {{form.budget}}Tips for HubSpot
- HubSpot uses email as the unique identifier for contacts. If a contact with the same email already exists, the createContact operation returns the existing contact rather than creating a duplicate.
- Custom properties must be created in HubSpot first. Use the property's internal name (e.g.,
custom_score) in the field mapping. - HubSpot free CRM has no API rate limits for most operations. Paid tiers have higher throughput allowances.
Dynamics 365
Microsoft Dynamics 365 is an enterprise CRM platform. The Buildorado integration connects through Microsoft OAuth and supports creating and listing contacts and accounts.
Setting Up Dynamics 365
- Navigate to Settings > Integrations and click Connect next to Dynamics 365.
- Sign in with your Microsoft 365 account that has access to Dynamics 365.
- Select the Dynamics 365 organization (environment) you want to connect.
- Grant the requested API permissions. The following scopes are required:
User.Read-- Read your profileoffline_access-- Allow Buildorado to maintain the connection- Dynamics CRM API access
- Once authorized, Dynamics 365 shows as Connected.
Operations
createContact
Create a new contact record in Dynamics 365.
| Field | Type | Required | Description |
|---|---|---|---|
orgUrl | string | Yes | Dynamics 365 organization URL (e.g., https://yourorg.crm.dynamics.com) |
firstname | string | No | Contact's first name |
lastname | string | Yes | Contact's last name |
emailaddress1 | string | No | Email address |
telephone1 | string | No | Phone number |
jobtitle | string | No | Job title |
company | string | No | Company name |
Output:
| Field | Type | Description |
|---|---|---|
contactid | string | The Dynamics 365 contact ID |
fullname | string | The contact's full name |
emailaddress1 | string | The contact's email address |
listContacts
Retrieve a list of contacts from Dynamics 365.
| Field | Type | Required | Description |
|---|---|---|---|
orgUrl | string | Yes | Dynamics 365 organization URL |
top | number | No | Maximum number of contacts to return |
filter | string | No | OData filter expression |
Output:
| Field | Type | Description |
|---|---|---|
contacts | string | Contacts as JSON |
listAccounts
Retrieve a list of accounts from Dynamics 365.
| Field | Type | Required | Description |
|---|---|---|---|
orgUrl | string | Yes | Dynamics 365 organization URL |
top | number | No | Maximum number of accounts to return |
filter | string | No | OData filter expression |
Output:
| Field | Type | Description |
|---|---|---|
accounts | string | Accounts as JSON |
Field Mapping
Dynamics 365 uses its own field naming conventions. Common mappings:
| Form Field | Dynamics 365 Field | Entity |
|---|---|---|
| First Name | firstname | Contact |
| Last Name | lastname | Contact |
emailaddress1 | Contact | |
| Phone | telephone1 | Contact |
| Job Title | jobtitle | Contact |
| Company | company | Contact |
Tips for Dynamics 365
- Dynamics 365 requires an active license for the user whose account is used for the integration. A Dynamics 365 Sales or Customer Service license is sufficient.
- Custom entities and fields are supported. Use the logical name (lowercase, no spaces) of the entity and field.
- The
orgUrlfield is required for every operation. This is your Dynamics 365 organization URL (e.g.,https://yourorg.crm.dynamics.com). - Admin consent may be required. Work with your Microsoft 365 administrator to approve the Buildorado application.
Best Practices for CRM Integrations
Deduplication
HubSpot uses email as the unique key for contacts. Salesforce does not deduplicate by default, so consider adding a branch node to check for existing records before creating new ones, or configure Salesforce duplicate rules in your org.
Error Handling
CRM API calls can fail due to validation errors (missing required fields), permission issues, or rate limits. Attach an error handler node to your CRM action to catch failures:
[CRM: createLead]
-- success -- [Slack: "Lead created: {{salesforce_1.id}}"]
-- error -- [Email: "CRM sync failed for {{form.email}}"]Data Validation Before CRM Push
Use conditional logic to validate data before sending it to your CRM. For example, ensure the email field is not empty and the company name is provided:
[Form: Lead Capture]
-- Branch: email is not empty AND company is not empty
-- true -- [Salesforce: createLead]
-- false -- [Email: "Incomplete submission from {{form.email}}"]Using CRM Output in Downstream Actions
Every CRM operation returns output variables (record IDs, success status) that you can use in subsequent nodes:
[Salesforce: createLead]
-- [Slack: "New lead {{salesforce_1.id}} created for {{form.company}}"]
-- [Email: Send welcome to {{form.email}}]
-- [Google Sheets: Log row with record ID {{salesforce_1.id}}]