My friend just paid €2,000 in auto-renewal fees he forgot to cancel. So I built him a watchdog

:waving_hand: Hey n8n Community,

After helping Mike out a few times already with n8n, it seems like he keeps finding slipping processes that could use automation. And since the community here gave great feedback on the previous workflows, I’m pretty sure these problems are more common for small business owners than many think.

This time Mike had a nearly €2,000 bill come in because he forgot to cancel two contracts that auto-renewed after the first period. Nobody caught the cancellation window early enough. Classic Mike problem – handled manually, nobody owned it, eventually blew up.

The Problem

Mike’s team signs contracts across everything – SaaS tools, the office lease, consultants, insurance. Each has its own term, its own notice period, its own cancellation deadline. None of it was tracked. Contract PDFs lived scattered across Sarah’s Drive, a few inboxes, and a DocuSign archive nobody had the login for.

The only time anyone noticed a contract existed was when the invoice for the next term landed.

The Solution: A Two-Part Watchdog

Two workflows working together. Split into two partly because the logic is different (intake vs. monitoring), partly because n8n doesn’t like multiple triggers in one workflow – something I learned the hard way a few posts ago.

Part 1 – Intake & Classification

Sarah drops any contract into a watched Drive folder. The workflow detects the file, sends it to easybits Extractor, which classifies it (SaaS / Lease / Service / Insurance / Other) and extracts every renewal field in the same call — parties, value, term, notice period, auto-renew, signatories. A Set node calculates the end date and cancellation deadline. The row lands in the matching tab of one Google Sheet.

Grab the workflow template here

Part 2 – Daily Slack Watchdog

Runs at 9am. Reads the sheet, checks days remaining until each cancellation deadline, sends tiered Slack alerts:

:green_circle: 30 days out – heads-up

:yellow_circle: 14 days – action needed

:red_circle: 7 days – urgent

Auto-renewing contracts get a stronger warning than ones that just expire. That’s the distinction where Mike’s money is actually at stake.

Grab the workflow template here

Biggest Learning

The classify-and-extract-in-one-call pattern. I almost built five type-specific extraction pipelines before realising the Extractor handles both jobs in a single call if classification is just another field in the same pipeline. Half the complexity, half the cost.

Also: don’t extract end_date from the document – derive it in n8n from start_date + initial_term_months. Contracts rarely print the end date, and asking a model to do date math is asking for silent off-by-one bugs.

Installation

If you’re on n8n Cloud, the easybits Extractor node is already available. If you’re self-hosting: Settings → Community Nodes → '@easybits/n8n-nodes-extractor'.

Question: how are you currently tracking contract renewals? Spreadsheet someone updates manually? A tool like Spendflo/Vendr? Or honestly just hoping for the best like Mike was?

Best,
Felix

1 Like

Really nice use case. The main point of attention here is reliability around extraction and deadline logic, because with contracts a small miss on notice period, renewal terms, or start date can become a very expensive mistake. The split between intake and monitoring is smart though.

1 Like

You’re absolutely right, reliability is critical in this kind of use case, especially when it comes to fields like notice periods, renewal terms, or start dates. Even small inaccuracies can have significant consequences.

That’s actually why I put a strong focus on refining the per-field descriptions and added an error-handling layer around the extraction when I implemented it for my friend. It helps catch edge cases and ensures anything uncertain can be reviewed before it impacts downstream logic.

And yes, the split between intake and monitoring made a big difference in keeping things more robust and easier to manage.

1 Like

Yes, I added an error-handling step when moving the workflow to production. It flags any fields that come back empty from the Extractor and sends those documents to a separate Slack channel for review.