Post journals to QuickBooks — with a human approval gate
Reconciliation no longer stops at a proposal. Once a payout is reconciled, your AI assistant can
ask for it to be posted to QuickBooks Online as a journal entry — but nothing is
ever written to your ledger without an explicit human approval. Two tools drive the flow:
post_journal and approve.
Step 1 — Map your ledger accounts (one-time setup)
Journals are drafted against four abstract roles. Before the first posting, bind each role to a real account from your QuickBooks chart of accounts at mcp.g-integrator.com/connect/accounts (also linked from the Vendor connections page):
| Role | Typical QuickBooks account |
|---|---|
BANK | The bank account receiving the deposit |
PAYMENT_CLEARING | Payment clearing (charges credit it; refunds and deposits relieve it) |
PROCESSOR_FEES | Processor fee expense (Stripe / Shopify Payments fees) |
SUSPENSE | Holding account for unmatched or unexplained amounts awaiting review |
Step 2 — Request posting with post_journal
After a successful reconcile_payout, ask your assistant to post it — e.g.
“Post the journal for Stripe payout po_123…” →
post_journal(vendor=STRIPE, payoutId=po_123…). This:
- Freezes the exact journal snapshot from the reconciliation — what the approver sees is exactly what gets posted; later re-reconciles never change a pending approval.
- Opens an approval request and emails a one-time decision link to every user with the
APPROVERorADMINrole. - Returns the approval id and status (
pending_approval) to the assistant.
Step 3 — Approve or reject
Approvers can decide through either path:
- Email link: the link opens a review page showing the full journal (roles, debit/credit sides, amounts, memos) with Approve and post / Reject buttons. Each link is single-use and expires after 7 days — once used, it's dead, and a rejected or posted approval can't be replayed.
- The
approvetool: from an AI client signed in as anAPPROVERorADMINuser —approve(approvalId=…, decision=APPROVE)(orREJECT, with an optional note). Users without the role get a typedforbiddenerror.
On approval the journal entry is posted to QuickBooks exactly as snapshotted, and the tool/page returns the new QuickBooks journal-entry id. The posting step is guarded against double-posting: retries, concurrent approvals and repeated clicks all resolve to a single ledger entry.
Good to know
- Nothing posts without a human.
post_journalonly opens the request; a decision is always required. - Rejected? Running
post_journalagain for the same payout reopens the request with fresh links. - Transient QuickBooks failure? The approval lands in
POST_FAILEDwith a typed error; approving again (tool or link) retries safely. - All outcomes are typed — e.g.
not_reconciled(reconcile first),account_mapping_missing(finish Step 1),no_approvers(no user holds the role),posted(already done, returns the entry id).