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
| Scenario | Report Contents |
|---|---|
| E-commerce | Yesterday’s revenue, order count, top sellers |
| App operations | Active users, signups, retention |
| Website | Pageviews, top pages, traffic sources |
| Finance | Revenue / expense, cash flow, receivables |
| Marketing | Ad 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
| Source | Access | Difficulty |
|---|---|---|
| Google Analytics | API | Medium |
| Database | SQL query | High |
| Spreadsheets | Google Sheets API | Medium |
| Third-party platforms | REST API | High |
| CSV / JSON files | File reads | Low |
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
| Principle | Description | Example |
|---|---|---|
| Lead with the point | Most important numbers on top | Core metrics table |
| Clear comparisons | Show yesterday and last week | % change + color coding |
| Visual | Use emojis and tables | 🟢 up 🔴 down |
| Action-oriented | Suggest next steps | Today’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?
- Check data source API permissions
- Confirm timezone settings
- Cross-check against raw data
- 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