Attio
Creates or updates Attio person records server-side with the assert endpoint, matched on email_addresses.
Why route Attio through Datafly Signal
- Profiles are updated from the server, not the browser. Events reach Attio even when a tracker blocker or a failed page unload would have dropped a client-side call, so the profile reflects what actually happened.
- Token lifecycle is handled for you. Signal obtains and refreshes the OAuth credentials Attio requires, so nothing expires quietly in the middle of a campaign.
- One consent decision governs every destination. Attio is gated by the same consent state as the rest of your stack, so a withdrawal applies everywhere at once.
Prerequisites
Create an access token
In Attio, open Settings > Developers and create an access token with record_permission:read-write and object_configuration:read. The token is scoped to one workspace.
Configuration
| Field | Type | Required | Description |
|---|---|---|---|
api_key | secret | Yes | Your Attio API key (or OAuth access token), sent as Authorization: Bearer. Generate one in Attio under Settings > Developers > API keys. The token must have the record_permission:read-write and object_configuration:read scopes, and is scoped to a single workspace: use a key for the workspace whose CRM should receive the contacts. |
Signal setup
- Navigate to Integrations in the sidebar and open the Integration Library tab.
- Find Attio, click Install and fill in the fields above.
- Pick the preset for your use, then review the mappings in the blueprint editor.
API endpoint
PUT https://api.attio.com/v2/objects/people/records?matching_attribute=email_addresses
Authorization: Bearer {api_key}Example request:
{"data": {"values": {
"email_addresses": [{"email_address": "jane.doe@example.com"}],
"name": [{"first_name": "Jane", "last_name": "Doe", "full_name": "Jane Doe"}],
"phone_numbers": ["+447700900123"],
"job_title": [{"value": "CTO"}]}}}The presets turn on the strict output contract: only the fields the blueprint maps are sent.
Event mapping
B2B / SaaS preset (saas)
B2B / SaaS: Upsert an Attio person, matched on email, when a visitor identifies, signs up or submits a lead: email, name (first, last and full name together, as Attio requires), phone (E.164) and job title, in plain text because the email is the record’s match key and the sales team reads the record. Events without an email are not sent. Adds login and trial start.
| Signal event | Sent to the vendor as | Enabled |
|---|---|---|
identify | assert_person | yes |
sign_up | assert_person | yes |
generate_lead | assert_person | yes |
demo_requested | assert_person | yes |
login | assert_person | yes |
trial_started | assert_person | yes |
Default preset (default)
Upsert an Attio person, matched on email, when a visitor identifies, signs up or submits a lead: email, name (first, last and full name together, as Attio requires), phone (E.164) and job title, in plain text because the email is the record’s match key and the sales team reads the record. Events without an email are not sent.
| Signal event | Sent to the vendor as | Enabled |
|---|---|---|
identify | assert_person | yes |
sign_up | assert_person | yes |
generate_lead | assert_person | yes |
demo_requested | assert_person | yes |
Identity and personal data
The person is matched on the email trait (trimmed, lower-cased); an event without one is not sent. Name is sent only with all three of first_name, last_name and full_name, as Attio requires. Phone is sent in E.164 string form. These are sent in plain text: the email is the record’s match key and the sales team reads the record.
Consent
Map the integration to the consent category your organisation uses for CRM or sales data. Signal does not write cookie consent into the CRM: no subscription status, do-not-disturb flag, list or tag is set from it, because a cookie banner choice is not a permission to email or call someone.
Known limitations
phone_numbersis a multi-value attribute that the assert endpoint replaces: the person’s other numbers are removed. Remove the phone mapping if your team keeps several numbers per person.- Attio allows 25 write requests a second; a
429is retried.
Troubleshooting
| Symptom | Cause and fix |
|---|---|
400 on name | A customised blueprint sent a partial name; keep first, last and full name together. |
403 | The token lacks record_permission:read-write or object_configuration:read. |