Cookiebees

Signal Studio

Every purchase looks the same to Meta.
Not to you.

Your ad account counts a ₹499 cash-on-delivery order that will be refused at the door exactly the same as a ₹4,000 prepaid order from a customer who buys four times a year. It calls retargeting your best campaign because it sells to people you already own. It cannot see any of this, because nobody told it.

Questions this answers

  • Am I paying prospecting prices to re-buy my own customers?
  • Why is my ROAS healthy and my bank balance flat?
  • How much of my spend trains Meta on orders that come back?
  • What can I actually put in Ads Manager beside ROAS?

The diagnosis

Four ways a brand leaks money. You have one of them.

A list of eighteen signals is a decision, and decisions get deferred. So the product runs four tests against your own orders and names the one to fix first, with the campaigns behind it. Every share is counted only against the orders it could be counted against - if a third of your orders never carried a discount field, it says so rather than inventing a number.

  • One answer, not a menu of eighteen switches
  • Each test names the campaigns driving it
  • What could not be judged is listed, not hidden
  • Counted from the same nightly tables as your reports
Signal backbuilding

Lead marked Qualified

Moved by a rep, or by a scoring rule

Match keys attached

EmailPhoneClick idExternal id

QualifiedLead posted to Meta and Google Ads, deduplicated on your own lead id.

Not every lead - the ones that qualified. That is the difference between teaching the algorithm to find volume and teaching it to find buyers.

The harvest leak

You are paying prospecting prices to re-buy your own customers.

A purchase from a four-time customer counts as a win, so prospecting takes credit for harvesting demand that already existed. Send first orders as their own signal and the split becomes a column: a campaign at 0.3 new visitors per click is sending you people you already have, and that is the number retargeting cannot hide from.

  • First purchases divided by all purchases, per campaign
  • Cost per first customer - the real acquisition cost
  • New visitors per click, beside Clicks
  • Meta bids on exactly this split already
Attribution coverage71% of all orders
Website orders1,252 of 1,331
Mobile app orders38 of 184
Draft & counter orders0 of 59
The naive number counts orders that could never have carried a signal.

The RTO leak

A purchase you have already sent cannot be taken back.

Fire Purchase at checkout on a cash-on-delivery order and you have cast an irreversible vote for a customer who may never pay. Hold that event until the carrier confirms delivery, report the returns, and send prepaid orders as their own signal - because a browser closed days before the parcel arrived, and only your systems know what happened next.

  • Purchase held until delivery is confirmed
  • Returns and cancellations reported back
  • Prepaid share and cost per delivered order
  • The ROAS column starts agreeing with the bank
Signal delivery

Third-party pixel

blocked

cdn.some-tracker.com/px.js

ITP · blocker

First-party path · your own domain

arrives

yourstore.com/a7f2k/collect

Attribution coverage

0%

of orders tied to a real source on live stores

The identity lives on the visitor, not the browser - so it survives the wipe.

The discount leak

The sale ends. The account keeps hunting discount buyers.

A discount-led push flatters its own ROAS with orders that were coming anyway, and quietly teaches the algorithm what kind of buyer to find next. Send full-price orders as a separate signal - before the sale, not during it - and you keep a clean line running while the noisy one spikes.

  • Full-price share per campaign
  • Discount, coupon code and cash discount on every order
  • Switch it on before the sale, not during
  • Cost per full-price order, beside ROAS
Match quality · before sendingPurchase · order.48213
9.5

Scored here, not in Events Manager

Meta tells you the number weeks later, in aggregate. We score each event from the keys we attach, and name what to add.

emEmail+3
phPhone+1.5
fbcClick ID+2
external_idStable ID+1.5
fbpBrowser ID+0.25
ip · uaIP + user agent+0.5
ct · zp · countryLocation+0.75
fn · lnFirst + last name: capture at checkout+0.5

The margin leak

Budget follows conversion rate. It should follow contribution.

Ad platforms optimise toward whatever converts cheapest, which is almost always your cheapest product rather than the one that pays for the business. Send margin and category on the order and spend can chase contribution instead - and where you hold no cost data, every report says so plainly rather than inventing a margin.

  • One event per category, expanding as you add them
  • Gross profit and margin on the order itself
  • Cost per purchase by category, side by side
  • No cost data? It says so, rather than guessing
Segmentslive counts
High lifetime value412
Lapsed 60+ days1,188
Browsed, never bought2,740
Bought once, never again906
Every segment is a list of people you can email or message, not a chart you read and close.

In Ads Manager

Columns you cannot get anywhere else.

Each signal becomes a custom conversion, and each custom conversion becomes a column beside Clicks and ROAS. The product shows you the exact rule to build, whether the signal is switched on, and how many events have actually left - so you know the column will have something in it before you go looking.

  • The exact custom-conversion rule, ready to build
  • Whether it is on, and what has actually been sent
  • 47 parameters to filter on, with real delivery rates
  • Your existing ROAS column stays exactly where it is
Event stream · Purchase · parameters44 attached

Your pixel sends the order. This is what we know about it.

Lifecycle · 7
order_index1is_first_purchasetruecustomer_ltv8430days_since_last_order47
Money · 6
payment_methodprepaiddiscount_pct12.5coupon_codeWELCOME10
Journey · 10
first_touch_channelmeta_adslast_touch_channelgoogle_adshas_paid_touchtrue
Behaviour · 10
sessions_before_order3abandoned_before_buyingtruedecision_speedfew_days
Product · Place · State · 8
primary_categorySkincareship_stateKarnatakaorder_statuspaid

Built on one parameter, in Meta

Purchase where is_first_purchase = true → CB First-time buyers · cost per genuinely new customer, per campaign

Every one is opt-in, omitted when unknown, and named for good: a custom conversion built on it inherits the Purchase's full history.

Inside the module

Inside Signal Studio

One catalogue of everything we can send, and one honest answer about what you are sending today.

Where you lose money

Four tests, one thing to fix, the campaigns behind it

The catalogue

Every event, parameter and audience in one place

Would fire vs sent

The ceiling and the reality, side by side

Set-up route

Five steps from the finding to a working column

Coverage, stated

What could not be judged, and why

Delivery per parameter

What actually left, not what could have

Nothing here is a projection. Every figure is a counted row from the same nightly tables the rest of your reports read, so the diagnosis can never disagree with the page it sends you to.

Close the loop on your next lead

Find out which leak you have

Measurement first, then everything else. Spin up your workspace in minutes and watch the first signal go back on your very first order. 30-day free trial, no card required.