Revenue reporting, order export, and ops intelligence (cohorts, fulfillment SLA, low-stock trigger) for merchants running Commerce on Birkly.
The Dashboard tab (Commerce default landing) shows revenue, order count, AOV, new vs returning customers, first-order cohorts, needs-shipping / SLA breaches, average fulfillment time, top products, and affiliate attribution. Export paid orders to CSV. An optional dashboard widget surfaces last-30-day revenue on the Birkly admin home page. Commerce 1.0.29 (P3-M4) adds the ops intelligence fields and the commerce_low_stock automation trigger.
Beginner
View metrics
- Open Commerce → Dashboard (opens by default when you enter Commerce).
- Review summary cards: order count, revenue, refunds, AOV, new / returning customers, needs shipping, SLA breaches, avg fulfillment hours.
- Scroll to Customer cohorts, Top products, and Affiliates.
- Click Refresh to reload.
Fulfillment SLA
- Open Commerce → Settings → General.
- Set Fulfillment SLA (hours) (default 48).
- Paid ship orders with remaining unshipped quantity older than this count as SLA breaches on the Dashboard.
Low stock alerts
- On Inventory rows, set a low stock threshold per SKU.
- When available stock hits or goes below the threshold, Commerce fires
commerce_low_stockonce per SKU (debounced until stock recovers above the threshold). - Import the Low stock alert recipe under Automation → Recipe pack, or wire your own workflow on that trigger.
Export orders
- On the Dashboard, click Export Orders CSV.
- Your browser downloads a CSV with order id, status, date, customer email, totals, and affiliate id.
Admin home widget (optional)
- Open Commerce → Settings.
- Enable Enable dashboard widget.
- Select which roles see the widget (Admin, Editor, etc.).
- Save settings.
Advanced Users
CommerceAnalyticsService
Aggregates from CommerceOrderStore — paid, partially refunded, and refunded orders count toward revenue (net of refunds).
Summary payload (P3 ops intelligence fields included):
{
"order_count": 42,
"revenue_cents": 125000,
"refunded_cents": 3500,
"aov_cents": 2976,
"new_customers": 12,
"returning_customers": 8,
"cohorts": [{ "period": "2026-07", "customers": 5, "orders": 7, "revenue_cents": 21000 }],
"cohort_period": "month",
"needs_shipping_count": 3,
"avg_fulfillment_hours": 26.5,
"sla_breach_count": 1,
"fulfillment_sla_hours": 48,
"top_products": [{ "key": "products:coffee-250g", "title": "...", "quantity": 10, "revenue_cents": 14990 }],
"affiliates": [{ "affiliate_id": "partner-a", "orders": 5, "revenue_cents": 22000 }]
}
Settings
| Key | Default | Notes |
|---|---|---|
commerce_fulfillment_sla_hours | 48 | Paid ship orders with remaining qty older than this → sla_breach_count |
Low-stock trigger
| Trigger | Payload |
|---|---|
commerce_low_stock | { sku, on_hand, reserved, available, threshold } |
Implemented by CommerceLowStockService — fires once per SKU until available recovers above threshold.
API
| Action | Params | Response |
|---|---|---|
analytics_summary | from, to (optional ISO dates) | Summary JSON |
analytics_export_csv | from, to | text/csv download |
Requires view_commerce_stats (or legacy view_payment_stats).
Top products key
{collection_slug}:{entry_id} from order line snapshots at checkout time.
Out of scope (v1)
- External BI connectors (Metabase, Looker)
- Real-time charts beyond summary tables
- Subscription MRR separate from order revenue (use Subscriptions tab + order export)