Outreach
Outreach is a sales engagement platform. Datafly Signal creates prospects in Outreach server-side (REST API v2, JSON:API POST /api/v2/prospects) when a visitor submits a lead form, requests a demo or signs up, so web leads reach sales sequences without a form integration.
Why route Outreach through Datafly Signal
- Records come from your server, not the browser. They reach Outreach 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. Outreach is gated by the same consent state as the rest of your stack, so a withdrawal applies everywhere at once.
Get your Outreach credentials
Create an Outreach app
In the Outreach Developer Portal create an app, open API access and add the prospects.read and prospects.write scopes. Copy the client ID and secret (the secret is shown once).
Get a refresh token
Complete the authorization-code flow once as an Outreach user who can create prospects and keep the refresh token. Outreach has no client-credentials grant for this API; Signal exchanges the refresh token for two-hour access tokens.
Configuration
| Field | Required | Description |
|---|---|---|
client_id | Yes | The Identifier of your Outreach connected application. Create one at the Outreach Developer Portal (developers.outreach.io) and request the prospects.read and prospects.write scopes. |
client_secret | Yes | The Secret of your Outreach connected application. Used together with the refresh token to obtain short-lived access tokens. |
refresh_token | Yes | A long-lived refresh token obtained once via the Outreach authorization_code flow. Outreach does not support client_credentials, so this is required. Signal exchanges it for access tokens automatically. |
Management UI setup
- Go to Integrations in the sidebar and open the Integration Library tab.
- Find Outreach 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/outreach/install \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Outreach",
"variant": "default",
"config": {
"client_id": "your_client_id",
"client_secret": "your_client_secret",
"refresh_token": "your_refresh_token"
},
"delivery_mode": "server_side"
}'What Signal sends
An example request, rendered from the default preset for generate_lead:
POST https://api.outreach.io/api/v2/prospects
{
"data": {
"attributes": {
"addressCity": "Bath",
"addressCountry": "GB",
"addressState": "Somerset",
"addressZip": "BA1 1AA",
"campaignName": "autumn_launch",
"company": "Acme Ltd",
"emails": [
"neill@example.com"
],
"externalId": "0f8fad5b-d9cb-469f-a165-70867728950e",
"firstName": "Neill",
"lastName": "Mcfixture",
"mobilePhones": [
"+447700900123"
],
"source": "google",
"tags": [
"Signal",
"lead"
],
"title": "Head of Growth",
"websiteUrl1": "https://acme.example"
},
"type": "prospect"
}
}| Field | Source |
|---|---|
data.type | prospect. |
data.attributes.emails | The email from identify() traits, trimmed and lower-cased. Required: an event without one is not sent. |
firstName, lastName, title, company | From traits. |
mobilePhones | The phone trait in E.164. |
addressCity, addressState, addressZip, addressCountry | From the address trait (or flat city, state … traits); the country is upper-cased. |
websiteUrl1 | The website trait. |
externalId | Your product user ID. |
source, campaignName | The UTM source and campaign. |
tags | Signal and the event (lead, demo-request, signup, trial, content-download). |
A prospect is a contactable sales record keyed by email, and Outreach has no hashed identifier, so email, name and phone are sent in plain text to your own Outreach instance. name is read-only in the API and is not sent.
Presets
| Preset | Signal events |
|---|---|
Lead Capture (default) | generate_lead, demo_requested, sign_up |
B2B / SaaS (saas) | generate_lead, demo_requested, sign_up, trial_started, content_downloaded |
Events not listed are not sent. Each preset is a starting point: add, rename or remove mappings on the installed integration.
Notes and limits
- The call creates a prospect. Outreach rejects a second prospect with the same email (
422), so a repeat submission from a known prospect is not an update; it is recorded as a permanent failure. - Outreach has no server-side event ingestion API, so page views and product events are not sent.
Consent
Assign the consent category you use for this processing when you install Outreach, so an event is delivered only when the visitor has granted it. Signal never writes a cookie-banner choice into Outreach’s contact permissions (optedOut, emailOptedOut, callOptedOut): consent to cookies is not consent to be emailed, called or messaged. Record communication opt-in and opt-out in Outreach.
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 Outreach.
- Find the record in Outreach and check it arrived.
Troubleshooting
| Symptom | Resolution |
|---|---|
401 | The refresh token has expired or been revoked; authorise the app again. |
403 | The app lacks the prospects.write scope. |
422 | A prospect with this email already exists, or an attribute is invalid. |
| Nothing sent for an event | The visitor had no email in identify() traits. |