Skill Tracer
Skills › Knowledge Work Plugins › month-end-prep › v2_sources.md

v2_sources.md

125 lines · small-business/skills/month-end-prep/reference/v2_sources.md at 2574e29

Open on GitHub

Most marks come from matching words in the file, so treat them as pointers.

1# More sources
2
3More systems reconciled. Same close sequence, same packet.
4
5---
6

More sources

More systems reconciled. Same close sequence, same packet.


Raw lines 1 to 6
7## Ledger — whichever is connected
8
9Ledgers are peers (`../../../shared/connector-neutrality.md`). Whichever is connected runs the close.
11| Source | What it supplies |
12|---|---|
13| MYOB | P&L, AR and AP balances, sales totals. No bank balances: the bank side comes from a statement upload |
14| NetSuite | P&L and register via reports and SuiteQL. Common at the larger end of the segment |
15| QuickBooks | P&L and transaction list; mapped in [quickbooks-reconcile.md](quickbooks-reconcile.md) |
16| Xero | P&L, bills, invoices, bank-transaction queue; mapped in [xero-reconcile.md](xero-reconcile.md) |
17| Zoho Books | Invoices, expenses, purchase orders, customer payments, bank and cash balances with an uncategorised count per account. No bill object, no bank-transaction feed, no report endpoints: the P&L and the bank statement come as exports; mapped in [zoho-books-reconcile.md](zoho-books-reconcile.md) |
19**Two ledgers connected: read both, total from one.** Ask which holds the books being closed and name it in the packet as the source of record. Read the other for anything it uniquely holds (a bank feed the first one lacks, a bill register), but every total, and the reconciliation itself, runs against the named ledger. Never reconcile against both, and never sum a figure across two — that double-counts.
21---

Ledger — whichever is connected

Ledgers are peers (../../../shared/connector-neutrality.md). Whichever is connected runs the close.

SourceWhat it supplies
MYOBP&L, AR and AP balances, sales totals. No bank balances: the bank side comes from a statement upload
NetSuiteP&L and register via reports and SuiteQL. Common at the larger end of the segment
QuickBooksP&L and transaction list; mapped in quickbooks-reconcile.md
XeroP&L, bills, invoices, bank-transaction queue; mapped in xero-reconcile.md
Zoho BooksInvoices, expenses, purchase orders, customer payments, bank and cash balances with an uncategorised count per account. No bill object, no bank-transaction feed, no report endpoints: the P&L and the bank statement come as exports; mapped in zoho-books-reconcile.md

Two ledgers connected: read both, total from one. Ask which holds the books being closed and name it in the packet as the source of record. Read the other for anything it uniquely holds (a bank feed the first one lacks, a bill register), but every total, and the reconciliation itself, runs against the named ledger. Never reconcile against both, and never sum a figure across two — that double-counts.


Raw lines 7 to 22
23## Shopify settlement reconciliation
25A first-class leg, and a common source of unexplained gaps.
27The trap: an order, its payout, and its fees all land on different dates and in different amounts. Reconciling gross order value against a net payout will never tie, and the difference is not an error.
29Pull three things separately:
31- **Orders** — gross, by date
32- **Payouts** — net, by settlement date
33- **Fees and refunds** — the difference between the two
35Then reconcile payout to bank, and orders to revenue. Those are two different reconciliations and conflating them produces a phantom discrepancy every month.
37If the payout read fails (the connector's scopes exclude Shopify Payments), the orders-to-revenue leg still runs; the payout-to-bank leg takes the payout report the owner exports from Shopify, or is listed as not reconciled this month. Say which.
39```
40Shopify: USD 38,400 in orders, USD 36,910 paid out, USD 1,490 in fees and refunds.
41Payouts tie to the bank. Fees are coded to merchant fees.
42```
44---

Shopify settlement reconciliation

A first-class leg, and a common source of unexplained gaps.

The trap: an order, its payout, and its fees all land on different dates and in different amounts. Reconciling gross order value against a net payout will never tie, and the difference is not an error.

Pull three things separately:

  • Orders — gross, by date
  • Payouts — net, by settlement date
  • Fees and refunds — the difference between the two

Then reconcile payout to bank, and orders to revenue. Those are two different reconciliations and conflating them produces a phantom discrepancy every month.

If the payout read fails (the connector's scopes exclude Shopify Payments), the orders-to-revenue leg still runs; the payout-to-bank leg takes the payout report the owner exports from Shopify, or is listed as not reconciled this month. Say which.

Shopify: USD 38,400 in orders, USD 36,910 paid out, USD 1,490 in fees and refunds.
Payouts tie to the bank. Fees are coded to merchant fees.

Raw lines 23 to 45
46## Ramp and Expensify
48Card spend and expense detail. These close the gap between what was actually spent and what has been coded.
50Pull outstanding transactions and unsubmitted expenses, and flag anything uncoded as an open item in the close packet rather than letting it disappear:
52```
53Open items:
54 USD 4,180 in Ramp card spend, 23 transactions, not yet coded
55 USD 610 in Expensify reports submitted but not approved
56```
58An owner who closes the month without seeing those closes on a number that is wrong.
60Two things to hold on to while pulling them:
62- **Expensify is read-only search.** It reports expenses, reports, receipts, and approval states; it changes nothing. The has-receipt filter is what surfaces the substantiation gap — "USD 2,140 across 17 expenses with no receipt attached" is a close-packet line an accountant will actually use.
63- **Ramp can write, and the close is not where it writes.** Approving a bill or marking it ready to sync belongs to `ap-processor` behind its own payment gate. Here, Ramp is read only: card spend, bill status, and account balances. Reimbursements overlap Expensify — count them once.
65---

Ramp and Expensify

Card spend and expense detail. These close the gap between what was actually spent and what has been coded.

Pull outstanding transactions and unsubmitted expenses, and flag anything uncoded as an open item in the close packet rather than letting it disappear:

Open items:
  USD 4,180 in Ramp card spend, 23 transactions, not yet coded
  USD 610 in Expensify reports submitted but not approved

An owner who closes the month without seeing those closes on a number that is wrong.

Two things to hold on to while pulling them:

  • Expensify is read-only search. It reports expenses, reports, receipts, and approval states; it changes nothing. The has-receipt filter is what surfaces the substantiation gap — "USD 2,140 across 17 expenses with no receipt attached" is a close-packet line an accountant will actually use.
  • Ramp can write, and the close is not where it writes. Approving a bill or marking it ready to sync belongs to ap-processor behind its own payment gate. Here, Ramp is read only: card spend, bill status, and account balances. Reimbursements overlap Expensify — count them once.

Raw lines 46 to 66
Names a skill ap-processor :63
67## Payroll — whichever is connected
69Gusto and QuickBooks Payroll are peers. Step 5a reads the month's totals from
70whichever is connected and checks them against the ledger's payroll expense.
72**Gusto.** Two reads:
74| Read | Parameters | Fields used |
75|---|---|---|
76| `list_payrolls` | `include=totals`; filter on `check_date` within the month (the list may also carry `pay_period.start_date` / `end_date`) | `totals.gross_pay`, `totals.employer_taxes`, `totals.employee_taxes`, `totals.net_pay`, `check_date` |
77| `list_contractor_payments` | `start_date`, `end_date` = first and last day of the month; `group_by_date=true` | `total.wages`, `total.reimbursements` |
79Keep only processed payrolls; an unprocessed run in the list is a plan, not a
80payment, and belongs to `payroll-prep`. Contractor payments cover US
81contractors only — say so in the footnote when the row is non-zero, and say it
82is absent when the business pays international contractors.
84**QuickBooks Payroll.** `qbo_payroll_get_company_last_payroll_run` returns the
85most recent run with its totals; runs earlier in the month are in the payroll
86summary export. Confirm the field names before the first close.
88**The cross-check.** Net pay + employer taxes + contractor wages, compared to
89the ledger's payroll expense lines for the month:
91```
92Payroll (Gusto): 2 runs, GBP 18,420 gross, GBP 1,660 employer taxes,
93GBP 14,210 net. Contractors: GBP 2,400.
94Ledger payroll expense: GBP 18,270. Delta GBP 150 — the 28 Mar run posted to April.
95```
97**What never enters the packet:** employee names, rates, hours, deductions,
98home addresses, or any per-person amount. The connector returns them; the
99close does not need them and does not reproduce them.
101---

Payroll — whichever is connected

Gusto and QuickBooks Payroll are peers. Step 5a reads the month's totals from whichever is connected and checks them against the ledger's payroll expense.

Gusto. Two reads:

ReadParametersFields used
list_payrollsinclude=totals; filter on check_date within the month (the list may also carry pay_period.start_date / end_date)totals.gross_pay, totals.employer_taxes, totals.employee_taxes, totals.net_pay, check_date
list_contractor_paymentsstart_date, end_date = first and last day of the month; group_by_date=truetotal.wages, total.reimbursements

Keep only processed payrolls; an unprocessed run in the list is a plan, not a payment, and belongs to payroll-prep. Contractor payments cover US contractors only — say so in the footnote when the row is non-zero, and say it is absent when the business pays international contractors.

QuickBooks Payroll. qbo_payroll_get_company_last_payroll_run returns the most recent run with its totals; runs earlier in the month are in the payroll summary export. Confirm the field names before the first close.

The cross-check. Net pay + employer taxes + contractor wages, compared to the ledger's payroll expense lines for the month:

Payroll (Gusto): 2 runs, GBP 18,420 gross, GBP 1,660 employer taxes,
GBP 14,210 net. Contractors: GBP 2,400.
Ledger payroll expense: GBP 18,270. Delta GBP 150 — the 28 Mar run posted to April.

What never enters the packet: employee names, rates, hours, deductions, home addresses, or any per-person amount. The connector returns them; the close does not need them and does not reproduce them.


Raw lines 67 to 102
Names a skill payroll-prep :80
103## What doesn't change
105- The reconcile sequence, the P&L narrative, and the close packet format
106- Duplicate detection and split-transaction handling
107- The CSV and statement-upload path, which still produces a full close
108- Never invent a number. An unavailable source is named as unavailable, and the packet says so
110---

What doesn't change

  • The reconcile sequence, the P&L narrative, and the close packet format
  • Duplicate detection and split-transaction handling
  • The CSV and statement-upload path, which still produces a full close
  • Never invent a number. An unavailable source is named as unavailable, and the packet says so

Raw lines 103 to 111
112## Naming the sources in the packet
114The close packet gets forwarded to accountants and lenders. It has to say what it was built from and what wasn't available:
116```
117Reconciled: Xero (ledger: bills, invoices, and bank transactions), Shopify
118(settlements), PayPal, Ramp (cards).
119Not available: Stripe — auth expired Jul 24. Stripe activity is not included
120in this close.
121```
123Name the ledger and, where its register was assembled from parts, say which parts.
125The second line protects the owner. A close packet that silently omits a processor is worse than one that says it did.

Naming the sources in the packet

The close packet gets forwarded to accountants and lenders. It has to say what it was built from and what wasn't available:

Reconciled: Xero (ledger: bills, invoices, and bank transactions), Shopify
(settlements), PayPal, Ramp (cards).
Not available: Stripe — auth expired Jul 24. Stripe activity is not included
in this close.

Name the ledger and, where its register was assembled from parts, say which parts.

The second line protects the owner. A close packet that silently omits a processor is worse than one that says it did.

Raw lines 112 to 125