How to Make a Monthly Sales Report in Google Sheets
Revenue and orders for each of the last twelve months, in a table that updates itself. Two formulas, copied down twelve rows.
The short answer: list the first day of each month in column A, then =SUMIFS(Orders!$J:$J, Orders!$A:$A, ">="&$A2, Orders!$A:$A, "<"&EDATE($A2,1)) totals that month's revenue. In the sample data, the twelve months from November 2025 to October 2026 add up to $1,572,281 across 2,547 orders.
The sample data
| A | B | C | D | E | F | G | H | I | J | K | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Date | Order ID | Customer | Region | Channel | Product | Category | Qty | Unit price | Revenue | Cost |
| 2 | 2025-01-01 | SO-10001 | Tin Roof Café | Northeast | Sales rep | Sip Lids (case of 1,000) | Supplies | 6 | 54 | 324 | 198 |
| 3 | 2025-01-01 | SO-10001 | Tin Roof Café | Northeast | Sales rep | Espresso Roast 5 lb | Coffee | 10 | 68 | 680 | 370 |
| 4 | 2025-01-01 | SO-10002 | Foxglove Café | Northeast | Online store | Sip Lids (case of 1,000) | Supplies | 1 | 54 | 54 | 33 |
| 5 | 2025-01-01 | SO-10002 | Foxglove Café | Northeast | Online store | Cold Brew Concentrate 1 gal | Coffee | 8 | 42 | 336 | 152 |
| 6 | 2025-01-01 | SO-10003 | Ember Café | Midwest | Online store | Sip Lids (case of 1,000) | Supplies | 4 | 54 | 216 | 132 |
| … | 8,115 more rows | ||||||||||
Sample data: a tab named Orders with 8,120 order lines from January 2025 to October 2026, one row per order line. Revenue is Qty × Unit price; Cost is the line's cost of goods (Qty × unit cost). Download orders.csv and import it (File → Import) to follow along. The business is fictional.
The classic way: a month column plus SUMIFS
On a new tab, put headings in row 1 (Month, Revenue, Orders). Then fill in the months: =DATE(2025,11,1) in A2 and =EDATE(A2,1) in A3, copied down to A13. Format column A as a month (Format → Number → Custom date and time → "MMM yyyy").
Revenue for each month, in B2 and copied down:
=SUMIFS(Orders!$J:$J, Orders!$A:$A, ">="&$A2, Orders!$A:$A, "<"&EDATE($A2,1))
Number of orders, in C2 and copied down. Each order has several lines, so count distinct order IDs rather than rows:
=COUNTUNIQUEIFS(Orders!$B:$B, Orders!$A:$A, ">="&$A2, Orders!$A:$A, "<"&EDATE($A2,1))
A Total row underneath is =SUM(B2:B13) and =SUM(C2:C13). Using "on or after the 1st, before the 1st of next month" catches every day of the month, including the 31st and any rows with a time on them.
| A | B | C | |
|---|---|---|---|
| 1 | Month | Revenue | Orders |
| 2 | Nov 2025 | $146,603 | 225 |
| 3 | Dec 2025 | $129,419 | 228 |
| 4 | Jan 2026 | $122,587 | 194 |
| 5 | Feb 2026 | $103,390 | 161 |
| 6 | Mar 2026 | $130,195 | 220 |
| 7 | Apr 2026 | $128,136 | 205 |
| 8 | May 2026 | $125,646 | 197 |
| 9 | Jun 2026 | $136,411 | 229 |
| 10 | Jul 2026 | $127,769 | 212 |
| 11 | Aug 2026 | $141,015 | 223 |
| 12 | Sep 2026 | $138,635 | 220 |
| 13 | Oct 2026 | $142,475 | 233 |
| 14 | Total | $1,572,281 | 2,547 |
Computed from the sample CSV above. Cells formatted as currency and percent.
Make it roll. To always show the last twelve full months, replace A2 with =EDATE(EOMONTH(TODAY(),-1)+1, -12). That is the first day of this month, minus twelve months. Everything below recalculates on its own.
Prefer one QUERY? This returns year, month and revenue in one go:
=QUERY(Orders!A:K, "select year(A), month(A)+1, sum(J) where A >= date '2025-11-01' and A < date '2026-11-01' group by year(A), month(A)+1 order by year(A), month(A)+1 label year(A) 'Year', month(A)+1 'Month', sum(J) 'Revenue'", 1)
Note the +1: QUERY's month() counts January as 0. Forget it and every month is labeled one too early.
Gotchas
- Counting rows instead of orders.
COUNTIFSon order lines counts products, not orders.COUNTUNIQUEIFSon the Order ID column counts each order once. - The current month is partial. A rolling report that includes this month always shows it low. The rolling start above stops at last month on purpose.
- Dates with times.
"<="&EOMONTH(A2,0)misses anything after midnight on the last day. The"<"&EDATE(A2,1)form does not. - Text dates. If SUMIFS returns 0 everywhere, column A of Orders is text. Convert it to real dates first.
The one-cell way: =QUIRIZ
With the Quiriz add-on for Google Sheets, you type the question instead of building the formula. =QUIRIZ does not read the cells around it: it answers from the datasets in your Quiriz account. For this example, upload orders.csv as a dataset, or connect your Shopify store. You can also add a Google Sheet itself as a dataset that refreshes on a schedule. Then, in any empty cell:
=QUIRIZ("revenue and number of orders by month from November 2025 to October 2026, with a total row", "table")
The "table" mode spills the answer down and to the right from that cell, header row first:
| A | B | C | |
|---|---|---|---|
| 1 | Month | Revenue | Orders |
| 2 | Nov 2025 | $146,603 | 225 |
| 3 | Dec 2025 | $129,419 | 228 |
| 4 | Jan 2026 | $122,587 | 194 |
| 5 | Feb 2026 | $103,390 | 161 |
| 6 | Mar 2026 | $130,195 | 220 |
| 7 | Apr 2026 | $128,136 | 205 |
| 8 | May 2026 | $125,646 | 197 |
| 9 | Jun 2026 | $136,411 | 229 |
| 10 | Jul 2026 | $127,769 | 212 |
| 11 | Aug 2026 | $141,015 | 223 |
| 12 | Sep 2026 | $138,635 | 220 |
| 13 | Oct 2026 | $142,475 | 233 |
| 14 | Total | $1,572,281 | 2,547 |
Same figures as the formula result above, from the same sample data. The spilled cells are plain numbers, so you can format them, total them or chart them; here they are formatted as currency and percent. Column headings are written with each answer and may be worded differently.
The other modes: "verbose" (the default) answers in a sentence, "bullets" writes two to four points one per cell, and "notes" adds how the figure was calculated. Install Quiriz for Google Sheets and try the question on your own data.
Ask the question, get the table
Quiriz answers business questions in a Google Sheets cell, from your imported files, scheduled Google Sheets and connected tools. Free to start.
Install for Google Sheets →Free on the Google Workspace Marketplace. Or try it on sample data first, no signup.