The monthly P&L that keeps your margin line visible
A free monthly P&L template for ecommerce, built on the contribution margin structure most generic templates bury: gross revenue steps down through discounts, returns, landed COGS, shipping and fulfilment, payment and platform fees and marketing spend to operating profit, with every subtotal computed live as a percent of net revenue. Edit the numbers on this page, then download the same table as a CSV.
| Line | This month | % of net |
|---|---|---|
| Gross revenueAll orders at full value, before any deductions | $ |
114.9% |
| − DiscountsCodes, sitewide offers and markdowns | $ |
9.2% |
| − ReturnsRevenue refunded this month | $ |
5.7% |
| = Net revenue | $87,000 | 100% |
| − Landed COGSCost + freight-in + duty, for the units sold | $ |
40% |
| = Contribution margin after product costs | $52,200 | 60% |
| − Shipping and fulfilmentPick/pack + outbound shipping | $ |
10% |
| − Payment and platform feesActual dollars from statements, not an assumed rate | $ |
3% |
| = Contribution margin before marketing | $40,890 | 47% |
| − Marketing spendAd platforms + affiliate + promo | $ |
20% |
| = Contribution margin after marketing | $23,490 | 27% |
| − Fixed costsRent, salaries, software: costs that do not move with sales | $ |
13.8% |
| = Operating profit | $11,490 | 13.2% |
Deductions are entered as positive numbers; the subtotals do the subtraction. The percent column reads every line against net revenue.
The month keeps $11,490 of operating profit: 13.2% of net revenue. Marketing spent $17,400 of the $40,890 pool that contribution margin before marketing allowed.
The file mirrors this page line for line, with deduction amounts signed and every line read against net revenue. File it with the month's records.
Fill it from reports you already have
Every editable cell maps to a report or statement your stack already produces. Six pulls, once a month, in this order.
Gross revenue, discounts and returns come from your Shopify sales reports for the month you are closing. Keep gross at full value and let the deductions sit on their own lines.
Landed COGS comes from your landing-cost records: supplier cost plus freight-in plus duty, applied to the units that sold this month, not the units you purchased.
Shipping and fulfilment comes from carrier invoices and your 3PL or warehouse bill: pick/pack plus outbound shipping for the month's orders.
Payment and platform fees are actual dollars from your payment processor statements and your platform bill. The template builds in no rate, because your real fee load moves with payment mix.
Marketing spend comes from each ad platform's billing report, plus affiliate and promo costs invoiced outside the platforms.
Fixed costs come from your accounting ledger: rent, salaries, software, everything that does not move with sales. Then read the subtotals top to bottom and download the CSV.
Every line has a source
No number on this page should be typed from memory. Each line maps to something you already receive, and the close checklist keeps the order honest.
| P&L line | Where it comes from | Watch for |
|---|---|---|
| Gross revenue, discounts, returns | Your Shopify sales reports for the month | Report totals can move if the month is re-pulled later; note the date you pulled them. |
| Landed COGS | Your landing-cost records: supplier invoices plus freight-in plus duty | Ex-factory cost alone makes the margin read fatter than it is. Cost the units sold, not the units purchased. |
| Shipping and fulfilment | Carrier invoices and your 3PL or warehouse bill | Packaging and pick/pack fees often sit on a separate invoice from postage. |
| Payment and platform fees | Payment processor statements and your platform bill | Enter actual dollars. A remembered blended rate drifts with payment mix. |
| Marketing spend | Each ad platform's billing report, plus affiliate and promo invoices | Billed spend and served spend differ around month ends; use the same basis every month. |
| Fixed costs | Your accounting ledger | Keep anything that moves with sales out of this line, or contribution margin stops meaning anything. |
- Let the month actually end. Returns and fee statements land late; closing on day one undercounts both.
- Reconcile revenue to payouts before reading margin. Sales reports minus fees should tie to what the processor actually paid out. Investigate any gap first.
- Match COGS to units sold, not units purchased. Purchases are inventory; only the units that shipped belong in this month's cost.
- Pull actual fee dollars. Processor statements and the platform bill, not a remembered rate.
- Collect every marketing invoice. Including affiliate and promo costs billed outside the ad platforms.
- Enter, read, file. Read the subtotals top to bottom, download the CSV, and file it in the same place every month so months compare.
Five subtractions, one ladder
The template is a step-down: each subtotal is the line above minus the costs that belong to that rung. Nothing is weighted, modelled or assumed.
Same ladder as The Math: after product costs is the CM1 rung, before marketing is CM2, after marketing is CM3. Landed means cost plus freight-in plus duty.
Your month starts at $100,000 gross. Discounts give up $8,000 and returns $5,000, leaving $87,000 of net revenue: the base every percent on this page reads against.
Landed COGS takes $34,800, leaving $52,200 after product costs (60% of net). Shipping and fulfilment take $8,700 and payment and platform fees $2,610, leaving $40,890 before marketing (47%). Marketing spend of $17,400 leaves $23,490 after marketing (27%), and fixed costs of $12,000 leave $11,490 of operating profit (13.2% of net revenue).
These are your live numbers from the table above, not a canned example. Change a cell up there and this paragraph follows.
The margin line is where the decision lives
A generic small-business P&L piles variable and fixed costs into one expense block, so the contribution margin line never appears on the page. Kept separate, the same statement answers three operator questions a bottom line cannot.
It is one blended month, typed by hand. It cannot see which SKU or customer sits above or below the line, and timing blurs it: returns lag the sales that caused them, COGS can be booked on purchase instead of sale, and spend billed rarely equals spend served across a month end.
The sharper failure is reading margin before reconciling revenue to actual payouts. The table computes whatever you type, so an unreconciled revenue line makes every subtotal below it precise and wrong.
What we recommend instead is a close that ties to the ledger. Blufire produces this structure live and reconciled: the CM waterfall & bridge in S2 runs the same step-down on every order, and S12 Financial Models carries the model layer. This template is the manual version of what the product automates monthly.
One close a month, three triggers
Monthly, in the first week after month end, once the close checklist passes. Not mid-month: returns and fee statements have not landed yet, and the margin line will read better than it is.
Re-run it before a launch or a promo-heavy month, with the planned discounts and marketing spend typed in, to size the marketing line against the pool contribution margin actually allows.
Feed the template from the napkin side: the contribution margin calculator steps a single order down the same ladder. All free tools →
Questions operators ask
Because discounts and returns are not costs, they are revenue that never arrived. Ratios taken on gross flatter every line below them: COGS, fees and marketing all look lighter than they are. Net revenue is the money the month actually produced, so it is the honest base, which is also why gross revenue itself reads above 100% in the column.
Generic templates pile variable and fixed costs into one expense block, so the contribution margin line never appears. This one keeps the costs that move with each sale separate from the costs that do not, which is what lets you see what the month's sales actually contributed before marketing and before rent, and judge each against the right base.
What you sold: the landed cost of the units that shipped this month. Stock you purchased but have not sold is inventory, not a cost of this month's sales, and booking it here makes a stock-up month look like a disaster and the following month look like a triumph.
Because your real fee load is on your statements, and it moves with payment mix, plan and currency, so any prefilled rate would be a guess. Every number on this page is an example to replace; the fee line takes the actual dollars from your processor statements and platform bill.
Into the returns line of the month you refund them, and accept the small distortion. A heavy-return month will read slightly worse than the sales that caused it deserved; the alternative, restating closed months, costs more than it tells you. Note the lag and keep the treatment consistent.
You can, but the close steps are monthly rhythms: payouts, fee statements and returns settle on month boundaries, so weekly runs read noisier and the reconciliation step cannot complete. The usual pattern is a weekly glance at sales reports and one disciplined monthly close in this structure.
The same P&L, live on every order
This page is one blended month, entered by hand. Blufire produces this structure live and reconciled: the CM waterfall & bridge in S2, and S12 Financial Models for the model layer. The template is the manual version of what the product automates monthly.