realvco Docs

Daily Reports

Every morning, a tidy business summary is waiting for you in your messaging app. That’s daily report automation — Rose collects data, spots trends, and formats the result for quick reading.


Scenario

Where This Fits

ScenarioReport Contents
E-commerceYesterday’s revenue, order count, top sellers
App operationsActive users, signups, retention
WebsitePageviews, top pages, traffic sources
FinanceRevenue / expense, cash flow, receivables
MarketingAd performance, conversion rate, ROI

Expected Results

  • Save time — no more manual logins to platforms
  • Real-time insight — know the score first thing in the morning
  • Faster decisions — consolidated numbers reveal trends
  • Read anywhere — delivered to your phone

Data Source Integration

Common Sources

SourceAccessDifficulty
Google AnalyticsAPIMedium
DatabaseSQL queryHigh
SpreadsheetsGoogle Sheets APIMedium
Third-party platformsREST APIHigh
CSV / JSON filesFile readsLow

Data Flow

┌──────────────┐    ┌──────────────┐    ┌──────────────┐
│   Sources    │ →  │   Collect    │ →  │   Process    │
├──────────────┤    ├──────────────┤    ├──────────────┤
│ • GA4        │    │              │    │              │
│ • Database   │    │ Rose runs    │    │ • Aggregate  │
│ • APIs       │    │ queries and  │    │ • Compute    │
│ • Files      │    │ API calls    │    │ • Analyze    │
└──────────────┘    └──────────────┘    └──────┬───────┘


                                        ┌──────────────┐
                                        │   Produce    │
                                        ├──────────────┤
                                        │ • Format     │
                                        │ • Chart      │
                                        │ • Deliver    │
                                        └──────────────┘

Report Layout

Basic Structure

{`# 📊 Daily Business Report
**Date:** 2026-03-21
**Generated at:** 08:00

---

## 📈 Core Metrics

| Metric | Yesterday | Day Before | Change |
|--------|-----------|------------|--------|
| Revenue | $50,000 | $45,000 | +11% 🟢 |
| Orders | 120 | 110 | +9% 🟢 |
| AOV | $417 | $409 | +2% 🟢 |
| Visitors | 2,500 | 2,800 | -11% 🔴 |

---

## 🏆 Highlights

- Revenue hit a weekly high
- New product "XXX" performed strongly (30 units sold)

---

## ⚠️ Watch List

- Visitors down 11% — review traffic sources
- Cart abandonment ran a bit high (65%)

---

## 📋 Today's Action Items

- [ ] Follow up on unfinished orders from yesterday
- [ ] Check inventory levels
- [ ] Reply to customer feedback

---

💡 *This report was generated by Rose.*`}

Design Principles

PrincipleDescriptionExample
Lead with the pointMost important numbers on topCore metrics table
Clear comparisonsShow yesterday and last week% change + color coding
VisualUse emojis and tables🟢 up 🔴 down
Action-orientedSuggest next stepsToday’s action items

Auto-Delivery

Cron Scheduling

{`# Generate and send the daily report at 8 AM
0 8 * * * cd /home/node/.openclaw/workspace && node scripts/daily-report.js

# Send the weekly report Monday at 8 AM
0 8 * * 1 cd /home/node/.openclaw/workspace && node scripts/weekly-report.js

# Send the monthly report on the 1st at 8 AM
0 8 1 * * cd /home/node/.openclaw/workspace && node scripts/monthly-report.js`}

Report Script Example

{`// Daily report generator

const { getGA4Data } = require('./apis/google-analytics');
const { queryDatabase } = require('./apis/database');
const { sendTelegramMessage } = require('./apis/telegram');

async function generateDailyReport() {
  const today = new Date();
  const yesterday = new Date(today);
  yesterday.setDate(yesterday.getDate() - 1);

  // Collect data
  const [gaData, orderData] = await Promise.all([
    getGA4Data(yesterday),
    queryDatabase('
      SELECT COUNT(*) as orders, SUM(total) as revenue
      FROM orders
      WHERE DATE(created_at) = DATE(?)
    ', [yesterday])
  ]);

  // Calculate change
  const prevDayData = await getPrevDayData(yesterday);
  const changes = calculateChanges(orderData, prevDayData);

  // Build the report
  const report = formatReport({
    date: formatDate(yesterday),
    revenue: orderData.revenue,
    orders: orderData.orders,
    visitors: gaData.activeUsers,
    changes: changes
  });

  // Send it
  await sendTelegramMessage({
    chat_id: process.env.ADMIN_CHAT_ID,
    text: report,
    parse_mode: 'Markdown'
  });

  console.log('✅ Report sent');
}

generateDailyReport().catch(console.error);`}

Heartbeat Checks

{`# Heartbeat Tasks

## Daily Report Health Check

Time: 08:00 daily
Tasks:
1. Confirm the report sent successfully
2. Check that data is complete
3. Notify the admin of any issues

## Data Source Health Check

Time: 06:00 daily
Tasks:
1. Check GA4 API connectivity
2. Check database connectivity
3. Check spreadsheet permissions
4. Log the results`}

Advanced

Multi-Platform Reports

{`# 📊 Full-Platform Daily Report

## 🛒 E-commerce Platforms
| Platform | Revenue | Orders | Status |
|----------|---------|--------|--------|
| Website | $30,000 | 75 | 🟢 |
| Marketplace A | $15,000 | 35 | 🟢 |
| Marketplace B | $5,000 | 10 | 🟡 |

## 📱 Social
| Platform | Followers | Engagement | New posts |
|----------|-----------|------------|-----------|
| FB | 5,200 | 3.2% | 2 |
| IG | 3,800 | 4.1% | 3 |
| LINE | 2,100 | 12% | 1 |

## 📧 Newsletter
- Sent: 1,500
- Open rate: 25%
- Click rate: 3.5%

Total: revenue $50,000 | orders 120 | visitors 2,500`}

Anomaly Alerts

{`# Anomaly detection

alerts:
  revenue_drop:
    condition: "revenue < yesterday_revenue * 0.7"
    message: "🚨 Revenue dropped more than 30% vs yesterday"
    priority: high

  order_spike:
    condition: "orders > avg_orders * 2"
    message: "📈 Order spike — confirm stock levels"
    priority: medium

  zero_sales:
    condition: "revenue == 0"
    message: "⚠️ No sales today — check the system"
    priority: high

  traffic_drop:
    condition: "visitors < yesterday_visitors * 0.5"
    message: "🔴 Traffic collapse — check the site"
    priority: high`}

Report Archive

{`#!/bin/bash
# Report archive script

REPORT_DIR="/reports/daily"
ARCHIVE_DIR="/reports/archive"
DATE=$(date +%Y%m%d)

# Month directory
MONTH_DIR="$ARCHIVE_DIR/$(date +%Y-%m)"
mkdir -p "$MONTH_DIR"

# Move reports older than 30 days into archive
find "$REPORT_DIR" -name "report-*.md" -mtime +30 -exec mv {} "$MONTH_DIR/" \;

# Drop archives older than 90 days
find "$ARCHIVE_DIR" -name "*.tar.gz" -mtime +90 -delete

# On the 1st, compress last month's archive
if [ "$(date +%d)" == "01" ]; then
    LAST_MONTH="$(date -d 'last month' +%Y-%m)"
    tar -czf "$ARCHIVE_DIR/$LAST_MONTH.tar.gz" -C "$ARCHIVE_DIR" "$LAST_MONTH/"
    rm -rf "$ARCHIVE_DIR/$LAST_MONTH/"
fi

echo "✅ Report archived"`}

FAQ

What If the Numbers Are Wrong?

  1. Check data source API permissions
  2. Confirm timezone settings
  3. Cross-check against raw data
  4. Add data validation

Can I Change the Report Time?

Yes — edit the cron schedule:

  • 8 AM: 0 8 * * *
  • 6 PM: 0 18 * * *
  • Every 4 hours: 0 */4 * * *

Can I Shorten the Report?

Yes — enable summary mode:

  • Show only core metrics
  • Include details only when abnormal
  • Provide a “view full report” link

Summary

Daily reports give you the full picture first thing in the morning:

  • Data integration — connect APIs, auto-collect
  • Visual presentation — tables, emojis, color-coded
  • Auto delivery — cron-scheduled, in your messages
  • Smart alerts — auto-notify on anomalies