Twee routes, één conversieactie
Google Ads meet conversies op twee manieren:
- Google-tag in de browser —
gtag('event', 'conversion', { send_to: 'AW-XXXX/label', value, currency, transaction_id }), optioneel met Enhanced Conversions (user_datamet e-mail, telefoonnummer en adres, gehasht door de tag). - Conversie-uploads via de Google Ads API —
ConversionUploadService.UploadClickConversions, verstuurd vanaf jouw server.
Beide verwijzen naar dezelfde conversieactie. De API-route is wat offline verkopen, CRM-gekwalificeerde leads en terugbetalingscorrecties mogelijk maakt, en het is de route die geblokkeerde browserrequests overleeft.
Het uploadrequest
POST https://googleads.googleapis.com/v25/customers/{customerId}:uploadClickConversions met de headers Authorization: Bearer <OAuth2>, developer-token en, wanneer je het account via een manageraccount benadert, login-customer-id.
Elke ClickConversion heeft nodig:
conversionAction— de resourcenaamcustomers/{cid}/conversionActions/{id}conversionDateTime—yyyy-mm-dd hh:mm:ss+|-hh:mm, met een expliciete tijdzone-offset- minstens één attributiesleutel:
gclid,gbraid,wbraidofuserIdentifiers(Enhanced Conversions for Leads) - optioneel
conversionValuemetcurrencyCode, enorderIdvoor deduplicatie consentmetadUserDataenadPersonalizationopGRANTEDofDENIED
Zet partialFailure: true — de API rapporteert fouten dan per rij in plaats van de hele batch af te wijzen — en gebruik validateOnly: true voor tests. Een validate-only-upload bewijst credentials, developer token en klanttoegang zonder iets vast te leggen.
Enhanced Conversions: wat je hasht
Voor userIdentifiers verwacht Google SHA-256 van genormaliseerde waarden:
- e-mail: getrimd, in kleine letters; bij gmail.com- en googlemail.com-adressen verwijder je punten en
+-suffixen vóór het hashen - telefoonnummer: E.164 (
+en landcode) vóór het hashen - voornaam, achternaam, straat: kleine letters, getrimd, daarna gehasht
- plaats, staat/provincie, postcode, landcode: platte tekst
Elk identifier-object draagt bovendien userIdentifierSource: FIRST_PARTY. Eén rij mag meerdere identifiers combineren; Google matcht op elk ervan.
Timingregels die stille missers veroorzaken
- Het conversietijdstip moet na de klik liggen en binnen het klikvenster van de conversieactie. Een aankoop uploaden met een tijdstempel van vóór de klik levert
CONVERSION_PRECEDES_CLICKop. - Klikken van slechts enkele uren oud zijn mogelijk nog niet te matchen (
TOO_RECENT_CLICK). Later opnieuw proberen is het juiste gedrag; Track behandelt deze fouten als herhaalbaar. - Tijdzone-offsets zijn verplicht.
2026-09-03 10:15:00zonder+02:00wordt afgewezen.
Toestemmingsvelden zijn in de praktijk niet optioneel
Sinds Consent Mode v2 worden uploads zonder consent.adUserData voor EER-verkeer gemarkeerd. Leid de flags af uit de toestemmingsdoelen die bij het event zijn vastgelegd: marketing → adUserData: GRANTED; marketing + personalisatie → adPersonalization: GRANTED; al het andere → DENIED. Zet nooit standaard op granted alleen omdat het veld bestaat.
Dedupliceren met de browsertag
Gebruik dezelfde transaction_id in de Google-tag en als orderId in de upload. Google dedupliceert conversies met dezelfde order-ID voor dezelfde conversieactie, zodat een aankoop die zowel de tag als de server ziet, één keer telt. Voor leads zonder bestelling houd je browser en server op verschillende conversieacties (bijvoorbeeld ‘Lead (tag)’ en ‘Gekwalificeerde lead (CRM)’) in plaats van ze te proberen te dedupliceren.
Een testworkflow die de rapportage niet vervuilt
- Verbind het Google-account via OAuth en valideer: Track stuurt een validate-only-upload en meldt of developer token en klant-ID worden geaccepteerd.
- Map
purchaseop de ID van de conversieactie. - Stuur een testevent in de wizard. Zolang de destination in de testmodus staat, gebruikt elke upload
validateOnly: true; het antwoord bevestigt de structuur van de payload. - Zet de testmodus uit, stuur één echte aankoop met een verse gclid en controleer de volgende dag Conversies → Diagnose in Google Ads.
Veelvoorkomende fouten, ontcijferd
| Fout | Betekenis | Oplossing |
|---|---|---|
UNAUTHENTICATED | OAuth-token ongeldig | het Google-account opnieuw verbinden |
PERMISSION_DENIED / USER_PERMISSION_DENIED | geen toegang tot de klant-ID | login-customer-id en accounttoegang controleren |
DEVELOPER_TOKEN_NOT_APPROVED | token staat alleen testaccounts toe | basistoegang aanvragen |
CLICK_NOT_FOUND | gclid onbekend | klik is te oud, komt uit een ander account of is misvormd |
INVALID_CONVERSION_ACTION_TYPE | actie is geen uploadtype | een conversieactie aanmaken met bron ‘Uploaden vanuit klikken’ |
Elk van deze fouten verschijnt met zijn code in de event-debugger, naast de geredigeerde payload die hem veroorzaakte.