Skip to content

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

SurfaceShared between products
Client masterOne Client per legal entity, with enabledProducts toggling which features the client sees
AuthenticationSame staff auth for both; magic-link tokens for client contacts work across both surfaces
File / document storageOne S3 bucket, one OCR pipeline (Vision + Claude or Mock), one document-types schema
NotificationsOne outbox-poller; templates differ per flow but the engine is shared
Audit logOne append-only event stream covers both products
InfrastructureShared 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 conceptWhere 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 EngineValidationService running the eight blocking rules
DIE — Document Intelligence EngineOCR pipeline (Vision + Claude in production, mock in dev)
CRE — Compliance Rule EngineThe compliance-flavored validation rules: FOREIGN_LEAVER_IR21, CPF_AW_CEILING, DUPLICATE_RECEIPTS, OCR_LOW_CONFIDENCE
EM — Exception ManagerThe Issues tab on each cycle (/dashboard/payroll/cycles/<id>)
AL — Audit LoggerThe Audit tab on each cycle, plus global at /dashboard/audit
Controlled states S0–S16The 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 phaseWhere you workWhat you do
CAPTUREClient side: /portal/[token]Client declares + uploads supporting documents
VALIDATE/dashboard/payroll/cycles/<id> → Issues tabYou triage failures, request info, or POL-override
PROCESS/dashboard/payroll/cycles/<id> → Exports tabYou generate the Infotech import workbook
(Infotech runs offline)Processor runs payroll the way it always has
/dashboard/payroll/cycles/<id> → Outputs tabYou upload the Infotech output back into Spade
REPORTClient side: /portal/[approval-token]Client approves the Spade approval report
RECORD/dashboard/audit, retention policySpade 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

Internal use only — BreezyCorp