sheetsmith

Templates › Business and freelance

Etsy Seller Profit Tracker

Made for handmade and print-on-demand sellers.

Record every Etsy sale with fees, postage and materials, and see what each order and each item actually earns. The summary carries a chart that redraws itself as you type.

Tabs
5
Columns
40
Fill themselves in
35

£7one payment, yours to keep

  • Opens in Excel, Google Sheets and Numbers
  • Delivered straight away
  • No macros, nothing to install
  • Change it free before you buy

Payment is handled by Stripe. Your card details go to them and never to us. Sales are final, which is why every tab, column and calculation is shown on this page first.

The workbook's summary and the table behind it
A row typed into the real file. Every figure that changes is the spreadsheet's own arithmetic.
The summary page, every figure calculated from the tables
The chart, drawn from the totals in the table beside it
What is inside: the tabs, the columns and what fills itself in
Where you type, and the shaded columns that work themselves out
The guide sheet that opens first and explains the file
Everything included in the download

Everything inside, before you pay

This is the whole design: every tab, every column and how each calculated one is worked out. White cells are yours to fill in; the shaded ones work themselves out and are locked so a formula cannot be overwritten by accident. There is room for 1,260 rows.

Products

Your items and what each one costs you to make. Room for 200 rows.

ColumnTypeWorked out as
Item Nametext
Categorychoice (list)
Listed Pricecurrency
Material Costcurrency
Make Time Minsnumber
Margin Per UnitcurrencyIF(OR(ISBLANK([list_price]),ISBLANK([material_cost])),"",ROUND([list_price]-[material_cost],2))
Margin PercentpercentIF(OR(ISBLANK([list_price]),ISBLANK([material_cost])),"",IFERROR(([list_price]-[material_cost])/[list_price],0))
Still Listedbool

Orders

One row per Etsy sale. Fill in what you charged and what it cost you, and the profit works itself out. Room for 800 rows.

ColumnTypeWorked out as
Order Datedate
Order Notext
Itemchoice (from Products › item_name)
Sales Channelchoice (list)
Qtynumber
Item Chargedcurrency
Postage Chargedcurrency
Postage Costcurrency
Etsy Feescurrency
Materials Costcurrency
Gross RevenuecurrencyIF(ISBLANK([item_charged]),"",ROUND([item_charged]+IF(ISBLANK([postage_charged]),0,[postage_charged]),2))
Total CostcurrencyIF(ISBLANK([item_charged]),"",ROUND(IF(ISBLANK([materials_cost]),IFERROR(INDEX([Products!material_cost],MATCH([item_name],[Products!item_name],0)),0)*IF(ISBLANK([qty]),1,[qty]),[materials_cost])+IF(ISBLANK([postage_cost]),0,[postage_cost])+IF(ISBLANK([etsy_fees]),0,[etsy_fees]),2))
ProfitcurrencyIF(ISBLANK([item_charged]),"",ROUND([item_charged]+IF(ISBLANK([postage_charged]),0,[postage_charged])-IF(ISBLANK([materials_cost]),IFERROR(INDEX([Products!material_cost],MATCH([item_name],[Products!item_name],0)),0)*IF(ISBLANK([qty]),1,[qty]),[materials_cost])-IF(ISBLANK([postage_cost]),0,[postage_cost])-IF(ISBLANK([etsy_fees]),0,[etsy_fees]),2))
Profit MarginpercentIF(ISBLANK([item_charged]),"",IFERROR((([item_charged]+IF(ISBLANK([postage_charged]),0,[postage_charged]))-(IF(ISBLANK([materials_cost]),IFERROR(INDEX([Products!material_cost],MATCH([item_name],[Products!item_name],0)),0)*IF(ISBLANK([qty]),1,[qty]),[materials_cost])+IF(ISBLANK([postage_cost]),0,[postage_cost])+IF(ISBLANK([etsy_fees]),0,[etsy_fees])))/([item_charged]+IF(ISBLANK([postage_charged]),0,[postage_charged])),0))
MonthtextIF(ISBLANK([order_date]),"",TEXT([order_date],"YYYY-MM"))
Statuschoice (list)

Item Performance

How each item has done across all orders. Add a row for any item you want to watch. Room for 200 rows.

ColumnTypeWorked out as
Itemchoice (from Products › item_name)
Units SoldnumberIF(ISBLANK([item_name]),"",SUMIF([Orders!item_name],[item_name],[Orders!qty]))
OrdersnumberIF(ISBLANK([item_name]),"",COUNTIF([Orders!item_name],[item_name]))
RevenuecurrencyIF(ISBLANK([item_name]),"",ROUND(SUMIF([Orders!item_name],[item_name],[Orders!gross_revenue]),2))
ProfitcurrencyIF(ISBLANK([item_name]),"",ROUND(SUMIF([Orders!item_name],[item_name],[Orders!profit]),2))
Profit Per OrdercurrencyIF(ISBLANK([item_name]),"",ROUND(IFERROR(SUMIF([Orders!item_name],[item_name],[Orders!profit])/COUNTIF([Orders!item_name],[item_name]),0),2))
Profit MarginpercentIF(ISBLANK([item_name]),"",IFERROR(SUMIF([Orders!item_name],[item_name],[Orders!profit])/SUMIF([Orders!item_name],[item_name],[Orders!gross_revenue]),0))

Monthly Summary

Profit month by month. Type the first day of each month in the left column. Room for 60 rows.

ColumnTypeWorked out as
Month Startingdate
MonthtextIF(ISBLANK([month_start]),"",TEXT([month_start],"MMM YYYY"))
OrdersnumberIF(ISBLANK([month_start]),"",COUNTIFS([Orders!order_date],">="&[month_start],[Orders!order_date],"<="&EOMONTH([month_start],0)))
RevenuecurrencyIF(ISBLANK([month_start]),"",ROUND(SUMIFS([Orders!gross_revenue],[Orders!order_date],">="&[month_start],[Orders!order_date],"<="&EOMONTH([month_start],0)),2))
Etsy FeescurrencyIF(ISBLANK([month_start]),"",ROUND(SUMIFS([Orders!etsy_fees],[Orders!order_date],">="&[month_start],[Orders!order_date],"<="&EOMONTH([month_start],0)),2))
Total CostscurrencyIF(ISBLANK([month_start]),"",ROUND(SUMIFS([Orders!total_cost],[Orders!order_date],">="&[month_start],[Orders!order_date],"<="&EOMONTH([month_start],0)),2))
ProfitcurrencyIF(ISBLANK([month_start]),"",ROUND(SUMIFS([Orders!profit],[Orders!order_date],">="&[month_start],[Orders!order_date],"<="&EOMONTH([month_start],0)),2))
Average Per OrdercurrencyIF(ISBLANK([month_start]),"",ROUND(IFERROR(SUMIFS([Orders!profit],[Orders!order_date],">="&[month_start],[Orders!order_date],"<="&EOMONTH([month_start],0))/COUNTIFS([Orders!order_date],">="&[month_start],[Orders!order_date],"<="&EOMONTH([month_start],0)),0),2))
Profit MarginpercentIF(ISBLANK([month_start]),"",IFERROR(SUMIFS([Orders!profit],[Orders!order_date],">="&[month_start],[Orders!order_date],"<="&EOMONTH([month_start],0))/SUMIFS([Orders!gross_revenue],[Orders!order_date],">="&[month_start],[Orders!order_date],"<="&EOMONTH([month_start],0)),0))

Summary

The headline numbers for the shop.

MeasureWorked out as
Orders RecordedCOUNT([Orders!item_charged])
Total RevenueROUND(SUM([Orders!gross_revenue]),2)
Total Etsy FeesROUND(SUM([Orders!etsy_fees]),2)
Total Postage CostROUND(SUM([Orders!postage_cost]),2)
Total CostsROUND(SUM([Orders!total_cost]),2)
Total ProfitROUND(SUM([Orders!profit]),2)
Overall Profit MarginIFERROR(SUM([Orders!profit])/SUM([Orders!gross_revenue]),0)
Average Profit Per OrderROUND(IFERROR(SUM([Orders!profit])/COUNT([Orders!item_charged]),0),2)
Profit This MonthROUND(SUMIFS([Orders!profit],[Orders!order_date],">="&DATE(YEAR(TODAY()),MONTH(TODAY()),1),[Orders!order_date],"<="&EOMONTH(TODAY(),0)),2)
Profit This YearROUND(SUMIFS([Orders!profit],[Orders!order_date],">="&DATE(YEAR(TODAY()),1,1),[Orders!order_date],"<="&DATE(YEAR(TODAY()),12,31)),2)
Best Earning ItemIFERROR(INDEX([Item Performance!item_name],MATCH(MAX([Item Performance!profit]),[Item Performance!profit],0)),"")
Profit From Best ItemROUND(IFERROR(MAX([Item Performance!profit]),0),2)
Fees As Share Of RevenueIFERROR(SUM([Orders!etsy_fees])/SUM([Orders!gross_revenue]),0)
Orders Not Yet PostedCOUNTIF([Orders!status],"Received")+COUNTIF([Orders!status],"Made")