How do you pack Shopify numbers for your accountant each month?

DACH, Shopify DTC.

Every month my Steuerberater wants one page: Umsatz, refunds, ad spend, ROAS.

Shopify Analytics has Umsatz and refunds. It does not have ad spend. ROAS on that page is net of refunds. So the monthly ritual is: export, paste the ad-account totals by hand, divide, PDF.

AgencyAnalytics / DashThis / Swydo are the things people point at. Those are agency seats. I have one shop.

What do you actually send? The Shopify CSV? A spreadsheet? Something else?

Two exports instead of one paste job, if that helps.

The page you want is not the Analytics overview. It’s the Total sales breakdown under Finance reports. Shopify itself describes that one as the values you need for bookkeeping, so you get gross sales, discounts, returns, net sales and taxes in the shape an accountant expects. Net sales there is already gross minus discounts minus returns, which is exactly why your Umsatz figure and the ROAS line on the overview disagree.

Ad spend is never coming out of Shopify, so that part stays manual whatever tool you buy. That is the whole reason the agency dashboards exist, and also why they are priced per seat.

The thing that bit us was dating. Sales reports are keyed to the order date, payments to when the money actually moved. An order placed on the 30th and captured on the 2nd shows up in two different months. So if your Steuerberater ties anything back to the bank statement, send the payout reconciliation report from Finance and then Documents next to the sales one. Otherwise you get a mismatch every single month and spend an hour explaining it.

For one shop I would stop at those two exports plus a small sheet for ad spend and ROAS, and skip the dashboard tools completely.

Does yours want it in DATEV format, or is a PDF plus a CSV enough?

PDF plus CSV is enough for ours. DATEV would be cleaner but they have not asked us to map it. The dating mismatch is the hour we used to burn. Two Finance exports plus pasted spend is the pack. No dashboard.

What do you already pay for that sheet (hours, Steuerberater line, or a tool)?

I’d cost it before buying anything:

  • Track one full month. Count export, paste, checks, PDF, and any back-and-forth with the Steuerberater.
  • Multiply that time by your real hourly cost, then add any accountant correction line. Example: 45 minutes at €50/hour plus €25 accountant time means the pack costs about €62.50/month.
  • If it stays under an hour, keep the two Finance CSVs and one fixed spreadsheet tab for Meta/Google spend and net ROAS.
  • Add a month-end checklist and lock the formulas. Most repeat cost comes from date ranges and overwritten cells, not exporting.

I’d only pay for a tool if it reliably removes more monthly cost than its fee.

@Jesse_G The two Finance exports are the right call. One thing about the third number though, since its the one going to a Steuerberater.

The ad spend figure in Ads Manager and Google Ads reporting is campaign spend, which is not the same as what youre invoiced. Billing thresholds mean a charge can straddle a month end, and the invoice can differ from the reported total for that period. Your accountant books the invoice, not the reporting number. So if youre pasting the campaign total onto a page they later reconcile against invoices, you build in a small discrepancy every month by design.

Take that number from the billing or invoices section instead. In Meta thats Billing and payments, in Google its Billing then Documents. Downloadable invoice, matches what your accountant will see, and it also carries whatever VAT treatment applies to you, which they will care about and campaign reporting doesnt show at all.

Second, and this saves you work rather than adding it. ROAS is not an accounting figure. Nothing in the books reconciles to it and your Steuerberater cannot do anything with it. Its a number for you. So it doesnt need to be on the page you send them, and it certainly doesnt need to tie to anything. If it went on there because it was asked for once, worth asking whether they actually use it.

Third, on the pasting itself. Both Meta and Google Ads will email you a scheduled report on a fixed day. Set both to arrive on the 1st and the manual step becomes two emails already sitting in your inbox when you start, rather than logging into two ad accounts and picking date ranges by hand. Picking date ranges is where the errors come from, as the post above says, so removing that is worth more than the couple of minutes it saves.

That gets you two Shopify exports, two invoices, and one sheet, with nothing typed from memory.

Hi there @Jesse_G
When it comes to the fiscal you run for a Shopify store, I’d keep it basic, you export Shopify’s sales & refund data, add your ad spend totals from each ad platform, then calculate ROAS on net sales after refunds. A spreadsheet is great for this as you can use one monthly template for consistency and then export it as a PDF for your Steuerberater. The trick is determining if the ROAS goes off the gross sales or net sales after refunds and being consistent in that calculation each month.

The timing mismatch is the interesting part for me. The merchant sees sales, payments, refunds and payouts that are individually correct, but still has to manually explain why the numbers do not agree at month-end.

I’m building VedaSuite around a related principle: instead of another dashboard, surface the exceptions that actually need investigation and show the evidence behind them.

For your monthly workflow, would it be more valuable to automatically flag only the unexplained differences — for example refunds from an earlier period, payout timing differences or unusually large adjustments — rather than generate the entire accounting pack?

Worth checking which date returns land on in your Total sales export, the original order date or the refund date. If it is the order date, exporting August again in October gives you a different net sales figure than the page you already sent, and you spend the call explaining a number that moved on its own.

Might be a good idea to freeze each month as a PDF on the day it goes out and treat that as the version of record.

Because this is a Steuerberater handoff rather than a management dashboard, I would freeze three layers separately:

  1. Source files: the two Shopify Finance exports plus Meta/Google billing invoices, each saved with its export date.
  2. One-page summary: net sales, refunds by refund date, fees/payouts and invoice-based ad spend. Keep ROAS clearly marked as a management metric, subject to your Steuerberater’s preference.
  3. Exception tab: original order month, refund month, payout month, amount difference and source file.

The useful control is not forcing every total to match when timing differs; it is giving every gap a reason and a source. Before automating anything, I would ask the Steuerberater one question: does the page need to reconcile to invoices/payouts, or only summarize store performance? That decides whether ROAS belongs there at all.

Which two Shopify Finance exports are you currently using?

Before changing creatives, I’d compare one fixed date range across Shopify and Meta:

  • Shopify paid orders
  • Meta Purchase events after deduplication
  • Refunds and cancellations
  • COGS, shipping subsidies and payment fees

Cheap CPC or a high ROAS can still hide poor contribution profit. The useful number is the break-even CPA for that specific product mix, not a universal ROAS target.

Which of these numbers is currently missing from your decision process?

The part that stands out to me is that your output is already very stable, one page with revenue, refunds, ad spend and ROAS, but the inputs still have to be stitched together manually every month.

That’s usually where I’d try to automate the workflow: keep the final report structure fixed, pull the new monthly data into the same structure, then review the result instead of rebuilding the page each time.

How long does that export → paste → calculate → PDF process usually take you each month?

Two things that made our Steuerberater handoff stable, since you’re in DACH:

  1. Send the order export, not the Analytics page. Orders → Export → CSV for the month gives one row per order with tax per rate, shipping, discounts,
    country and payment gateway. That’s what an accountant can actually post from; the Total sales report is a summary and can’t be booked.

  2. Refunds move. The order export only shows the refunded amount, not the refund date, so a refund from July on an August export shifts your numbers.
    If your Steuerberater works in DATEV, the Shopify Payments transactions export (Finance → Payouts → Transactions) carries the real refund dates and the
    fees, which the order export doesn’t have.

Ad spend never comes out of Shopify; that stays a pasted line from the ad invoices.

(Disclosure and shameless plug: I built buchungsstapel.de, which turns that order export into a DATEV posting batch for German accountants. Not needed for the two points above.)