Google Ads Offline Conversions
Adyen to Google Ads Offline Conversions via n8n
- Ivan
- Tutorials, Marketing Ops
- 08 Oct, 2026
When running paid acquisition campaigns, relying solely on client-side conversion tags (like Google Tag Manager scripts on a checkout confirmation page) leaves costly blind spots. Browser privacy restrictions, ad blockers, 3D Secure authentication redirects, and asynchronous payment methods (such as iDEAL, SEPA, or bank transfers) frequently prevent client-side purchase pixels from firing.
If you process transactions through Adyen, you can bypass these tracking drops entirely by building a server-side pipeline. By capturing Adyen payment webhooks and sending them directly to Google Ads Offline Conversion Tracking (OCT) via n8n, you feed 100% verified payment data back into Google’s Smart Bidding algorithms (Target ROAS and Target CPA).
Because n8n can be self-hosted, this pipeline costs a fraction of third-party integration platforms while offering complete control over payload manipulation and privacy compliance.
Prerequisites: Getting Your Credentials
This tutorial focuses specifically on receiving, parsing, and formatting Adyen webhook events.
For the one-time Google Ads API setup (obtaining your Developer Token, Google Cloud OAuth 2.0 Client credentials, and Conversion Action ID), please follow the initial steps in our core n8n to Google Ads offline conversions tutorial.
Once your Google Ads credentials are ready, the pipeline follows this linear flow:
flowchart LR
A[Webhook<br/>Adyen Trigger] -->|POST| B[Filter<br/>Keep Successful Events]
B -->|Kept| C[Prepare Data<br/>Format Values & Dates]
C --> D[SHA256 Email<br/>Hash PII Data]
D --> E[Set Vars<br/>Add Conversion IDs]
E --> F[Google Ads<br/>Send Offline Conversion]
%% Node Styling (n8n & Platform Palette)
classDef webhook fill:#FFEAEB,stroke:#EA4335,stroke-width:2px,color:#900C3F;
classDef filter fill:#E8F4FD,stroke:#2B8A3E,stroke-width:2px,color:#1B4332;
classDef prepare fill:#FFF4E6,stroke:#F59E0B,stroke-width:2px,color:#78350F;
classDef security fill:#E6FCF5,stroke:#0CA678,stroke-width:2px,color:#065F46;
classDef vars fill:#EDF2FF,stroke:#4C6EF5,stroke-width:2px,color:#1C7ED6;
classDef google fill:#E8F0FE,stroke:#4285F4,stroke-width:2px,color:#174EA6;
class A webhook;
class B filter;
class C prepare;
class D security;
class E vars;
class F google;
1. Configure the Adyen Webhook
- Log into your Adyen Customer Area (switch to your merchant account).
- Navigate to Developers > Webhooks.
- Click Webhook and select Standard Webhook.
- Set the Server URL to your n8n Webhook node production URL (e.g.,
https://n8n.yourdomain.com/webhook/adyen-google-ads). - Security: We strongly recommend configuring HMAC signature validation or Basic Authentication under the webhook settings in Adyen. This ensures your n8n workflow only accepts genuine events signed by Adyen.
2. Handle the Adyen Payload & The 10-Second Rule
Adyen delivers HTTP POST notifications containing an array of notificationItems. When handling these events in n8n, there are two crucial rules:
The 10-Second Response Rule
Adyen strictly requires your webhook endpoint to return an HTTP 200 with the literal body [accepted] within 10 seconds. If your workflow takes longer (for example, waiting on downstream API calls), Adyen marks the transmission as timed out and begins an exponential retry schedule.
To prevent retry loops:
- In your n8n Webhook node settings, set Response Mode to “Immediately”.
- Set Response Data to return
[accepted]with status code200.
This immediately satisfies Adyen’s requirement while n8n executes the remainder of your workflow in the background.
Filter Rule
Adyen transmits notifications for many payment lifecycle events (such as pending captures, cancellations, and refunds). To avoid sending unearned conversions to Google Ads, place a Filter node right after the Webhook trigger:
eventCodeequalsAUTHORISATIONsuccessequalstrue
This guarantees that only confirmed, authorized purchases proceed to Google Ads.
3. Preparing the Data (Code Node)
Adyen passes data in a specific structure that needs minor adjustments before Google Ads will accept it:
- Minor currency units: Adyen amounts are passed in minor units (e.g.,
5000equals$50.00or€50.00). You must divide the value by 100 to send standard decimal numbers to Google Ads. - Shopper email normalization: Enhanced conversions require user email addresses to be trimmed and lowercased before hashing.
- Transaction deduplication: Adyen provides a unique
pspReferencefor every payment. Passing this as theorderIdin Google Ads ensures idempotency, preventing accidental double-counting if a webhook is reprocessed.
Add a Code node (JavaScript) after your Filter node with the following snippet:
const item = $input.first().json.body.notificationItems[0].NotificationRequestItem;
// 1. Clean and normalize email (check additionalData metadata or fallback)
const rawEmail = item.additionalData?.["metadata.platformShopperEmail"]
|| item.additionalData?.["shopperEmail"]
|| "";
const cleanEmail = rawEmail.trim().toLowerCase();
// 2. Extract transaction value (Adyen amounts are in minor units, e.g. 5000 = $50.00)
const amount = (item.amount?.value || 0) / 100;
const currency = item.amount?.currency || "USD";
// 3. Extract unique transaction id (Adyen pspReference)
const transactionId = item.pspReference;
return {
transactionId,
cleanEmail,
amount,
currency,
timestamp: new Date().toISOString()
};
4. Hash and Send to Google Ads API
Once the Adyen payload is normalized, the remaining steps are identical to our core Google Ads pipeline:
- Crypto Node: Hash
cleanEmailusingSHA-256to create yoursha256_emailuser identifier. - Edit Fields (Set) Node: Assign your
customer_id,conversion_action_id,order_id(usingtransactionId),conversion_value(usingamount), andcurrency_code(usingcurrency). - HTTP Request Node: Make a
POSTrequest to Google’suploadClickConversionsAPI endpoint:
https://googleads.googleapis.com/v24/customers/{{ $json.customer_id }}:uploadClickConversions
For the exact HTTP Request headers, OAuth2 configuration, and JSON body structure, refer directly to Step 3 in the main n8n Google Ads tutorial.
Testing & Verifying Conversions
Before switching to live traffic, verify your pipeline end-to-end:
- Adyen Webhook Test: In your Adyen Customer Area under your webhook configuration, click Test configuration. Select
AUTHORISATIONand send the test payload to your n8n test webhook URL to confirm that values, email fields, and currency amounts parse correctly. - Google Ads Upload Status: Within Google Ads, navigate to Goals > Conversions > Uploads. Uploaded conversions typically take 3 to 6 hours to process. Check the Upload history tab to ensure there are no payload syntax or credential errors.
By routing verified Adyen transactions directly into Google Ads through n8n, your Smart Bidding models optimize against genuine backend revenue, protecting your return on ad spend from frontend signal degradation.
Need this exact workflow?
Struggling to connect payment gateways like Adyen to Google Ads? We build robust marketing data pipelines that just work. Let's automate your tracking.
Book a Discovery Call