finance-api
finance-api sits behind an email to bills automation: n8n calls POST /v1/ingest once per message and every decision, keep or discard, which service, which parser, whether a transaction already exists, is made here so the workflows stay thin and the logic stays in one testable place. A cheapest-stage-first pipeline keeps around 10k messages a month inexpensive on modest hardware.
- Started
- 2026
- Stack
- TypeScript, Node.js, PostgreSQL, Docker, n8n, Coolify
- Kind
- Experiment
- Source
- Private
Why I built it
An email-to-bills automation needs all of its keep/discard, classify and parse decisions in one testable place rather than scattered across workflows.
What it does
- Runs a normalize to prefilter to persist to classify to parse to transaction pipeline
- Deterministic and idempotent on (provider, message_id), so reprocessing after a parser fix is safe
- Stores no raw bodies: only headers, a short snippet and extracted fields are kept
- Keeps a database-driven service registry, so adding a vendor is an INSERT, not a deploy
How it is built
A TypeScript/Node service with a Postgres store (money as numeric, not float), reachable only on the private Docker network, deployed by Coolify and driven by n8n.
How it evolved
- 2026Scoped
An email-to-bills automation needs all of its keep/discard, classify and parse decisions in one testable place rather than scattered across workflows.
- 2026Built
A TypeScript/Node service with a Postgres store (money as numeric, not float), reachable only on the private Docker network, deployed by Coolify and driven by n8n.
- 2026Live
Shipped and still improving it.
Built by Syed Tasavour. More at syedtasavour.com.