Skip to main content
Independent community resource — not affiliated with the official OpenClaw project. Learn more
Part 5 of 5OpenClaw for E-commerce

Sales Reporting & Forecasting with OpenClaw

What you can report on

Revenue data is only useful if it reaches you in a digestible form, at the right time, with context and comparisons. OpenClaw automates the assembly of daily, weekly, and monthly reports so you can spot trends, identify winners and losers, and track progress against targets — without logging into your e-commerce dashboard.

Daily revenue brief

Yesterday's orders, revenue, AOV, units sold — delivered every morning with comparisons to last week and last year.

Weekly comparative report

This week vs last week vs same week last year, with percentage deltas and trend indicators.

Best & worst performers

Top and bottom products by revenue and units sold, ranked and segmented by category if available.

Revenue vs target tracking

Track cumulative revenue against your monthly or weekly target, calculate pacing, and alert if you're falling behind.

Slow mover alerts

Products whose sales velocity is declining week over week — different from dead stock, these are selling but losing momentum.

Seasonal trend detection

Flag when you're ahead of or behind last year's seasonal curve, with context on why.

Daily revenue summary agent

The simplest and most impactful report: yesterday's summary with key metrics and comparisons. Run this every morning and you'll spot anomalies before they cascade.

# AGENTS.md — daily-reporter agent

agents:
  daily-reporter:
    description: "Summarize yesterday's sales with key metrics and YoY/WoW comparisons"
    tools:
      - shopify-admin-api   # or woocommerce-api
    config:
      platform: shopify     # or: woocommerce
      credentials:
        store: "${SHOPIFY_STORE}"
        token: "${SHOPIFY_TOKEN}"
      date_range: yesterday
      metrics:
        - order_count
        - gross_revenue
        - net_revenue        # after discounts
        - avg_order_value
        - units_sold
        - new_customers_count
        - returning_customers_count
      comparisons:
        - same_day_last_week
        - same_day_last_year
      top_products_n: 3
      top_by: [revenue, units_sold]
    output:
      format: markdown
      include_summary: true
      include_top_products: true
      sort_by: revenue

For WooCommerce, use the /wp-json/wc/v3/reports/sales endpoint, which aggregates sales data by date. You can filter by date range and break down by product or category.

Weekly comparative report

A week-over-week comparison contextualises today's performance. Is this week strong because of a campaign, or weak because of seasonality? The weekly report answers that.

# AGENTS.md — weekly-reporter agent

agents:
  weekly-reporter:
    description: "Comparative analysis: this week vs last week vs same week last year"
    tools:
      - shopify-admin-api
    config:
      platform: shopify
      credentials:
        store: "${SHOPIFY_STORE}"
        token: "${SHOPIFY_TOKEN}"
      date_range: last_7_days
      comparison_periods: [previous_7_days, same_7_days_last_year]
      metrics:
        - revenue
        - orders
        - avg_order_value
        - units_sold
        - new_customers
        - returning_customers
      top_products_n: 10
    output:
      format: markdown_table
      columns: [metric, this_week, last_week, delta_pct, last_year, yoy_delta_pct]
      include_trend_arrows: true  # ▲ / ▼ indicators
      sort_by: revenue
💡 Conversion data: Shopify Analytics requires a different endpoint than Admin API. For conversion rates, session counts, and bounce rates, you'll need to integrate with Google Analytics Data API (GA4) or use Shopify's GraphQL API with the analytics scope enabled.

Best and worst performers

Which products are carrying the business? Which are dragging? The best/worst finder ranks products by revenue, units sold, and profit margin so you know where to double down and where to cut.

# AGENTS.md — best-worst-finder agent

agents:
  best-worst-finder:
    description: "Identify best and worst performing products by revenue and units"
    tools:
      - shopify-admin-api
    config:
      platform: shopify
      credentials:
        store: "${SHOPIFY_STORE}"
        token: "${SHOPIFY_TOKEN}"
      date_range: last_30_days
      metrics: [revenue, units_sold, margin]
      top_n: 10              # top 10 best and worst
      segment_by: category   # optional: break down by product tag or collection
    output:
      format: markdown_table
      columns: [rank, sku, product_title, revenue, units_sold, margin_pct]
      include_best: true
      include_worst: true
      sort_by: revenue

Revenue vs target tracking

Tracking progress against a target keeps the team aligned. The pacing alert calculates whether you're on track for your monthly goal, and surfaces a warning if you fall behind early in the month.

# AGENTS.md — revenue-vs-target agent

agents:
  revenue-vs-target:
    description: "Calculate cumulative revenue pacing against monthly target"
    tools:
      - shopify-admin-api
      - file-reader           # reads targets.json
    config:
      platform: shopify
      credentials:
        store: "${SHOPIFY_STORE}"
        token: "${SHOPIFY_TOKEN}"
      targets_file: "targets.json"  # format: {"monthly_target": 90000, "weekly_target": 20000}
      date_range: month_to_date
    output:
      format: markdown
      include_fields:
        - revenue_to_date
        - target_amount
        - pacing_percentage
        - projected_month_end
        - pace_category        # "on_track" / "ahead" / "behind"
      alert_threshold: 85     # alert if pacing drops below 85% by day 15

The pacing calculation is simple but powerful: pacing = (revenue_to_date / (days_elapsed / days_in_month)) / target. If you're on day 12 of 31 and have done 30% of your target revenue, you're at 100% pacing. If you've only done 25%, you're at 81% pacing and should be alerted.

Slow mover identification

Different from dead stock (which doesn't sell at all), slow movers are products that ARE selling but whose sales velocity is declining. Catch these early and you can adjust marketing or pricing before the product becomes dead stock.

# AGENTS.md — slow-mover-finder agent

agents:
  slow-mover-finder:
    description: "Identify products whose sales velocity is declining week over week"
    tools:
      - shopify-admin-api
    config:
      platform: shopify
      credentials:
        store: "${SHOPIFY_STORE}"
        token: "${SHOPIFY_TOKEN}"
      current_window_days: 14       # sales in last 14 days
      prior_window_days: 14         # 15-28 days ago
      velocity_decline_threshold: -25  # flag if velocity drops >25%
      min_absolute_sales: 5         # only flag products with >5 units in current window
    output:
      format: markdown_table
      columns: [sku, product_title, current_velocity, prior_velocity, velocity_change_pct, revenue_trend]
      sort_by: revenue_trend        # highest revenue first (high-value declines matter more)
      include_summary: true
📍 Ranking by impact: A 30% decline on a £2,000/week product is worth more attention than a 40% decline on a £100/week product. Sort slow movers by absolute revenue lost, not percentage decline.

Seasonal trend detection

E-commerce is seasonal. The tool that matters most is knowing whether your current performance matches historical patterns. A week that looks weak might actually be strong if it's typically your slowest week of the year.

# AGENTS.md — seasonal-trend-finder agent

agents:
  seasonal-trend-finder:
    description: "Compare current week's performance to same period last year and seasonal index"
    tools:
      - shopify-admin-api
      - file-reader             # reads seasonal_index.json
    config:
      platform: shopify
      credentials:
        store: "${SHOPIFY_STORE}"
        token: "${SHOPIFY_TOKEN}"
      seasonal_index_file: "seasonal_index.json"  # format: {"week_12": 1.15, "week_13": 0.92}
      date_range: current_week
      comparison_year_offset: 52 weeks
    output:
      format: markdown
      include_fields:
        - current_week_revenue
        - same_week_last_year
        - yoy_growth_pct
        - expected_seasonal_index
        - ahead_behind_baseline
      include_alert: true

The seasonal index is user-configurable. If you don't have historical data yet, use a flat baseline (every week = 100%) and build the index as data accumulates. Common patterns: holidays spike in November/December, summer slows in August, Easter affects March/April depending on the calendar.

HEARTBEAT.md templates

Daily morning brief

# HEARTBEAT.md — daily revenue brief

schedule:
  - name: "Daily Morning Brief"
    cron: "0 7 * * *"           # every day at 7 AM
    agents:
      - daily-reporter
    output:
      file: "daily_brief.md"
      notify: true
    prompt: |
      Generate a brief morning summary of yesterday's sales.
      Include: order count, revenue (gross and net), AOV, units sold,
      new vs returning customers, and the top 3 products by revenue.
      Compare to: same day last week (% delta), same day last year (% delta).
      Format for quick scanning. If performance is >10% down vs last week, flag it.

Weekly performance report

# HEARTBEAT.md — weekly performance

schedule:
  - name: "Weekly Performance Report"
    cron: "0 7 * * 1"           # Monday at 7 AM
    agents:
      - weekly-reporter
      - best-worst-finder
      - slow-mover-finder
    output:
      file: "weekly_report.md"
      notify: true
    prompt: |
      Combine three reports into a weekly overview:
      1. Weekly comparison: this week vs last week vs same week last year
      2. Best 10 products by revenue and units sold
      3. Slow movers: products with >25% velocity decline
      Include a one-line summary at the top: "Week pacing:" or "Week strength:"

Monthly pacing alert

# HEARTBEAT.md — monthly pacing alert

schedule:
  - name: "Monthly Pacing Check"
    cron: "0 9 15 * *"          # 15th of month at 9 AM
    agents:
      - revenue-vs-target
    output:
      file: "pacing_alert.md"
      notify: true
    prompt: |
      On the 15th of each month, report pacing towards the monthly target.
      Format: "Day 15 of 31: £[revenue_to_date] of £[target] — [pacing]%"
      If pacing < 85%, issue an alert: "⚠️  Behind pace. Projected month-end: £[projected]"
      Otherwise, output: "✓ On pace for £[projected] at month-end"

What the daily report looks like

━━ Morning Brief — 25 Mar 2026 ━━
📊 Yesterday's Summary
· Orders: 63 ▲12% vs last week
· Revenue: £5,240 ▲12% vs last week
· AOV: £83.17 (↔ flat vs last week)
· Units: 156 ▲8% vs last week
· New customers: 18 ▲15% vs last week

🏆 Top Products
· 1. Embroidered Hoodie — Sage: £1,240 (28 units)
· 2. Classic Tee — White: £684 (38 units)
· 3. Canvas Tote — Natural: £412 (16 units)

📉 SLOW MOVER ALERT
· Crew Neck Sweatshirt — Black: 4 units yesterday (-32% vs prev week)

💰 Month Pacing
· Day 11 of 31 — £32,100 / £90,000 target
· On pace for £88,000 (98% of target)

Frequently asked questions

Can OpenClaw connect to Shopify Analytics or Google Analytics?

Shopify order data via Admin API covers the core sales metrics (orders, revenue, average order value). For full analytics including sessions, traffic, and conversion rates, use the Google Analytics Data API (GA4) — OpenClaw can connect to this with a service account credentials file. This is essential if you want conversion rate trends or traffic-to-revenue correlation.

Can OpenClaw send the daily report to Slack or email?

OpenClaw can write the report to a file or trigger a webhook. Sending to Slack requires configuring a Slack incoming webhook URL in your agent config and calling the webhook-post tool. Email sending requires an SMTP tool or an email API like Resend or SendGrid integrated into your OpenClaw environment.

How do I set revenue targets in OpenClaw?

Create a targets.json file in your project root with the format: {"monthly_target": 90000, "weekly_target": 20000}. The revenue-vs-target agent reads this file and calculates pacing. You can also pass targets as environment variables: MONTHLY_TARGET=90000 and reference them in your config with ${MONTHLY_TARGET}.

Does OpenClaw calculate profit or just revenue?

By default, OpenClaw reports revenue (from order totals). Profit calculation requires your cost-of-goods data, which Shopify stores at the variant level. To enable cost tracking, add read_products scope to your API token and the reporting agent can pull cost prices and calculate gross margin per product. WooCommerce stores cost in the product metafield; ensure your WooCommerce API key has product read access.