Pixels
Google Ads Conversion Tracking for South African Stores.
Google Ads Conversion Tracking tells Google which clicks end in a Rand. Smart Bidding strategies like tROAS depend on it being accurate. This guide installs the conversion tag on Shopify (or any SA site), fires Purchase in ZAR, sets up Value Rules for VAT-inclusive vs VAT-exclusive reporting, and walks through the deduplication trap that halves revenue in Ads reports for most SA merchants.
Prerequisites
- A Google Ads account with billing in ZAR enabled
- Conversion action created under Tools > Conversions > +New conversion action > Website
- The Google tag or GTM container already on the site
- Access to edit theme.liquid or the Shopify Customer Events panel
Step 1. Create a Purchase conversion action
Google Ads > Tools > Conversions > +New > Website. Category: Purchase. Value: Use different values for each conversion. Count: One (per click). Click-through window: 30 days. View-through: 1 day. Attribution model: Data-driven. Name it "Purchase - Primary". Mark as a Primary goal.
Step 2. Grab the Conversion ID and Label
On the conversion action details page, click "Tag setup" > "Use Google tag". Copy the two values: AW-XXXXXXXXX (account) and the per-conversion label (e.g. abc123XYZ). You need both.
Step 3. Install via Google tag (gtag.js)
If you already run GA4 via gtag, add your AW- ID to the same gtag loader — a single script handles both. Paste this in theme.liquid. Note the tight ZAR currency format.
<!-- Google tag (gtag.js) - GA4 + Google Ads -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-XXXXXXXXXX', { currency: 'ZAR', country: 'ZA' });
gtag('config', 'AW-XXXXXXXXX');
</script> Step 4. Fire the Purchase conversion from checkout
In Shopify > Settings > Customer events > Add custom pixel. Send the conversion on checkout_completed. transaction_id must equal the Shopify order ID so Google can dedupe repeated clicks from the thank-you page being refreshed.
analytics.subscribe('checkout_completed', (event) => {
const c = event.data.checkout;
window.gtag && gtag('event', 'conversion', {
send_to: 'AW-XXXXXXXXX/abc123XYZ',
value: Number(c.totalPrice.amount),
currency: c.totalPrice.currencyCode, // 'ZAR'
transaction_id: String(c.order.id)
});
}); Step 5. Handle VAT-inclusive vs VAT-exclusive reporting
SARS VAT lands at 15 percent on most products. Google Ads reports whatever value you send. Most SA merchants send VAT-inclusive (full charged amount) for tROAS bidding and reconcile VAT-exclusive in Sheets. If you want Google to optimise on gross margin, send (value - tax - COGS) instead.
Step 6. Enable Enhanced Conversions-lite for parity
On the conversion action > Enhanced conversions > "Turn on" > Google tag. Enable. This layers hashed email and phone on top of the conversion so iOS 17 click-through still attributes. Full walkthrough in the Enhanced Conversions guide.
Step 7. Prevent double-counting across GA4 + Ads
If you import GA4 key events into Ads ("purchase") AND run the Ads conversion tag directly, you will double-count Purchases. Pick one: either the direct Ads tag (preferred, sharper attribution) OR the GA4 import (simpler). Do not mark both as Primary.
Step 8. Validate with Tag Assistant
Install Google Tag Assistant. Load your site with ?gclid=test, place a R1 test order, and confirm in Tag Assistant: "conversion" event fires once with value > 0 and currency "ZAR". In Ads Manager, give it 6 hours for the conversion column to update.
Step 9. Build a tROAS campaign around it
Once 50 conversions have landed in 30 days, switch the campaign bid strategy to Target ROAS. Start at 300 percent (R3 revenue per R1 spend) and let Google adjust. SA Performance Max campaigns typically need 30 to 50 conversions per month to leave learning.
SA gotchas
- Double counting purchases (direct Ads tag + GA4 import) is the number one reason SA merchants see inflated ROAS. Pick one path per conversion action.
- Sending "R" or omitting currency in the conversion call defaults to your Ads account currency. If the account is USD, every R1,000 sale reports as $1,000.
- Shopify's thank-you page can refresh, causing the conversion to fire twice. Use transaction_id = order.id so Google dedupes.
- Smart Shopping / Performance Max will burn budget with sparse conversion data. Wait for 30+ conversions before switching off Manual CPC.
- Google Ads counts clicks from Apple Private Relay IPs as organic in some regions. Enhanced Conversions closes this gap with hashed email.
Frequently asked questions
Is Google Ads conversion tracking POPIA compliant?
Yes with consent. The tag reads gclid and needs ad_storage granted. Under Consent Mode v2 with default denied, it falls back to modelled conversions while respecting consent.
Why does Google Ads revenue not match Shopify Admin?
Attribution windows (30-day click vs Shopify real-time), consent gating, and double counting. Expect 5 to 15 percent variance — anything bigger points to a tagging bug.
Do I need Enhanced Conversions if I already have CAPI for Meta?
Different platforms. Enhanced Conversions is Google's version. You want both running if you advertise on both networks.
Can I track leads (not purchases) for SA lead gen sites?
Yes. Create a "Contact" conversion action with a fixed value (e.g. R500 per lead). Fire it on form submit. Smart Bidding handles the rest.