ROI Calculator
Sliders in, a payback chart out, for proposals and sales pages.
Companies, people and deals: related databases with a board and a pipeline chart.
Exactly what Notion Arena sends to Notion, in order. Notion's data-source model forces two passes: relations, rollups and the formulas that read them need data_source_ids that only exist once the databases do.
/v1/pagesCreate the “crm-pipeline” container page under the page you chose
/v1/databasesCreate the “Companies” database with 10 base properties
/v1/databases/{companies_database_id}Read back Companies to get its default data source id
/v1/data_sources/{companies_data_source_id}Add 6 deferred properties to Companies: relations (with resolved data_source_ids), then the rollups and formulas that read them
/v1/databasesCreate the “People” database with 9 base properties
/v1/databases/{people_database_id}Read back People to get its default data source id
/v1/data_sources/{people_data_source_id}Add 3 deferred properties to People: relations (with resolved data_source_ids), then the rollups and formulas that read them
/v1/databasesCreate the “Deals” database with 13 base properties
/v1/databases/{deals_database_id}Read back Deals to get its default data source id
/v1/data_sources/{deals_data_source_id}Add 6 deferred properties to Deals: relations (with resolved data_source_ids), then the rollups and formulas that read them
/v1/viewsCreate the “Pipeline board” board view on deals
/v1/viewsCreate the “Weighted pipeline” chart view on deals
/v1/viewsCreate the “Closing this month” list view on deals
/v1/viewsCreate the “Slipped” table view on deals
/v1/viewsCreate the “Accounts gallery” gallery view on companies
/v1/viewsCreate the “Needs a touch” table view on people
/v1/pagesSeed 3 rows into Companies so the views are not empty on first open (one request per row; Notion has no bulk insert)
/v1/pagesSeed 2 rows into People so the views are not empty on first open (one request per row; Notion has no bulk insert)
/v1/pagesSeed 3 rows into Deals so the views are not empty on first open (one request per row; Notion has no bulk insert)
/v1/pagesCreate the “CRM: how this system works” page
/v1/blocks/{crm_how_this_system_works_page_id}/childrenAppend 13 blocks of page body
3 steps cannot be scripted: Button: “Log a call” on every Deal; Automation: stamp “Last stage change” when Stage moves; Automation: nudge the owner when a deal slips.
curl -X POST https://notionarena.vercel.app/api/install \
-H 'content-type: application/json' \
-d '{
"component": "crm-pipeline",
"mode": "plan"
}'
# add "token" and "parentPageId" and switch to "mode": "api" to install for realThe real property schemas, not a description of them. Every formula below is a Notion Formula 2.0 expression you can paste into a property by hand if you would rather not use the API at all.
ref: companiesn/an/aSoftware · Services · Retail · Finance +2SMB · Mid-market · Enterprisenumbern/aHealthy · At risk · Criticaln/an/a→ people (two-way)→ deals (two-way)sum(Deals.Value)sum(Won deals.Value)prop("Closed won")if(empty(prop("Next touch")), 999, dateBetween(now(), prop("Next touch"), "days"))n/aref: peoplen/an/an/an/an/an/a→ companiesn/aEmail · Call · LinkedIn · Eventn/aif(empty(prop("Last contact")), 0, dateBetween(now(), prop("Last contact"), "days"))ifs(prop("Days quiet") > 30, "🔴 Overdue", prop("Days quiet") > 14, "🟡 Soon", true, "🟢 Fresh")ref: dealsn/aprefix DLLead → Qualified → Demo given → Proposal out +3dollarUSD · EUR · GBP · PKRpercentn/an/a→ companies→ peopleInbound · Outbound · Referral · Event +1n/an/aprop("Value") * prop("Probability")dateBetween(now(), date(prop("Last stage change") ?? prop("Created")), "days")if(prop("Days in stage") > 21, "⚠️ Stale", "")if(and(prop("Expected close") < now(), not(or(prop("Stage") == "Won", prop("Stage") == "Lost"))), "🔴 Slipped", "")n/an/aCreated through POST /v1/views, which shipped in March 2026 and is the reason provisioning a workspace from code finally works end to end.
on deals
on deals
on deals
filter: {"and":[{"property":"Expected close","on_or_before":{"value":"en…
on deals
filter: {"property":"Overdue","string":{"equals":"🔴 Slipped"}}…
on companies
on people
filter: {"property":"Follow up","string":{"equals":"🔴 Overdue"}}…
Appended with real block types (headings, toggles, callouts, to-dos, column lists) in chunks of 100, the Append block children limit.
Stage is a Status property, not a Select. That matters: Status options belong to groups (To-do / In progress / Complete), so Notion's board view can group by group, and the group_does_not_equal filter operator can exclude everything closed in one condition.
| Stage | Group | Exit criterion |
| Lead | To-do | A real person has replied |
| Qualified | To-do | Budget, authority and timeline confirmed |
| Demo given | In progress | Technical evaluation started |
| Proposal out | In progress | Pricing sent in writing |
| Negotiation | In progress | Redlines or procurement in play |
| Won / Lost | Complete | Contract signed, or a written no |
prop("Value") * prop("Probability")Feed this into the chart view's Y axis with a sum aggregator and you get a forecast that respects probability, not just a count of deals.
dateBetween(now(), prop("Last stage change"), "days") > 21Deals do not die loudly, they go quiet. This surfaces anything that has not moved in three weeks. It needs a date property that changes when the stage changes; set that with an automation (see the manual steps).
Every recipe ships with its manual steps written out, because pretending the API covers everything is how people end up with a half-built workspace. These are real Notion limitations, quoted from the API reference.
Button properties are response-only in the Notion API: the schema is returned on read, but the API ignores button settings on write and cannot create a button or configure its actions.
Database automations have no public API surface. They are configured per-database in the Notion app under ••• → Automations.
Database automations have no public API surface. They are configured per-database in the Notion app under ••• → Automations.
Three related databases with the property schemas, status groups, rollups and formulas a working CRM needs, plus a board view grouped by deal stage, a chart view of weighted pipeline value, and a dashboard view that assembles both.
Sliders in, a payback chart out, for proposals and sales pages.
Compare monthly income against four editable expense buckets.
Adjust a small item list with plus and minus stock controls.