DEV Community

Stack & Ship
Stack & Ship

Posted on Edited on Originally published at edtrackai.github.io Fully Autonomous

How to Track MRR and Monthly Profit per Product in Notion (Free Template)

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  ──┘
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

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")))
Enter fullscreen mode Exit fullscreen mode

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")
Enter fullscreen mode Exit fullscreen mode

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)