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

  1. In Close, go to Settings > Developer > API Keys.
  2. Click + New API Key, give it a name (e.g. “Datafly Signal”), and create it.
  3. 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:

  1. In Close, go to Settings > Statuses & Pipelines.
  2. Note the lead status you want; its id looks like stat_xxxxxxxxxxxxxxxxxxxxxxxx.

Leave this blank to use your organization’s default lead status.

Configuration

FieldRequiredDescription
api_keyYesYour Close API key. Used as the HTTP Basic auth username (the password is empty).
lead_status_idNoLead status id to assign to newly created leads (e.g. stat_...). Leave blank for the org default.

Configure in Signal

  1. Go to Integrations > Add Integration > Close.
  2. Choose the Default preset (lead capture).
  3. Enter your api_key and, optionally, your lead_status_id.
  4. Select your marketing consent category — leads are only created for consenting, identified users.
  5. 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:

TraitClose fieldNotes
emailcontacts[].emails[].emailRequired. Lowercased and trimmed.
phonecontacts[].phones[].phoneNormalised to E.164 (e.g. +447700900123).
firstName / lastNamecontacts[].nameJoined into the contact’s full name.
titlecontacts[].titleJob title.
companynameLead (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 eventClose action
Lead SubmittedCreate lead
Demo RequestedCreate lead
Signed UpCreate 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

  1. Trigger an identify + lead event on your site (or replay one from Signal’s Event Debugger).
  2. In Close, open Leads and look for the newly created lead.
  3. Open the lead to confirm the contact’s name, email, phone, and title were captured.
  4. In Signal’s Event Debugger, confirm the delivery returned 200 and 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

ProblemSolution
401 UnauthorizedThe API key is wrong or revoked. Generate a new key in Settings > Developer > API Keys.
403 ForbiddenThe key lacks permission for this organization. Use a key from the correct Close org.
400 Bad RequestThe lead is missing a required field (usually name). Ensure an identify call with email precedes the event.
No lead createdThe event was dropped because no email trait was present, or marketing consent was not granted. Check the Event Debugger.
Duplicate leadsClose creates a new lead per request; deduplicate by matching on email in Close, or use Workflows to merge.
429 Too Many RequestsYou 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.