Why this fails without a visible error
ActiveCampaign's contact API can behave permissively around identifiers — depending on how the update is addressed (by contact ID vs. by email lookup), a request that does not cleanly match an existing record can be accepted by the API without an explicit error while doing nothing meaningful to an existing contact, or in some configurations creating a new, unintended one instead of updating the expected record.
Community reports of "update contact not working" describe exactly this pattern: no error surfaces in n8n, but the ActiveCampaign dashboard shows no change, which points at identifier resolution rather than the update payload itself as the first thing to check.
Confirm the identifier resolves to the right contact
- If updating by email, confirm the exact email value being passed matches the contact's email in ActiveCampaign character-for-character, including case and whitespace — a trailing space from an upstream form field is a common, invisible cause.
- If updating by internal contact ID, confirm that ID was retrieved from ActiveCampaign itself (via a prior lookup node) rather than assumed or hardcoded, since a wrong or stale numeric ID targets a different (or nonexistent) record silently.
- Check whether the fields being sent in the update actually contain new values at execution time — an upstream expression that evaluates to empty or to the same value already on the record will "succeed" without producing any visible change.
Fix by adding an explicit lookup before update
Insert a Get Contact (or equivalent search) step immediately before the Update Contact node, addressed by the same identifier you plan to use for the update, and confirm it returns exactly one matching contact with the ID you expect — this converts a silent identifier mismatch into a visible, debuggable failure at the lookup step instead of a silent no-op at the update step.
Log or inspect the exact payload the Update Contact node sends (field names and values) immediately before execution, to rule out an upstream expression quietly resolving to empty or unchanged data.
// Example: Get Contact lookup before Update Contact
GET /api/3/contacts?email=test@example.com
// Confirm response has exactly one "contacts" entry, and use
// contacts[0].id for the subsequent Update Contact call —
// do not pass the email string forward as if it were an ID.
Sources checked for this guide
The community report below describes this symptom directly; the identifier-based diagnosis follows from how ActiveCampaign's contact API generally resolves records.
Frequently asked questions
The node shows success but nothing changed in ActiveCampaign — is this an n8n bug?
It is more often an identifier mismatch (wrong or stale contact ID/email) than a node defect. Add an explicit Get Contact lookup before the update to confirm the identifier resolves to the exact record you expect.
Could a trailing space in the email field really cause this?
Yes — email-based lookups are typically exact-match, so a stray space or case difference from an upstream form or CRM field can cause the identifier to fail to resolve without producing a visible n8n error.
How do I confirm the fields I'm sending actually have new values?
Inspect the node's input data immediately before execution (using n8n's execution data view) to confirm the upstream expression is not quietly evaluating to empty or to a value identical to what is already on the record.
Should I always add a Get Contact step before updating?
For any workflow where the identifier comes from an external or user-provided source (a form, another CRM, a webhook payload), yes — it converts a silent mismatch into a visible, debuggable failure rather than a no-op update.