Underwriting CLTV vs GAAP CLTV after a COGS drop
After a drop in cost of goods, GAAP CLTV lags while old inventory sells through. Underwrite CAC on current landed cost and keep both as named metrics.
Written by Linus Tse, founder of Greyfield Data
ยท 7 min read
On this page 8 sections
When your cost of goods drops, GAAP COGS won't show it until the older, more expensive inventory has sold through. Underwriting CLTV should use current landed cost, because the customers you acquire now will mostly buy from the new cost. Keep both numbers, give each a name, and say which one a decision uses.
We see this when a brand has a huge decrease in its cost of goods and asks why the financials don't reflect it yet. The answer is usually that you're not going to fully realize that for a while. In the meantime, you're underwriting a different CLTV than is running through your GAAP financials, and both sets of information are important. We set up both as named metrics in a DTC data warehouse.
Key takeaways
- GAAP COGS follows your inventory cost method, so a lower purchase cost reaches the P&L only as old inventory sells.
- Under FIFO, the lag is roughly units on hand at the old cost divided by monthly unit sales.
- Underwriting CLTV uses current landed cost, because it prices customers you'll acquire and serve going forward.
- The two numbers answer different questions: GAAP CLTV explains reported results, underwriting CLTV sets CAC targets.
- Store both in the semantic layer with their cost basis, owner, and use, so nobody mixes them in one report.
Why doesn't a COGS drop show up in GAAP right away?
GAAP COGS records the cost of the units you actually sold, and those units were bought at the old price. A new purchase order at a lower cost sits on the balance sheet as inventory until it is sold.
Which cost leaves inventory first depends on your cost flow method. Under FIFO, the oldest units are expensed first, so the old cost runs through COGS until that layer is gone. Under weighted average cost, the new cost blends in, so COGS drifts down over several receipts rather than stepping down once. Your accountant chooses the method. The data team should know which one it is.
Landed cost means the full cost to get a unit into your warehouse: product cost plus inbound freight, duties, and similar costs your accounting team capitalizes into inventory.
What is underwriting CLTV?
Underwriting CLTV is the contribution you expect a new customer to bring over a set horizon, priced at the costs you'll actually face while serving them. It's the number behind questions like "what CAC can we afford this quarter?"
It's forward-looking by design. If your new landed cost is locked in for the next year, a customer acquired today will mostly receive units bought at that cost. Pricing them at last year's inventory cost understates what they're worth and makes you underbid on acquisition.
GAAP CLTV is backward-looking. It ties to the financials, so it's the right number for explaining reported margin, board reporting, and audit.
| GAAP CLTV | Underwriting CLTV | |
|---|---|---|
| Cost basis | COGS as booked, by inventory layer | Current landed cost from a dated cost table |
| Looks | Backward, at units actually sold | Forward, at units you'll ship |
| Used for | Reported margin, board, audit | CAC targets, budgets, channel bids |
| Owner | Finance | Growth or FP&A, agreed with finance |
| Moves when | Old inventory sells through | A new cost is agreed |
A worked example: the same subscriber, two CLTVs
These numbers are synthetic. A DTC subscription brand sells one product at $40 of net revenue per unit. Fulfillment and payment fees are $8 per unit. A new subscriber is expected to buy 7 units in their first 12 months.
The landed cost per unit dropped from $14 to $9. The brand has 60,000 units on hand at $14 and sells 15,000 units a month, so under FIFO the old layer lasts 60,000 / 15,000 = 4 months.
| Cost basis | Contribution per unit | 12-month CLTV (7 units) |
|---|---|---|
| Old cost, $14 | $40 - $14 - $8 = $18 | $126 |
| New cost, $9 | $40 - $9 - $8 = $23 | $161 |
| This cohort as GAAP will report it | 3 units at $18, 4 at $23 | $146 |
The last row assumes a customer acquired this month buys 3 of their 7 units during the 4 months the old layer lasts. That's $54 + $92 = $146. So GAAP will show $146 for this cohort, today's trailing GAAP cohorts show $126, and the forward view is $161.
Now set a CAC target. Say the rule is that 12-month contribution must be at least 1.5 times CAC.
| CLTV used | 12-month CLTV | Maximum CAC at 1.5x |
|---|---|---|
| Trailing GAAP | $126 | $84.00 |
| Underwriting | $161 | $107.33 |
The gap is $35 of CLTV and $23.33 of allowable CAC per customer. At 3,000 new subscribers a month, the CLTV gap is $105,000 of contribution a month that one view counts and the other doesn't.
Under weighted average cost, the picture is different. If 60,000 units at $9 arrive while 60,000 at $14 remain, the average becomes $11.50. Contribution per unit is $20.50 and 12-month CLTV is $143.50, until the next receipt moves the average again.
Is this wonky accounting for CLTV?
It feels like wonky accounting for CLTV, but both numbers are correct for their purpose. The mistake is putting them in one column without a label.
Three places this usually goes wrong:
Shopify's cost field. Shopify profit reports only use cost recorded at the time of sale, and the cost field is static. If someone updates the cost to $9 today, new orders show $9 even though GAAP still expenses $14. That number matches neither view cleanly.
Mixed cohorts. A 12-month CLTV built from cohorts that span the cost change blends both costs. Label the cohort months that straddle it.
Silent restatements. If someone edits a cost table in place, old CLTV numbers change without anyone noticing. Use effective dates instead.
How do you keep both in the semantic layer?
Define them as two named metrics with the same formula and different cost inputs. In our setup, they look like this:
| Metric | Cost input | Source | Note |
|---|---|---|---|
cltv_12m_gaap |
COGS per unit as booked | Accounting system, by month and SKU | Ties to the P&L |
cltv_12m_underwriting |
Current landed cost | Dated cost table, effective from the agreed date | Used for CAC targets |
cltv_cost_basis_gap |
Difference of the two | Derived | Shrinks to zero as old layers sell through |
Everything else stays shared: net revenue, fulfillment, fees, refunds, and the same cohort definitions. That way the only reason the two differ is cost basis, and the gap metric shows when they'll converge.
The DTC semantic layer post has the metric dictionary format we use, and what is a semantic layer covers the idea from the start. For the contribution formula and cohort mechanics, see contribution margin LTV by acquisition channel. Before trusting either number, run the profit dashboard readiness check to see whether your cost data is complete.
Frequently asked questions
Why doesn't a lower cost of goods show up in my financials yet?
GAAP COGS expenses the units you actually sold, which were bought at the old cost. Under FIFO, the new cost reaches COGS only after the older inventory sells through.
Should CAC targets use GAAP CLTV or underwriting CLTV?
Underwriting CLTV, if it uses a landed cost you're confident you'll pay going forward. New customers will mostly receive units bought at that cost. Keep GAAP CLTV for explaining reported margin.
How long does the FIFO lag last after a COGS decrease?
Roughly the units on hand at the old cost divided by monthly unit sales. In the synthetic example, 60,000 units at 15,000 a month is about 4 months.
Can you show underwriting CLTV and GAAP CLTV on the same dashboard?
Yes, as two labelled metrics side by side with the gap between them. Don't blend them into one CLTV number.
What to do next
Work out how many months of old-cost inventory you have left, then compute both CLTVs for your most recent cohort. If the gap changes your CAC target, agree with finance which view sets bids and write it down. If you'd like a hand setting up both metrics in your warehouse, book a call with me. To see how CAC shifts by channel on a synthetic brand, try the CAC apportionment demo.
Part of the Ecommerce reporting guides, a reading path through related articles.

Linus Tse
Founder of Greyfield Data. Built 400+ dashboards. Certified in Sigma, Snowflake, Tableau, and Power BI.
About Linus

