Overview
- Next.js application server and PostgreSQL, on servers in the EU behind Cloudflare.
- Every table carries the workspace id and every query filters on it; records from other workspaces answer 404.
- Each recovery module is a pure engine: a parser that turns a CSV into rows and a rule set that turns rows into cases. Engines do no I/O, take today's date as input and work in integer minor units, so results are reproducible and unit-tested.
- The platform layer owns storage, deduplication, workflow, fees, statements, letters and notifications for every module the same way.
Background jobs
| Job | Frequency | What it does |
|---|---|---|
| Mail queue | Every 5 minutes | Sends queued email with retries and back-off. |
| Connectors | Every 5 minutes | Syncs connections that are due, a few at a time. |
| Email-in | Every 5 minutes | Reads new messages to import addresses. |
| Reminders | Every 5 minutes | Deadline nudges, morning pipeline digest, lifecycle emails, each sent once per window. |
| Housekeeping | Every 5 minutes | Expired sessions and orphaned files are removed. |
Mail is sent from erpsav.com with SPF, DKIM and DMARC. Optional emails carry a one-click unsubscribe; account and billing emails always send.