What is BreezyCorp?
BreezyCorp is a Singapore accountancy orchestration platform that ships two products on one codebase.
The two products
Payroll automates the monthly cycle around Infotech, the workbook-based payroll engine most SG accountants use. The platform handles the messy parts: chasing the client for changes and supporting documents, validating what they sent, generating the Infotech import workbook, importing the Infotech output, packaging an approval report, and chasing the approver. Infotech itself stays in charge of CPF / IRAS / payslip generation.
Bookkeeping automates the document-to-journal-to-upload-file flow around Xero, QuickBooks, Zoho, and Tally, plus bank reconciliation. The platform handles ingestion (manual / WhatsApp / Drive), OCR, classification against a per-client chart of accounts and vendor master, batch review, the upload-file artifact, parsing bank statements, matching transactions, and chasing the client for unreconciled items via a magic-link portal. The accountant still posts the upload file manually into the target platform — Spade does not push via API in MVP.
What they share
| Surface | Shared between products |
|---|---|
| Client master | One Client per legal entity, with enabledProducts toggling which features the client sees |
| Authentication | Same staff auth for both; magic-link tokens for client contacts work across both surfaces |
| File / document storage | One S3 bucket, one OCR pipeline (Vision + Claude or Mock), one document-types schema |
| Notifications | One outbox-poller; templates differ per flow but the engine is shared |
| Audit log | One append-only event stream covers both products |
| Infrastructure | Shared API (Fastify), worker (pg-boss), web (Next.js), Postgres |
What's separate: the domain aggregates. Payroll has cycles, submissions, exports, output workbooks, approval rounds. Bookkeeping has journal batches, journal entries, bank statements, reconciliation runs, unreconciled items, upload files. The two domains never reach into each other; they just use the same plumbing.
Why this matters when you're using the app
When you log in, the staff dashboard mixes both products in the sidebar. Your role decides what you can see — a Bookkeeper sees Bookkeeping nav and is filtered out of Payroll. The dashboard route per-page is dashboard/payroll/... or dashboard/bookkeeping/..., so your URL bar tells you which product you're in.
If a client buys only one product, the toggle is on the Client record (enabledProducts). The platform won't ask a payroll-only client about chart of accounts.
How the payroll SOP maps to the platform
The Singapore Payroll Processing SOP describes a controlled monthly workflow run by an "Agentic Payroll Orchestration Engine" (APOE). Spade is that engine. The SOP names several abstract components; here's how each shows up in the product:
| SOP concept | Where you'll find it in Spade |
|---|---|
| APOE (orchestration layer) | The API + worker + domain code (apps/api, apps/worker, packages/domain) |
| SPWP — Secure Payroll Webform Portal | /portal/[token] — the magic-link surface clients see |
| RTVE — Real-Time Validation Engine | ValidationService running the eight blocking rules |
| DIE — Document Intelligence Engine | OCR pipeline (Vision + Claude in production, mock in dev) |
| CRE — Compliance Rule Engine | The compliance-flavored validation rules: FOREIGN_LEAVER_IR21, CPF_AW_CEILING, DUPLICATE_RECEIPTS, OCR_LOW_CONFIDENCE |
| EM — Exception Manager | The Issues tab on each cycle (/dashboard/payroll/cycles/<id>) |
| AL — Audit Logger | The Audit tab on each cycle, plus global at /dashboard/audit |
| Controlled states S0–S16 | The 16-state payroll cycle status machine |
| Infotech Payroll (system of record) | Staff uploads parsed output via the Outputs tab; Spade does not push to Infotech |
The SOP's phase mapping also lines up with the staff dashboard:
| SOP phase | Where you work | What you do |
|---|---|---|
| CAPTURE | Client side: /portal/[token] | Client declares + uploads supporting documents |
| VALIDATE | /dashboard/payroll/cycles/<id> → Issues tab | You triage failures, request info, or POL-override |
| PROCESS | /dashboard/payroll/cycles/<id> → Exports tab | You generate the Infotech import workbook |
| (Infotech runs offline) | — | Processor runs payroll the way it always has |
/dashboard/payroll/cycles/<id> → Outputs tab | You upload the Infotech output back into Spade | |
| REPORT | Client side: /portal/[approval-token] | Client approves the Spade approval report |
| RECORD | /dashboard/audit, retention policy | Spade keeps the immutable trail; retention-purge eventually archives |
What's real vs simulated
Worth knowing when you're explaining the system to others:
- Real: intake portal, validation engine, status machine, file upload (S3 pre-signed + magic-byte check), audit log, RBAC, approval loop, OCR pipeline (Vision + Claude tool-use), reminder scheduling, magic-link auth.
- Manual / human-in-the-loop: Infotech import is a manual upload (no API), bookkeeping upload-files are downloaded and posted into Xero/QBO/Zoho/Tally manually.
- Detected, not auto-filed: IR21 detection is real but actual filing to IRAS is not integrated.
Where to read more
- Run a payroll cycle end to end: Quick start — payroll.
- Run a bookkeeping cycle end to end: Quick start — bookkeeping.
- The full SOPs: Payroll and Bookkeeping.
- Why the two products live in one codebase: Architecture — bookkeeping integration.