Insights
Accounting: Your Ledger and the Export for Your Accountant
What the Accounting totals count, how refunds and costs are treated, how to export the ledger as a CSV for your accountant, and how to sync sales, refunds and payouts to QuickBooks Online or Xero.
Overview
Finance → Accounting shows your store's money for a date range: Revenue, Expenses, Profit and Invoices scanned, a revenue-against-expenses chart, and the Ledger, the list of every money movement BestWebby recorded for your store. Accounting is part of the Scale plan and above. The owner, admins and anyone with the accountant role can open it.
Pick the range with the two dates in the Ledger section. It starts at the last 30 days.
What the totals count
Every ledger entry has a type, and the type decides where it counts:
| Category | Ledger types | Where it counts |
|---|---|---|
| Revenue | POS sale, order payment, subscription | Adds to Revenue |
| Refund | Refund | Comes off Revenue. Refunds are stored as negative amounts: money going back out |
| Cost | Network order cost, API cost | Adds to Expenses, by size, whatever sign it was stored with |
| Other | Every other type, for example scanned supplier invoices, chargebacks, gift cards issued and vendor payouts | Listed in the ledger and the export, not counted in the totals |
So Revenue is what you took after refunds, and Profit is Revenue minus Expenses.
The screen lists the newest 200 entries in the range; the totals always cover the whole range. To see every entry, export it.
Entries left over from the retired payroll screen are not real pay: their amounts were made up. They stay out of the ledger, the totals and the export. When a range has any, the Ledger says how many, and Show them lists them with their amounts struck through.
Test-mode payments
A card payment Stripe took while your Stripe account was in test mode moved no real money, so it is not revenue. An order counts as test mode when every payment that paid it was a Stripe test-mode payment. Its ledger entries (the payment, and any refund, chargeback or fee on that order) are left out of the totals, the ledger list and the export. When a range has any, the top of the Ledger says so, for example "2 test-mode payments not counted".
- An order paid partly in test mode and partly with real money counts in full, because real money did move.
- Cash, e-Transfer and orders marked paid by hand are always real money.
- Payments recorded before BestWebby started noting Stripe's mode count as real.
- A customer's card payment of one of your invoices is left out when Stripe took it in test mode, and so is a credit note against an invoice paid only that way.
- Other entries that do not belong to an order, such as scanned supplier invoices, count as before.
The same rule applies to the revenue figures on Analytics and the store overview: test-mode orders are left out, and the page says how many. It applies to the money everywhere else too: customer spend and the RFM money score in the CRM, on the Customers list, on each customer's page and in the customer export, segment spend rules, cohort revenue and the VIP group, the Hub briefing and the daily brief, the Intelligence health score, board report and cash-flow forecast, the Digital twin's figures, the funnel's revenue by source and campaign, the sales on AI agent traffic, the lifetime value in a win-back suggestion, the recent sales on Shop health, Benchmarks (yours and the other businesses'), the Québec QST heads-up and franchise royalty statements. Where a figure counts what customers did (orders placed, the last order, a VIP's order count, Orders this month on the Billing page), a test-mode order still counts. The Billing page shows no sales figure.
If a period has more than 30,000 test-mode entries to leave out, a report or export asks you to choose a shorter period instead of counting them.
Exporting the ledger for your accountant
In the Ledger section, set the two dates and click Export CSV. You get ledger-<from>-to-<to>.csv with every entry in the range, not just the 200 on screen, oldest first.
- The range runs from the start of the first day to the end of the last day, in UTC, and can be up to two years long.
- Amounts are as recorded. Refunds are negative, so adding up the amount column nets them off. Each amount is given twice: in cents, and in dollars and cents.
- The category column is the same rule the totals use:
revenue,refund,costorother. Revenue rows plus refund rows give revenue after refunds; cost rows, added by size, give expenses;otherrows are in neither. - Legacy payroll entries are left out, as they are on screen.
- Test-mode entries are left out too, the same ones the screen leaves out.
- Up to 100,000 entries go in one file. If the range holds more, you are told the file is partial and how many entries it has; export a shorter range for the rest.
- Spreadsheet-safe. A cell that starts with a character a spreadsheet would treat as a formula is written as text. Negative amounts stay numbers.
The columns:
| Column | What it holds |
|---|---|
date | When the entry was recorded, in UTC |
type | The ledger type, for example order_payment, pos_sale or refund |
category | revenue, refund, cost or other (see above) |
amount_cents | The amount in cents; negative for a refund |
amount | The same amount in dollars and cents |
currency | The currency of the entry |
reference_type, reference_id | What the entry belongs to, for example an order and its id |
description | The description shown in the ledger |
entry_id | The ledger entry's own id |
Only people who can open Accounting can export it, and each export is recorded in Settings → Audit log.
Sync to QuickBooks Online or Xero
Finance → Accounting → Ledger sync sends this store's money to your own accounting software, one record at a time and once each: every paid order, every refund, and every Stripe payout. Connect one ledger at a time; to switch, disconnect the first.
If a provider shows Not available yet, BestWebby's own connection to it is not set up yet, so it cannot be connected. It appears here when it is ready.
Connecting
Click Connect QuickBooks Online or Connect Xero, sign in on Intuit's or Xero's own page and choose the company (in Xero, the organisation) to connect. BestWebby never sees your password. If you use an authenticator app, you are asked for a code first, because connecting lets BestWebby write to your books. Only the owner, admins and accountants can connect, change or disconnect a ledger, and each of those is recorded in Settings → Audit log.
Xero lets you tick more than one organisation on its page; BestWebby keeps the first one and gives back access to the rest.
Choosing the accounts
After connecting, Where the money goes lists the accounts from your own chart of accounts, with a suggestion for each:
| Row | What goes there |
|---|---|
| Sales | The goods on each order |
| Shipping income | What shoppers paid for shipping |
| Discounts | Discount codes and promotions, as a negative line |
| Refunds | Money given back |
| Tax collected | The sales tax BestWebby charged, as a line of its own |
| Gift card liability | Gift cards sold (owed until spent), and gift cards spent on an order (taken off again) |
| Stripe fees | The fees Stripe kept from each payout |
| Stripe clearing | Card payments land here, refunds leave from here, and each payout moves the rest to your bank |
| Other payments | Cash, Interac e-Transfer and orders you marked paid; often Undeposited Funds (BestWebby is not endorsed by or affiliated with Interac Corp.) |
| Bank account | Where Stripe pays out |
Rows marked (if you use it) can stay empty until a record needs them; that record then waits with a message saying which account to choose. Your ledger's own system tax account (QuickBooks "GST/HST Payable", Xero's GST or VAT account) does not accept direct posts, so choose or create a separate liability account for tax collected. The tax is posted as its own line and is not run through your ledger's tax engine, so file your sales tax from BestWebby's tax report, not your ledger's. A QuickBooks company outside the US also asks for a tax code on every line: pick one that charges no tax, such as Exempt or Out of scope.
Sync from is the first day that is sent. It starts on the day you connected; an earlier day (up to two years back) also sends those older records, so choose a day after anything you already entered by hand. Then click Save and turn sync on. Saving checks every account against your ledger as it is now, and creates what the documents need there: in QuickBooks, a service item per row ("BestWebby Sales" and so on) and a customer called "BestWebby Sales"; in Xero, contacts called "BestWebby Sales" and "Stripe". No shopper's name, email or address is sent to your ledger.
What is posted
| BestWebby record | QuickBooks Online | Xero |
|---|---|---|
| A paid order (web, POS, or marked paid) | A sales receipt | A paid invoice |
| A refund | A refund receipt | A credit note with its refund |
| A Stripe payout | A journal entry: the payout into your bank, Stripe's fees to Stripe fees, the total out of Stripe clearing | A transfer from Stripe clearing to your bank, and a spend of the fees |
Each document is numbered BW- and a code from BestWebby (for example BW-S1A2B3C4D5E6F7): S for a sale, R for a refund, P for a payout. The order is named in the memo.
- Sent when paid. A sale goes to your ledger when it is paid, as BestWebby's own ledger records it. A second payment on an order (an exchange top-up, say) is posted as its own sale of that amount.
- A refund that failed and came back is posted as money in, against Refunds.
- Test-mode payments move no real money. An order paid while your Stripe account was in test mode, and any refund of it, is skipped with a message saying so. An order paid partly in test mode and partly with real money is not posted; post the real part by hand. Payments recorded before BestWebby started noting Stripe's mode count as real.
- Payouts are posted once Stripe has finished listing what each one carried; until then the record says it is waiting. Test-mode payouts move no real money and are never posted. A payout carrying more than BestWebby reads from Stripe is not posted, with a message to post it by hand.
- Not sent: Stripe's fee on each single order (the fees are posted once, with the payout that carried them), your BestWebby subscription, scanned supplier invoices, and the other ledger types that do not count toward revenue.
- Currencies. Records in your ledger's home currency always go. A record in another currency goes only when your ledger has multi-currency turned on and that currency added; otherwise it is not posted, and its message says what to change. Payouts in a currency other than the home one are posted by hand.
The sync log
The Sync log lists every record with its status:
- Waiting: due on the next run. Runs happen every ten minutes, and each sends a limited number per ledger so as to stay inside the provider's limits (Xero allows 60 requests a minute).
- Posted: in your ledger, with its number there.
- Not posted: with your ledger's own reason. A temporary problem is tried again by itself (after 2, 4, 8 minutes and so on, up to eight tries); anything that needs you, such as an account not chosen or a currency not turned on, waits for Retry. Retry on a row sends that one again; the button above the log sends every one that was not posted.
- Skipped: there is nothing to post (for example, the order was paid in Stripe test mode, or Stripe later reported the payout as failed).
Nothing is posted twice. Each BestWebby record has one entry per ledger company. Before trying again, BestWebby first looks in your ledger for the document by its number, so a send whose answer was lost is found instead of repeated. If you delete a posted document in your ledger, BestWebby does not send it again.
Disconnecting
Disconnect gives up BestWebby's access at Intuit or Xero and deletes the stored keys, and nothing more is posted. Documents already posted stay in your ledger. Reconnecting the same company later keeps your account choices and posts nothing twice; turn sync on again after checking them. If the provider could not be reached, BestWebby still forgets the keys and tells you to remove BestWebby from the connected apps in QuickBooks or Xero yourself.
If your ledger stops accepting BestWebby's access (you removed the app there, or it was unused for months), the screen shows Needs reconnecting and nothing is posted. Reconnecting the same company keeps your account choices and sync carries on where it stopped. Connecting a different company starts again: new account choices, and sync from that day.
Refunds in the order export
A refund never changes an order's total: it is a ledger entry against the order. The order export (Export on the Orders list) therefore has a last column, refunded_cents, with how much of each order has been refunded, as a positive number of cents. See Orders and shipping.
A card refund that the shopper's bank turned down after it was issued is booked back as a refund reversal: a positive entry beside the refund it cancels. Accounting counts it off your refunds, and refunded_cents leaves it out.