Notion VIP Logo
BulletproofA-to-ZConsultingThe Streamline

Learn Notion by Building an Accounting System

To be frank, I'm disappointed by accounting apps. Each one is functionally limited, buggy or ugly—sometimes all three. Most recently, I was attracted to the sleek aesthetic and affable tone of FreshBooks, only to find its savvy branding to be lipstick on a pig. One particularly agonizing experience was the last straw, so I committed to taking my bookkeeping elsewhere.

This was shortly after the debut of Notion's API, which introduced a world of automation opportunities. Already, Notion's unique blend of documents and databases made it an excellent tool for managing finances, and the API resolved all lingering inadequacies. Thus, I endeavored to build a more dependable, versatile and gratifying accounting system in Notion.

Even more useful than the outcome of constructing this system is the educational value of the process. Notion is best learned through practical implementation, and everyone manages finances in some capacity. Let's construct a simple version of my accounting system for a practical understanding of Relations and Rollups, Formulas, database templates, and even the API. This specific implementation works best for me, but you can apply the concepts to your own bespoke accounting system and other functions of your custom workspace.

Watch the video above for a detailed demonstration or read the text below for an overview. You can also duplicate the system from Notion Market for your own analysis and customization.

If you're entirely new to these concepts, you may want to start with these introductory posts:

The Bulletproof Principle

If you're familiar with my Notion resources, you know I approach every workspace with an essential tenet: Use databases, not pages.

As the foundation of my Bulletproof framework, this strategy is known as The Bulletproof Principle. I detail it further in the post Optimize Your Workspace for the Notion API, but here's the general approach:

These concepts will make more sense as we develop our accounting system.

System Snapshot

For our contained system, we'll have four interrelated databases within a page called "Accounting Databases."


The Accounts database contains three types of accounts:

For each account, the database will display the current balance.


The Transactions database aggregates all transactions, granularly logging the movement of very dollar. It's the only place you input information; all other databases perform calculations based on transactions. Filtered views allow you to manage and summarize transactions in helpful segments.

Each transaction is categorized and Related to an account, as well as an invoice if applicable.

Transaction types include:


The Invoices database displays helpful information for each invoice. It's entirely automated.


The Organizations database includes the vendors you pay and the clients who pay you. An Organizations database typically serves many other needs in a workspace.

Build the databases.

Accounting Databases in Notion

Create a page called "Accounting Databases" to contain the databases that comprise your system.

Within "Account Databases," create four full-page databases:

For the page and database icons, consider using my Notion Icons tool.


Create the properties.

Organization Database Properties

Open the Organizations database and configure these properties:

Configure the view.

Organizations Database View

A more widely used Organizations database typically contains multiple views, but for our demonstration, we need only to sort the default Table view by Organization, then hide the Transactions property.


Create the properties.

Accounts Database Properties

Within "Accounts," configure these properties:

Configure the view.

Accounts Database View

You're unlikely to require multiple views of the Accounts database, so I recommend:

Add the accounts.

Accounts Database Inputs

For initial configuration, add one account for each type. Choose the type within the Type property.


The Transactions database is the hub of your accounting system. It's where you input all information, which other databases use for calculations.

The Transactions database can seem overwhelming, but it's much simpler when you consider one transaction type at a time. Filtered views make it easy to manage.

Here's a breakdown of the transaction types, each of which will have corresponding options in the Categories property:

Balance → These are used to adjust your balance when conventional transactions are inapplicable. They can increase or decrease an account's balance. Categories include Opening Balance and Balance Adjustments.

Equity → Equity transactions are owner contributions and withdrawals that do not affect the business's reported revenue or expenses. They can increase or decrease an account's balance. Categories include Owner's Draw and Owner's Contributions.

Expense → Expenses are the purchases of goods and services that are deducted from revenue to calculate net income. In this system, expenses always reduce an account's balance. Example categories include SaaS, Transaction Fees, Hardware and Healthcare.

Revenue → Revenue transactions include full invoice amounts and other income prior to transaction fees and other associated expenses. In this system, revenue always increases an account's balance. Also worth noting is that revenue for an invoice is registered when the invoice is issued. The selected account is Account Receivable. When the invoice is paid, the amount is transferred from Accounts Receivable to the funded account. Example revenue categories include Invoice Issued and Other Income.

Transfer → Transfers migrate assets from one account to another. Each transfer includes two transactions: one for the origin account, another for the destination account. Example categories include Invoice Payment and Payment Gateway Payout.

Create the properties.

Transactions Database Properties

With all properties created, you can populate the Title Generator property. It's important to use a unique title for all database items, so this property automatically generates a title from other property values, which you can easily copy and paste into the Title property. Here's the formula:

formatDate(prop("Date"), "YYYY-MM-DD") + " › " + prop("Account") + " › " + prop("Type") + if(empty(prop("Payee")), "", " (" + prop("Payee") + ")") + if(empty(prop("Invoices")), "", " (" + prop("Invoices") + ")")

Example Transactions

Opening Balance

Your bookkeeping is unlikely to begin with empty accounts. With the "Balance" type and "Opening Balance" category, you can establish your starting balance.

Transactions Example: Opening Balance
Monthly Expense

A typical monthly expense is a subscription to Zapier.

Transactions Example: Monthly Expense
Invoice Issued

When an invoice is created and delivered to a client, it's logged as a "Revenue" transaction:

Transactions Example: Invoice Issued
Invoice Payment

When a client makes an invoice payment, it's logged as a "Transfer" from Accounts Receivable to the funded account. This involves two transactions—one for the origin account, the other for the destination account. The values are the same for both transactions unless otherwise noted.

Transactions Example: Invoice Paid
Non-Invoice Income

Many businesses receive revenue without issuing invoices. For these, you can create specific categories, such as "Template Sales," or use "Other Income."

Transactions Example: Other Income
Transaction Fee

Payment gateways, such as PayPal and Stripe, charge a fee for most transactions. You'll log these fees as expenses. I often aggregate a month's worth of fees into a single transaction, particularly when payouts are monthly.

Transactions Example: Transaction Fee

When an owner contributes or withdraws equity from the business, you'll log an equity transaction.

Transactions Example: Equity
Payment Gateway Payout

A payout from a payment gateway is typically a transfer from the gateway account to a bank account. You'll log a transaction for each account, where most of the values are the same.

Transactions Example: Gateway Payout

Configure the views.

Transactions Database View

Preconfigured views make it easy to manage your Transactions database. You can view your transactions by Type, Category, Account, Status and other properties. Here are the views I find most helpful—each formatted as a table and sorted by Date:

You can also view transactions by account after creating the Accounts database template.


Notion Invoices Database

The Invoices database populates all properties from Related transactions. Prior to creating the properties, populate various invoice transactions, which will create a few sample invoices.

Create the properties.

Configure the views.

A handful of the Invoices properties are used only as references for other properties. Therefore, you can hide them from all views. Those properties include:

With the remaining properties, I recommend a view for "Open Invoices" and "All Invoices"—both sorted by Date Issued. For "Open Invoices," filter for the items where:

Calculate balances.

Notion Accounts Database: Balance Property

With all Relations established, you can calculate the balance for each account:

Create an account template.

Notion Bank Account Template

In addition to your preconfigured views of the Transactions database, you can automatically filter transactions within each account by creating a template:

Thereafter, when you click the template within a project, it will automatically display transactions filtered for that project.

Create annual reports.

Just as you've summarized your finances by account, you could do the same with years by Relating a Years database to Transactions. The "Year" template could include multiple Linked Databases—one for each transaction type—to generate an intuitive report for accountants and other stakeholders.

Automate with the API.

Zapier: Notion and Harvest Invoices

With integrations facilitated by Notion's new API, you can automate much of this accounting workflow. By connecting Notion to your banks and payment gateways, you can automatically add transactions based on predefined conditions.

You can also populate invoices that are issued from tools like Harvest, AND.CO, and my dreaded FreshBooks. To do so, you'll use Zapier, or Integromat to build an automation that's triggered when a new invoice is created. The action is then to create an item in your Invoices database.

If you hit any roadblocks while exploring these concepts, I'm all ears @WilliamNutt. If you're able, consider duplicating and dissecting the template from Notion Market.

All-in on
the all-in-one
productivity app.
Subscribe →