In short
n8n workflow that gives an agency founder one daily view of the money. Every morning it pulls recurring revenue from Stripe, invoices from Zoho Books, pipeline from GoHighLevel and client agreements from ClickUp, checks each source, and reconciles them against each other. Code calculates MRR, receivables, pipeline and 30/60/90 day forecasts split into confirmed and speculative. Gemini writes a daily brief from verified figures only, and a guardrail checks every number in it before it is published. In the recorded run: 12 steps in 22 seconds, 32 of 32 numbers verified, one unbilled client caught.
Project description
A growing agency keeps its money in four places: retainers in Stripe, project invoices in Zoho Books, the sales pipeline in GoHighLevel and client agreements in ClickUp. The founder's question is simple, "how much is coming in over the next 90 days and what needs my attention today", and answering it means four logins and a spreadsheet. This n8n workflow answers it every morning at 7:00. I built it as a working demo for an agency's job post, on sandbox data in each API's real response format, and recorded it running end to end.
Tools & Deliverables
- n8n workflow on a 7:00 schedule pulling Stripe subscriptions, Zoho Books invoices, GoHighLevel opportunities and a ClickUp client agreements list
- Source health check on every run: each pull continues on error, so a failed sync is reported and its numbers marked stale instead of silently showing zero
- One tested calculation module: MRR and its movement this month, ARR, invoice aging and collections, pipeline by stage with probabilities, and 30/60/90 day forecasts split into confirmed and speculative
- Cross-system reconciliation: agreements with no billing, fee mismatches between ClickUp and Stripe, overdue invoices, deals with no owner, late follow-ups, scheduled churn and unconfirmed renewals
- Gemini daily brief written from verified figures only, then a guardrail step that extracts every number it wrote and matches it against the data before publishing
- Founder alert on critical issues, and a dashboard page built from each run's snapshot
The problem
- The numbers live in four tools that do not talk to each other. Stripe knows what is billed, Zoho knows what is invoiced and unpaid, GoHighLevel knows what might close, and ClickUp knows what was agreed. None of them knows what the others say.
- Forecasts mix money you have with money you hope for. A signed retainer and a deal at the proposal stage end up in the same total, so the 90 day number looks better than it is.
- The expensive mistakes are the silent ones. A client marked active in ClickUp but never set up in Stripe is revenue that is simply not being billed, and nobody notices until the month end.
- Syncs fail quietly. When an API token expires, the dashboard shows zero or yesterday's number and still looks normal, which is worse than showing nothing.
- An AI summary of financial data can invent figures. A model asked to summarise revenue will produce a fluent paragraph, and one wrong number in it is enough to make the founder stop trusting the whole report.
Approach
Each tool is used for what it is the source of truth for. Recurring revenue, new and churned clients come from Stripe subscriptions. Agreement terms, fees and end dates come from the ClickUp agreements list. Outstanding invoices, due dates and collections come from Zoho Books. Pipeline, stages, owners and follow-ups come from GoHighLevel. The four pulls run in sequence and each one continues on error, so the calculation step knows exactly which sources answered and can mark the rest as stale.
All the money logic lives in one small code module, because forecasts and reconciliation need to be repeatable and testable. Confirmed revenue is retainer billing that falls inside the agreement term plus open invoices due in the window. Speculative revenue is the weighted pipeline, using a probability per stage, plus renewals that are not yet confirmed, counted at 70%. Overdue invoices are kept out of the forecast and listed separately for chasing. The same module then compares the tools against each other and turns every mismatch into a ranked alert. AI comes last: Gemini receives only the verified figures and writes the morning brief, and a guardrail step extracts every number from its text and checks it against the data. If one does not match, the brief is held back and the dashboard shows the numbers alone.
Solution
In the recorded run, all 12 steps went green in about 22 seconds. The dashboard showed $42,900 in monthly recurring revenue, up $9,100 this month after two new clients and one churn, $37,070 in outstanding invoices with $6,820 overdue, and $126,500 of weighted pipeline across seven open deals. The 30 day forecast came out at $57,250 confirmed plus $20,175 speculative, and the 90 day forecast at $123,050 confirmed plus $54,055 speculative, with the split visible line by line.
The reconciliation is where it earned its keep. It flagged a client active in ClickUp at $3,600 a month with no Stripe subscription, which is revenue not being billed, and sent that to the founder as a critical alert. It also caught a $200 a month fee mismatch between ClickUp and Stripe, a 40 day overdue invoice, two deals with no owner and two late follow-ups. The AI brief covered all of it, and the guardrail checked 32 numbers in its text against the data with 0 mismatches before it was published.
FAQ
Is this connected to real accounts?
The demo runs on sandbox copies of each API with the exact response format, filled with fictional clients. Going live only changes the four source steps: the real endpoint and a read-only credential for Stripe, Zoho Books, GoHighLevel and ClickUp. Everything downstream stays the same.
How do you stop the AI from inventing numbers?
The model never sees raw data, only the verified figures, and it is told to use no other numbers. Then a guardrail step extracts every number it wrote and matches it against the data. In the recorded run 32 numbers were checked and 0 were unmatched. If one ever fails, the brief is held back and the dashboard shows the numbers alone.
What happens when a sync fails?
Each source step continues on error, so the run still finishes. The failed source is marked in the sync health table, its numbers are shown as stale rather than zero, and the founder gets an alert.
Could this run in Make.com instead of n8n?
Yes. The steps map one to one: four HTTP modules on a schedule, one code step for the calculations, an AI module for the brief, a filter for critical alerts and a data store or database for the daily snapshot. For a team already on Make.com, that is the recommended setup.
What does confirmed mean in the forecast?
Retainer billing that falls inside a signed agreement term, plus open invoices due inside the window. Weighted pipeline and renewals that are not yet confirmed are speculative. The definition is agreed with the client during discovery, because it decides what the founder plans around.






