Under the hood

What runs when someone opens a case, answers a request or looks at a verdict.

Fourteen n8n workflows, one Google Sheet, Claude for the writing and reading, Gmail for the mail, and a small Cloudflare Worker in front that serves the static pages and keeps crawlers away from the run budget. Nothing else.

The shape of it

Your browserone link per person profitorburn.comCloudflare Workerstatic pages, cache, bot gate,document store, snapshots n8n Cloud14 workflows, 121 nodeswebhooks, schedules,Code nodes, LLM chains Google Sheet14 tabs, the only store Claudewrites the words, reads the quotes Gmailrequests, digests, approvals

What costs a run

Opening a case, an answer, a decision, a reforecast, a document read, a chat question, and a page that has to be rendered for one person. Static pages, cached pages and the snapshots cost nothing, so a hundred visitors reading the home page cost n8n nothing at all.

What holds it together

Every person gets one link with their own key; there is no login. The key decides what the page shows: the owner sees everything on their case, each stakeholder sees what the owner allowed, a reader with no key sees the case and the verdict. The sheet is the only store, so FP&A can always open it and see every row.

The fourteen workflows

Each canvas below is drawn from the workflow itself: the same nodes, in the same places, with the same connections. Teal marks the trigger, ember the Claude step. Together: 121 nodes and about 1200 lines of JavaScript in the Code nodes, where the rules live. The long ones scroll sideways.

PoB 1. New investment case (form page)

A visit to /new (served from the edge) · 2 nodes

The form a budget owner fills in. The Worker serves a static copy, so a visit costs no run; this workflow is the source of the page.

WebhookWebhookRespond with the formRespond to Webhook

PoB 2. Create the case and send the requests

One run per case opened · 15 nodes · 272 lines of code

Checks the form, counts the rows already in the sheet, lets Claude write the case and a plain-English request for each person, saves the rows, emails the requests, saves which emails went out and answers with the links.

WebhookWebhookCheck the caseCodeValid?IfRespond with the problemRespond to WebhookCount rowsHTTP RequestWrite the caseBasic LLM ChainClaudeAnthropic Chat ModelAssemble rowsCodeSave to the sheetHTTP RequestAnyone to email?IfEmails to sendCodeSend the requestsGmailWhat was sentCodeSave the email statusHTTP RequestRespond with the linksRespond to Webhook

PoB 3. Case page

One run per view; the public page is cached for an hour · 4 nodes · 245 lines of code

Reads the sheet and renders the case page for whoever holds the link: the owner, one of the people asked, or a reader with no key, who sees the case and the verdict only.

WebhookWebhookRead the sheetHTTP RequestRender the case pageCodeRespond with the pageRespond to Webhook

PoB 4. Stakeholder input

One run per answer · 12 nodes · 62 lines of code

Takes an answer from a personal link, checks it, lets Claude write it clearly, and files it under the right case and person.

WebhookWebhookRead the sheetHTTP RequestCheck inputCodeValid?IfRespond with the problemRespond to WebhookWrite it clearlyBasic LLM ChainClaudeAnthropic Chat ModelRowsCodePublish?IfSave to the sheetHTTP RequestRespond publishedRespond to WebhookRespond declinedRespond to Webhook

PoB 5. Owner decision

One run per decision · 7 nodes · 25 lines of code

Records the owner's decision, after checking that the link really is the owner's.

WebhookWebhookRead the sheetHTTP RequestCheck the decisionCodeAllowed?IfSave to the sheetHTTP RequestRespond recordedRespond to WebhookRespond refusedRespond to Webhook

PoB 6. Contracts watch (every Monday)

One run a week (switched off in the demo) · 6 nodes · 36 lines of code

Every Monday: reads every cost line, lists the cancel-by dates in the next three weeks and the money signed before a decision, and emails FP&A.

Every Monday 08:00Schedule TriggerRun nowManual TriggerSettingsEdit FieldsRead the contractsHTTP RequestContracts watchCodeEmail FP&AGmail

PoB 7. Open the monthly reforecast (2nd of each month)

One run a month (switched off in the demo) · 9 nodes · 38 lines of code

On the second of each month: opens the reforecast round, makes a personal link for every budget owner and emails FP&A.

2nd of each month 08:00Schedule TriggerRun nowManual TriggerSettingsEdit FieldsRead the forecastHTTP RequestOpen the roundCodeNew round?IfSave the roundHTTP RequestLinks for FP&ACodeEmail FP&AGmail

PoB 8. Reforecast page

One run per view; the roll-up is cached for ten minutes · 4 nodes · 112 lines of code

The round roll-up for FP&A, or an owner's own form when the link carries their key.

WebhookWebhookRead the roundHTTP RequestRender the pageCodeRespond with the pageRespond to Webhook

PoB 9. Submit a reforecast

One run per reforecast · 12 nodes · 58 lines of code

Takes an owner's new forecast and the reason, lets Claude write the reason clearly, and saves it.

WebhookWebhookRead the roundHTTP RequestCheck the reforecastCodeValid?IfRespond with the problemRespond to WebhookWrite it clearlyBasic LLM ChainClaudeAnthropic Chat ModelRowsCodePublish?IfSave to the sheetHTTP RequestRespond savedRespond to WebhookRespond declinedRespond to Webhook

PoB 10. Verdicts and look back (every morning)

One run a day (switched off in the demo) · 9 nodes · 80 lines of code

Every morning: compares results with forecasts, sets the provisional verdict at 30 days and the final one at 90, and sends the digest to FP&A.

Every day 07:00Schedule TriggerRun nowManual TriggerSettingsEdit FieldsRead results and forecastsHTTP RequestSet the verdictsCodeAnything new?IfSave the verdictsHTTP RequestDigest for FP&ACodeEmail FP&AGmail

PoB 11. Quarter review (first week of each quarter)

One run a quarter (switched off in the demo) · 12 nodes · 54 lines of code

In the first week of each quarter: computes the quarter pack, lets Claude draft the memo, waits for FP&A's approval by email, then files it.

6th of Jan, Apr, Jul, Oct 08:00Schedule TriggerRun nowManual TriggerSettingsEdit FieldsRead the quarterHTTP RequestCompute the quarter packCodeNot approved yet?IfWrite the memoBasic LLM ChainClaudeAnthropic Chat ModelWait for approvalGmailApproved?IfFile the memoCodeSave to MemosHTTP Request

PoB 12. Propose a definition change

One run per proposal · 14 nodes · 26 lines of code

Takes a proposed change to a metric definition, lets Claude write it clearly, files it and tells FP&A.

WebhookWebhookRead the proposalsHTTP RequestCheck the proposalCodeValid?IfRespond with the problemRespond to WebhookWrite it clearlyBasic LLM ChainClaudeAnthropic Chat ModelRowsCodeFile it?IfSave to the sheetHTTP RequestRespond filedRespond to WebhookRespond declinedRespond to WebhookTell FP&ACodeEmail FP&AGmail

PoB 13. Read a supplier quote or email thread

One run per document · 11 nodes · 54 lines of code

Reads a supplier quote or an email thread (PDF or text) and fills the cost line: supplier, amount, terms, cancel-by date. The document itself is kept at the edge, not in n8n.

WebhookWebhookPrepare the documentCodeReadable?IfRespond with the problemRespond to WebhookA PDF?IfPDF to fileConvert to FileText from the PDFExtract from FileRead the documentBasic LLM ChainClaudeAnthropic Chat ModelFields for the formCodeRespond with the fieldsRespond to Webhook

PoB 14. The three views: owner, stakeholder, FP&A

One run per view; the FP&A view is cached for ten minutes · 4 nodes · 145 lines of code

The three views. A budget owner sees their cases, a stakeholder sees what is waiting for them, FP&A sees everything and where the gaps are.

WebhookWebhookRead the sheetHTTP RequestRender the viewCodeRespond with the pageRespond to Webhook

Also running

A chat workflow answers questions about the budget from a context file built from the sheet (Ask the budget), and two housekeeping workflows: one loads the invented year into the sheet, one sends an email when any workflow fails.

What is assumed

The money side of a verdict rests on a few values that are set by hand in this demo: the price of each plan, the months a subscriber stays, the share of enterprise pipeline that closes, the years of margin a contract brings, and the 30 and 90 day windows. In production each of them is wired to the actual value and refreshed, not typed in. The rules themselves (the band of plus or minus 15 percent, the provisional and final verdicts, who sees what) are decisions, and they are written down in the Code nodes where anyone can read them. The research behind them is on the studies page.

Guard rails