Operations & advisory

The audit trail that keeps 30 sites honest against the invoice.

Reconciles WordPress activity across ~30 managed sites against tracked time to surface over-billing, under-billing, and scope creep.

billing reconciliation
Sector
Agency operations
Engagement
Platform build
Stack
FastAPI · Postgres · WordPress plugin
Status
In production

Context

A digital agency running roughly thirty managed WordPress sites had the oldest problem in services work: no reliable link between what was actually done on each site and what was billed for it. Over-billing, under-billing, and quiet scope creep all hid in that gap.

What we built

We built an agency-grade audit trail. A custom WordPress plugin (HMAC-signed transport, an outbox for reliability) reports every revision and activity event from each managed site; the platform pulls tracked time from the time-tracking system and reconciles the two, activity versus billed hours, to flag over-billing, under-billing, and scope creep. FastAPI and Postgres do the reconciliation, a scheduler keeps it current, Metabase dashboards surface it, and secrets are encrypted at rest, production-deployed across the full ~30-site fleet.

The value

  • Closes the gap between work done and hours billed across thirty sites. Billing integrity becomes measurable instead of assumed.
  • Catches scope creep and under-billing early, protecting margin and the client relationship at the same time.
  • A custom WordPress agent reports real activity from every site, so the audit trail is ground truth, not memory.
  • Billing integrity runs as a continuous, monitored system rather than a quarterly spot-check.
~30 sites

reconciled against tracked time

Over/under-bill

+ scope-creep detection

Ground truth

real activity from every site

Always-on

continuous, monitored billing integrity

Client name and identifying details withheld by design. Every figure here is drawn from the system we actually delivered.

Your work would get the same discretion.

Tell us what's breaking. We'll tell you whether we've solved something like it. And if we take it on, your name stays yours.

Start with a diagnostic