Compliance
Audit packages
Generate an auditor-ready PDF audit package from your compliance evidence — scope, structure, and how to read it.
Updated May 26, 2026 | 5 min
What an audit package is
- Point-in-time snapshots of a tenant's coverage against a single compliance framework.
- A branded PDF (via WeasyPrint) that you can hand to an auditor or attach to a client deliverable.
- Contain the same control-status data the live /compliance pages show, frozen at the moment of generation.
- Persist in the database with bytes inline, so you can re-download earlier versions for evidence-of-evidence traceability.
What the PDF contains
- Cover page: tenant, framework, version, coverage percentage, letter grade (A-F), met/gap/N/A/pending counts, period (if specified), generation timestamp.
- Executive summary paragraph: plain-English description of current state.
- Control-by-control evidence table: every control in the framework with status badge, gap count, last-assessed date, and inline lists of linked open findings + manual attestations.
- About this package: definitions of status values + framework source URL.
How to generate one
- Open /compliance/packages.
- Pick the framework from the dropdown (one PDF per framework). Optionally add a title and period range.
- Click Generate. The API returns 202 + a pending package row. Generation runs in the background via FastAPI BackgroundTasks.
- The package status flips through pending → generating → completed (usually within 10-30 sec).
- Click Download PDF on the completed row.
How to read the output
- Coverage percentage = met controls / total controls. The letter grade is mechanical: A ≥90%, B ≥80%, C ≥70%, D ≥60%, F below.
- A "Met" control on automatic mapping means we don't see open posture findings linked to it. Not an attestation that the policy is documented — your auditor may still want a separate policy artifact.
- A "Gap" lists the specific open findings driving the gap, with severity and "open since" dates. Remediate or attest.
- An "N/A" control was operator-set and is preserved across reconciliations. Auditors typically accept N/A markings only when paired with a written rationale (use the attestation notes field).
- A "Pending" control has no signal yet — either a brand-new subscription that has not been reconciled, or a control with no posture-finding mapping for the current frameworks.
Limits
- Each package is per-framework. To package multiple frameworks for one audit, generate them separately and bundle the PDFs.
- Packages capture the state at generation time. To re-assess after remediation, generate a new package.
- PDF size grows with the number of open findings (each Gap shows linked findings inline). Typical M365 tenants land in the 50-200 KB range.
- Packages do not currently include the raw posture-scan CSV. That artifact is available separately on the posture scan detail page.