Close CRM
Datafly Signal delivers identified events to Close server-to-server using the Close REST API. When a visitor identifies themselves (submits a lead form, requests a demo, or signs up), Signal creates a Lead in Close with a nested Contact carrying their name, email, phone, and title — so marketing-sourced prospects land directly in your sales team’s CRM, with no client-side form integration.
Prerequisites
Before configuring Close in Signal you need a Close account and an API key.
Create an API key
- In Close, go to Settings > Developer > API Keys.
- Click + New API Key, give it a name (e.g. “Datafly Signal”), and create it.
- Copy the key immediately — it is shown once. It looks like
api_xxxxxxxxxxxxxxxxxxxxxxxx.
The API key is scoped to the Close organization it was created in. Use a key for the org whose CRM should receive the leads.
(Optional) Find a Lead Status ID
If you want new web leads to land in a specific stage (e.g. a “Website Lead” status), grab its id:
- In Close, go to Settings > Statuses & Pipelines.
- Note the lead status you want; its id looks like
stat_xxxxxxxxxxxxxxxxxxxxxxxx.
Leave this blank to use your organization’s default lead status.
Configuration
| Field | Required | Description |
|---|---|---|
api_key | Yes | Your Close API key. Used as the HTTP Basic auth username (the password is empty). |
lead_status_id | No | Lead status id to assign to newly created leads (e.g. stat_...). Leave blank for the org default. |
Configure in Signal
- Go to Integrations > Add Integration > Close.
- Choose the Default preset (lead capture).
- Enter your
api_keyand, optionally, yourlead_status_id. - Select your marketing consent category — leads are only created for consenting, identified users.
- Click Save.
API Endpoint
POST https://api.close.com/api/v1/lead/Authentication is HTTP Basic: the API key is the username and the password is empty (Authorization: Basic base64("{api_key}:")). Signal handles this for you.
Identity Signals
Close is a CRM whose purpose is to store the real contact record, so unlike advertising integrations, identity fields are sent in the clear, not hashed — a hashed email is useless to a salesperson.
Lead and contact data come from datafly.identify() traits:
| Trait | Close field | Notes |
|---|---|---|
email | contacts[].emails[].email | Required. Lowercased and trimmed. |
phone | contacts[].phones[].phone | Normalised to E.164 (e.g. +447700900123). |
firstName / lastName | contacts[].name | Joined into the contact’s full name. |
title | contacts[].title | Job title. |
company | name | Lead (company) name. |
The lead name falls back in order: company → last name → email, so a lead is never created nameless.
How to send contact data
Call datafly.identify() when a user submits a form, requests a demo, or signs up:
datafly.identify("user-123", {
email: "jane.doe@acme.com",
phone: "+44 7700 900123",
firstName: "Jane",
lastName: "Doe",
title: "Head of Growth",
company: "Acme Inc"
});Event Mapping
The Default preset captures lead-generating events. All other events are dropped.
| Signal event | Close action |
|---|---|
Lead Submitted | Create lead |
Demo Requested | Create lead |
Signed Up | Create lead |
To customise (add events, map custom fields), edit the integration’s Field Mappings in the Management UI. Close custom fields use the custom.<field_id> key syntax.
Example: Lead Submitted
Datafly.js calls:
datafly.identify("user-123", {
email: "jane.doe@acme.com",
phone: "+44 7700 900123",
firstName: "Jane",
lastName: "Doe",
title: "Head of Growth",
company: "Acme Inc"
});
datafly.track("Lead Submitted", {
lead_type: "Pricing enquiry"
});Close payload sent by Signal:
{
"name": "Acme Inc",
"status_id": "stat_xxxxxxxxxxxxxxxxxxxxxxxx",
"url": "https://example.com/contact",
"description": "Pricing enquiry",
"contacts": [
{
"name": "Jane Doe",
"title": "Head of Growth",
"emails": [{ "email": "jane.doe@acme.com" }],
"phones": [{ "phone": "+447700900123" }]
}
]
}Close responds 200 OK with the created lead, including the generated lead_id and contact_id.
Testing
- Trigger an identify + lead event on your site (or replay one from Signal’s Event Debugger).
- In Close, open Leads and look for the newly created lead.
- Open the lead to confirm the contact’s name, email, phone, and title were captured.
- In Signal’s Event Debugger, confirm the delivery returned
200and inspect the outbound payload.
Only identified events with email present create a lead. Anonymous page views are dropped — Close is a CRM, not an analytics destination.
Troubleshooting
| Problem | Solution |
|---|---|
401 Unauthorized | The API key is wrong or revoked. Generate a new key in Settings > Developer > API Keys. |
403 Forbidden | The key lacks permission for this organization. Use a key from the correct Close org. |
400 Bad Request | The lead is missing a required field (usually name). Ensure an identify call with email precedes the event. |
| No lead created | The event was dropped because no email trait was present, or marketing consent was not granted. Check the Event Debugger. |
| Duplicate leads | Close creates a new lead per request; deduplicate by matching on email in Close, or use Workflows to merge. |
429 Too Many Requests | You exceeded Close’s rate limit. Signal retries automatically and rate-limits delivery; lower throughput if it persists. |
Rate Limits
Close enforces per-second rate limits per endpoint. Signal caps delivery to a conservative sustained rate with a small burst and retries on 429, so most deployments never hit the limit.