You track in-store purchases from online ads by sending the sale back to Google and Meta as an offline conversion. The customer buys in your shop, your staff record their phone number or email, and that record is matched against the people who clicked your ads. Google calls it offline conversion import, Meta calls it offline events. You can wire it up with Zapier in an afternoon and you do not need a developer.
The short version
- Ad platforms only see the browser. A cash sale at your counter is invisible to them.
- You need three things: a click ID stored on the customer record, a phone number at the till, and somewhere to hold both.
- Above 40 percent match rate on phone number is healthy in the UAE.
- The real win is not the reporting. It is that the algorithm starts finding walk-in buyers.
This is the single biggest blind spot on UAE retail accounts, and almost nobody talks about it.
The setup is common. A store has a website, runs ads, and also has a physical shop. The ads get judged on online orders alone. Meanwhile a good chunk of the people who clicked the ad walked into the shop and paid at the counter, and not one dirham of that shows up in Ads Manager.
So the ads look worse than they are. The owner cuts budget on campaigns that were working. We have watched it happen more than once, and it is entirely avoidable.
We built this pipeline for a UAE craft supplies store that sells both online and from a physical shop. Here is exactly how it works.
Why your ad platform cannot see in-store sales
Google and Meta only know what happens in a browser. A pixel fires on your thank you page, and that is the end of what they can observe.
Someone clicks your ad on Tuesday, thinks about it, drives to your shop on Saturday and pays cash. There is no pixel anywhere in that story. The platforms cannot join those two events unless you join them yourself.
That is what an offline conversion upload does. You hand the platform a list that says “these people bought, on this date, for this amount”, and it matches them back to ad clicks it already has on file.
The match happens on hashed data. An email or phone number gets scrambled before it leaves your side, and the platform compares scrambled values. Nobody is emailing a customer list in plain text.
What you need before you start
Three things. Only three.
One, a way to capture the customer at the counter. A phone number is enough in the UAE, because almost everyone hands one over for the receipt or the loyalty scheme. Email works too. If your point of sale already collects this, you are most of the way there.
Two, the click ID stored against that customer. This is the part people miss. Google needs the GCLID, Meta needs the fbclid. If the customer first landed on your site from an ad, that ID is sitting in the URL. Store it in a first party cookie, and if they ever fill in a form or join your list, save it against their record.
Three, somewhere to hold the data. A Google Sheet is genuinely fine to start with. That is what we used. You can graduate to something serious later, and most people never need to. Both platforms document the file formats they accept: Google offline conversion imports and Meta offline events.
The Zapier setup, step by step
This is the pipeline. It has been running for over two years.
Step 1. Capture the click ID on the website. Add a small script that reads gclid and fbclid from the URL and drops them into a first party cookie lasting 90 days. Every form on the site then passes that cookie value through as a hidden field.
Step 2. Build the customer record. When someone fills in a form, joins the newsletter or buys online, the phone number, email and click ID all land in one row of a Google Sheet.
Step 3. Record the in-store sale. When a sale happens at the counter, staff enter the customer phone number and the amount. On Shopify POS this is automatic. On a simpler setup, a shared form on a tablet at the till does the job perfectly well.
Step 4. Match and send. Zapier watches for new in-store sales, looks up the phone number in the customer sheet, finds the stored click ID, and fires two actions: a conversion upload to Google Ads and an offline event to the Meta Conversions API. Both carry the sale amount and the timestamp.
Step 5. Check the match rate. Google shows you how many uploaded conversions it managed to attribute. Meta shows a match quality score. Above 40 percent on phone number is workable. Below 20 percent and something upstream is broken, almost always the click ID.
What changes once it is running
Two things change, and the second matters more than the first.
The obvious one: your reported revenue goes up, because sales that were always happening finally get counted. Here is what that looks like in Ads Manager once the offline column starts filling.

The less obvious one: the bidding gets smarter. Google and Meta optimise towards whatever you tell them a conversion is. Feed them online orders only and they chase people who buy online. Feed them in-store sales too and the algorithm starts finding people who behave like your walk-in buyers.
On a business where the shop is a real revenue channel, that is a different and better audience. This is the part that pays for the afternoon of work.
On the same account, Google spend sits at roughly AED 18,000 to AED 20,000 a month and has held a 4x to 5x return for over two years. The most recent 90 day window: AED 213,502 in conversion value on AED 39,372 in spend, 5.1x, 573 conversions.

Across all channels the store did AED 478,539 in sales in one quarter, up 13 percent, with a 51.6 percent returning customer rate. That is the whole store, not paid only. It is the number the owner banks.
Uploading too late. Google rejects conversions older than 90 days and Meta has similar limits. Run the Zap daily, not monthly.
Wrong phone format. The UAE has three common formats for the same number: 0551234567, 971551234567 and +971551234567. A mixed sheet collapses your match rate. Normalise everything to E.164 with the plus and country code before it is sent.
Double counting. If someone orders online and you also log the pickup as a walk-in, you have counted one sale twice. Give in-store sales their own conversion action so you can always separate the two streams.
Trusting the match rate blindly. A high match rate on low volume usually means only loyalty members are getting matched. Check what share of your total in-store sales have a customer record at all, not just how many matched.
Is this worth doing for your business?
If the shop is a small side channel and nearly everything sells online, skip it for now. The setup will not pay back.
If you are a UAE retailer where a meaningful share of revenue crosses a physical counter, and you are running paid ads at the same time, this is one of the highest value things you can do. You are not buying more traffic. You are letting the platforms finally see sales you were already making.
One note on scope, since we would rather be believed than impressive. We built this for one account. It is not something we run on every client, and it is not a magic switch. It is plumbing. It takes an afternoon and then it quietly works.
Running ads and a physical shop at the same time?
If your counter sales are invisible to Google and Meta, you are almost certainly under-reporting your best campaigns. Send us the account and we will tell you what is missing and whether the fix is worth your time.
Get a free tracking reviewSee the accounts we have done this on or what we handle end to end.
Frequently asked questions
Can I track in-store sales without Zapier?
Yes. Google Ads accepts a scheduled CSV upload of offline conversions straight from a Google Sheet, and Meta accepts an offline event file upload. Zapier just runs the job daily so nobody has to remember. Shopify POS and several UAE point of sale systems can also push offline events natively.
Do I need customer consent to upload this data?
You need a privacy policy that states you share hashed customer data with advertising platforms for measurement, and customers need a way to opt out. The data is hashed before it leaves your systems, but the disclosure still has to exist. Check it against the UAE Personal Data Protection Law before you switch anything on.
How long does the setup take?
An afternoon for the Zapier side, if your click IDs are already being captured. If they are not, add a day to get the cookie script and the hidden form fields in place first. That first part is the real work and it is the part people skip.
What match rate should I expect?
Above 40 percent on phone number is a healthy result for a UAE retail account. Under 20 percent almost always means the click ID was never stored, not that the matching is failing. Check the source before you blame the platform.
Does this work for clinics and service businesses?
Yes, and arguably better. A clinic that captures a lead on Meta and completes a treatment three weeks later has the same blind spot. Send the completed booking back as an offline conversion and the algorithm starts finding people who show up rather than people who fill in forms.
Will this make my reported ROAS go up?
Your reported ROAS will rise, because sales that were always happening finally get counted. Nothing about the business changed on the day you switched it on. Do not treat the jump as growth, treat it as the measurement finally catching up.