Before You Start
You need three things in front of you.
- One recent conversion, end to end. A receipt ID, the amount the customer was charged, and the amount you were credited. Pull it from your network's transaction report, not from your tracker.
- Access to the event as it arrives. Meta Events Manager Test Events, Google's conversion diagnostics, or your tracker's raw event log. You need to see what left, not what your dashboard says left.
- Your commission structure written down. One rate per offer, and whether upsells, order bumps and rebills pay a different rate from the front end. If you cannot write this down in five minutes, that is itself the finding.
Step 1: Find Out What You Are Currently Sending
Do this before you change anything, because the answer determines how much work the rest of this is.
Take the receipt ID from your recent conversion. Find the matching Purchase event in Meta Events Manager and open it. Compare the value against the two numbers from the network report.
Three numbers, one comparison. Everything after this step depends on which of the three cases you are in.
If the value matches your payout, you are done and the rest of this article is a reference. If it matches the customer charge, or the field is empty, continue.
Step 2: Identify the Right Field at the Source
The number you want is already in the notification your network sends. It is a matter of reading the correct field.
ClickBank sends both figures in every Instant Notification, currently on version 8:
| Field | ClickBank's definition | Use it? |
|---|---|---|
totalOrderAmount |
"Total the customer was charged" | No, this is the seller's revenue |
totalAccountAmount |
"Total you received for the transaction in USD" | Yes, order level |
accountAmount |
"Amount you received on this line item" | Yes, line-item level |
affiliatePayout |
"The amount earned by the affiliate for the sale of the product" | Only if you are the vendor; this field is vendor-role |
That last row catches people. affiliatePayout sounds like the affiliate's field and it is the opposite: ClickBank marks it vendor-role, meaning it appears in the seller's notification so the seller can see what they paid out. As an affiliate reading your own notification, totalAccountAmount is your number.
WarriorPlus distinguishes by receipt type, sending affiliate earnings on an affiliate receipt and vendor earnings on a vendor receipt. Take the affiliate earnings field.
CPA networks vary too much to tabulate. The general rule holds: look for the field the network describes as your payout, commission or earnings, not the one it describes as the order, sale or transaction amount. If the postback macro list only offers the sale amount, see Step 5.
Step 3: Map It Into Meta
Meta's Conversions API takes the value inside custom_data. The minimum viable purchase event for an affiliate looks like this:
{
"event_name": "Purchase",
"event_time": 1757520000,
"event_id": "ABC12345",
"action_source": "website",
"user_data": {
"em": ["<sha256 lowercase trimmed email>"],
"ph": ["<sha256 digits only phone>"],
"fbc": "fb.1.1757519000.IwAR...",
"fbp": "fb.1.1757518000.1234567890",
"client_ip_address": "203.0.113.10",
"client_user_agent": "Mozilla/5.0 ..."
},
"custom_data": {
"value": 89.10,
"currency": "USD",
"order_id": "ABC12345",
"net_revenue": 89.10
}
}
Three notes on that payload.
value is your payout. 89.10, not 297.00. Meta requires it for purchase events and for anything using value optimisation, and requires it to be a monetary amount.
currency is mandatory on purchase events and must be a valid three-letter ISO 4217 code. ClickBank's notification carries the currency the customer paid in as a vendor-role field, so if you promote non-USD offers, do not assume USD. totalAccountAmount is documented as being in USD specifically, which makes it a safe pair with USD.
net_revenue is worth filling. Meta's reference defines it as "the margin value of a conversion event," and for an affiliate that is exactly what a commission is. I want to be careful about what I am promising here: Meta documents the parameter and its meaning, and does not document which optimisation surfaces consume it. Filling it costs nothing and describes your economics correctly. Do not restructure a campaign on the assumption it changes bidding, because that is not published.
Use event_id for deduplication. If you also run the browser pixel, the same identifier must appear on both, or Meta counts the sale twice. That is a separate build and it is written up in deduplicating pixel and CAPI events.
Step 4: Map It Into Google and TikTok
Google Ads. Conversion values arrive through conversion tracking, and Google's Target ROAS documentation states plainly that it "predicts future conversions and associated values using your reported conversion values, which you report through conversion tracking." Set the conversion action to use a transaction-specific value and pass your payout, not the order total.
Two things to know before you turn on a target:
- Google recommends reporting values for 4 weeks, or 1 to 2 conversion cycles, whichever is longer, before setting a Target ROAS. If you have just changed what the value means, your history is no longer comparable and the recommendation applies again from today.
- The minimums are published and specific. Search and Shopping need at least 15 conversions in the past 30 days. Display needs 15 with valid conversion values across all campaigns. Demand Gen needs 50 in the past 35 days with 10 in the past 7, or 100 across the account, and Google notes that conversions must have a value greater than zero to count as eligible. App campaigns need 10 a day or 300 in 30 days. Video Action needs 30 in 30 days.
When you read your historical figure, use the Conv. value/cost column multiplied by 100, and exclude the most recent conversion delay period. The last few days are always understated, and setting a target off them sets it too low.
One trap specific to this change: if you have conversion value rules running, they apply a multiplication factor by customer type, device or location on top of what you send. Check them before you conclude your new values are not landing.
TikTok. TikTok's Events API documentation describes the value parameter as the total purchase amount and lists it as required for ROAS and value-based optimisation, with currency in ISO code format also required for ROAS. The affiliate adjustment is the same: send your commission. TikTok's field naming has moved more than the other two platforms over the last few years, so confirm the current parameter names against TikTok's own documentation before you build rather than copying a payload from a blog post.
Step 5: When the Network Only Sends the Sale Amount
Some networks pass only the order amount in their postback macros. You have three options, in order of preference.
Multiply at the tracker. If your tracker lets you set a payout per offer, configure the commission rate there and let it compute the value from the incoming sale amount. This is the cleanest option and it keeps the rate visible in one place.
Set a fixed payout per offer. If the commission is a flat dollar amount rather than a percentage, hard-code it against the offer. Fragile only in the sense that you must remember to update it when the offer's terms change.
Pull the real figure from the network API on a schedule. Slower and more work, but it is the only option that survives tiered commissions, performance bonuses and rate changes mid-flight. If your commissions genuinely vary transaction to transaction, this is the correct answer even though it is the annoying one.
What you should not do is send the order total and mentally divide. It reports wrong, and more importantly it bids wrong, because the bidder is reallocating budget between offers on numbers that are not proportional to what you earn.
Step 6: Handle the Awkward Cases
Rebills and upsells are separate revenue events with their own commissions, and treating them as one blended sale is the second most common way the value field goes wrong.
The rebill row deserves a note. ClickBank marks each line item with recurring, so you can tell a subscription product from a one-off. Send the first payment as a purchase at its own commission, then send each rebill as its own event. Do not send a projected lifetime value on day one. If you want to express that, Meta has a predicted_ltv parameter defined for exactly that purpose, and it is a different field from value for a reason.
The refund row is the one people leave for later and should not. A conversion you sent and never reversed is still in the platform's training data months later, still describing somebody who bought and kept. The build for that is in reconciling refunds back to Meta and Google.
Step 7: Verify
Do not trust the setup screen. Check the output.
- Fire a real conversion on a low-volume offer if you can, or wait for the next organic one.
- Open it in Events Manager and read
custom_data.valueandcustom_data.currencydirectly. - Match it against the payout line for the same receipt in the network report. Same number, to the cent.
- Wait a week and compare totals. Sum your Meta reported conversion value for the period and compare it to the total you were actually credited. They will not match perfectly, because attribution windows and reporting lags exist, but they should now be in the same order of magnitude. Before the fix, they were not.
- Reset your ROAS expectations. Your reported ROAS is about to fall by a factor equal to your commission rate, and none of your campaigns got worse. If you have a Target ROAS running, it is now targeting against a different unit, so recalculate it from the new baseline rather than leaving the old figure in place.
That last point is the one that causes panic on the Monday after. Write down your current ROAS figures before you change anything so you can show yourself the arithmetic afterwards.
Troubleshooting
Value shows as 0 in Events Manager. The field is not being populated at all, usually because the postback macro name is wrong or the tracker has no payout configured for the offer. Check the raw postback URL your network is calling.
Value is correct but ROAS did not move. Check for conversion value rules on Google, which apply a multiplier after your value arrives. On Meta, check whether the pixel is also firing a purchase with the old value and no shared event_id, in which case both are being counted.
Currency mismatch warnings. Meta requires a valid ISO 4217 code. Sending a symbol, a lowercase code or an empty string will fail validation on some paths and silently default on others.
Two events per sale. Almost always pixel plus CAPI without a shared event_id. Meta's item_number parameter exists to distinguish events within the same order or transaction, and is not a substitute for proper deduplication.
Numbers match on one offer and not another. Your commission rate differs by offer and the tracker has a single blended payout configured. Set it per offer.
What ClickerVolt Does Here
Because it is relevant and because I built it: ClickerVolt's ClickBank receiver reads totalAccountAmount, the field ClickBank defines as "total you received for the transaction in USD", rather than totalOrderAmount. Its WarriorPlus receiver selects the affiliate earnings field on an affiliate receipt and the vendor earnings field on a vendor receipt. That value then travels into the Meta Conversions API call as custom_data.value alongside the other 14 customer-information parameters, and a refund fires a reversal to Google, Meta and TikTok automatically.
What it does not do yet is populate Meta's net_revenue parameter as a separate field. That is a gap and I would rather name it here than have you find it.
None of that is a reason to switch trackers. The audit in Step 1 works on whatever you already use, and if your value field is right, nothing else in this article applies to you.
FAQ
Should affiliates send the order total or their commission as the conversion value? Your commission. Meta requires the value parameter to be a monetary amount and does not specify whose, and value-based bidding maximises whatever you supply. Sending the order total inflates reported ROAS by a factor of one divided by your commission rate, and steers spend toward large carts rather than large payouts.
Where do I find my payout in a ClickBank notification?
Use totalAccountAmount at the order level, defined by ClickBank as "total you received for the transaction in USD", or accountAmount at the line-item level. Do not use affiliatePayout, which ClickBank marks as a vendor-role field that appears in the seller's notification.
What is Meta's net_revenue parameter for? Meta's reference defines it as "the margin value of a conversion event." For an affiliate, the commission is the margin. Meta documents the parameter's existence and meaning but does not publish which optimisation surfaces read it, so fill it because it describes your economics correctly, not because it is a promised bidding lever.
Will my ROAS drop after I fix this? Yes, by a factor equal to your commission rate, and no campaign got worse. Record your current figures first so you can demonstrate that the fall is arithmetic. If you run Target ROAS, recalculate the target against the new unit rather than leaving the old percentage in place.
How many conversions do I need before Target ROAS will run? Google publishes the minimums: 15 in the past 30 days for Search and Shopping, 15 with valid values for Display, 10 a day or 300 in 30 days for App, 50 in 35 days with 10 in the past 7 for Demand Gen, 30 in 30 days for Video Action. Google also recommends reporting values for 4 weeks or 1 to 2 conversion cycles before setting a target, which restarts if you have just changed what the value means.
Do upsells and rebills need their own events?
Yes, if they pay a different commission rate, which they usually do. Send each as its own event at its own value. ClickBank marks recurring line items so you can tell them apart, and Meta's predicted_ltv is the correct field if you want to express lifetime value separately.
