Upload offline conversions from Google Sheets or CSV
A spreadsheet is a fine place to start with offline conversions, as long as you set it up right. Here is the column layout, the checks to run before you upload, when to use a CSV and when to feed sales live, and how DataCops sends it all to 8 ad platforms.

Trusted by agencies and brands running paid media










What are offline conversions from a spreadsheet?
Many teams keep their real sales in a sheet: a list of who bought, when and for how much. Uploading that list tells the ad platforms which people became customers, so they can find more like them. It only works if each row can be matched to a person and is sent while the platform still accepts it.
DataCops handles this two ways. For past customers, Ads Warmup takes a CSV. For sales you add from now on, a Google Sheets automation, or Zapier, Make or n8n, posts each new row to your private sales webhook, and DataCops sends it as the sale happens.
DataCops takes a CSV of past customers through Ads Warmup and a live feed of new sales through a webhook, and sends both to Meta, Google Ads, TikTok, LinkedIn, Microsoft Ads, Reddit, Pinterest and X.
What your ads learn from
How a CSV becomes conversions
Upload, check, send. Ads Warmup does the matching and the formatting for each platform.
- Step 01
Stages your CRM reports
Booked call ReportedShowed up ReportedWon, with value ReportedUpload your CSV, up to 20,000 rows. DataCops reads the columns it recognises.
- Step 02Finding the ad click againWon dealby email or phoneAd click, 23 days earlierMatched
Each row is matched by click ID or hashed email and phone, with a match score.
- Step 03Saved on yourdomain.comfbclid from Meta Keptgclid from Google Ads Keptttclid from TikTok KeptKept for up to 90 days
Pick the event and the platforms. A dry run shows what would go out.
- Step 04Won deal sent
Meta Sent once
Google Ads Sent once
TikTok Sent once
LinkedIn Sent once
Send. Each platform gets real conversions through its own API, counted once.
Preview and match scores are free. Sending needs the Business or Organization plan.
The sheet layout that works
One row is one sale or one step in a sale. Keep the header row in plain lowercase, and format every column as plain text before you paste anything in. That single habit prevents most upload problems.
- email: the customer's email address, no spaces.
- phone: with the country code, for example +14155550137. Format the column as text, or the plus sign and leading zeros disappear.
- event: the stage, such as lead, booked, won or paid.
- date and time: when the event happened, in one consistent format.
- value: the amount as a plain number, no currency symbol or thousands separator.
- currency: a three-letter code such as USD, GBP or EUR.
- order_id: your own ID for the sale. The same order ID sent twice counts once, so this is what protects you from doubles.
- click ID columns: gclid, wbraid or gbraid for Google, fbclid, fbc or fbp for Meta, ttclid for TikTok, li_fat_id for LinkedIn, msclkid for Microsoft, rdt_cid for Reddit. Format as text. A click ID that a spreadsheet turns into a number or scientific notation cannot be matched.
You do not need every column. DataCops recognises many common column names, so a sheet exported from your CRM usually works with little or no renaming.
Four checks before you upload
Spend two minutes on these and you avoid most rejected rows.
- Every row has an email or a phone number, ideally both. A row with neither cannot be matched to anyone.
- Phone numbers carry the country code and click ID columns are set to text, so nothing was reformatted on the way in.
- Duplicates are gone. Give every sale an order ID, and remove rows for the same sale that appear twice.
- Dates are honest. The event dates are real, and you know which platform limits they fall inside: 7 days for Meta, 90 days after the click for Google Ads.
Ads Warmup: send past customers
Ads Warmup is the DataCops tool for lists. It sends known people, or an uploaded CSV, as real conversions to the ad platforms you pick. It is how you give a new ad account, or a new campaign, a head start: the platforms learn what your buyers look like before the first click.
How it works
- Upload or pick people. Upload a CSV of up to 20,000 rows, or pick people DataCops already knows from your site.
- Preview. DataCops reads the columns, cleans the details and shows a match score from 0 to 10 for each person. The score is our own estimate: an email adds the most, then phone, name, click ID, country and city. Previews last 24 hours.
- Choose the event. Lead, Purchase, CompleteRegistration, AddToCart or Schedule.
- Choose the platforms. Any of the 8 you connected. Platforms you did not pick are skipped and logged as not selected.
- Dry run, then send. A dry run is free and shows what would go out. Then one click sends the batch. If some rows fail, you can resend just those, free.
A same-day resend of the same person and event does nothing, so an accidental double upload never doubles your numbers. Preview and scoring are free on every plan. Sending needs the Business plan ($59 a month, $49 yearly) or Organization ($359 a month, $299 yearly). Read more on Ads Warmup.
The one thing to remember
A warmup list is sent today. It is right for a customer list you want the ad platforms to learn from now, and wrong for pretending old sales happened this week. Platforms also apply their own lookback windows, so very old sales may be refused. Send recent customers for the strongest signal.
The live feed: send new sales as they happen
For sales you add from today, skip the upload. Add each new row to the sheet, and let Google Sheets, Zapier, Make or n8n post it to your private DataCops sales webhook or the conversions API. DataCops sends it the same day.
Each post needs the event name and an email or phone. Value, currency, an order ID and click IDs are optional. Every post is logged in plain words: sent, not sent, duplicate, ignored or rejected. The same messageId sent twice counts once, so a Zap that fires twice is harmless.
The live feed has one more advantage: DataCops can join the row to the visitor it already saw on your site. The script keeps each ad click on your own domain, and a buyer who gives the same email can be linked to that first click. So a sheet row with only an email can still reach the platforms with the original click ID.
Which route, past customers or new sales?
- A one-off list of customers you already have: Ads Warmup CSV.
- Every new sale from now on: the live feed by webhook.
- Both: most teams do both. Warm up once, then keep the feed running.
If your sales already live in HighLevel, you do not need a sheet at all: the free DataCops app sends booked, showed and won stages on its own. See HighLevel conversion tracking.
The platform time limits
Meta rejects events sent more than 7 days after they happened. Google Ads ignores uploads more than 90 days after the click, and enhanced conversions for leads, which match on hashed email or phone, have a 63-day window. Microsoft Ads accepts events within 7 days of when they happened.
These limits are why the date column matters and why a sheet full of last year's sales does not behave like fresh conversions.
Why a monthly upload loses rows
This is a made-up example to show the arithmetic, not a customer result. A shop closes 40 sales in June. It uploads one CSV on 30 June.
The 8 sales from the last week of June are inside Meta's 7-day limit and are accepted. The 32 earlier ones are more than 7 days old, so Meta rejects them. Google Ads is kinder: all 40 are inside 90 days of the click, provided the click ID survived.
So one upload gives Meta 8 of 40 sales, or 20 percent. Sending each sale on the day it closes gives every platform all 40. The fix is not a better spreadsheet. It is a shorter gap between the sale and the send.
What happens to each row
Every row goes through the same path as any other DataCops conversion:
- Hashing. Emails, phones and names are cleaned and SHA-256 hashed before they leave our servers.
- Consent. The server re-checks consent before every send. For EU, UK and Swiss visitors DataCops saw on your site, nothing goes out until they opt in.
- One sale, one conversion. A purchase with an order ID is sent once per platform for 400 days, even if the pixel and a webhook also report it.
- Refunds. Post a refund with the order ID and Google Ads is corrected: a full refund is retracted, a partial one lowered. Meta and TikTok offer no correction call. See refunds.
- Delivery report. Per platform, see what was sent, skipped or failed, with a plain-English reason and the value sent.
The rest of the chain, once the script is on your site
A sheet is often the first step. The same DataCops account also runs the site side, so you can retire the sheet bit by bit:
- Built-in cookie banner. Shown in Europe by default, built to the IAB TCF v2.2 standard, with Google Consent Mode v2 on by default.
- Real people only. A per-platform switch, off by default, that keeps bot and datacenter traffic out of what each platform receives. VPN, proxy and Tor can be added.
- CRM sales without a sheet. DataCops can hold a lead and send it once your CRM marks it qualified. HubSpot is checked every 5 minutes, other systems use the release API, and held leads expire after 14 days. Salesforce and Pipedrive post through the webhook, directly or via Zapier, Make or n8n.
- Click fraud tools on Organization. Block bot IPs at the Cloudflare edge, and export refund evidence for Google's Click Quality form covering the last 60 days. Google decides the refund.
Good to know before you start
- DataCops takes your sheet as a CSV upload or as new rows posted by an automation.
- Ads Warmup preview is free; sending needs Business or Organization.
- Clean the list before you send: rows from a file come from you, so remove test and junk rows first.
- The Free plan includes 2,000 sessions for the site script. See pricing.
Filter fake leads before you send
A bot that fills in your form becomes a lead your ads try to find more of. DataCops checks every visit for bots and datacenter traffic, and for VPNs and proxies if you choose. Switch on Real people only for a platform and flagged visits never reach it.
Sales that come from your CRM are sent as your CRM reports them, with no bot check, so qualify them there before you send.
How DataCops spots botsEverything else DataCops does around the send

One first-party script, served from your own domain
- Runs first-party from datacops.yourdomain, not a blockable third-party host
- One script, one CNAME, live in about 5 minutes, no container to host
- Server-side collection on Cloudflare's edge, close to every visitor
- Captures click IDs at the network level, so fbclid and gclid still reach your CAPI feed after browsers strip them
- Recovers 15 to 25% of the sessions other setups lose
Traffic Visibility
First-Party Script
Blockers and ITP cut your sessions
Set up a sheet or CSV feed
About 5 minutes for the site, then upload once or connect the sheet.
- Step 1code
Add the DataCops script
One script and one DNS record keep every ad click on your own domain. - Step 2upload_file
Upload past customers
Send the CSV through Ads Warmup, up to 20,000 rows per batch. Preview free, send on Business or Organization. - Step 3hub
Feed new sales live
Post each new sheet row to your private sales webhook so it goes out the same day.
Offline conversions from Google Sheets or CSV with DataCops, in short
DataCops is a tool that sends a spreadsheet of customers to Meta, Google Ads and TikTok with Ads Warmup, up to 20,000 rows per upload with a match score for every person, and feeds new sales live by webhook.
How DataCops does it
Upload a CSV or sheet
Export your Google Sheet as a CSV. DataCops reads your columns, and only email is required. The preview and the 0 to 10 match score are free, and a preview stays for 24 hours.
Pick the event and platforms
Lead, Purchase, Complete registration, Add to cart or Schedule, to Meta, Google Ads and TikTok. On Google Ads they go in as click conversions, so Google credits only people who clicked a Google ad.
Dated when you send
Every row is dated when you press send, not with the original sale date. Sending needs Business or Organization. Dry runs and resending failed rows are free, and a same-day resend is a no-op.
Feed new sales live
A spreadsheet is fine to start. For new sales, post each row to the private sales webhook from an automation so every sale lands inside the platforms' time windows. An order ID means a repeat counts once.
Clean the list first
Rows from a file come from you, so remove test and junk rows before you send. Every visit to your site gets a bot verdict against 360+ billion IPs, with a Real people only switch per platform, off by default, and every form email is checked for disposable providers, domains with no mail server and an email risk score.
Capture the click and see every send
One script and one DNS record collect on your own domain, click IDs are kept for up to 90 days, and a signed server-set cookie lasts up to 400 days where enabled. A delivery log row shows each send as sent, held, skipped or failed with the reason.
Best for: small teams and agencies who keep customers in a spreadsheet and want them in Meta, Google Ads and TikTok today, with a path to live feeds.
Free to start. See pricing.
When not to use DataCops
One file, one platform, once
Meta Events Manager has a manual Upload events option, and Google Ads has its own CSV upload. For a single one-off file, those may be enough.
You need other platforms from a CSV
This page documents Ads Warmup for Meta, Google Ads and TikTok. Check the connected platform list in your dashboard before planning a list for another platform.
You want original sale dates kept
Rows are dated when sent. A CSV gives a campaign buyers to learn from; it does not credit old ads with old sales.
You need bot checks on a file
Rows from a file come from you. Remove test and junk rows first. Events from a CSV carry no bot flags.
Sources
Platform rules checked October 2026. Rules change; check the platform's own page before you build.
FAQ
Yes. Export the sheet as a CSV and upload past customers through Ads Warmup, or have Google Sheets, Zapier, Make or n8n post each new row to your private sales webhook so it goes out as it happens.
Works with the rest of DataCops
Conversion API
Server-side conversions to Meta, Google Ads and TikTok, no code.
See Conversion APIAds Warmup
Feed your customer list to the ad platforms before you spend.
See Ads WarmupLeadCops
Verified leads, and conversions only once a lead qualifies.
See LeadCopsOffline Conversions
CRM, store and CSV sales matched back to the ad click.
See Offline ConversionsStop losing rows to a monthly upload
Start free, then send new sales the day they close.
Setup in 5 minutes. No credit card.