Financial Accounting

Ecommerce Chart of Accounts and P&L: A Short Chart That Reports by Month and by Channel

In December 2025 I was on a call about a seller whose books had grown sideways. Their inventory accounts were split by brand. Their income and cost of goods sold were split by sales channel. Warehouse transfers had stopped meaning anything, because stock moving from one building to another never changed accounts. I described it on the call like this: “They’re doing inventory accounts by brand instead of by warehouse. So they have no idea what’s in each warehouse.”

Nobody set out to build that. Each split was a reasonable answer to one question someone once asked of the books. Ten of those answers later, the chart of accounts could not answer the simplest question of all, which is what the business made last month.

My view is that an ecommerce chart of accounts should be short, and that most of the detail people try to put in it belongs somewhere else. This guide covers what a short chart looks like, where the channel goes instead, where marketplace fees belong, how to read the P&L by month and by channel, the mistakes I see most, and how to check your own books. It ends with how SKU.io does it, and what it does not do.

Three questions, three places

Every reporting question an ecommerce seller asks falls into one of three kinds. Each kind has one right home.

  • What kind of money was it? Sales, shipping charged to the customer, a refund, a referral fee, ad spend. That is the chart of accounts. It is the one thing only the ledger can do.
  • Where was it earned? Amazon, Shopify, Walmart, wholesale. That is a tag on the entry: a tracking category in Xero or a class in QuickBooks Online. It is not a new account.
  • Which product earned it? SKU, brand, product line, order. That lives in your inventory or order system, which already knows every unit and its cost. The ledger holds dollars, not units.

The seller on that call had put all three kinds into the chart. Brand went into the inventory accounts and channel went into the income accounts, and the product detail was half in and half out. When a chart tries to answer all three, it answers none of them well. I wrote about the product side years ago, in why you should not use your accounting software to make decisions. This guide is about the first two.

A short chart for an online seller

Here is the shape I would start any online seller on. The account names are generic. Your accountant will have their own numbering.

SectionAccounts
IncomeSales · Shipping income · Sales discounts · Refunds and returns · Marketplace reimbursements
Cost of salesCost of goods sold · Marketplace fees: referral · Marketplace fees: fulfillment · Marketplace fees: storage · Marketplace fees: other · Merchant processing fees · Outbound shipping and postage · Inventory shrinkage · Inventory damage write-offs
Operating expensesAdvertising · Software · Payroll · Rent and warehouse · the usual overhead lines
AssetsInventory · Inventory in transit · Vendor deposits (paid before delivery) · One clearing account per marketplace or payment processor
LiabilitiesAccounts payable · Accrued purchases (received, not yet billed) · Sales tax payable

That is about 30 accounts for a business that sells on five or six channels. A few things about it are deliberate.

Shipping income is its own line. If you credit what customers pay for shipping to Sales, your average order value looks better than it is, and you can never compare what you charge for shipping with what you pay for it.

Discounts and refunds are their own lines. Gross sales minus discounts minus refunds is net revenue. If those three are netted together before they reach the books, you lose the two numbers that tell you whether a promotion or a product is going wrong.

Marketplace reimbursements are income, not a negative fee. When Amazon pays you for a unit it lost, that is money in. Burying it inside the fee account makes your fees look lower in the month it lands.

Vendor deposits and accrued purchases are two accounts, not one. Money you paid before the goods arrived and goods you received before the bill arrived are opposite situations. Each one needs to be reconciled on its own. Kept in one account, they cancel and hide each other.

There is a clearing account for each channel. A marketplace payout is gross sales, minus fees, minus refunds, minus any reserve, in one deposit. The clearing account is where the gross invoice and the fee bill meet the deposit. If it sits near zero, every payout was matched. The payouts pillar covers that in depth.

There are no channel names anywhere in that table. That is the point of the next section.

Put the channel in a tag, not in the account name

The usual way a chart gets long is that someone wants a P&L by channel and the accounts are the only tool in sight. So “Sales” becomes “Sales - Amazon”, “Sales - Shopify”, “Sales - Walmart”. Then the same happens to shipping income, discounts, refunds and each fee line. Five income lines and four fee lines across eight channels is 72 accounts before cost of goods sold. Add a second Shopify store and a wholesale channel, and it keeps going.

Xero and QuickBooks Online both have a better tool for this. Xero calls it a tracking category. QuickBooks Online calls it a class. You keep one Sales account, and each entry carries a tag that says which channel it came from. Then you run the P&L once and group it by the tag. A new channel is a new tag option, not nine new accounts.

There are limits. Xero allows only two active tracking categories, so you choose the two dimensions that matter most. Channel is almost always one of them. QuickBooks Online classes are not on every plan, so check yours. And tags belong on the entries that belong to a channel: revenue, cost of goods sold, marketplace fees. Purchases and inventory adjustments do not belong to any channel, so they stay untagged.

The point I’d underline: in the financials you only want a dollar amount for inventory. Quantities, SKUs and per-unit costs stay in the inventory system.

There is one honest case for a separate account per channel. If a channel has to read as its own line on the face of the P&L, for example wholesale revenue that a lender or buyer wants to see apart, give it its own account. Do that for one or two channels by choice, not for every channel by default. Channel tracking instead of 200 income accounts works through the trade-off with real account counts.

Where marketplace fees belong

This is the part of the chart where reasonable accountants disagree, so here is my position plainly. Marketplace fees, payment processing fees and outbound shipping belong in cost of sales, above gross margin. Advertising belongs in operating expenses, below it.

The test I use is simple: could you have made the sale without paying it? You cannot sell on Amazon without the referral fee. You cannot ship an FBA order without the fulfillment fee. You cannot take a card on Shopify without the processing fee. Those costs scale with every order, just like the cost of the unit. Advertising is a choice you make to get more orders. It belongs with the other spending decisions.

Here is why it matters, using one invented month for a seller doing $116,000 of net revenue:

Fees in cost of salesFees in operating expenses
Net revenue$116,000$116,000
Cost of goods sold$41,800$41,800
Marketplace, processing and shipping costs$31,200(below the line)
Gross profit$43,000$74,200
Gross margin37.1%64.0%

Same business, same month. One version says 37% and the other says 64%. The 64% figure is the one that gets a seller in trouble, because it makes a marketplace look as profitable as the website, and it makes the gross margin rise whenever more sales shift to the channel with the highest fees. Whichever you choose, choose it once and keep it. A fee that moves between sections from one month to the next makes every trend line useless.

The SKU.io standard chart makes the same choice: marketplace and processing fees sit in cost of sales, and advertising stays an operating expense. You can still disagree and map them elsewhere.

The P&L by month and by channel

With a short chart and a channel tag, the P&L an ecommerce seller should read every month has two views.

By month. Revenue down to gross profit, one column per month. This is where you see seasonality, the month a fee change hit, or the month refunds jumped. If you can only read one view, read this one, and read it on the accrual basis even if you file taxes on cash. A payout that lands on the 3rd of the month covers sales from the month before.

By channel. The same lines split by tag, carried down to contribution margin: gross profit minus the costs that belong to that channel, such as its own advertising. Here is the invented month from above, split three ways:

AmazonShopifyWalmartTotal
Net revenue$64,000$40,000$12,000$116,000
Cost of goods sold$23,000$14,000$4,800$41,800
Fees, processing and shipping$20,700$7,400$3,100$31,200
Gross profit$20,300$18,600$4,100$43,000
Gross margin31.7%46.5%34.2%37.1%
Advertising$6,500$7,000$1,000$14,500
Contribution margin$13,800$11,600$3,100$28,500
Contribution margin %21.6%29.0%25.8%24.6%

Amazon brings in over half the revenue and has the lowest contribution margin of the three. That isn’t a reason to leave Amazon. It is a reason to know which channel pays for the warehouse. Contribution margin by channel goes further into reading this table, including what happens when you start allocating overhead to it.

Product-level profit, such as which SKU lost money on which channel, is a level below this. It belongs in the inventory system, which has every unit’s cost. A ledger cannot get you there without a thousand accounts.

Common mistakes

These are the patterns I see most when I look at a seller’s chart for the first time.

  1. One account per channel per line. “Shipping income - eBay” and so on. The chart grows with every channel, and comparing a line across channels means adding accounts by hand.
  2. Booking the deposit as the sale. A $9,400 Amazon payout is not $9,400 of sales. It might be $14,000 of sales less $4,600 of fees and refunds. Booking the net amount makes revenue look low and makes the fees vanish from the P&L.
  3. Revenue counted twice. The inventory system posts invoices and a settlement tool posts the same sales from the payout. I covered how that happens in what an inventory system should post to QuickBooks Online.
  4. One “Amazon” account for everything. Sales, fees, refunds and reimbursements all go in one account that nets to roughly the deposit. It reconciles, and it tells you nothing.
  5. Fees that move between sections. Fees go in cost of sales one quarter and in operating expenses the next, so gross margin jumps for no business reason.
  6. Inventory split by something other than location. Brand or channel inventory accounts mean the balance sheet can’t be checked against a count, because no warehouse’s value is on its own line.
  7. Asking the ledger for SKU-level answers. Product-line accounts multiply until nobody maps new products to them, and new products fall into a catch-all like “Other income” that grows every month.

How to check your own chart and P&L

You do not need any particular software for these checks. You need your chart, last month’s P&L and your channel reports.

1. Count your income accounts. If you have more than about ten, list what each one separates. Every split that is really a channel is a tag waiting to happen.

2. Compare gross sales with each channel’s own report. Take one channel and one month. Here is an invented example: Shopify reports $41,900 of gross sales. The books show $38,600 tagged to Shopify. The $3,300 gap is $1,500 of processing fees and $1,800 of refunds that were netted out before booking. The gap should be zero, or explained by timing that reverses the next month.

3. Work out fees as a percentage of gross sales, by channel, by month. Twelve months of it should be a fairly flat line for each channel. A month where Amazon fees drop from 32% to 18% of sales is usually a fee that was miscoded, not a good month.

4. Check that channels add up to the total. Sum each tag’s revenue. If it falls short of the P&L, some entries went in untagged. Find out what they are before trusting any channel’s margin.

5. Tie inventory on the balance sheet to the inventory system at month end. If they disagree, the cost of goods sold for that month is off by at least the change in the gap. This is the check the month-end close is built around.

6. Look at every clearing account balance. A clearing account that grows month after month means deposits are not being matched to the invoices and bills they pay.

If checks 2 and 4 fail, fix the posting before you fix the chart. A clean chart fed by the wrong entries is still wrong.

How SKU.io handles it

SKU.io posts summarized entries to Xero or QuickBooks Online. The books stay in your accounting software, and your accountant keeps working there. Here is what it does on each part of this guide, with the guide for each.

A standard ecommerce chart

New accounts start with an ecommerce chart of accounts. If you are already set up, Accounting → Settings → Nominal Code Mappings has an Apply ecommerce standard button. It shows a full preview and adds only what is missing: nothing you have already set is remapped, renamed or deleted, and nothing is written in a locked period. The standard has shipping income, discounts, marketplace reimbursements, separate referral, fulfillment, storage and other marketplace fee accounts, merchant processing fees, advertising, and an optional clearing account for channels whose deposits SKU.io doesn’t post yet (off by default; SKU.io’s own payouts clear through receivables and payables). Payout lines that have no mapping fall to Marketplace Reimbursements (money in) or Marketplace Fees: Other (money out), so they are easy to find and reclassify. There is no step-by-step guide for it yet. The ecommerce standard chart release note has the details, and the chart of accounts reference lists the default accounts.

Channel as a tag

SKU.io can stamp each revenue, cost of goods sold, marketplace fee and FBA inventory line it sends with its channel, as a tracking category option in Xero or a class in QuickBooks Online. Nothing is created in your books until you confirm it. The tracking categories guide has the setup.

Product lines without a long chart

When your accountant does want product lines on the P&L, account rules send groups of products to their own accounts by category, brand, supplier or product type, so new products follow the rule too. The account rules guide says most catalogs need three to six rules.

The ecommerce P&L

Under Accounting → Reports, the Ecommerce P&L has four tabs: P&L by month; By channel by month, down to contribution margin; Balance sheet - inventory, with inventory at each month end beside your books; and Trust and method. Each month is labeled Operational, Ledger, History or Estimate, so you know where its figures came from, and estimates are never posted. Revenue that no order explains, such as a settlement adjustment or a manual journal, goes to an Unassigned block so the channels always add up to the monthly total. All four tabs export as one Excel workbook for your accountant. The ecommerce P&L guide walks through each tab.

Watch on YouTube

Checking the P&L against your books

The books health check compares SKU.io’s figures with your Xero or QuickBooks Online trial balance, month by month, in four sections: income, income by channel, cost of goods sold, and the balance sheet. Each difference is graded against bands you can change. By default, up to 5% is a close match and over 90% suggests a rebuild. It only reads your books and never posts anything. It covers up to 24 months per run, and your books must use the same base currency as SKU.io. There is one limit worth knowing if you follow this guide’s advice: the health check can compare a channel on its own only where that channel has its own income account. A channel that shares an account with others reads “Books do not split this channel” and isn’t graded alone. The books health check guide has the rest.

Watch on YouTube

What it does not do

SKU.io doesn’t replace your accounting software or your accountant. It doesn’t choose your chart for you: the standard is a starting point, and every mapping can be changed. And it doesn’t rewrite the accounts you already use when you apply the standard.

Who this is not for

If you sell on one channel, have a short product list and do under about $1M a year, you probably don’t need any of the channel machinery here. QuickBooks Online’s own inventory, or a lighter tool like inFlow or Zoho Inventory, will do the job for far less. Keep the short chart anyway. It costs nothing and it will still fit when you add a second channel.

Further reading

This guide is one part of the ecommerce accounting standards, a checklist for a seller’s books. The posts that go deeper on this topic:

How SKU.io posts to your books is on the accounting page. If you want me to go through your own chart and channels with you, book a call.

Newsletter

Get the next one by email

Short, practical writing on inventory, fulfilment and multi-channel operations — sent when there is something worth sending.

Double opt-in — we send a confirmation link and you are not on the list until you click it. One-click unsubscribe on every email. See our privacy policy.

Ready to see SKU.io in action?

Bring your real numbers and the messy questions — we'll walk the system against an operation like yours, not a slide deck.

Book a Demo

Founder-led demo · 2-day onboarding · no onboarding fees