The part that starts after kickoff. Written from one real Type I — what the auditor asked, what answers worked, and what to write down.
← The guide (deciding & scoping)Your platform generates ~21 policies from enterprise templates. They assume a security team, a change advisory board and an HR function you don't have. Replace them. Don't fill them in.
One real swap: 21 generated policies (~107 pages, ~26,600 words) → 17 lean ones (~40 pages, ~8,000 words). Same TSC coverage. Base was Tailscale's open set plus the three it lacks: Physical Security, Encryption, Acceptable Use.
| Policy says | Procedure says |
|---|---|
| Full-disk encryption is enforced by MDM | Enable FileVault via Mosyle |
| Secrets live in a secrets management system | GCP Secret Manager; path in the password manager |
| Critical data stores are backed up daily | Atlas: continuous backup, 7-day retention |
| Infrastructure is managed as code | Terraform; state in GCS bucket X |
One exception: name your source control. PRs are the change records, so naming GitHub makes the evidence path explicit. Keep incident tracking and log storage generic — "an issue tracker, document, or spreadsheet." Don't hand the auditor a hostage.
| Delete this policy | Covered by |
|---|---|
| SDLC | Change Management + Testing |
| Asset Management | Access Control + Physical Security |
| Logging & Monitoring | Risk Assessment + Patch Management + IR |
| Vulnerability Management | Patch Management |
| Third-Party Risk | Vendor Management |
| Any TSC you didn't scope | Nothing. Delete it. |
A standalone logging policy over-commits on retention, alert thresholds and SIEM tooling you can't evidence. A data-center Physical Security policy at a company with no data center becomes one paragraph: remote work, device security, cloud provider's responsibility.
| Commitment | Write | Not | Why |
|---|---|---|---|
| Offboarding | 1 business day | "immediately" | Finding the first time someone quits on a Friday night. |
| Password | 15 chars, no complexity | 8 + symbols | NIST 800-63B. Complexity rules produce P@ssw0rd. |
| Patching | severity × exploit × exposure | flat CVSS dates | NIST 800-40r4. 14 days actively-exploited, up to 365 internal-only. Clock starts at confirmed presence, not CVE publication. |
| Breach notice | 72 hours | 24 hours | GDPR Art. 33. One window covers regulator and customer. |
| RTO / RPO | 24 hours | 4 hours | 4 sounds better and fails on a real incident. Keep internal targets tighter. |
| Reviews | annual | quarterly | 4× the evidence for the same criterion. |
Skip the day-one acknowledgment theater. Behavioral policies (acceptable use, code of conduct, data classification, infosec) go to everyone at onboarding. Operational policies go to the roles that operate them, annually. Auditors accept the split when you state it.
Single reviewer? Don't write a rule you'll break weekly. Replace pre-deployment peer review with a self-review checklist in the change template (scope, blast radius, rollback, credential exposure, staging validation) plus a monthly batch review by another leader with sign-off recorded. Note that it applies until a second reviewer exists.
Folders barely matter. The auditor consumes an index: one row per control — criterion, artifact, date, status. Build it as you go.
One 8-person company's entire operational layer: 12 documents (~5,300 words) and 7 spreadsheets.
| Register | The column that matters |
|---|---|
| Risk register | A written justification beside every score. That's what makes it auditable rather than a spreadsheet of numbers. |
| Access matrix — Roles / People / Auth / Service Accounts | The Auth tab (system, auth method, password fallback disabled, MFA source) is what makes offboarding provable. |
| Service accounts | Point each row at the platform's own inventory page. Don't hand-maintain a duplicate that drifts. |
| Vulnerability tracker | Status + target resolution date. Detection without tracked remediation isn't a control. |
| Access change log, device disposal log | Schema only. Zero rows. |
Split every policy obligation into recurring, event-triggered (~18 triggers: hiring, departure, lost device, KEV hit, emergency change, subprocessor change) and continuous. Setup is under an hour. Three calendar events cover an annual cadence: monthly security ops review, quarterly device patch check, annual review week.
Prefer controls that document themselves. A runbook can state "evidence lives in the systems themselves — no hand-kept log," then map each claim to its system of record: restore tests to CI history, secret changes to version history, who can restore to the IAM policy.
A model provider is usually a subprocessor, and needs real data terms — no-training, limited retention, stated plainly. "Standard data handling terms" is a hedge a reviewer picks at immediately.
One flat sheet handles it: vendor, period, TSC, the CUEC text, your covering policy, status. One engagement logged 170 rows across nine vendors — 42 from the cloud provider, 4 from a single-purpose API vendor. Those 170 collapsed into 24 actions, and four cross-cutting ones covered most of the set. "Enforce MFA on every tenant" satisfies all nine by itself.
Tier the depth. Full mapping for critical vendors; a couple of lines in the register for everyone else. Annual review reduces to "any new CUECs?"
Collecting reports isn't the control. Reading them is. From nine of them:
Tier with two questions: if breached, would customer data be exposed? If down, would your product stop? Yes to either → critical (SOC 2 + CUEC mapping). Source code or internal data only → standard (report or questionnaire). Neither → light (confirm what it does, move on).
Same three beats for every control. Most guides describe two.
Beat three is the one nobody writes down. A null answer still needs an artifact. Every control needs a record showing it ran, or proof of the negative.
Not interchangeable, and using the wrong one is checkable. "Not yet due" is a periodic control whose cycle hasn't arrived. "No instances" is an event-driven control where the event hasn't happened. Never claim "none" where instances occurred — a company that hired people has onboarding approvals.
For a cycle not yet due, five parts get accepted and four get returned:
In practice: "The annual access review had not yet come due as of June 8, 2026. It is scheduled for August 31, 2026." Attach the calendar screenshot — that screenshot is the evidence. Say "newly implemented," never "we're a young company" — a year of hires on the books contradicts you.
Ask for their evidence spreadsheet at kickoff. Good auditors keep a per-control list with separate Type I and Type II columns. It turns the audit into a checklist.
Auditors vary a lot in how hard they push. Read yours early, calibrate to the bar you measure, don't assume the next one shares it.
Two scheduling notes. Confirm your real stack before writing anything — policies drafted against an assumed identity provider cost more to unpick than they did to write. And auditors need roughly ten days of lead time to get you into their queue, so if the as-of date is going to move, move it early.
Auditors evaluate controls, not your platform's score. One engagement started triage at 110 controls with 86 "Unhealthy" — 78% red — and got a clean unqualified report. Sorting all 98 failing tests:
| What the red test needed | Share |
|---|---|
| An evidence upload | 55% |
| An override with written justification | 27% |
| Disable / N-A — didn't apply | 10% |
| An actual configuration change | 8% |
Eight of 98 were real security problems. Nine-tenths of a red dashboard is paperwork and scope.
Archive out-of-scope TSC controls first, before remediating anything. Security-only doesn't cleanly deselect the others. Archiving reclassified ~31% of one control set in twenty minutes.
Decision rule: if the config can change, fix it. If not, justify with compensating controls. Otherwise disable.
Good override text names the mechanism and cites the policy: "Production infrastructure managed as Terraform IaC in GitHub, reviewed through branch-protected PRs per Change Management Policy." Overrides also defend a lean policy set against a platform demanding one policy per topic.
Then stop optimizing the number.
Two gotchas: federated MFA often reads as failing because the platform can't see through federation. And the platform can't see systems it doesn't integrate with, so your access review population is assembled by hand.
You get a draft before signature. Read it twice.
They discount predictably: when is the Type II and for what period, why Security only, what governs the data stores you left out, what does "single-tenant" actually mean, where's the penetration test. Have answers before the report ships.
Two asks while the draft is open: get the Type II timeline in writing so you can quote it, and agree the bridge-letter plan.
Type II is where exceptions appear. The auditor defines populations — every termination, every production change, every hire — samples ~25 of each, and wants evidence the control fired every time.
You cannot retroactively fix an operating-effectiveness miss. You can backfill documentation for a control that ran. You cannot create a review that never happened.
Fix before the clock starts, in order:
Manual, memory-dependent controls fail. Controls that produce evidence as a side effect of normal work — a merged PR, a CI run, an alert that fired — don't.
Expect scope expansion. If your product sits in the runtime path of customer data, buyers will want Confidentiality and probably Availability — plus a scoped penetration test, formal secrets management, EDR beyond built-in AV, and a redaction policy for whatever reaches your analytics stores and model providers.
We do readiness assessments, AI red teaming, app penetration testing, and general "am I doing this right" support for SaaS companies selling into enterprise markets.
Get in Touch