CTV for Retail Apps: Your Conversion Is Not Final

Most app verticals have one problem with their conversion event: it arrives late. Retail has two. The purchase you are optimizing toward may not happen in your app at all, and the one that does happen can be reversed weeks later.
Neither shows up in a standard campaign report, and both change what you should be buying against.
Your app is one storefront, not the business
A game's app is the business. A subscription app's funnel runs end to end inside it. A retail app is one of several places the same customer can buy, alongside your site, your stores, and a marketplace listing.
That matters for CTV specifically. A television ad reaches a household and the person who saw it picks up whatever is nearest. Sometimes that is your app. Often it is the laptop, or a store visit on Saturday. App attribution sees none of the second kind, which means a channel more likely than most to drive a purchase somewhere other than the app is also one your app reporting will systematically undercount.
The mechanics make it worse. A television and a phone share no advertising identifier, so the connection runs on household IP matching inside a short lookback window, and probabilistic impression matches rank low in the attribution waterfall. When the match loses, the install does not disappear; it gets credited elsewhere, usually to organic. That waterfall picture is mostly an Android one, since Apple's policy does not permit fingerprint matching, which is a large part of why the iOS section below exists. Our post on why CTV installs arrive late and land in organic covers the decay in detail.
So the first decision is which business question you are asking. If it is "did CTV grow app revenue," app-level data can answer it. If it is "did CTV grow revenue," you need the account-level view across channels, and app attribution is one input to it.
The purchase reverses
This is the part that is specific to retail and that most media plans ignore entirely.
The National Retail Federation and Happy Returns estimated that US consumers would return $849.9 billion of merchandise in 2025, amounting to 15.8 percent of annual retail sales. For online sales specifically the estimate was 19.3 percent. Those figures are from the October 2025 edition, based on a survey of 358 ecommerce professionals at merchants above $500 million in revenue, alongside a consumer survey, and the series is published annually, so check the current release before quoting it.
Take the online figure at its word for a moment. If roughly a fifth of online purchases come back, then a campaign optimized toward purchase events is optimized toward a number that partly reverses, and the reversal is not distributed evenly. The categories that return hardest are the ones where fit, size or feel cannot be judged before delivery, and apparel and footwear are reliably among the worst. A cohort that looks efficient on gross purchase value can be the worst cohort you bought once the returns settle.
The fix is not complicated; it is just rarely done: optimize and report on net revenue, with returns deducted at the cohort level, and hold the campaign open long enough for your returns window to close before calling the result. If your policy is 30 days, a 14-day read is measuring gross.
On iOS, the reversal barely reports
Here is where the arithmetic bites.
Apple's AdAttributionKit reports across three conversion windows covering days 0 to 2, 3 to 7, and 8 to 35, measured from the user's first app launch. The fine-grained conversion value is available only in the first postback; the second and third carry a coarse value. Postbacks arrive after a random delay of 24 to 48 hours for the first and 24 to 144 hours for the others.
Now place a retail funnel on that timeline. A purchase on day 5 lands in the second window and reports as a coarse value. A return on day 25 is still inside the third window, and Apple does permit conversion values to be updated in all three, so the reversal can be signalled. What it cannot be is specific. The third window carries a coarse value only, which means you can report that a cohort got worse, not that $84.99 came back.
Three limits follow, and together they are the real problem. A postback already sent cannot be retracted, so a return cannot reach back and correct the first postback that went out days after the purchase. A return after day 35 falls outside every window and never reports at all. And expressing any of this requires your app to encode net-of-returns logic into the window-three value before the campaign launches, which almost nobody builds. If the app locks its window-three value early to get the postback sooner, the system ignores later updates in that window, so the day-25 return would not report even though it falls inside it.
Tier gates it further. Apple assigns a postback data tier per app download based on crowd size, and for downloads in the lowest tier the system sends only the first postback, so a reversal cannot be signalled on those installs whatever your app encoded. So on the consentless iOS population, the privacy-preserving path can carry a blunt downgrade if you built for it, sometimes cannot carry one at all, and carries nothing if you did not build for it. Your own commerce systems know what happened, keyed to your own customer ID. The campaign-level view mostly does not, which is the reason to stop treating per-campaign postback data as the source of truth for revenue in this vertical.
What to optimize toward instead
Three changes, in order of how much they move the answer.
Net revenue at the cohort level, not purchase count. Count the purchase, then subtract the return when it lands, and judge the cohort on what survived. This requires joining your ad data to your commerce data on your own identifier, which is work your team has to own because no ad platform can do it for you.
A read date set by your returns policy, not your flight. The campaign ends; the returns do not. Decide the read date before launch and write it down, because the pressure to read early is strongest in exactly the weeks when the number is least settled.
Category-level reporting, not blended. Return rates vary enough between categories that a blended figure hides which part of the catalog your media actually sold. Pull your own rates by category before you set a target, because the industry average will not describe your mix.
The fraud edge nobody plans for
The same NRF research estimated that 9 percent of all returns are fraudulent.
For a UA team, that is not a loss-prevention statistic; it is a cohort-quality signal. Media that attracts return abusers looks excellent on purchase events and terrible on net revenue, and the gap between those two reports is where you find them. Any incentivized or heavily discounted acquisition path deserves this check specifically, because the economics of return abuse and the economics of incentive chasing select for similar behavior.
Agree with your fraud team before launch on who runs this check and when, since a cohort flagged in month three is a cohort you have already scaled.
How to measure the channel
Everything above points the same way: the per-campaign attributed number will be incomplete on channel, incomplete on platform, and provisional on revenue.
A geo holdout avoids all three. Suppress the channel in a randomly assigned set of markets, run it in the others, and compare total net revenue across every channel using your own data. It never asks which touchpoint deserves credit, so the household match, the store purchase, and the organic spillover all stop mattering. It is also the only design here that counts revenue your app never touched toward the channel that drove it.
Size it on your own conversion volume and run it long enough to cover the purchase cycle plus the returns window. For a 30-day returns policy, that is considerably longer than most retail teams plan for.
When CTV is the wrong channel here
When your licensed or shippable markets are too few to randomize across. When your catalog is narrow enough that the only honest success metric is one product's sales, which a brand-weighted channel will struggle to move inside a test window. And when the business cannot yet join ad exposure to net revenue on a customer identifier, because without that join, every number this post asks you to compute is unavailable and the test will produce an argument rather than an answer.
We run CTV, in-app, and rewarded on one platform, so we have an interest in what you conclude about any of them. That is the reason to ask us to help design a test against our own numbers instead of taking our reporting at face value. The same timing problem in a different vertical is in our post on measuring a conversion that lands 30 days later. If you want to work through which event to optimize toward for your catalog, get in touch.
FAQ
What should a retail app optimize CTV toward?
Net revenue at the cohort level, with returns deducted, rather than purchase count or gross order value. Returns run high enough in retail that a cohort can look efficient on purchases and lose money once the window closes, and the two reports can diverge sharply on the same cohort.
Why does CTV undercount in a retail app?
Because a television ad reaches a household and the purchase can happen anywhere. App attribution sees app purchases, so it misses a desktop checkout or a store visit entirely. On top of that, CTV-to-mobile matching is probabilistic and household-level, so credit frequently lands in organic even for the app purchases it did drive.
Can iOS report a returned purchase?
Only bluntly, and only sometimes. Apple permits conversion values to be updated in all three windows, so a return inside 35 days can be signalled, but the second and third windows carry a coarse value rather than a figure, a postback already sent cannot be retracted, and a return after day 35 never reports. Doing even that requires encoding net-of-returns logic before launch, which is rare. Your own commerce data knows what happened; the per-campaign postback view mostly does not.
How long should a retail CTV test run?
Long enough to cover the purchase cycle plus the return window, which for a 30-day returns policy means a read date well past the end of the flight. Set it before launch, because the pressure to read early peaks while the revenue figure is still provisional.
How high are retail return rates?
About 15.8 percent of US retail sales in 2025, and 19.3 percent of online sales, according to the National Retail Federation and Happy Returns, which also put fraudulent returns at about 9 percent of the total. Rates vary widely by category, so use your own by-category numbers for planning and treat the industry figure as context.

