attio-triggers

n8n community node with an Attio Trigger for reacting instantly to Attio CRM events (records, lists, list entries, notes, tasks, comments, call recordings) via Attio's webhooks API.

Package Information

Released: this month
Downloads: 0 weekly / 0 monthly
Latest Version: 0.8.1
Author: Richard Gilchrist

Documentation

n8n-nodes-attio-triggers

An n8n community package for Attio with two nodes:

  • Attio Trigger — react instantly to Attio CRM events (records, lists, list entries, notes, tasks, comments, call recordings) via Attio's real webhooks API.
  • Attio — a full-featured action node to create, update, upsert and search records (and manage list entries, notes, tasks and comments), with the same polished, dropdown-driven UX as the trigger.

Both nodes share one Attio API credential. Published at npmjs.com/package/n8n-nodes-attio-triggers.

Why this exists

Attio's REST API supports signed, real-time webhooks for records, lists, list entries, notes, tasks, comments, and call recordings (docs.attio.com/rest-api/webhook-reference). No n8n community node exposed that as a Trigger node — the existing n8n-nodes-attio package covers CRUD actions only. This package fills that specific gap.

What the Attio Trigger node does

  • Event Type dropdown lists every documented Attio webhook event.

  • Object / List dropdowns (populated live from your workspace via Attio's API) scope the subscription to a single object type or list instead of firing for the whole workspace. Leave on - Any - to fire for everything.

  • Filter Conditions: a row-based builder (Field / Operator / Value, with an Add Condition button and an AND/OR combinator) for anything the Object/List dropdowns don't cover. Both Field and Value are now dropdowns so you never type internal IDs:

    • Field offers the payload paths that actually exist for the selected event — e.g. for Record Updated: Changed Attribute (id.attribute_id), Record (id.record_id), Actor Type (actor.type), Actor (actor.id), plus Custom Path… to type a raw dot-path.
    • Value is populated from your workspace based on the chosen Field: pick Changed Attribute → and Value lists that object's attributes (e.g. Stage) by name; pick Actor → Value lists workspace members; pick Actor Type → the three Attio actor types. For a value with no fixed list (e.g. a specific record ID) or a custom path, switch Value to an Expression and type it.
    • Operator is restricted to the two Attio supports (equals, not_equals). These conditions combine with the Object/List filters, not instead of them.

    Important: Attio's webhook filter matches the event payload — i.e. which attribute changed — not an attribute's new value. You can trigger "only when a Deal's Stage changed", but not "only when Stage becomes Won" at the webhook level. For value-based logic, add a downstream IF/Filter node after the trigger.

  • On workflow activation, the node creates a matching webhook subscription in Attio (POST /v2/webhooks) pointed at n8n's webhook URL, and stores the returned webhook ID + signing secret in the workflow's static data.

  • On deactivation/removal, it deletes that subscription from Attio — no orphaned webhooks left behind in your workspace.

  • Every incoming request's Attio-Signature header is verified (HMAC-SHA256 over the raw body, using the secret Attio issued when the subscription was created) before the payload is passed into the workflow. Unsigned or mismatched requests are dropped.

What the Attio (action) node does

Pick a Resource and Operation; every ID field is a live dropdown from your workspace.

  • Record — Create, Update, Create-or-Update (upsert on a matching attribute), Search. Pick an Object and the Attributes field becomes a resource mapper that loads that object's attributes as typed fields: select/status attributes (like a Deal's Stage) appear as dropdowns of their options, and each value is serialized into Attio's per-type shape (selects wrapped in arrays, currency as {currency_value, currency_code}, dates as ISO, etc.). An Additional Values (JSON) escape hatch covers exotic attribute types.
  • List Entry — Add Record to List, Update Entry, Search Entries (entry values use the same resource mapper against the list's attributes).
  • Note — Create, Get Many.
  • Task — Create, Update, Get Many (assignees and linked records via dropdowns).
  • Comment — Create (on a record or an existing thread), Get.

Notes:

  • Update uses PATCH, which appends to multiselect attributes (Attio's documented behaviour); use raw values / a future overwrite mode if you need to replace them.
  • Record-reference and owner (actor-reference) values accept an ID/expression in this version; a searchable record picker is a planned enhancement.

Build

cd attio-n8n-trigger-nodes
npm install --include=dev
npm run build

This compiles credentials/ and nodes/ to dist/ and copies the node icon (gulp build:icons). --include=dev matters if NODE_ENV=production is set anywhere in your shell/environment — without it, npm silently skips devDependencies (including typescript), and the build fails with tsc: not found.

If your environment doesn't have a C/C++ toolchain + Python (native modules can't compile — n8n-workflow's isolated-vm dependency needs this, even though this package never actually calls it, only its type declarations), use:

npm install --include=dev --ignore-scripts
npm run build

--ignore-scripts skips the native-module install step entirely (safe here — we only need n8n-workflow's .d.ts files for type-checking) and skips this package's own prepare hook, hence the explicit npm run build right after.

Publish an update

npm version <patch|minor|major>
npm publish
git push && git push --tags

Then in n8n: Settings → Community Nodes, find n8n-nodes-attio-triggers, and use its update action to pick up the new version.

First-time install into a self-hosted n8n

Settings → Community Nodes → Install, package name n8n-nodes-attio-triggers. Then:

  1. Add an Attio API credential: Attio Workspace Settings → Developers → API keys → create a key with read access to objects/lists/records (whatever events you plan to trigger on) and write access to Webhooks.
  2. Attio must be able to reach your n8n instance's webhook URL over HTTPS — a public domain (as on Railway) or a tunnel for local dev.
  3. Build a workflow: Attio Trigger (pick an event, e.g. Record Created) → any node. Activate it, then trigger the event in Attio and confirm the execution fires.

Notes / gotchas

  • Attio's webhook filter engine does plain equality matching against the raw event payload (UUIDs, not slugs) — this is exactly why the Object/List fields are dropdowns rather than free text: typing a slug like people instead of its UUID produces a filter that silently matches nothing, forever, with no error anywhere.
  • Attio delivers a max of 25 requests/sec per target URL with retries over ~3 days on failure — make sure whatever the trigger feeds into can keep up, or add a Queue/Split-in-batches step downstream if you expect bursts.
  • n8n-workflow is a peer dependency; the version pinned in package.json should be bumped to match whatever your n8n version ships, if the build reports type mismatches (e.g. NodeConnectionTypes vs NodeConnectionType broke between versions once already).
  • If you ever install this manually via a container shell instead of through n8n's own installer (e.g. troubleshooting on a host where the registry install fails), do it in n8n's actual user folder (check env | grep N8N_USER_FOLDER, default /home/node/.n8n for the official Docker image) — not whatever ~ resolves to for your shell session, which may be a different, non-persistent user (e.g. root via railway ssh).

Discussion