Notes

Sending Offline Conversions to Google Ads with n8n

n8n can send verified outcomes from almost any CRM to Google Ads: a trigger on a stage change, a filter that checks the click identifier and the age of the click, a node that builds the payload, an upload to the Google Ads API, and a log row for every attempt. The last node is the one most builds leave out, and the one that makes the whole thing trustworthy.

Key takeaways

Contents

  1. Why n8n for this
  2. The workflow, node by node
  3. The payload
  4. Logging, and why it is not optional
  5. What breaks
  6. When not to use automation for this
  7. What it costs
  8. Build the log node first
Sending Offline Conversions to Google Ads with n8n

Your CRM is not Salesforce and has no native Google Ads integration. You still need to tell Google which enquiries became patients. n8n sits in the middle, and because it is self-hosted you can keep the whole thing inside infrastructure you control, which matters in regulated fields.

Why n8n for this

Three reasons. It self-hosts, so patient-adjacent data does not pass through a third-party automation vendor you would otherwise need an agreement with. It speaks to almost any CRM through HTTP nodes, so it does not depend on a native integration existing. And the workflow is visible, so somebody other than its author can see what it sends.

The same job can be done with a scheduled CSV upload, and for larger accounts that remains my preference. The reasoning is in the offline conversion tracking guide.

The workflow, node by node

An n8n workflow for Google Ads offline conversions
The fifth node is the one people skip, and the one that makes the rest trustworthy.
  1. Trigger. A webhook from the CRM when a record changes stage, or a schedule that polls for records updated since the last run. Prefer the schedule if the CRM's webhooks are unreliable, which is common.
  2. Filter. Continue only if the stage is one you report, the click identifier is present, the click is under 90 days old, and this record has not already been sent for this conversion action.
  3. Build payload. Click identifier, conversion action resource name, conversion time with an explicit timezone offset, and a value if you use one.
  4. Send. An HTTP node calling the Google Ads API click conversion upload, with credentials stored in n8n rather than in the workflow body.
  5. Log. Write a row for every attempt: record ID, identifier, action, time, response code and any error text. Append it to a sheet, a database table or back onto the CRM record.

The payload

FieldExampleNote
Click identifierthe gclid, gbraid or wbraid stored at enquiryExactly one per conversion, case preserved
Conversion actiona resource name from your accountUse neutral names such as "Stage 2"
Conversion time2026-09-14 15:20:00-04:00Always with an explicit offset
Value1, 5 or 20Weights are safer than real prices in healthcare

For clinics, the conversion action names matter as much as the fields. A conversion list that reads like a service menu discloses more than the payload does. The reasoning is in click-ID-only conversion feeds, and the identifier in what a GCLID is.

Logging, and why it is not optional

An automation pipeline fails silently. A webhook is missed, a credential expires, a timezone changes with daylight saving, and nothing anywhere tells you. Weeks later the account is bidding on partial data and everyone assumes the feature "did not work".

The log node costs ten minutes and makes three things possible: proving to a privacy officer exactly what was sent, reconciling monthly against CRM stage counts, and alerting when consecutive failures occur.

What breaks

Common failures in automated offline conversion pipelines
Every one of these is invisible without the log.
CauseWhat actually happensHidden costWhat you seeRisk level
Webhook missedOutcomes never sentBidding learns from a partial sampleCRM stage count above upload countHigh
Stage flips back and forthThe same outcome uploaded twiceInflated resultsDuplicates in the logMedium
Timezone or format errorRows rejectedPartial data looks completeErrors in the upload responseMedium
Click older than 90 daysGoogle rejects itLong cycles lose their final stage"Click too old"Medium
Credentials expireEverything stopsWeeks of blind biddingA wall of failures in the logHigh
No log at allNobody notices any of the aboveMonthsNothing, which is the problemHigh

When not to use automation for this

If the account carries meaningful spend, run a scheduled CSV import as the source of truth and use automation as the fast path, reconciled against the file monthly. Webhooks fail, statuses change, deduplication breaks between objects, and none of it raises an alarm on its own. That position has not changed.

What it costs

RouteTypical costTime to the first verified uploadWhat it depends on
Build it yourself in n8nHosting plus a day of workDaysAPI access and CRM webhooks
Hire a developerUpwork lists tag manager and automation specialists at $20 to $49 an hour, median $30; senior US consultants at $85 to $175DaysCRM complexity
I build itAudit at $500 per ad account with a 90-day plan, credited toward the first month; the build is a fixed quote from the auditScoped in the audit, then about 30 clean days before bidding relies on itEntry points, CRM, sign-off
AUDIT · $500 PER AD ACCOUNT

The audit covers your ad account, the tracking and the path from enquiry to booked patient, and ends with a 90-day plan. It is credited toward the first month if you continue with me.

You work with me directly. There are no account managers and no juniors.

Build the log node first

Before wiring the trigger, build the node that writes a row for every attempt. Everything else in this workflow can be rebuilt in an afternoon; the weeks of silent failure that happen without a log cannot be recovered. If you would rather have it built and documented for you, start with the audit, or see CRM-verified attribution.

Written by Lev Brovtsev, independent performance marketing consultant. I do the work myself. Last updated: September 2026.

Frequently asked questions

Can n8n send offline conversions to Google Ads?

Yes, through an HTTP node calling the Google Ads API click conversion upload. There is no need for a dedicated Google Ads node.

Should I use a webhook or a schedule?

A schedule is more reliable in practice. Webhooks are faster but fail silently, which is the main risk in this kind of pipeline.

What about ActiveCampaign or another CRM?

The pattern is identical: trigger on a stage change, filter, build, send, log. Only the first node differs.

How often should the workflow run?

Daily is enough for most accounts. Bidding weights recent data, but hourly runs add failure modes without adding much signal.

Is self-hosted n8n safer for healthcare?

It keeps the data inside infrastructure you control, which removes one vendor from the agreement conversation. It does not remove the need to decide what the payload contains.

What if the click is older than 90 days?

Send an earlier verified stage inside the window and keep the final outcome for your own reporting. Google will reject anything older.

Who does the work if I hire you?

I do: the workflow, the payload, the logging and the reconciliation routine. Nothing is subcontracted or delegated.

How do I verify it is working?

Three places: the log rows, the upload diagnostics in Google Ads, and a monthly comparison of uploaded counts against CRM stage counts. If all three agree, it works.

Related

Dental PPC ConsultantDental SEO That Produces Implant Patients, Not PDFsDental Implant Marketing for 5-Figure Cases