Outreach
Datafly Signal delivers identified events to Outreach server-to-server, creating Prospect records from your website and product activity. Marketing- and product-sourced leads flow straight into your sales team’s sequences with no client-side form integration.
Outreach is a sales-engagement CRM, not an analytics or conversions platform. This integration writes prospects — it captures identified leads (form fills, sign-ups, demo requests). Anonymous page views and the e-commerce funnel are intentionally not sent, because Outreach has no event-ingestion API.
Prerequisites
Before configuring Outreach in Signal, you need an Outreach account with admin access and a connected OAuth application.
Step 1: Create an Outreach Connected Application
- Sign in to the Outreach Developer Portal.
- Go to My Apps and click Create New App.
- Give the app a name (e.g. “Datafly Signal”).
- Under OAuth, set a Redirect URI you control (used once to mint the refresh token).
- Under Scopes, enable:
prospects.readprospects.write
- Save the app and note the Identifier (client ID) and Secret (client secret).
Step 2: Obtain a Refresh Token
Outreach does not support the client_credentials grant, so you authorise the app once via the authorization_code flow and store the resulting refresh token.
Authorise the app
Open this URL in a browser (replace the placeholders), sign in as an Outreach user, and approve:
https://api.outreach.io/oauth/authorize?client_id=YOUR_CLIENT_ID&redirect_uri=YOUR_REDIRECT_URI&response_type=code&scope=prospects.read+prospects.writeOutreach redirects back to your redirect URI with a code query parameter.
Exchange the code for tokens
curl -X POST https://api.outreach.io/oauth/token \
-d client_id=YOUR_CLIENT_ID \
-d client_secret=YOUR_CLIENT_SECRET \
-d redirect_uri=YOUR_REDIRECT_URI \
-d grant_type=authorization_code \
-d code=THE_CODEThe response contains an access_token, a refresh_token, and expires_in: 7200. Save the refresh_token — Signal uses it to mint fresh access tokens automatically.
The authorization code is single-use and expires within minutes. If the exchange fails, repeat the authorise step to get a new code.
Configure in Signal
Configuration Fields
| Field | Required | Description |
|---|---|---|
client_id | Yes | Your connected app’s Identifier (OAuth client ID). |
client_secret | Yes | Your connected app’s Secret (OAuth client secret). |
refresh_token | Yes | The refresh token from the authorization_code exchange above. |
Setup
- Go to Integrations > Add Integration > Outreach.
- Choose the Lead Capture preset.
- Enter your
client_id,client_secret, andrefresh_token. - Select the consent categories that should gate delivery (typically
marketing). Signal only forwards events from consenting, identified users. - Click Save.
API Endpoint
POST https://api.outreach.io/api/v2/prospects
Authorization: Bearer {access_token}
Content-Type: application/vnd.api+jsonSignal exchanges your refresh token for a short-lived access token and sends it in the Authorization header. The request body is a JSON:API document. The application/vnd.api+json media type is required — Outreach rejects requests without it.
Identity Signals
Outreach is a first-party CRM that stores the real, contactable prospect. Identity data is sent in the clear (not hashed) — the email address is Outreach’s dedupe key, and a hashed value would be unusable to a salesperson.
| Signal | Outreach attribute | Notes |
|---|---|---|
email | emails[] | Required. Trimmed and lower-cased. Outreach dedupes prospects on email. |
firstName / lastName | firstName, lastName | From identify() traits. |
name | name | Full name. |
phone | mobilePhones[] | Normalised to E.164. |
title | title, occupation | Job title. |
company | company | Account/company name. |
city / state / country | addressCity, addressState, addressCountry | Location traits. |
How to send identity data
Call datafly.identify() when a user submits a form, signs up, or requests a demo, then track() the event:
datafly.identify("user-123", {
email: "jane.doe@acme.com",
firstName: "Jane",
lastName: "Doe",
company: "Acme Inc",
title: "Head of Growth",
phone: "+44 7700 900123",
city: "London",
country: "GB"
});Event Mapping
Only identity-bearing events create prospects. Every other event is dropped (defaults.action: drop).
Lead Capture preset
| Signal event | Outreach action | Tag applied |
|---|---|---|
Lead Submitted | Create prospect | Signal, lead |
Form Submitted | Create prospect | Signal, form |
Signed Up | Create prospect | Signal, signup |
Demo Requested | Create prospect | Signal, demo-request |
Example: Demo Requested
Datafly.js call:
datafly.identify("user-123", {
email: "jane.doe@acme.com",
firstName: "Jane",
lastName: "Doe",
company: "Acme Inc",
title: "Head of Growth",
phone: "+44 7700 900123"
});
datafly.track("Demo Requested");Outreach payload sent by Signal:
{
"data": {
"type": "prospect",
"attributes": {
"emails": ["jane.doe@acme.com"],
"firstName": "Jane",
"lastName": "Doe",
"name": "Jane Doe",
"title": "Head of Growth",
"occupation": "Head of Growth",
"company": "Acme Inc",
"mobilePhones": ["+447700900123"],
"tags": ["Signal", "demo-request"]
}
}
}Outreach responds with the created prospect, including its assigned id, createdAt, and the echoed attributes.
Testing Your Integration
- Trigger a tracked event on your site (e.g. submit a demo-request form) as an identified, consenting user.
- In Outreach, go to Prospects and search for the email address you used.
- The new prospect should appear within seconds, carrying the name, company, phone, and
Signaltag. - Use Signal’s Event Debugger to inspect the exact JSON:API document sent and the Outreach response code.
Troubleshooting
| Problem | Solution |
|---|---|
415 Unsupported Media Type | The Content-Type: application/vnd.api+json header is missing. Signal sets this automatically; if you see it, check for a proxy stripping the header. |
401 Unauthorized | The access token is invalid or expired. Confirm the refresh_token, client_id, and client_secret are correct and the refresh token has not been revoked. |
403 Forbidden | The connected app lacks the prospects.write scope. Re-authorise with both prospects.read and prospects.write. |
422 Unprocessable Entity | A validation error — usually an unknown attribute or an invalid value. Review the mapped fields in the Event Debugger. |
| Prospect not created, no error | The event was dropped. Confirm the event name is one of the mapped events and that the user is identified (an email trait is required) and consented. |
| Duplicate prospects | Outreach dedupes on email; ensure the same lower-cased email is sent each time. |
Rate Limits
Outreach enforces a per-token request ceiling (surfaced via X-RateLimit-* response headers). Signal applies a conservative client-side rate limit and retries 429 responses with backoff, so normal lead volumes deliver without manual tuning.