The nightly close for a business with no CFO — and the only one that will tell you it doesn’t know.
Every dashboard you have ever been shown filled its gaps with a zero. A feed times out, a connection expires, a tag stops firing — and the chart still draws a confident line, because a blank looks broken and a zero looks like a slow week. The Till pulls the money in and the money out into one hash-chained ledger where every row still knows which system it came from, and when it cannot read a feed it writes UNKNOWN and refuses to print the ratio underneath it.
This is the real engine, not a picture of one — the same reconciliation, the same watchers, the same rule compiler, ported from production and checked against it. Switch a source to DARK, or tamper with the ledger, and see exactly what a close is supposed to do about it.
| Date | Kind | Amount | Source | Source id | Hash |
|---|
Both engines were run against the same 10 scenarios on 2026-08-27 and produced identical totals, identical findings, identical rule verdicts and identical ledger hashes — 0 differences. The demo above is the tool, not a picture of it.
Two closes, run on live connections on 2026-08-27. Neither one is flattering, which is the point — a close that only prints when the news is good is a brochure.
| Entity | Window | Ad spend | Net revenue | MER | Status | What the close said |
|---|---|---|---|---|---|---|
| Rooster Agents LLC | 2026-07-29 → 2026-08-27 | $0.00 | UNKNOWN | UNKNOWN | PARTIAL | Stripe answered and PayPal did not, so the money side is incomplete and the close says so rather than reporting the half it could read as the whole. |
| The Bridge (client) | 2026-07-29 → 2026-08-27 | $7,112.33 | UNKNOWN | UNKNOWN | PARTIAL | Every dollar of spend is visible and there is no revenue feed connected at all, so the close refuses to state a return and raises it as the finding. |
Rooster Agents: the payments feed that went dark mid-run (RuntimeError: Failed to fetch transactions: 401 Unauthorized) is a real outage, not a demo — it read perfectly an hour earlier. The close rode out a 37-second retry window, then reported the gap instead of dropping the source silently. The ledger it did build is 2 entries, chain verified. The $0.00 of ad spend is a measured zero, not an assumed one: the only ad feed wired to this entity is a Meta account that answered and returned no rows for the window — a close can only ever speak for the feeds connected to it, and it says which those are. The Bridge: $7,112.33 of real Google Ads spend across 30 days, 29 daily entries, chain verified at 9ea8a2f24587fbee. No payment or booking feed is wired into the close yet — so the honest answer to “what did that spend return” is that nothing on this account can currently tell you, and that is exactly what it prints.
The first pass at the payments feed read every PayPal row and treated anything positive as money in.
It produced a clean, confident, completely wrong $3,393.10 of gross revenue for
the month. Roughly $2,900 of that was event code T0700 — the
card-funding leg that appears every time you send a payment. The money never came in; it went out, and
the card refilled the balance on the way past. A pairing of subscriptions Andrew pays for read as a good sales
month.
The fix is the doctrine, not a patch: the engine now carries a map of transaction types it has actually verified, and any row whose type is not in that map is excluded from every total and reported as unclassified — the close drops to PARTIAL and tells you how much money it declined to guess about. Funding legs and bank transfers are never revenue. Pending and denied rows are counted, never summed.
The engine in your browser and the production engine were run against the same 10 scenarios on 2026-08-27 — a clean month, a dead processor, a dead ad platform, a spend-only account with no money feed, a revenue cliff, a refund spike, unclassifiable rows, and everything dark at once.
| Checked | Result |
|---|---|
| Scenarios run through both engines | 10 |
| Ledger entries hashed on both sides | 1,444 |
| Metrics compared (value and known/unknown) | 110 |
| Findings compared (id, severity, wording) | 9 |
| Rule compilations and evaluations compared | 80 |
| Chain head hashes that matched | 10 of 10 |
| Differences found | 0 |
The production engine also ships a self-test with the negative controls that matter: a dark feed must never become a zero, a tampered ledger must be caught, a rule that leans on an UNKNOWN metric must be held rather than passed, and a sentence it does not understand must be refused rather than guessed. Last run on 2026-08-27: 27 checks, 0 failures.
Because the question “did last month make money” is normally answered in the middle of the month after, by someone reading a bank balance. A close is just the discipline of answering it every night while the answer can still change what you do. The owner-sized version does not need journals and accruals — it needs money in, money out, what the ads cost, and what is left.
A dashboard draws a line through a gap. If the pixel stopped firing on the 12th, the chart shows a quiet week, and quiet weeks get explained away. The Till separates “this was zero” from “I could not see this”, and when it cannot see something it refuses to print the ratios that depend on it. You lose a number and gain the truth about the number.
It is the opposite — it is the only honest thing to do with missing data, and it is louder than a zero. An UNKNOWN drops the whole close to PARTIAL, names the feed that went dark and the exact error it returned, and raises a finding that says fix this connection. A zero raises nothing, which is why every reporting tool prefers it.
Each entry is hashed together with the hash before it, so the ledger has one head hash that stands for the whole month. Change a settled row after the fact — even by a cent — and every hash after it stops matching and the close refuses itself. It means the numbers you were shown in the morning are provably the numbers that were there, which matters the day someone disputes them.
No, and that is deliberate. Every watcher produces a finding with a proposal attached and stops. An agent that can pause a campaign because an API timed out is a liability. The one thing it does automatically is tell you — and when a rule you wrote depends on a number the close could not see, the rule is held and reported as held rather than quietly evaluated against a phantom zero.
In a sentence. “If ad spend is over 200 in a day and bookings are zero, text me.” It compiles that into a rule and shows you the rule it built, in English, before it runs. If it cannot understand your sentence it refuses and tells you which half it did not follow — it never guesses at what you meant and quietly watches the wrong thing.
Read-only access to wherever the money lands — the payment processor, the booking system — and to the ad accounts. Nothing that can move money, nothing that can spend. The first close can run the same day, and if half the picture is missing it will say so on the first run instead of six weeks in.
Read-only connections to what you already use. First close inside a day, and it will tell you plainly which part of your money it cannot see yet.
Text Rudy the word TILL🍪 We use cookies and similar technologies to run this site, remember your preferences, measure traffic, and improve your experience — and some tools help us understand which businesses visit us. By clicking Accept you agree to this use. You can decline non-essential cookies anytime. See our Privacy Policy.