Build phases
The SaaS build did not start as a new idea. It came after the readiness packs and Notion workspace had already proved the audit workflow. The SaaS version is where the model starts to enforce what Notion could only structure: tenant separation, user roles, permissions, workflow gates, report locking and stronger audit trails. The SaaS build is now in beta, with the core foundation live and deeper workflow features being tested and refined.
| Phase | What it covers |
|---|---|
| 1. Readiness pack method | IS4, ISO 27001, NCSC CAF and NIST CSF question packs, evidence requests, red flags, scoring and interview-prep appendices. |
| 2. Notion operating model | Audits, findings, evidence, actions, controls, dashboards, templates, reporting libraries and example audits. |
| 3. Public Notion release | Public positioning, user guidance, downloadable artefacts, screenshots and a duplicable template. |
| 4. SaaS foundation | Authentication, organisations, user roles, audit records, findings, evidence, actions, controls, dashboard, permissions and database structure. |
| 5. SaaS workflow depth | Management responses, report generation, risk scoring, framework mapping, reminders, exports and stronger audit controls. |
Roadmap
| Release | Scope | Status |
|---|---|---|
| R1 | Core audit workflow | Live |
| R2 | Findings, evidence and actions linked together | Live |
| R3 | Dashboard and reporting views | Live |
| R4 | Framework mapping and reusable libraries | Live |
| R5 | SaaS user roles, organisations and permissions | Live |
| R6 | Exporting, automation and future integrations | PDF export live, automation ahead |
Future phases
Backlog & prioritisation
| Priority | Scope |
|---|---|
| P1: must have | Core audit, findings, evidence, actions and dashboard. |
| P2: should have | Framework mapping, reporting libraries, user guidance and example audits. |
| P3: could have | Integrations, automated reminders, advanced analytics and report exports. |
| P4: later phase | AI-assisted report drafting, supplier portal and mobile or offline field audit support. |
Risks & mitigations
| Risk | Mitigation |
|---|---|
| Product becomes too broad | Keep the core focused on audit, findings, evidence and actions. |
| Users do not understand audit terminology | Add a glossary, examples and guidance. |
| SaaS version becomes too complex | Build from the proven Notion data model rather than starting fresh. |
| Access control errors | Use organisation-level permissions and clear roles. |
| Poor reporting outputs | Build a reusable report structure and libraries. |
| Evidence storage issues | Define evidence handling and upload rules early. |
| Framework mapping becomes inaccurate | Keep mappings clear, editable and reviewed. |
What the SaaS build actually cost and caught
Row-level security from the first migration, not retrofitted
Every business table gets an organisation_id and row-level security enabled in the same migration that creates it, not added in a cleanup pass later. Slower up front, since every new table needs its access rules worked out before it can be used, but it avoids the common multi-tenant failure: a table quietly missing tenant isolation until someone notices in production.
Risk kept in three separate places, on purpose
Likelihood and impact live on the audit; risk_rating lives on the finding; a separate risks table holds risk broader than one finding. Collapsing them into one concept would be simpler to build, but would lose the real distinction between how risky the audit is, how serious this specific issue is, and what the standing risk register entry connects to.
Billing deliberately not built yet
Subscriptions and billing are explicitly deferred until the core workflow, audit creation through report generation, is solid end to end. For a SaaS product, delaying monetisation infrastructure is a real sequencing call: prove the workflow works before building the layer that charges for it.
AI drafting features planned, then shelved
A phased plan for AI-assisted report drafting was researched and written up in detail against the real codebase, then set aside on purpose. Test the app for a month first, and come back to it after the core product has actually been used, not before.
A skipped migration that broke production
Changing a member's audit access started failing in production with a missing-column error. The cause was one migration getting skipped when migrations were applied manually, while later ones went through fine. Diagnosed by checking what was actually missing rather than guessing, then fixed by running the skipped migration directly.
Minimal, reversible private beta gating
Signup during the beta is gated behind an invite code checked against a single environment variable, not a new database table or invite system. If the beta opens up later, that's one variable removed, not a migration to undo.
Reports stay live until issued, then become locked
Draft reports can pull current findings, evidence and actions while they are being reviewed. Once issued, the report is snapshotted and locked so later changes do not alter the official audit record. That trades convenience for audit integrity.
Closing an action does not close the finding
A remediation action can be marked complete, but the finding only closes after review of completion evidence. That keeps closure tied to evidence, not to someone saying the work is done.
Lessons learned
- A good audit product starts with the workflow, not the dashboard.
- Findings need structure before reporting can improve.
- Evidence must be linked to controls and actions, not filed separately.
- Users need worked examples, not just empty templates.
- A Notion build can prove the operating model before SaaS development starts.
- Product thinking and audit thinking work well together because both need traceability.
How I work with AI on a build like this
The SaaS build is AI-assisted end to end. What matters is not that AI wrote code, it's the discipline applied to it: verify before accepting, correct the direction when something drifts, and hold the line on scope and honesty rather than letting either slide for the sake of speed.
Verification before acceptance, every time
Every change goes through an actual production build before it counts as done, checked against the real output, not an AI's claim that something works. That single habit catches a real class of problem: a broken build, a stale link left over from a domain change, a component fixed in one place but still broken in three others.
Correcting the direction mid-build, not after
When a proposed feature risked moving the build outside its agreed scope, the call was to flag it and stop, not build around it silently. The same standard applied to content: illustrative mockups that could pass as real client documents were sent back with a requirement for an explicit disclosure label before anything shipped.
Treating a summary as a claim, not a fact
A stale portfolio link, a phase-gating conflict, and a UI bug reported once but present in four near-identical places were all caught by re-checking the actual code and output, not by accepting a plausible-sounding summary. The skill being exercised is direction and verification, not typing.
Artefacts
Product roadmapBacklogRisk registerRelease planFramework mapping docNotion audit database
What this demonstrates
Product & systems thinkingDelivery managementProcess mapping
What this stage proved
The SaaS build proved the workflow could be enforced, not just modelled: real tenant isolation from the first migration, real permission gates by role, and an audit record that locks on issue instead of staying quietly editable. That is the gap Notion could structure but never close.