Connecting Attio to n8n: syncing and enriching your CRM through the API
Published 15 August 2026 · 6 min read
Attio has carved out a spot among the CRMs favored by teams who already automate the rest of their stack: a flexible data model (its "objects" are customized without a rigid configurator), a full REST API in v2, and a foundation built to be driven by code or workflows rather than filled in by hand. The flip side of that flexibility: n8n doesn't have a native Attio node yet, only an unofficial community one. That's not a serious obstacle — the HTTP Request node covers the whole API in a few minutes of setup — but it changes how you approach the integration compared to a CRM like HubSpot or Salesforce, where everything is already wrapped in a form-based interface.
Automating this sync layer isn't a cosmetic detail. A 2026 meta-analysis by Romoli, Oduro, Cardinali, Mainolfi, and De Nisco published in the Journal of Business & Industrial Marketing (see on Google Scholar), covering 62 studies and over 23,000 observations, finds that sales technologies (CRM, sales force automation, social selling) improve sales performance, though the measured effect is moderate — and the authors point out that the gain depends heavily on how well the tool is actually embedded in day-to-day routines rather than on adoption alone. A CRM that gets its data late or by hand stays a glorified log; a CRM fed and queried automatically by n8n becomes the source of truth that triggers action.
Why Attio doesn't have a native n8n node (yet)
n8n prioritizes native nodes for the most-requested tools, but coverage is never exhaustive at any given moment — see our community nodes guide for the general mechanics. For Attio, two options exist today:
- The
n8n-nodes-attiocommunity node: an unofficial third-party package that wraps most of Attio's OpenAPI surface (objects, records, lists, notes, tasks, webhooks) in a classic form-based interface. It only installs on a self-hosted instance, via Community Nodes, and can be wired as a tool on an AI Agent node by setting theN8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGEenvironment variable. - The HTTP Request node: the most portable route, available on both n8n Cloud (where community nodes stay limited to a vetted list) and self-hosted, with no dependency on a third-party maintainer who might abandon the project.
This guide covers the second option, reusable as-is whether you're on Cloud or a self-hosted instance — see our guides on choosing a VPS for self-hosted n8n if you're just getting started.
Authentication: access token and scopes
Attio exposes two authentication modes, but for internal use within a single company, an API key is more than enough:
- In Attio, open Workspace Settings → Developers → Create a new integration, name it (e.g. "n8n"), and check only the scopes you need:
object_configuration:readto read object structure,record_permission:readto read records, andrecord_permission:read-writeif the workflow also needs to create or update them. - Generate the access token and copy it immediately — it won't be shown in plain text again.
- In n8n, create a credential of type Generic Credential Type → Header Auth, with the
Authorizationheader set toBearer <your_token>.
Every HTTP Request node that calls the Attio API then reuses this same credential. Treat this token like any other API secret — our guide on securing API credentials covers storage and rotation practices, especially useful if several workflows share the same access.
Attio's data model: objects and records
Attio's API organizes everything around objects (people, companies, deals, or custom objects created in the workspace) and records, the individual entries of each object. Three calls cover nearly everything an n8n workflow needs:
- List or filter:
POST https://api.attio.com/v2/objects/{object}/records/query, with a JSON body defining filters and sort order. Large result sets are paginated — the same cursor pattern covered in our HTTP Request pagination guide. - Create:
POST https://api.attio.com/v2/objects/{object}/records, with attribute values in the body. - Upsert (create or update):
PUT https://api.attio.com/v2/objects/{object}/records?matching_attribute=domain(oremail_addressfor a person) — Attio updates the existing record that matches on that attribute, or creates a new one if none matches.
This last point matters a lot in an n8n pipeline: a Schedule Trigger or a webhook that accidentally re-fires should never create a duplicate. Upserting with matching_attribute makes the call naturally idempotent, on the same principle covered in our guide on webhook idempotency — except here the API itself carries that guarantee, with no dedup logic to write on the n8n side.
Example: pushing a qualified, enriched lead into Attio
A full pipeline illustrates the point well:
- Lead capture: a form or a webhook captures a business email and a message, as described in our automatic lead enrichment guide.
- Enrichment: extracting the domain, visiting the company's website, and querying an enrichment API or a business-registry API for sector and headcount — the same mechanics covered in the article above.
- AI qualification: an AI Agent node assigns a score and a justification, following the principles in our guide on qualifying inbound leads with AI. Lock down the output format with a Structured Output Parser — a malformed score field would silently break the following call to Attio.
- Upsert into Attio: two HTTP Request nodes doing a
PUT, one on thecompaniesobject (matching ondomain), the other onpeople(matching onemail_address), with the AI score and summary written into custom attributes created beforehand in the Attio workspace.
If your team already built its AI sorting and scoring logic for a mailbox with the Inbox AI Pack (€79), the same scoring prompt carries over directly to this pipeline — only the final destination changes, from a Slack digest to a CRM record.
Triggering a workflow from Attio: webhooks over polling
Rather than querying records/query on a Schedule Trigger to detect a new lead or an update, Attio offers real webhooks: configurable from the integration settings or through the API, they send an event (record.created, record.updated, among others) to a target URL as soon as it happens, including the workspace, object, and record IDs involved. An n8n Webhook node receiving it, followed by a GET call to fetch the full detail of the changed record, is a clear upgrade over polling — see our guide on integrations without webhooks for why this difference matters, particularly for the number of calls consumed and how fresh the data stays.
Making the integration production-ready
Two habits worth building into the very first production workflow:
- Retry and timeout: like any SaaS API, Attio enforces a request-rate limit per workspace. A
Loop Over Itemswith a small delay for bulk imports, combined with the settings covered in our HTTP Request retry and timeout guide, keeps a burst of calls (an initial lead-base import, for example) from cascading into 429 errors. - Safety net: a dedicated Error Workflow catches failed calls to Attio (an expired token, a custom attribute renamed in the workspace) and notifies instead of letting an enriched lead silently vanish because it couldn't be written to the CRM.
Where to go from here
Connecting Attio to n8n needs neither an official node nor a complicated workaround: a Header Auth credential and three HTTP Request calls (query, create, upsert) cover most sync needs. The real value sits upstream, in the quality of the pipeline that feeds those calls — enrichment, scoring, deduplication — exactly the kind of building block already covered in our guides on inbound leads and available out of the box in the Inbox AI Pack (€79). Start with a single object (people or companies) and a single trigger before extending the sync to the rest of the workspace.
FAQ
Frequently asked questions
Should I install the n8n-nodes-attio community node or use HTTP Request?
The community node (unofficial, maintained by a third party) makes writing calls simpler for self-hosted setups, where installing third-party packages is possible. On n8n Cloud, community nodes are restricted to a vetted list, and Attio isn't on it as of now: the HTTP Request node with a Header Auth credential is therefore the most portable route, works identically on Cloud and self-hosted, and doesn't depend on any third-party maintainer.
How does idempotent upsert work on an Attio record?
The PUT /v2/objects/{object}/records endpoint accepts a matching_attribute parameter (for example domain for a company, or email_address for a person): if an existing record matches on that attribute, Attio updates it; otherwise it creates a new one. Replaying the same call multiple times never duplicates the entry, unlike a plain POST /records call repeated.
What's the minimum set of scopes to read and write records from n8n?
To read, record_permission:read and object_configuration:read are enough. To create or update, you also need record_permission:read-write alongside object_configuration:read. These scopes are checked off when creating the integration in Workspace Settings → Developers, and determine what the generated token can do — no point granting more than the workflow actually uses.
Does Attio offer real-time webhooks, or do I need to poll the API?
Attio has real webhooks, configurable from the integration settings or through the API itself, with events like record.created and record.updated sent to a target URL as soon as they happen. That's the recommended way to trigger an n8n workflow: it avoids polling the API on a schedule to detect a change that may not even have occurred.
Bundle FlowKit Complet
€269