Google Ads
Beginner-friendly end-to-end guide. Start here if you've never set up a Google Ads conversion before — every term is defined, every click is documented, every common error is covered.
This guide assumes zero prior experience with Google Ads APIs, OAuth, gtag, or pixel tracking. If you already know all these terms, you can skip to the illustrated manual setup guide which is more reference-style.
What you'll have at the end
After completing this guide, every time a visitor on your customer's website fills a form, makes a purchase, clicks a phone number, or any other action you care about, that conversion will show up in Google Ads. Google can then optimise their bidding to find more people who will do that same action — i.e. the entire reason for running paid ads in the first place.
Concretely, the data flow is:
Visitor on merchant.com
↓
pb.js (loaded once in <head>)
↓
pbq("track", "Purchase", { value: 199, currency: "TRY" })
↓
┌──────────────────────┐ ┌──────────────────────┐
│ Server-side path: │ │ Browser-side path: │
│ AdsPing backend → │ │ pb.js loads gtag.js │
│ Google Ads API │ │ → googleadservices │
│ (Conversions API) │ │ .com directly │
└──────────────────────┘ └──────────────────────┘
↓ ↓
Google Ads Dashboard (deduplicated by gclid + timestamp)AdsPing fires both paths for you. Google deduplicates them so the conversion is counted exactly once. Server-side has better attribution (iOS Safari, ad-blocker resistance); browser-side works immediately even before Google has approved your Conversions API access. Together they cover every visitor.
Vocabulary (read first)
Google's docs assume you know these. If even one of these terms is fuzzy in your head, the rest of this guide won't make sense. Skim it once.
Google Ads account
The customer-facing account that runs ads. Each one has a 10-digit Customer ID shown top-right in Google Ads (formatted like 123-456-7890). You'll see this ID in the URL bar of every Google Ads page after you log in.
MCC (Manager Account)
A "manager" Google Ads account that can hold + manage many regular accounts under it. Agencies use MCCs to organise client accounts. You only need to know about MCCs if you're an agency or your developer token is registered to one. For most single-business AdsPing users this isn't relevant.
Conversion action
A specific user behaviour that Google Ads tracks. Examples:
- Lead — someone filled a contact form
- Purchase — someone completed checkout
- PhoneCall — someone clicked the phone number on the site
- AddToCart — someone added something to cart
- SignUp — someone created an account
Each conversion action has its own ID and label. You can have up to ~50 conversion actions per Google Ads account. One AdsPing pipeline = one Google Ads conversion action. If you want to track 3 different things (Lead, Purchase, PhoneCall), you'll create 3 pipelines.
Conversion ID + Label
Two strings that together uniquely identify a conversion action. They're in every gtag snippet Google generates:
'send_to': 'AW-17521972457/ufKLCP6P-6ocEOmpkKNB'
└─────┬─────┘ └────────┬────────┘
ID LABEL- Conversion ID (
AW-...) — same for every conversion action in the same Google Ads account - Conversion Label (random string after the
/) — different for each conversion action
OAuth
How AdsPing gets permission to send events to your Google Ads account without you sharing your password. You click "Connect Google Ads" in AdsPing, Google shows a consent screen, you approve. Google then gives AdsPing a refresh token — a long string that's saved encrypted in our database and used to make API calls on your behalf. You can revoke it any time from your Google account settings.
Developer token
A separate credential that the AdsPing platform holds (you don't need to know yours). It identifies AdsPing as the application to Google's API, separately from individual user OAuth tokens. Has three access levels:
AdsPing's developer token authorises us to call Google's API on every merchant's behalf. You don't need to know the value — it's managed centrally and rotated periodically.
gclid
A unique identifier Google appends to every link from a Google ad click. Example URL after someone clicks an ad:
https://merchant.com/landing?gclid=Cj0KCQiAi9-PBhCJ...
Without a gclid, Google can't link a conversion to the original ad click — so the conversion is recorded but it's not attributed to any specific campaign or ad. Visiting your site directly (typing the URL) produces zero gclids — that's why test conversions from your own browser often don't show up in campaign reports.
pb.js
AdsPing's tracking script. One <script> tag in your customer's site <head> covers Meta, TikTok, Google Ads, GA4, and GTM together. It exposes a global pbq(action, eventName, eventData) function the merchant's site can call to fire events.
Pipeline
In AdsPing, a "pipeline" = one event-to-destination wiring. For Google Ads, each pipeline binds a pb.js event name (e.g. Purchase) to a Google Ads conversion action (e.g. 987654321). When the event fires, the pipeline forwards it to Google.
Prerequisites checklist
Before you start clicking, confirm you have all of these. If you miss one, you'll hit a wall halfway through and have to come back.
- A Google Ads account. Not Google Analytics, not Google Tag Manager — specifically Google Ads. If you don't have one, create it at ads.google.com. The account doesn't need any active campaigns yet.
- Admin or Standard access on that Google Ads account, signed in with the same Google account you'll use for OAuth. Check at Google Ads → Tools (top-right gear) → Access and security. If you see your email with role Admin or Standard, you're fine. Read-only / Email-only access is not enough — AdsPing can't write conversions with those.
- The site has
<script src="https://api.adsping.io/pb.js" data-pixel-id="...">in<head>. If you haven't added this yet, do that first — see Install. - You know what conversion action(s) you want to track. Decide before you start. The most common ones are listed in the decision tree below.
Decide which conversion type to create
Different conversion types have different setup paths. Pick yours before continuing — the steps that follow assume you know which.
A. Lead form submit (most common)
Visitor fills a contact form. Use this for service businesses, B2B lead-gen, healthcare, real estate, etc.
- Google conversion type: Website → Submit lead form
- pb.js event name to map:
Lead - How pb.js fires it: auto-detected on form submit (no merchant code needed)
B. Purchase (ecommerce)
Visitor completes checkout. Use this for Shopify, WooCommerce, or custom carts.
- Google conversion type: Website → Purchase
- pb.js event name:
Purchase - How pb.js fires it: auto-bridged from GA4 dataLayer push, or merchant calls
pbq('trackPurchase', { value, currency, orderId })
C. Phone call / Click-to-call
Visitor clicks a phone number link on the site. Common for service businesses where the "conversion" is a call. This one has multiple sub-types in Google Ads — most of them DON'T work with AdsPing.
- Google conversion type: Phone calls → Clicks on your phone number on a mobile website (or the equivalent "website" variant)
- pb.js event name:
PhoneCall - How pb.js fires it: auto-detected when a visitor clicks any
<a href="tel:...">link
D. Other events
Common ones AdsPing supports out of the box: AddToCart, InitiateCheckout, ViewContent, SignUp, WhatsAppClick, Contact, AppointmentRequest. For each one you want in Google Ads, create a separate conversion action with Goal: Custom and name it after the event.
Step-by-step walkthrough
This walkthrough creates one conversion action and wires it into AdsPing. Repeat steps 1-3 for each additional conversion. The screenshots that go with each step live in the illustrated manual guide; this page is the textual walkthrough.
Step 1 — Create the conversion action in Google Ads
- Log into ads.google.com. Confirm the top-right shows the correct Customer ID for the customer you're setting up.
- Click Tools (top-right gear) → Conversions.
- Click + New conversion action.
- On the "Select the data sources" screen, tick what applies — usually Conversions on the website (and optionally Conversions obtained from phone calls if you want phone tracking). Click Save and continue.
- Choose the conversion type per the decision tree above. Fill in settings: name, value, counting, click-through window. See recommended settings.
- When the wizard finishes (3-step summary screen), click Show the event snippet on the row for your new conversion. The snippet appears with a
send_toline. - Copy two things from the snippet:
- Conversion ID — the
AW-...part before the/(e.g.AW-17521972457) - Conversion Label — the string after the
/(e.g.ufKLCP6P-6ocEOmpkKNB)
- Conversion ID — the
Step 2 — Find the Conversion Action ID
The Conversion ID + Label you just copied are for the browser-side path. For server-side, AdsPing also needs the Conversion Action ID — a numeric value Google doesn't put in the snippet. You'll find it in the URL.
- From Tools → Conversions, click the action you just created. You'll land on the action's detail page.
- Look at the URL bar. It will look like:
https://ads.google.com/aw/conversions/customers/3884688380/detail?ctId=987654321
- The number after
ctId=is your Conversion Action ID. Copy it (e.g.987654321). - The number after
customers/is your Customer ID. You don't need to copy this — AdsPing pulls it automatically from OAuth.
Step 3 — Connect Google Ads in AdsPing
- In AdsPing, open the pixel for this site: Dashboard → Pixels → click your pixel.
- Go to the Destinations tab.
- You'll see a top banner: Connect your Google account (one sign-in unlocks GA4, Google Ads, GTM Server). Click Connect Google.
- A Google consent screen pops up. Pick the Google account that has access to the Google Ads account you set up in Step 1. If you have multiple Google accounts, double-check this — the wrong one is the #1 cause of "account not found" errors later.
- Approve the requested permissions (analytics.readonly, tagmanager.readonly, adwords). You'll return to the pixel page.
- The Google Ads card on the page should now show Set up first conversion action instead of Connect Google Ads. Click it.
- Fill in the form:
- Name: human-readable label (e.g. "Form lead — Acme" or "Phone clicks")
- Google Ads customer: pick from the dropdown (auto-populated from OAuth). If you don't see your account here, see troubleshooting.
- Conversion Action ID: the numeric value from Step 2 (e.g.
987654321) - Event name filter:
Lead,Purchase,PhoneCall, etc. - gtag Conversion ID:
AW-...from Step 1 (recommended) - gtag Conversion Label: the label string from Step 1 (recommended)
- Click Save. A new pipeline appears in the Pipelines list at the bottom of the page.
Verify it's working
Don't assume it works — test it. Three layers of verification, easiest first.
Layer 1 — AdsPing Recent Events (instant)
- In AdsPing pixel page, scroll to Recent events at the bottom.
- On a separate tab, open the merchant's site and trigger the conversion (submit a test form, click a phone link, etc.).
- Within 5-10 seconds, the event should appear in Recent events with a green Success badge.
If you see Failed, click the event to see the error — most likely PERMISSION_DENIED if Basic Access isn't granted yet.
Layer 2 — Tag Assistant Browser Extension (real-time)
For the gtag (browser-side) path:
- Install Google Tag Assistant: install the official Tag Assistant Legacy Chrome extension from the Chrome Web Store.
- Open the merchant's site in Chrome with Tag Assistant active.
- Trigger the conversion. Tag Assistant will pop up showing the
AW-...tag firing with the correct conversion label.
Layer 3 — Google Ads Dashboard (3-24 hour delay)
Google Ads UI has a real delay before conversions appear. Test conversions you fire today may not show up until tomorrow. This isn't a bug; it's normal Google attribution processing time.
- Google Ads → Tools → Conversions.
- Click the conversion action.
- Recent conversions tab. Wait 3-24 hours.
Server-side vs browser-side — why both
AdsPing fires conversions through two independent paths. Each has strengths the other doesn't.
Server-side (Google Ads Conversions API)
- How: AdsPing backend calls
customer.uploadClickConversionswith the gclid + value + currency. - Pros: bypasses ad-blockers, immune to iOS Safari ITP, doesn't depend on JavaScript executing in the browser. Better attribution overall (~95% vs ~65% for browser-only).
- Cons: requires Basic Access on AdsPing's developer token. If we haven't been approved yet, these calls fail with PERMISSION_DENIED.
Browser-side (gtag fallback)
- How: pb.js loads
https://www.googletagmanager.com/gtag/jsand callsgtag('event', 'conversion', { send_to: 'AW-XXX/YYY' })from the visitor's browser, just like a manual Google Ads tag would. - Pros: works immediately without any approval. Same network path Google uses for its own Tag Manager — no special API auth needed.
- Cons: blocked by ad-blockers (~10-20% of users), weakened by iOS Safari ITP (~30% of mobile users have weaker attribution), needs JavaScript to run.
Why running both is correct
Google Ads deduplicates conversions by gclid + timestamp. When the same conversion arrives twice (once server-side, once browser-side) within a short window, Google keeps one and discards the other. You can't double-count by running both. Running both is strictly better:
- If both succeed → Google dedups by gclid + timestamp and keeps one copy. No double-counting.
- If the visitor has an ad blocker → browser-side gtag is blocked, server-side becomes the only path that delivers.
- If a network hiccup drops one upload → the other still delivers, so the conversion is recorded.
Troubleshooting
Google Ads customer dropdown is empty after OAuth
Likely cause: the Google account you OAuth'd with doesn't have access to any Google Ads account. Fix: go to ads.google.com signed in as the same Google account → confirm you can see the target Google Ads account in the top-right account switcher. If you can't, ask the account owner to add you (via Tools → Access and security in Google Ads).
If you signed in with the wrong Google account, click Switch account on the AdsPing Google banner to re-OAuth with the correct one.
Recent events shows "PERMISSION_DENIED" / "The caller does not have permission"
Likely cause: the OAuth token granted to AdsPing doesn't have write access on the conversion action you wired. The Google account you authenticated with may have Read-only or Email-only access on the Google Ads account.
Fix:
- Go to Google Ads → Tools → Access and security and confirm your Google account has Admin or Standard access on the account you're forwarding to.
- If access was recently changed, reconnect: in AdsPing open the pixel → Destinations → Google Ads card → Reconnect. Re-authenticate with the correctly-privileged account and the pipeline will resume.
Tag Assistant shows the conversion firing, but it's not in Google Ads dashboard
Three possible causes, in order of likelihood:
- It's too soon. Google Ads UI lags 3-24 hours behind reality. Wait a day, check again.
- No gclid in the conversion. Click one of your own ads in Incognito mode to get a real gclid, then trigger the test. Direct navigation = no gclid = no campaign attribution.
- You're looking in the wrong report. Open the conversion action directly → Recent conversions tab. The campaign-level "Conversions" column has more attribution rules and filters out unattributed events.
Conversion fires in AdsPing but as the wrong type
Likely cause: mismatch between pb.js event name and the pipeline filter. The pipeline says "fire on Lead", but the merchant's site fires SubmitForm or similar non-standard name.
Fix: verify the merchant's site fires the exact event name your pipeline expects. The auto-form-detection in pb.js fires Lead by default; if the merchant has custom code, ask them to use the standard event names.
I want different Google Ads accounts for different events
Possible — each AdsPing pipeline can have its own customer ID. When creating the second pipeline, pick a different customer from the Google Ads customer dropdown. They'll use the same OAuth token as long as the connected Google account has access to both.
If you need different Google accounts for different conversion actions (e.g. Lead goes to client A, Purchase goes to client B), you currently need to OAuth twice — the AdsPing pixel only stores one set of Google credentials at a time. Talk to us if this is a blocker.
FAQ
Can I use AdsPing without Basic Access?
Yes — browser-side gtag works immediately. You lose ~30% of attribution (iOS Safari + ad-blocked users) but conversions still get counted in Google Ads. Many AdsPing accounts launch with gtag-only and migrate to server-side later when Basic Access lands.
Do I have to fill in the gtag fields if I have Basic Access?
Recommended yes. Even with Basic Access, ~10-20% of your visitors have ad-blockers that don't block the AdsPing event post (the event still reaches our server) but do block Google's response if you only relied on browser-side. Running both = full coverage.
How do I delete or disable a conversion?
Pixel detail → Pipelines section → find the pipeline → click Edit → toggle Enabled, or click Delete to remove the pipeline entirely. Deleting the pipeline doesn't touch the conversion action in Google Ads — only the AdsPing forwarding stops.
Why is there a 24-hour delay before conversions appear?
Google explicitly states this in their docs: "Conversions can take up to 3 hours to appear in your account and up to 24 hours for the data to be fully reported." This is a Google-side processing window — AdsPing forwards the event in milliseconds, but the Google Ads UI itself has the delay baked in.
What if the customer revokes the OAuth?
If the customer goes to myaccount.google.com/permissions and revokes AdsPing's access, server-side uploads start failing with UNAUTHENTICATED immediately. The pipeline flips to "Auth failed" in AdsPing. Click Reconnect on the pixel page and re-OAuth. Browser-side gtag continues working even if OAuth is revoked (it's public-key based).
Can I do this for many customers at once?
Each customer is its own AdsPing pixel and its own Google Ads account. The setup is per-pixel — repeat the walkthrough for each customer. The OAuth token is per-pixel too; you don't share it across pixels.