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

  1. Sign in to the Outreach Developer Portal.
  2. Go to My Apps and click Create New App.
  3. Give the app a name (e.g. “Datafly Signal”).
  4. Under OAuth, set a Redirect URI you control (used once to mint the refresh token).
  5. Under Scopes, enable:
    • prospects.read
    • prospects.write
  6. 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.write

Outreach 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_CODE

The 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

FieldRequiredDescription
client_idYesYour connected app’s Identifier (OAuth client ID).
client_secretYesYour connected app’s Secret (OAuth client secret).
refresh_tokenYesThe refresh token from the authorization_code exchange above.

Setup

  1. Go to Integrations > Add Integration > Outreach.
  2. Choose the Lead Capture preset.
  3. Enter your client_id, client_secret, and refresh_token.
  4. Select the consent categories that should gate delivery (typically marketing). Signal only forwards events from consenting, identified users.
  5. Click Save.

API Endpoint

POST https://api.outreach.io/api/v2/prospects
Authorization: Bearer {access_token}
Content-Type: application/vnd.api+json

Signal 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.

SignalOutreach attributeNotes
emailemails[]Required. Trimmed and lower-cased. Outreach dedupes prospects on email.
firstName / lastNamefirstName, lastNameFrom identify() traits.
namenameFull name.
phonemobilePhones[]Normalised to E.164.
titletitle, occupationJob title.
companycompanyAccount/company name.
city / state / countryaddressCity, addressState, addressCountryLocation 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 eventOutreach actionTag applied
Lead SubmittedCreate prospectSignal, lead
Form SubmittedCreate prospectSignal, form
Signed UpCreate prospectSignal, signup
Demo RequestedCreate prospectSignal, 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

  1. Trigger a tracked event on your site (e.g. submit a demo-request form) as an identified, consenting user.
  2. In Outreach, go to Prospects and search for the email address you used.
  3. The new prospect should appear within seconds, carrying the name, company, phone, and Signal tag.
  4. Use Signal’s Event Debugger to inspect the exact JSON:API document sent and the Outreach response code.

Troubleshooting

ProblemSolution
415 Unsupported Media TypeThe 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 UnauthorizedThe 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 ForbiddenThe connected app lacks the prospects.write scope. Re-authorise with both prospects.read and prospects.write.
422 Unprocessable EntityA validation error — usually an unknown attribute or an invalid value. Review the mapped fields in the Event Debugger.
Prospect not created, no errorThe 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 prospectsOutreach 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.