At a glance
Day-by-day revenue (SUM(grand_total)) over the last 90 days. The headline time-series card. Plotted with a 7-day moving average overlay to smooth weekly seasonality and a year-over-year overlay for stores with sufficient history.
| What it counts | For each day in the 90-day window: SUM(grand_total) over orders created in that day. |
| API field | grand_total, created_at from the orders index. Adobe Commerce REST: GET /rest/V1/orders. |
| VAT / tax treatment | Tax-inclusive (grand_total). Toggle to net-of-tax via grand_total - tax_amount for VAT-net revenue. |
| Shipping inclusion | Included (in grand_total). |
| Discounts | Already deducted, post-promotion paid revenue. |
| Cancelled orders | Included by default (matches Total Revenue). Toggle to exclude for “captured-only” view. |
| Refunds | Not subtracted, the card is creation-time. For net-of-refund revenue, subtract Credit Memo grand_total from Refunds Over Time. |
| Currency | Mixed-currency display by default (visual-shape friendly). base_grand_total for FX-neutral. |
| Multi-store scope | All Store Views by default. Per-Store-View slicing exposes regional patterns. |
| Time window | 90D rolling. Configurable to 30D, 180D, 365D. |
| Alert trigger | None on this card directly. The hourly canary is on Revenue Drop Alert. |
| Sentiment key | revenue_trend |
| Roles | owner, marketing |
Calculation
Worked example
A B2B+DTC homewares merchant on Adobe Commerce 2.4.7. UK base, GBP. Snapshot 13 May 26, 90-day rolling. Aggregate stats:| Metric | Value |
|---|---|
| Days | 90 |
| Total revenue | £2,840,000 |
| Mean revenue / day | £31,556 |
| Median revenue / day | £30,200 |
| Min day (Sun 7 Apr 26) | £8,400 |
| Max day (Mon 14 Apr 26, post-Easter) | £52,800 |
| Standard deviation | £8,200 |
| Date | Revenue | What happened |
|---|---|---|
| 24 Feb 26 | £48,200 | flash sale (SPRING25 launched), +52% vs Tue median |
| 14 Mar 26 | £18,200 | -42% vs Sat median; storefront 502 outage at 11:00 GMT |
| 14 Apr 26 | £52,800 | post-Easter Monday catch-up |
| 28 Apr to 5 May 26 | £19k-£24k/day | sustained dip; supplier sizing PR crisis |
| 6 May 26 onwards | recovery | merchant’s PR response landed |
- Mean ≈ median (£31,556 vs £30,200). Distribution roughly symmetric over the 90 days. Mean would be much higher than median if a single huge promotion dominated; here it’s balanced.
- The 14 Mar 502 outage is the canary; cross-link with Revenue Drop Alert which fired at 11:00. £18,200 day vs £30,200 median = £12,000 lost. Recovery the following day was complete.
- The 28 Apr to 5 May sustained dip is the most concerning. Eight days below the 7-day moving average, with the average itself trending down. £19k average per day vs £30k median = £88,000 cumulative shortfall over the 8 days. Cross-link with Refunds Over Time for the parallel uniform-line return wave. Recovery began 6 May after the merchant’s PR team posted corrections.
- Compare to Orders Over Time: order count dropped less proportionally during the 28 Apr-5 May dip (~12% drop in orders vs 35% drop in revenue). That means AOV dropped during the dip, customers were cautious, ordering low-value test purchases rather than full baskets. Healthy sign that demand wasn’t lost; just AOV.
- YoY overlay: when 365-day data is available, year-over-year overlay reveals seasonality (Black Friday peak, January post-Christmas dip). The card supports the overlay automatically once history exists.
- Cancelled orders included. The card includes ~1-3% canceled revenue. Toggle to exclude for true cash-flow signal; minor difference but matters for finance.
Sibling cards merchants should reference together
| Card | Why pair it with Revenue Over Time |
|---|---|
| Total Revenue | Aggregate of this card. |
| Orders Over Time | Order count companion; AOV diagnoses divergence. |
| Revenue by Day of Week | The DOW pattern this card displays. |
| Refunds Over Time | Subtracted view for net revenue. |
| Revenue Drop Alert | Real-time canary; this is the historical context. |
| AOV | Per-order average; complements daily revenue. |
| Customer Trend | Customer count over time; pair to disentangle AOV vs traffic. |
shopify.revenue_over_time | Cross-platform peer. |
google_analytics.ga_revenue_trend | GA4 traffic-attributed revenue; usually 10-25% lower due to tracking gaps. |
Reconciling against the vendor’s own dashboard
Where to look in Adobe Commerce Admin:Reports > Sales > Orders with “Show By” set to “Day”, date range matching this card. The chart and revenue column should approximately match.
Dashboard > Sales > Revenue Chart is a built-in chart on the Admin dashboard. Limited to 30 days and uses base currency. Useful for sanity-checking the most-recent month.Why our number may legitimately differ from Adobe Commerce Admin:
| Reason | Direction of divergence |
|---|---|
Currency. Admin uses base_grand_total; this card defaults to mixed grand_total. | Material for multi-currency stores |
Reports indexer lag. Reports use the nightly sales_order_aggregated_* tables. | Vortex IQ ahead by ~12-24h on most-recent day |
| Status filter. Reports default to “Any”. Match unless overridden. | Standard |
| Cancelled inclusion. Card includes by default; Admin Reports include depending on filter. | None expected |
| Time-zone. UTC vs Store View locale. | ±1 day at edges |
| Sync lag. 5-15 min. | Standard |
| Card | Expected relationship | What divergence tells you |
|---|---|---|
google_analytics.ga_revenue_trend | GA4 daily revenue ≈ this card × (1 − tracking gap, typically 10-25%) | Persistent <70% means tracking is broken or consent is blocking events. Look at GA4’s [Realtime] view to confirm. |
stripe.stripe_charge_volume_over_time | Stripe daily volume ≤ this card | Gap = orders paid via PayPal, Authorize.Net, manual transfer + orders in pending_payment/canceled that never hit Stripe. |
| Bank deposit per day (manual) | Lags this card by 1-3 days (capture-to-deposit) | Deposit shape should mirror this card’s shape with a 1-3 day delay. |
Known limitations / merchant FAQs
Why does today’s last data point look low? Because today is incomplete. The trailing point is in-progress; mentally exclude or wait for the day to close. Why is mixed-currency the default? For trend visualisation, mixed-currency works because the shape doesn’t depend on FX. For absolute reconciliation against finance, switch tobase_grand_total (FX-converted to store base currency at order time).
My multi-store revenue per Store View doesn’t sum to the headline, why?
Currency mixing is the most common cause. Switch to base currency for both views. Otherwise: orders without an assigned Store View (rare), or sync-lag making the per-Store-View totals slightly out of sync with the combined.
Cancelled orders are included by default. Why?
For the headline trend, cancelled orders represent demand that almost-converted; including them gives a fuller customer-intent picture. For “actual cash received” view, exclude cancelled. The sentiment trend uses the included version.
A long horizontal line near zero, what’s that?
Either an outage that wiped a day, or a Store View was disabled for that period. Cross-check against deployment logs and the Order State Distribution for that day.
Why doesn’t Stripe agree?
Stripe is a subset (Stripe-paid orders only). PayPal, Authorize.Net, manual bank transfer revenue is in this card but not in Stripe. Sum (Stripe + PayPal + manual) should approximately match this card.
Year-over-year overlay isn’t showing, why?
Need at least 365 days of order history. The card auto-disables YoY if data is shorter than that.
Net-of-tax view, when do I use it?
For Finance dashboards reconciling to GL revenue lines (which are net of VAT). For marketing dashboards (gross is the impressed-on-customer figure), keep the default.
Net-of-refund view, when?
For finance “true cash” dashboards. The Vortex IQ workspace can compute net-of-refund automatically when Refunds Over Time is on the same dashboard.
Why does my Black Friday spike not appear?
Either the 90-day window doesn’t reach back to Black Friday, or you toggled off the year-over-year overlay. Extend the window to 180D or 365D.