Salesloft
Salesloft is a sales engagement platform. Datafly Signal upserts People in Salesloft server-side (POST /v2/person_upserts, keyed on email_address), so inbound leads and sign-ups reach your reps and a repeat visit updates the same person.
Why route Salesloft through Datafly Signal
- Records come from your server, not the browser. They reach Salesloft even when a tracker blocker or a failed page unload would have dropped a client-side call, and no form integration or browser tag is needed.
- Delivery is queued and retried. Signal buffers to Kafka and retries on 429 or a transient failure rather than dropping the event; a permanent rejection goes to the dead-letter queue with the vendor’s reason.
- One consent decision governs every destination. Salesloft is gated by the same consent state as the rest of your stack, so a withdrawal applies everywhere at once.
Get your Salesloft credentials
Create an API key
In Salesloft open Your Applications > API Keys and create a key with People write access. Signal sends it as Authorization: Bearer.
Configuration
| Field | Required | Description |
|---|---|---|
api_key | Yes | Salesloft API key with People (Person Upsert) scope. Generate it in Salesloft under Your Applications > API Keys > Create New. Sent as an Authorization: Bearer header; stored encrypted. |
Management UI setup
- Go to Integrations in the sidebar and open the Integration Library tab.
- Find Salesloft under CRM and click Install.
- Choose a preset, enter the fields above and click Install Integration.
Management API setup
curl -X POST http://localhost:8084/v1/admin/integration-catalog/salesloft/install \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Salesloft",
"variant": "lead_capture",
"config": {
"api_key": "your_api_key"
},
"delivery_mode": "server_side"
}'What Signal sends
An example request, rendered from the lead_capture preset for generate_lead:
POST https://api.salesloft.com/v2/person_upserts
{
"city": "Bath",
"country": "GB",
"email_address": "neill@example.com",
"first_name": "Neill",
"last_name": "Mcfixture",
"person_company_name": "Acme Ltd",
"person_company_website": "https://acme.example",
"phone": "+447700900123",
"state": "Somerset",
"title": "Head of Growth",
"upsert_key": "email_address"
}| Field | Source |
|---|---|
upsert_key | email_address. |
email_address | The email, trimmed and lower-cased. Required: an event without one is not sent. |
first_name, last_name, title, person_company_name, person_company_website | From traits (company, website). |
phone | The phone trait in E.164. |
city, state, country | From the address trait; the country is upper-cased. |
Salesloft upserts the person by email and contacts them directly, and has no hashed identifier, so email, name and phone are sent in plain text to your own Salesloft account.
Presets
| Preset | Signal events |
|---|---|
Lead Capture (lead_capture) | generate_lead, sign_up, identify |
B2B / SaaS (saas) | generate_lead, demo_requested, sign_up, trial_started, identify |
Events not listed are not sent. Each preset is a starting point: add, rename or remove mappings on the installed integration.
Notes and limits
- Tags and custom fields are not sent: the upsert replaces a person’s tags, and custom fields must exist in your team’s settings. Add
custom_fields.<name>mappings on the installed integration for fields you have created.
Consent
Assign the consent category you use for this processing when you install Salesloft, so an event is delivered only when the visitor has granted it. Signal never writes a cookie-banner choice into Salesloft’s contact permissions (do_not_contact, contact_restrictions): consent to cookies is not consent to be emailed, called or messaged. Record communication opt-in and opt-out in Salesloft.
Verify it’s working
- Open the integration in the Signal Management UI and watch Live Events while you trigger a mapped event.
- Confirm a 2xx response from Salesloft.
- Find the record in Salesloft and check it arrived.
Troubleshooting
| Symptom | Resolution |
|---|---|
401 | The API key is wrong or revoked. |
422 | More than one person matches the email (intentional duplicates are enabled), or a value is invalid. |
| Nothing sent for an event | The visitor had no email in identify() traits. |