The notice window: the contract renewed itself because nobody counted backwards
Every agreement read once for its notice period, so the last day you can still leave arrives 30 days early with the letter already written
- Twelve months of bank statements, read once for every recurring payment leaving the account - that list, not the filing cabinet, is what tells you which contracts exist
- The signed PDF for each agreement, including the terms and conditions page the signature refers to
- An always-on machine with roughly 16 GB of RAM if the reading step runs locally; a mini-VPS at EUR 5-12/month otherwise
- Someone who will actually print, sign and post the letter - the automation stops at the printer
Version history
Nobody is going to remind you. The protection that forces a supplier to warn you before a contract renews is being written for consumers, not for businesses, and it does not apply to you at all. So the clock has to be yours.
The architecture
the same flow as text
▼
[ Docling ] turns the PDF into text that still knows its page numbers
▼
[ Local model via Ollama ] drafts: start date, term length, renewal type,
│ notice period, required channel — and quotes the clause verbatim
▼
[ You confirm it. Once, per contract. ] ◄── the draft is never the record
▼
[ Grist — the register, one row per agreement ]
│ last_notice_day = renewal_date − notice_period
│ decide_by = last_notice_day − 30 days
▼
[ n8n — one pass every morning ]
├─ decide_by: "a month to compare the market or renegotiate"
├─ −14 days: letter generated, clause quoted, ready to sign
├─ −3 days: "registered post today or it renews"
└─ after: proof of posting filed back onto the row
Nothing is sent for you. The letter is written; the signature is yours.
The design decision is the confirmation step in the middle. A model reading a contract is fast and it is wrong often enough to matter, so it produces a draft and the register holds only what a human accepted. That also gives you the thing you actually want at the deadline: the computed date and, next to it, the sentence it came from.
The problem
Take the standard clause: "this agreement renews automatically for successive twelve-month terms unless either party gives written notice at least sixty days before the end of the current term." Read on the day you sign, it is unremarkable. Read eleven months later, it means the decision you thought you had in November was actually taken in September, by you, by saying nothing. A small business carries twenty to forty of these at once — telecom, leasing, alarm monitoring, waste collection, the card terminal, the accounting package, three pieces of software, the insurance. Miss one window on a €180/month contract and it costs €2,160 to be six days late.
The law is not coming to help the business buyer, and the direction of travel proves it. Across the EU the new rules on tacit renewal are being written for consumers: one member state, Belgium, has just adopted a proactive notification duty — the supplier must warn the customer before a renewal, at least fifteen days before the deadline to object (Act of 20 April 2026, new Article VI.91 §1/1 of the Code of Economic Law, in force 1 May 2027) — and it applies to consumer contracts only. In the US the Federal Trade Commission's "click-to-cancel" rule was vacated by the Eighth Circuit on 8 July 2025, six days before it took effect; the Commission sent a fresh notice of proposed rulemaking to the budget office on 30 January 2026, and around thirty states run their own automatic-renewal statutes. Consumer statutes again. In the UK and Canada the picture is the same shape. Between two businesses the rule is freedom of contract: the clause you accepted is the clause that binds you.
The software that tracks this exists and is priced for legal departments. ContractSafe publishes $450/month as its entry plan and Concord $499/month base plus $49–89 for each user past the first five (both vendor-published, checked 04/09/2026). For thirty contracts that is not a purchase, it is a joke. What you actually need is a list, some date arithmetic, and something that shouts.
Tool choices — and why
Setup outline
- Before any software: pull twelve months of bank statements and list every recurring payment leaving the account. That list, not the filing cabinet, tells you which contracts exist. Almost everyone finds two they had forgotten.
- Collect the signed PDF for each one, including the terms and conditions page the signature refers to. A contract you cannot produce cannot be cancelled cleanly.
- Deploy Grist and n8n (both publish Docker images) on one box behind HTTPS. Build the register: supplier, what it is for, monthly amount, start date, term length, renewal type, notice period, notice channel, clause quote, clause location, status.
- Add two formula columns. last_notice_day counts back the notice period from the next renewal date; decide_by is thirty days before that. Sanity-check both against three contracts you already know by heart.
- Install Ollama and Docling. Write one prompt that returns the fields as JSON plus the verbatim clause, and run it over the archive. Expect a draft, not an answer.
- Confirm each row by eye against the contract. This is the slow part — budget five minutes per agreement, an afternoon for thirty. It is done once.
- Build the n8n workflow: read the register each morning, fire at decide_by, at fourteen days and at three days before last_notice_day. Each message carries the amount, the quoted clause, the required channel and a link to the row.
- Write the letter template once — your details, their details, the contract reference, the clause quoted back, the effective end date, a request for written confirmation — and have WeasyPrint fill it. Test the whole chain by setting one row's renewal date to next week.
Pitfalls — what goes wrong when you build this
Verified repos
paperless-ngx — GPL-3.0, 44.8k stars, active (03/09/2026)
Docling — MIT, 64.9k stars, active (17/08/2026)
Ollama — MIT, 179.3k stars, active (23/08/2026)
Grist — Apache-2.0, 11.7k stars, active (04/09/2026)
n8n — Sustainable Use License (free self-hosted internal use), 201.9k stars, active (23/08/2026)
WeasyPrint — BSD-3-Clause, 9.6k stars, active (02/09/2026)
OpenContracts — MIT, 1.5k stars, active (03/09/2026) — the heavier alternative
Get the next blueprint as it publishes — free, practical, verified tooling only.
Subscribe · Want this audited or extended for your business? DM @RXed_EU
What this costs to run
Priced as Extract fields from a document — one OCR'd page; output is a JSON record of 8-20 fields. the model copies six fields and one clause out of a contract and hands them over as a draft; a person confirms every row before it enters the register, and no message is ever sent without a signature. Adjust the volume to yours; the bill is a range because the assumptions are ranges.
| Model | $/day | $/month | Reasoning |
|---|
Cheapest eight shown — straight per-token
arithmetic on list prices: no caching, no batch discount, thinking tokens bill as output.
All models + every assumption in the full explorer →
Capability & cost data: Artificial Analysis