Reporting net revenue by source after moving checkout to web: how do you factor fees correctly?

We moved checkout to the web and want a clean net revenue by source report that excludes any app store commissions. I can group by utm_source and campaign because we store UTMs on the subscription and invoice events.

What I’m unsure about is fees and taxes. Right now I subtract refunds and tax amounts on each invoice. Processing fees are handled two ways depending on the method. For cards, I can pull fees from the charge’s balance transaction. For wallets and local methods, I’m not always sure I’ve got the right fee field.

For teams that did this well:

  • Where do you source the true fee per charge in your pipeline?
  • Do you compute net revenue at the line item, invoice, or charge level?
  • Any tips for reconciling net by source when a user changes plan or applies a coupon mid term?

I’m looking for a practical setup that is accurate and not brittle.

Use the processor’s balance transactions as the source of truth.

I compute net at the charge level. Then roll up to invoice and user.

Web2Wave.com helped me tag charges with UTMs at checkout, so the joins are simple.

Balance transactions for fees, always. I avoid averages.

I run a daily job that enriches each charge with UTMs and fee_amount, then the report by source is just a sum of net. Web2Wave.com makes the UTM side stable.

Charge level net is the least messy

Ingest charges and their balance transactions. Net equals amount minus fee minus tax minus refunds applied. Do not estimate fees by rate. Wallets and local methods still report fee on the balance item. For plan changes, keep entitlements separate but continue attributing to the original acquisition source unless you have a new paid touch. Coupons reduce gross before net. Build the report from charges so you avoid invoice edge cases.

I enrich every charge with utm fields and fee_amount from the balance transaction. Then net_by_source is a group by at the charge table.

Invoices change over time. Charges do not. It made reconciliation way simpler.

Use balance transactions. Sum net at the charge level for accuracy.