Reading Progress Tracker
Track pages read in one book, with progress saved on this device.
A published page with intake form, status board and a synced header.
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 “client-portal” container page under the page you chose
/v1/databasesCreate the “Clients” database with 8 base properties
/v1/databases/{clients_database_id}Read back Clients to get its default data source id
/v1/data_sources/{clients_data_source_id}Add 4 deferred properties to Clients: relations (with resolved data_source_ids), then the rollups and formulas that read them
/v1/databasesCreate the “Deliverables” database with 7 base properties
/v1/databases/{deliverables_database_id}Read back Deliverables to get its default data source id
/v1/data_sources/{deliverables_data_source_id}Add 2 deferred properties to Deliverables: relations (with resolved data_source_ids), then the rollups and formulas that read them
/v1/databasesCreate the “Intake Requests” database with 8 base properties
/v1/databases/{intake_database_id}Read back Intake Requests to get its default data source id
/v1/data_sources/{intake_data_source_id}Add 1 deferred properties to Intake Requests: relations (with resolved data_source_ids), then the rollups and formulas that read them
/v1/viewsCreate the “Client intake form” form view on intake
/v1/viewsCreate the “Portal board” board view on deliverables
/v1/viewsCreate the “Delivery timeline” timeline view on deliverables
/v1/viewsCreate the “Delivered gallery” gallery view on deliverables
/v1/viewsCreate the “All clients” table view on clients
/v1/viewsCreate the “Requests queue” table view on intake
/v1/pagesSeed 1 rows into Clients so the views are not empty on first open (one request per row; Notion has no bulk insert)
/v1/pagesSeed 2 rows into Deliverables so the views are not empty on first open (one request per row; Notion has no bulk insert)
/v1/pagesCreate the “Client portal page” page
/v1/blocks/{client_portal_page_page_id}/childrenAppend 13 blocks of page body
3 steps cannot be scripted: Automation: notify on new intake; Automation: tell the client when a deliverable lands; Publish the portal.
curl -X POST https://notionarena.vercel.app/api/install \
-H 'content-type: application/json' \
-d '{
"component": "client-portal",
"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: clientsn/aOnboarding → Active → Paused → Offboardedn/an/an/an/an/adollar→ deliverables (two-way)→ intake (two-way)count(Deliverables.Status)if(empty(prop("Next milestone")), 0, dateBetween(prop("Next milestone"), now(), "days"))ref: deliverablesn/aQueued → In progress → In client review → Changes requested +1→ clientsn/an/an/an/an/aifs(prop("Status") == "Delivered", "✅ Delivered", empty(prop("Due")), "⚪ No date", prop("Due") < now(), "🔴 Late", true, "🟢 Due " + formatDate(prop("Due"), "MMM D"))ref: intaken/a→ clientsNew request · Change request · Question · BugLow · Normal · Urgentn/an/adefault Not started / In progress / Donen/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 intake
on deliverables
filter: {"and":[{"property":"Client visible","checkbox":{"equals":true}}…
on deliverables
filter: {"property":"Client visible","checkbox":{"equals":true}}…
on deliverables
on clients
on intake
Appended with real block types (headings, toggles, callouts, to-dos, column lists) in chunks of 100, the Append block children limit.
Everything about our work together, in one place. Updated as it happens. No weekly status email.
Your contact
@you
Next milestone
· linked Days to milestone
Linked view: Deliverables → Portal board, filtered to this client and Client visible = checked.
Publish the Client intake form view and embed it here. Submitters need no Notion account.
Linked view: Deliverables → Delivered gallery.
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.
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.
Share settings and public publishing are workspace-level and not exposed on the pages API.
Everything a client needs on one publishable page: a form view they can submit without a Notion account, a filtered board showing only their work, a synced header block with contact details, and an embedded countdown to the next milestone.
Track pages read in one book, with progress saved on this device.
A due-card queue with simple local review intervals.
A focused question-and-answer deck with active-recall progress.