Type something to search...
Adyen Purchase Tracking

Google Ads Offline Conversions

Adyen to Google Ads Offline Conversions via n8n

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

  1. Log into your Adyen Customer Area (switch to your merchant account).
  2. Navigate to Developers > Webhooks.
  3. Click Webhook and select Standard Webhook.
  4. Set the Server URL to your n8n Webhook node production URL (e.g., https://n8n.yourdomain.com/webhook/adyen-google-ads).
  5. 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 code 200.

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:

  • eventCode equals AUTHORISATION
  • success equals true

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:

  1. Minor currency units: Adyen amounts are passed in minor units (e.g., 5000 equals $50.00 or €50.00). You must divide the value by 100 to send standard decimal numbers to Google Ads.
  2. Shopper email normalization: Enhanced conversions require user email addresses to be trimmed and lowercased before hashing.
  3. Transaction deduplication: Adyen provides a unique pspReference for every payment. Passing this as the orderId in 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:

  1. Crypto Node: Hash cleanEmail using SHA-256 to create your sha256_email user identifier.
  2. Edit Fields (Set) Node: Assign your customer_id, conversion_action_id, order_id (using transactionId), conversion_value (using amount), and currency_code (using currency).
  3. HTTP Request Node: Make a POST request to Google’s uploadClickConversions API 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:

  1. Adyen Webhook Test: In your Adyen Customer Area under your webhook configuration, click Test configuration. Select AUTHORISATION and send the test payload to your n8n test webhook URL to confirm that values, email fields, and currency amounts parse correctly.
  2. 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

Related Posts

LTV based nCACAdvanced Google Ads bidding strategy

nCAC Google Ads Bidding Strategy based on LTV

Your Google Ads account might be pausing your most profitable products right now — and the algorithm thinks it's doing you a favor. Lots of Google Ads managers live and die by immediate, dashboard-re

read more
n8n to Google AdsOffline Conversions

Google Ads Offline Conversions via n8n

If you are running lead generation campaigns, Offline Conversion Tracking is non-negotiable. It’s the only way to tell Google, "Hey, this lead actually bought something." While tools like Zapie

read more
Google Ads POAS TrackingShopify, Server-Side GTM, Stape & Matrixify

Shopify POAS Tracking for Google Ads via Stape

As e-commerce advertising becomes more competitive, optimizing campaigns for ROAS (Return on Ad Spend) is no longer enough. High revenue doesn't always equal high profit, especially if your best-selli

read more
Google Ads Editor on LinuxA step-by-step guide to installing and running Google Ads Editor with Bottles and Wine

How to Run Google Ads Editor on Linux using Bottles

For PPC specialists, media buyers, and agency professionals working on a Linux desktop, Google Ads Editor has long been a missing piece. Google officially provides desktop installers only for Windows

read more
Boost Your ROAS with AlgoShop AITurn hesitant ad clicks into profitable customers with proactive conversational commerce.

Boost Your ROAS with AlgoShop AI Chatbot for Shopify

We talk a lot on this blog about optimizing Google Ads and tightening up conversion tracking. But here is a harsh truth for e-commerce brands: you can have the perfect campaign structure, the most ref

read more
Sales Handoff with n8n & SlackZero-Touch VIP Onboarding

Automating the Sales Handoff with n8n & Slack

The Client: SaaS FinTech The Problem: High-value enterprise prospects were getting lost in a noisy pipeline mixed with support requests. The sales team wasted time manually setting up

read more
Support Intelligence AutomationUsing n8n & AI

Using n8n & AI to Automate Support Intelligence

The Client: High-growth D2C brand The Problem: Support data was a "black hole." Management missed burning issues because they were buried in thousands of tickets. The Stack: Go

read more