Skip to content
Why finance and marketing never agree on revenue (checklist from 6 months of pain)
article2 min read212 viewsSep 27, 2026

Why finance and marketing never agree on revenue (checklist from 6 months of pain)

Lin Wei@linwei

September 27, 2026 · 2 min read

#1 in My Model Is Fine, The Data Is Not

212 views3 comments

Every month same meeting. Marketing dashboard say revenue X, finance report say Y, difference 4-8%, and data team (me) is asked to explain. After 6 months I made a checklist. Sharing in case it help someone.

Where the numbers split

  • Gross vs net. Marketing count order value at checkout. Finance count after cancellations, refunds and returns. Biggest gap is always this one.
  • Which date. Order date, payment date, shipped date, delivered date. Finance recognise revenue on delivery (for us). Marketing use order date. At month end this alone move a few %.
  • Day boundary timezone. Our warehouse is UTC, business is Singapore (UTC+8). Order at 7am SGT on the 1st is still the 31st in UTC. Every daily number shift by 8 hours if you are not careful.
  • Tax. Prices shown include GST (9% now in Singapore). Finance report revenue without GST. Marketing tool import the price with GST.
  • Vouchers. Is a $10 voucher a revenue reduction or a marketing expense? Depends who you ask. Need one decision.
  • Currency. Cross-border orders: which FX rate, of which day. Store the rate and its source on each row.
  • Test and internal orders. Staff orders, QA orders in production, B2B bulk orders. Finance exclude some, marketing exclude none.
  • Attribution tools. Ad platform revenue use its own attribution window and count conversions it "influenced". It will never match your database, stop trying.

What worked

We wrote one page "metric contract" with finance and marketing in the same room. For revenue: net of refunds, recognised on delivery date, SGT day boundary, excluding GST, vouchers as revenue reduction, internal orders excluded.

Then one dbt model fct_revenue with explicit columns for each variant: gross_order_value, net_revenue, order_date_sgt, delivered_date_sgt. Dashboards are not allowed to compute revenue themselves, they only pick a column. Every chart title say which definition.

Last, weekly reconciliation query between fct_revenue and the finance ledger export. Difference must be under 0.5% or it alert. First month it alert every week. Now almost never.

Meeting is now 10 minutes. Sometimes cancelled. Honestly best result of the whole project.

Written by

Lin Wei

Data engineer at e-commerce company, Singapore. dbt, Airflow, Spark, too many dashboards. Trying to make the numbers match between finance and marketing.

Get the best of #my-model-is-fine weekly

One email each Monday with the most useful posts. No spam; unsubscribe in one click.

Comments

3

Sign in to join the conversation.

Sign in to comment
Rachel Kim@rachelkim#4 in My Model Is Fine, The Data Is Not
Bookmarking. "Every chart title says which definition" would have saved me two very awkward board meetings.
0 net votes
Emma Lindqvist@emmalindqvist#2 in My Model Is Fine, The Data Is Not
The currency conversion date bit us too. We now store the rate, the rate date and the source on every row. Boring, and it ended an argument that had run for a year.
0 net votes
Nguyen Minh Anh@minhanh_ml#4 in My Model Is Fine, The Data Is Not
very useful. we have same fight between ops and marketing about what is "active user". maybe I steal metric contract idea
0 net votes