Coverage
Coverage is concorbit's read-only view of how completely the Autotask mirror is populated. It answers the question "how much of AT's billing world has concorbit pulled, and where are the gaps?" before you trust the mirror enough to read its billing parity or attempt a cutover.
Coverage lives on Settings, Autotask, Coverage. The dashboard is rendered from AutotaskCoverageService (app/Services/Autotask/AutotaskCoverageService.php), which scores each company on the mirror's completeness.
What "covered" means
A company is considered covered when:
Its AT companies, contacts, contracts, and contract-services rows are present in concorbit and linked via
external_links.Its AT-issued invoices for the last N periods are mirrored as
governance=autotaskInvoice rows.Every BillingItem on those invoices has been ingested (so the per-line ledger matches AT's invoice total within a £0.01 tolerance).
No mirrored row is stuck in a deferred-retry or mirror-incomplete state.
A company can be linked to AT and still uncovered if the initial sync has not run yet, the mapping table is missing a status or work-type entry, or a recent AT invoice failed to ingest cleanly.
The Coverage tab
The tab surfaces three views:
Per-tenant totals. Linked companies, mirrored invoices, mismatched totals, and orphan rows (concorbit rows pointing at AT ids that no longer exist on the AT side).
Per-company drill-down. One row per AT-linked company with the score, last mirrored invoice date, the parity outcome from
AutotaskInvoiceParityService, and any pending mirror-incomplete deferrals.Per-invoice spot-check. Click a mirrored invoice to see its BillingItem breakdown, the matching concorbit Charge rows, and any "out of scope" lines (AT charges concorbit could not reconcile to a concorbit-owned charge).
Re-pull buttons
The Coverage tab exposes a few operator escape hatches that always work, even when the connection is wound down (read-only or off):
Re-pull company runs
autotask:sync --entity=all --company=<uuid> --allow-wound-down.Re-pull invoice re-fetches a specific AT invoice id and re-runs reconciliation.
Run parity triggers
AutotaskInvoiceParityServicead hoc for one company.Reconcile all sweeps the parity check across every linked company in a tenant.
These actions are deliberate spot-checks. They are gated on autotask.manage, audited, and do not change the wind-down policy. Schedules (cron jobs) stay gated on canPull() (mirror mode only). See Wind-down.
Reading the per-invoice mismatch list
The per-invoice view lists mirrored AT invoices where the invoice's subtotal doesn't equal the sum of the first-class AT-billed Charges linked to it (voided invoices are excluded, their producing charges have already moved on). Each row shows the invoice number, the AT external id, the invoice total, the charge line sum, and the diff, sorted biggest drift first. This is a data-quality check on the mirror itself (has every BillingItem been ingested correctly), not the recurring-line billing comparison, that lives on the Billing parity tab.
When coverage tells you not to flip
Coverage is the early warning before governance and cutover. If a company is not covered, do not flip its governance. The two telltales:
Last mirrored invoice date is stale (an AT invoice is missing from concorbit). Re-pull the company and check the mismatch list.
Mirror incomplete deferred-retry attempts exhausted for any invoice. The BillingItem totals never reconcile to the invoice total within tolerance. Check the mismatch list to see which invoice drifted, then re-pull.
Once Coverage is green for a company and billing parity has been green for at least two consecutive periods, the company becomes eligible for the Cutover flip.