Why Paid Signal exists

Your ads are optimising on orders. You get paid on money.

On cash on delivery those are not the same number — and the gap between them is exactly what your ad platform has spent your budget learning from. This page explains what that costs you, what changes when you fix it, and the one thing you have to do for any of it to work.

Start a free trial See what it costs first Everything switched on · no card required

The problem

When someone checks out, your pixel fires a Purchase event. Meta, TikTok and Snapchat take that as truth: this person converted — go and find more like them.

On a prepaid store that is fair enough. The card was captured at checkout, so an order really is a sale. On cash on delivery it is not. The order is a promise to pay.

Some promises turn into cash at the door. Plenty do not: the parcel is refused, nobody answers, the address is wrong, the customer changed their mind somewhere between the ad and the knock. Your ad platform never hears about any of it. It learned from the order and moved on.

The gap in one line

Your pixel measures intent. Your bank measures money. On COD those two numbers drift apart — and every campaign you run is optimising against the first one.

What it actually costs you

Take a simple month. The numbers below are made up — the shape is what matters, and yours will be different:

Without Paid Signal

100

conversions reported

The pixel counts every order at checkout. Your campaigns optimise toward all 100, and every audience you build is seeded from all 100.

But only 60 of them paid you. The other 40 taught your campaigns to go and find more people who order and never pay — and they are sitting inside every audience you have seeded since.

With Paid Signal

60

conversions reported

One event per order, fired only when the money is confirmed. Fewer events — and every one of them is a customer who actually paid.

If someone later refunds, or the parcel comes back, that is recorded too, so the seed does not quietly rot over the following months.

The right-hand column looks worse in Ads Manager. That is the central difficulty with this product and it is worth being blunt about: your reported conversion count will go down, and your reported cost per conversion will go up.

Neither of those changed anything in the real world. They just stopped counting people who never paid you.

The one-sentence version

You were never really paying for 100 conversions. You were paying for 60 customers and telling yourself it was 100 — while pointing your optimisation at the wrong 40.

What the app does

  1. Watches your orders. Connects to your store and follows every order's financial status — no theme edits, no extra scripts on your storefront.
  2. Waits for the money. Nothing is sent at checkout. The event fires the moment the order is paid — card captured, or COD cash confirmed.
  3. Tells your ad platforms. One server-side event per paid order to Meta, TikTok and Snapchat, plus an offline-conversion file for Google. Server to server, so ad blockers and browser restrictions cannot drop it.
  4. Takes it back when the money goes back. Refunds and courier returns are tracked, so you can see which conversions reversed — and Google's file carries an explicit retraction.
  5. Shows you the truth. A full order ledger, collect rate per channel, and a reversal rate that tells you how polluted your seed audiences have become.

It never talks to your courier and never needs to. Everything hangs off one fact your store already knows: whether the order has been paid.

The one rule that makes it work

A cash-on-delivery order sends nothing until it is marked paid

Card payments mark themselves paid at checkout. Cash on delivery does not — your store has no way to know your courier collected the money. So a delivered, fully-paid COD order stays "pending" forever unless somebody says otherwise, and no event is ever sent for it. Every one of those is a real paying customer your ad platforms never learn about.

Prepaid Paid at checkout Marked automatically · event fires · nothing for you to do
Cash on delivery Paid when you say so Your store never learns the courier collected · no event until it is marked

Nothing else on this page matters if this is not handled. An app that never receives a "paid" signal will sit there looking perfectly connected and send nothing at all — which is exactly what it should do, and exactly what looks like a broken app if you do not know why.

Selling prepaid only? Nothing to do — card payments mark themselves paid at checkout and the event fires on its own.

Four ways to do it

An automation rule

automatic · free

If your courier marks orders Delivered in your store, an automation can mark them paid the second that happens. No app, no code, nobody remembering.

  1. Open your store's automation tool and create a workflow.
  2. Trigger: Fulfillment event created.
  3. Condition: fulfillment display status equals DELIVERED.
  4. On the True branch: Mark order as paid.
  5. Turn it on. Paid Signal picks it up through the webhook it already uses.

Your courier or 3PL

best if available

If your courier already writes fulfilment status back to your store, the workflow above runs itself and you never touch an order again.

  1. Ask your courier whether their app writes Delivered back to the order.
  2. If it does, build the workflow above and you are finished.

In bulk, from the orders list

no setup

The practical option when you reconcile courier payouts once or twice a week.

  1. Open Orders, filtered to the ones the courier has settled.
  2. Tick them, then use the bulk action to mark them paid.
  3. One event per order fires immediately.

One order at a time

no setup

Fine at low volume, and the most accurate — you are marking exactly what you were actually paid for.

  1. Open the order in your store admin.
  2. Collect paymentMark as paid.
Before you automate it

Only automate this if "delivered" really does mean "paid" for you. If your courier marks parcels delivered before handing over the cash, or returns are settled later, you will be telling the ad platforms a customer paid when they have not — the exact bad signal Paid Signal exists to stop. When in doubt, mark orders paid against your payout reconciliation instead: slower, but true.

Playbooks — turning verified payers into better targeting

Once the event is firing there are two moves on every channel: bid on it, and build an audience from it. The playbooks below happen inside the ad platform’s own console, with no extra access and nothing that expires. On the Scale plan Paid Signal can also maintain a payer audience on Meta and Snapchat for you, adding payers and removing reversals automatically; either way you create the Lookalike itself in the ad platform.

Meta

conversions api · audiences

Meta treats server events exactly like pixel events — same dataset — which is what lets them seed an audience with no extra access at all.

  1. Bid on it: Sales campaign → ad set → Conversion event → DeliveredPurchase.
  2. Seed an audience: Events Manager → Audiences → Create audience → Website, rule set to that event, retention 180 days.
  3. Then create a Lookalike from it in Meta, 1%, your country. Meta needs at least 100 matched people in the source before it will build one.
  4. The audience is a live rule, not an upload — Meta keeps it current as events arrive.

TikTok

events api · website audience
  1. Ad group → Optimization event → your verified event. Check Events Manager shows the source as Events API, not Browser.
  2. Assets → Audiences → Create → Website traffic, filtered to that event over the longest window offered. Then build a lookalike from it in TikTok, starting Narrow.

Snapchat

conversions api · pixel audience

Snapchat only accepts its own fixed event names, so choose one you do not use anywhere else — otherwise the audience mixes everyone who ordered with everyone who paid, and you are back where you started.

  1. Ads Manager → Audiences → Create Audience → Pixel Custom Audience, filtered to that event.
  2. Then build a lookalike from it in Snapchat, and set the ad set goal to the same event.

Google

offline import · smart bidding

Google removed Similar Audiences in August 2023, so on Google the win is bidding rather than audiences.

  1. Download the conversions file from the app and upload it in Google Ads → Goals → Conversions → Uploads. Matching is by the click id captured at the click.
  2. Set that conversion action as a primary goal, and use Maximise conversions or Target CPA so bidding learns from it.

How to tell it is working

Look atWhat it tells you
Events sentShould climb as orders are marked paid — not at checkout. If it is flat while orders keep arriving, your COD orders are not being marked paid.
Collect ratePaid ÷ placed. This is the number the whole product exists to expose. If it is 60%, then four in ten of your old "conversions" were fiction.
Reversal rateThe share of sent conversions whose order later returned or refunded. Under 10% is a healthy seed. Higher means you are still feeding the platforms money that came back.
Collect rate per channelThe uncomfortable one. A channel can deliver plenty of orders and collect badly — that is budget you have been defending with the wrong metric.

Fair objections

My pixel already tracks purchases. Why do I need this?

Your pixel tracks checkouts. On prepaid that is the same thing as a purchase. On cash on delivery it is a promise, and a meaningful share of promises never turn into money. The pixel has no way to learn that — it stops watching the moment the browser closes.

Fewer conversion events will hurt my optimisation.

This objection is legitimate and worth taking seriously. Ad platforms do need volume to learn, and if your verified-payer volume is very low, an algorithm can struggle.

The honest advice: do not switch everything at once. Run one campaign optimised on the verified event alongside your existing ones, give it a few weeks, and compare on the number that pays your wages — cash collected — rather than on conversions reported. If your volume really is too thin, use the verified event for audiences and reporting and keep bidding on the pixel event until it is not.

My reported ROAS is going to drop.

Yes. Your reported ROAS was measuring orders placed. The money in your bank did not change when you installed this — only the honesty of the number describing it. Every decision you make from here is made against what actually collected.

We are prepaid only. Is there anything in this for us?

Less, and we would rather say so than sell you something. Your orders mark themselves paid at checkout, so the main gap this closes does not exist for you.

What is still useful: server-side events that ad blockers cannot drop, refund corrections so returns do not pollute your audiences, and a full ledger of what actually collected after refunds.

Does this send my customers' personal data anywhere?

Only one-way hashes. Email and phone are normalised and SHA-256 hashed before they ever leave your workspace — that is the format the ad platforms match on, and it cannot be reversed back into an address. Nothing readable is transmitted.

Do I have to change my theme or add scripts?

No. It reads your orders through your store's API and sends events from our server to theirs. There is nothing to paste into your storefront and nothing that can slow your site down.

Stop optimising on orders you never got paid for

Connect your store, mark your COD orders paid, and let your ad platforms learn from customers who actually paid you.

Start a free trial

Everything switched on · no card required