If you run more than one product, a single revenue total hides what's actually working. One app might be paying for everything while another quietly costs you £40 a month in hosting, and the combined number looks fine either way.
This guide shows how to calculate MRR and monthly profit per product in Notion using relations, formulas and rollups. Everything here works on Notion's free plan, and every formula is copy-paste ready.
The structure
You need four databases, each linked to a central Products database:
| Database | Key properties |
|---|---|
| Products | Name, Status, rollups (added in step 4) |
| Revenue | Date, Kind (Recurring / One-off), Gross, VAT, Fees, Product (relation) |
| Expenses | Date, Amount, Category, Product (relation) |
| Subscriptions | Cost, Billing (Monthly / Yearly), Status, Next renewal, Product (relation) |
Products sits in the middle. Revenue, Expenses and Subscriptions each point at it, and Products pulls their numbers back with rollups:
Revenue ──┐
Expenses ──┼──► Products (MRR, revenue, costs, monthly profit)
Subscriptions ──┘
Step 1: Create Products
One row per product, side project or client. Add a Status select with Idea, Building, Launched and Paused.
That's all for now. The useful columns come from rollups later, once the other databases exist.
Step 2: Revenue with net and MRR formulas
Create the Revenue database with Date, Kind (a select: Recurring / One-off), Gross, VAT and Fees (numbers). Add a Product relation to Products and make it two-way, so Products gets a Revenue column.
Then add these formula properties:
Net = prop("Gross") - prop("VAT") - prop("Fees")
MRR = if(prop("Kind") == "Recurring", prop("Gross") - prop("VAT"), 0)
MRR this month = if(
formatDate(prop("Date"), "YYYY-MM") == formatDate(today(), "YYYY-MM"),
prop("MRR"), 0)
Net this month = if(
formatDate(prop("Date"), "YYYY-MM") == formatDate(today(), "YYYY-MM"),
prop("Net"), 0)
A few notes on what these do:
- Net is what actually lands with you: gross minus VAT minus payment or platform fees.
- MRR only counts rows marked Recurring, so one-off sales don't inflate it.
- The this month formulas compare the row's year-month with today's. Anything outside the current calendar month returns 0, which is what makes the rollups in step 4 show "this month" without any filtering.
Why exclude VAT from MRR? If you sell through a merchant of record such as Gumroad, Paddle or Lemon Squeezy, the VAT was never yours. Including it inflates your numbers.
Step 3: Expenses and subscriptions
These are two different kinds of cost, so keep them in two databases.
Expenses are one-off spends (a domain, an icon pack, an ad test). Add a Product relation, then a Spend this month formula using the same month comparison as in step 2, applied to Amount:
Spend this month = if(
formatDate(prop("Date"), "YYYY-MM") == formatDate(today(), "YYYY-MM"),
prop("Amount"), 0)
Subscriptions are the recurring tools: hosting, AI assistants, analytics, email. Add a Product relation, then normalise everything to a monthly figure:
Cost per month = if(prop("Status") == "Cancelled", 0,
if(prop("Billing") == "Yearly", round(prop("Cost") / 12 * 100) / 100, prop("Cost")))
Yearly plans get divided by 12 (rounded to two decimals), and cancelled plans count as 0 but stay on record, so you keep the history without it skewing this month's costs.
If your subscriptions list is a mess right now, I wrote a separate walkthrough on auditing indie tool spend that covers finding every subscription and adding a renewal countdown.
Step 4: Roll it up on Products
Back on Products, add four rollups, all set to Sum:
| Rollup on Products | Relation | Property |
|---|---|---|
| MRR | Revenue | MRR this month |
| Revenue this month | Revenue | Net this month |
| Expenses this month | Expenses | Spend this month |
| Tool costs / month | Subscriptions | Cost per month |
Then one formula:
Monthly profit = prop("Revenue this month") - prop("Expenses this month") - prop("Tool costs / month")
Now every product row shows its own MRR, revenue, costs and profit for the current month.
Turn on the column Sum at the bottom of a table view to get business-wide totals, so you get both views: the whole business and each product.
Two views worth adding on Products:
- This month: a table showing MRR, Revenue this month, Expenses this month, Tool costs / month and Monthly profit, sorted by Monthly profit.
- Losing money: the same table filtered to Monthly profit less than 0. This is the one that changes decisions.
Limitations to know
This setup is genuinely useful, but be honest with yourself about what it isn't:
- No currency conversion. Notion adds up numbers as entered. Pick a home currency and convert before entering; keep a Currency tag for reference.
- Manual entry. Notion doesn't pull from Stripe or Gumroad natively. Log weekly, or use Zapier/Make.
- "This month" is calendar-based. Annual plans paid upfront show as a spike unless you enter them as monthly instalments.
- It's tracking, not accounting. Your accountant still needs proper records.
This isn't tax or accounting advice; check what your own situation needs.
Disclosure: I make Solo Founder OS, which has all of the above pre-built alongside tasks, releases and a dashboard. There's also a free Lite version covering projects, tasks and subscriptions with renewal reminders. Originally published on my blog.
Top comments (0)