The Reconciliation page compares your POS totals to what's actually in QuickBooks Online for each business date. The Audit Log captures every action anyone took on a journal entry. Together they answer "did our books match the till?" and "who did what, when?"

> **Permissions:** Admin-only. You need the `quickbooks_config` permission for the store.

***

## Reconciliation

Open from the sidebar: **QuickBooks** > **Reconciliation**. Direct URL: `/admin/{typeNum}/quickbooks/reconciliation`.

### What you see

Pick a date range at the top (max 92 days per report). The grid then shows one row per business date with:

| Column | Meaning |
| ------ | ------- |
| Date | Business date being checked |
| POS Total | Total debits from your staged journal entry (the canonical source-of-truth one-side total) |
| QBO Total | Sum of debit lines on the actual QBO journal entry for that date |
| Variance | POS Total − QBO Total |
| Status | `matched`, `variance`, `qbo_only`, `pos_only`, or `no_data` |

### Status meanings

| Status | What it means |
| ------ | ------------- |
| `matched` | POS and QBO agree to within $0.01. ✅ |
| `variance` | They differ. The Variance column is the diff. Investigate. |
| `qbo_only` | QBO has a JE but no POS staged entry exists. Likely a manual JE in QBO, or a sync that bypassed staging. |
| `pos_only` | POS has staged data but no JE was found in QBO. Likely the entry was rejected, voided, or never approved. |
| `no_data` | Neither side has data for the date. Store closed, holiday, or pre-launch. |

### Why "POS Total" might surprise accountants

POS Total reads from `qb_staged_entries.totalDebits` (or `MAX(debits, credits)` for entries that auto-balanced via Cash Over/Short). This is the *post-balance* one-side total — the amount QBO will see as the debit-side sum after auto-balance lines are added.

Older versions of this report summed every column of the close report independently, which over-counted by 30× because the close report has both per-tender totals AND grand totals as separate fields. The new canonical-staged-total approach is the right answer for variance work.

### Exporting CSV

Click `Export CSV` to download a flat row-per-date file with `date, posTotal, qboTotal, variance, status`. Open in Excel or hand to your accountant.

> **Important:** Exporting the CSV does **not** mark dates as reconciled. The "Last Reconciled" timestamp only advances when you run the on-screen review (the dashboard call). This was a deliberate fix — a read-only export shouldn't move the marker.

### When variance happens

- **Real POS variance** — the POS reported $381.40 unbalanced (cash drawer was actually short or over). This is normal and shows up as the variance even after a correctly posted JE. Auto-balance via Cash Over/Short absorbs the gap on the QBO side, so the variance is on the POS side.
- **Wrong account mapping** — a field is mapped to the wrong account, so the JE balances but the categorization is off. Cross-check via the Audit Log to see which mapping was used.
- **Period close moved the JE** — if QBO closed the period and re-opened it, the JE may have been re-categorized. Compare the QBO journal entry directly using the DocNumber.

***

## Audit Log

Open from the sidebar: **QuickBooks** > **Audit Log**. Direct URL: `/admin/{typeNum}/quickbooks/audit-log`.

This is an **append-only** record of every action on the QuickBooks integration — there's no way to delete or modify rows from the UI. Each row has a timestamp, actor (user), event type, sync date, staged entry id, and a JSON details payload.

### Event types

| Event | When fired |
| ----- | ---------- |
| `sync_staged` | A journal entry was staged for a new date |
| `sync_restaged` | A new staged entry supersedes a rejected one (details includes `priorEntryId`) |
| `sync_posted` | An entry was successfully posted to QBO |
| `sync_failed` | A post attempt failed (details includes the QBO error) |
| `edited` | Someone edited a staged entry's payload |
| `approved` | A user clicked Approve (semantic event distinct from `sync_posted`) |
| `rejected` | A user rejected a staged entry |
| `voided` | A posted entry was voided in QBO |
| `mapping_updated` | The QBO account mapping for a field was changed |
| `settings_changed` | A setting (sync mode, memo template, etc.) was changed |
| `connected` / `disconnected` | OAuth connection events |
| `re_synced` | A historical re-sync action |

### Filters

- **Event Type** — narrow to a single event class (great for "show me all rejections this month")
- **From / To Date** — created-at range
- **Actor** — filter by user
- **Sync Date** — the business date the event relates to (different from event timestamp)

### Exporting CSV

`Export CSV` produces a flat file with up to 10,000 rows for the current filter. Use it for monthly sign-off reports or to hand to an external auditor.

### Reading the supersession chain

When a staged entry is rejected and re-staged, the audit log captures both events:

1. `rejected` event on the original entry id (with `reason` in details)
2. `sync_restaged` event on the new entry id (with `priorEntryId` in details)

If you ever need to prove "this $5,243 JE in QBO supersedes a corrected $5,300 JE," the chain is right here.

***

## Daily reconciliation routine (recommended)

1. Each morning, open the Approval Queue. Approve yesterday's entry.
2. Once a week (or before close-of-month), open Reconciliation for the past 30 days.
3. Investigate any `variance` rows: open the Audit Log filtered to that sync date, look at the staged values vs. what posted.
4. Export both reports as CSV at month-end for your bookkeeper.

***

## What's next

- [Daily approval workflow](/support/articles/quickbooks-daily-approval-workflow) — the upstream of all this.
- [Account mapping](/support/articles/quickbooks-account-mapping) — fix categorization-related variance.
- [Connect & configure](/support/articles/quickbooks-connect-and-configure) — change sync mode, memo template.
