Nineteen billing feeds, one reconciled invoice.
- 19vendor billing systems normalised
- 25staff · two offices · statewide book
- 1Jiwa-driven monthly invoice
Summary
An Australian-owned managed IT services provider approaching thirty years of operation — around twenty-five staff across two offices, a mixed client book spanning corporate, small-business, and not-for-profit, from a state-level sporting franchise to a statewide aged-care group. Nineteen external vendor billing systems needed to reconcile into Jiwa each month and stay in step with Halo PSA for ticketing. I built the plugins, the feeds, and the reconciliation loop.
Context
An MSP's economics depend on accurate pass-through billing. Each vendor — Kaseya, FortiEDR, Microsoft 365, Leap, Kaseya VSA, TasNetworks, Veeam, Crayon, Cloudian storage, several telecoms — ships usage and licence data in its own format on its own cadence. The baseline was a monthly spreadsheet reconciliation exercise. The cost was visibility, speed at month-end, and tickets drifting out of sync with billing.
What was built
-
Jiwa plugins
For recurring billing renewals and debtor maintenance.
-
Nineteen external billing feed integrations
Each vendor's feed normalised to the internal model; invoice lines generated per client per month.
-
Halo PSA bi-directional integration
Tickets, clients, and billing stay in step across the two systems.
-
Toner and print usage tracking
Consumables billed from actual device telemetry, not estimates.
Outcome
Nineteen vendor feeds reconcile into a single Jiwa-driven monthly invoice across the full client book. Halo PSA stays in sync; support tickets and billed hours no longer drift apart. Reconciliation is verified to the cent.
Reflection
Integration work rewards patience. Each vendor is its own puzzle, and every reconciliation loop has its own edge cases. The system that holds up is the one where those edge cases were named, tested, and left behind a comment explaining why.
On continuity This engagement is one of the answers to the fair question — what happens if I'm unavailable? Read the answer →