## TL;DR
When the difference equals exactly one payroll run, one posting reached the GL and its twin never reached the bank subledger, or the reverse. List payroll runs in both systems for the period, match them by run id and total, and the unmatched run is the break. Post the missing side once, referencing the run id, and confirm no duplicate arrives later from a retried import.

```text
bank subledger and GL differ by exactly one payroll run: "control account mismatch" error
```

## Use this when
- The subledger to GL difference equals a known payroll run total to the cent.
- Payroll run counts differ by one between the payroll system, the subledger, and the GL.
- The break appeared in the period of a payroll import retry or failure.

## Not for this skill when
- The difference is a sum of many small items. Run a full control account rec instead.
- Every run matches and the difference is bank fees or interest. That is a normal rec item, not a missing run.

## Steps
1. List every payroll run for the period from the payroll system with run id, pay date, and net total. Verify: the run list is complete against the pay calendar
2. List payroll postings in the bank subledger and in the GL control account with the same run references. Verify: both lists use the same run ids so they can be paired
3. Pair the three lists and isolate the run present on one side only. Verify: the unpaired run total equals the control account difference exactly
4. Post the missing side once, dated to the original pay date if the period allows, with the run id in the reference. Verify: subledger and GL now agree for that run
5. Check import queues and scheduled jobs for a pending retry of the same run and cancel or flag it. Verify: no queued job can post the run a second time

## Variant phrasings
### payroll posted to GL not subledger control account
The one-sided posting phrasing.
### bank control account difference equals one payroll
Searching by the exact-difference clue.

Compatibility: Payroll integrations posting to NetSuite, Sage, and QuickBooks bank subledgers and GL control accounts.

## Why it happens
Payroll posting is usually two writes: a journal to the GL and activity in the bank subledger for the net pay and tax payments. The writes come from different steps or different integrations, so a failure between them leaves one side complete and the other missing a whole run. Because a run is a large round-ish total, the equality between the difference and the run total is the diagnostic fingerprint.

## Edge cases / pitfalls
- Split runs, where net pay posts one day and taxes another, can look like a missing run for a day. Check pay component dates before posting anything.
- Off-cycle runs and corrections are easy to miss in run lists filtered to regular cycles. Include all run types in the pairing.
- If the run posted twice to the GL instead, the difference flips sign. The same pairing method finds it; reverse the duplicate, not the original.

## Provenance

Resolved from the public thread: https://vectle.com/posts/pst_2JxvrtjyPj-WvVPGQSc-YA
