Google Ads
Configuration
Guide
Configure the two conversion actions, extract the ctId resource IDs, and validate the system via the 72-hour diagnostics protocol.
THE TWO-ACTION ARCHITECTURE
| ACTION | SOURCE | GOAL TYPE | ROLE |
|---|---|---|---|
| CRM Feed (Primary) | Import → clicks | PRIMARY · BIDDING | Bidding signal. Fed by API loop. Consent-independent. |
| Web Pixel (Secondary) | Website (GTM) | SECONDARY · DIAGNOSTIC | Diagnostic visibility. Consent-gated. ~65% EU reach. |
If the website pixel is your Primary goal, Smart Bidding trains on a systematically biased subset of your leads — it drifts toward audiences least likely to block tracking, not toward your best buyers. The API-fed Import action is the reliable signal.
Setting Up the Primary Goal
The conversion action the API loop uploads to. Must be of type Import → clicks.
Navigate to Goals → Conversions → Summary and click New conversion action.
Select source: Import.
Select import type: Other data sources or CRMs → Track conversions from clicks. Click Continue.
Configure:
Save and Continue.
The ctId for this action is what you will use in the conversionAction field of every API upload. Extract it in Section 03.
Setting Up the Secondary Goal
The conversion action your GTM pixel fires on the thank-you page. Must be of type Website.
Click New conversion action.
Select source: Website. Enter your domain and click Scan.
Scroll down and click + Add a conversion action manually.
Configure:
Enable Enhanced Conversions for Leads:
→ Expand the Enhanced Conversions section
→ Check the box to enable them
→ Select Google Tag Manager as the method
Save and Continue.
The Enhanced Conversions toggle on the Website action must be enabled even if you are using the API for ECL uploads. The toggle is what allows the Google Ads account to accept any hashed user data at all. If this toggle is off, userIdentifiers uploads via the API will be rejected.
Extracting the ctId Resource IDs
The Google Ads API uses internal backend resource IDs — not the AW-XXXXXXXXXX format you see in GTM. You must extract the ctId for both conversion actions.
Go to Goals → Conversions → Summary.
Click on your Primary Goal (the Import/UPLOAD_CLICKS one).
Look at the browser URL bar. Find the parameter &ctId=.
Copy the numeric ID that follows (10–13 digits, e.g., 7336415901). This is your Primary ctId.
Repeat for the Secondary Goal. Save both IDs somewhere accessible — you will need them when configuring the automation in Phase 6 of the Implementation Guide.
Primary ctId → conversionAction in every uploadClickConversions API call (both the gclid path and the ECL path use the Primary ctId). Secondary ctId → used only if you implement a RESTATEMENT adjustment flow later (advanced, not required for the core Fortress).
Conversion Action Formatting Rules
The conversionAction field in the API payload must use the full resource name format. Do not use the AW-XXXXXXXXXX/LABEL format — that is the web tag format and is not accepted by the upload API.
customers/{customer_id}/conversionActions/{ctId}
// Example:
customers/8093239660/conversionActions/7336415901AW-XXXXXXXXXX/LABEL_XXXXXXXXXX
// This format is NOT accepted by uploadClickConversions.
// It works in GTM tags — not in API calls.{customer_id} is the 10-digit Google Ads client account ID with no hyphens (e.g., 8093239660). This is the account ID of the client account, not the MCC.
Consent Mode and the Diagnostic Layer
You will notice the Secondary goal (website pixel) records fewer conversions than the Primary goal. This is expected and correct — it is the tracking gap the Fortress was built to close.
SECONDARY · PIXEL
55–70%
of actual leads · EU/DE markets · depends on consent rate
PRIMARY · API LOOP
90%+
of actual leads · remaining gap is anonymous traffic with no Google attribution
If the Primary goal records fewer conversions than the Secondary goal, something is wrong with the API pipeline. Investigate the automation logs immediately.
The 72-Hour Diagnostics Protocol
Google Ads processes offline upload data with a delay. After your first successful API uploads, follow this protocol.
Wait 48–72 hours after the first confirmed upload (check your automation logs for HTTP 200 responses).
Navigate to Goals → Conversions → Summary. Click on your Primary goal.
Click the Diagnostics tab.
Check the Upload status panel. You should see:
→ Status: "Recording" (or "Excellent" with a match count)
→ Number of conversions matched and uploaded
→ Any partial failures with error codes (see Section 06 error table)
ERROR CODES
| CODE | MEANING | ACTION |
|---|---|---|
| UNPARSEABLE_GCLID | gclid value is malformed or a test value | Expected during QA. Not an error in production for test submissions. |
| CLICK_NOT_FOUND | gclid is valid format but Google cannot find a matching click | Check: upload within 90 days of click, correct customer ID, click was served by this account. |
| CONVERSION_ACTION_NOT_FOUND | ctId is wrong or belongs to a different account | Re-extract ctId from the URL bar in Goals → Conversions → Summary. |
| FUTURE_CONVERSION_DATE_TIME | Conversion timestamp is in the future | Timezone offset error. Check date formatting — YYYY-MM-DD HH:mm:ssZ, offset is mandatory. |
| INVALID_ARGUMENT | Payload structure error | Check JSON against API spec. Common: wrong resource name format, missing fields. |
The Enhanced Conversions diagnostics (visible on the Secondary goal) show the ECL match rate after the API loop submits email-only records. Expect 25–45% match rate. If consistently below 10%, investigate email quality — check for placeholder values, internal test submissions, or domain-level issues.
Ongoing Monitoring
The API loop should notify you on every execution. A healthy system produces:
Click conversion uploads for every Google-attributed lead
ECL upload attempts for leads without a gclid (no immediate match confirmation — check Google Ads Diagnostics 24–48h later)
No-attribution logs for organic/direct leads (expected, no action required)
Error alerts (investigate immediately — a broken pipeline means primary conversion tracking is dark)
Review the Diagnostics tab weekly during the first month after launch, then monthly. Compare Primary goal conversion count against the CRM's total new contacts for the same period. The gap should be explainable by organic/direct traffic volume.