# Automated HTML Report Delivery on a Schedule | Comma Routines

Canonical: https://commareports.com/features/routines/scheduled-html-reports

> Stop maintaining a Python script that emails the weekly report. Comma routines re-run an underlying skill on a cron and post the refreshed HTML as a revision on a commentable, shareable document.

# Automated HTML report delivery, refreshed in place

You have a recurring report. Maybe it's a weekly analytics digest, a daily
ops summary, a monthly board update. Today it's a Python script that emails a
PDF, a Slack message with a screenshot, or a cron job nobody owns. Tomorrow,
it's a routine.

## The job

Take a report you currently send by hand (or by brittle script). Move it
onto a hosted schedule. Make the new revision land in a place your team
actually opens — a document, with comments, with history — not a Slack
channel that goes unread.

That's what scheduled HTML reports look like as a Comma routine.

## Why HTML, not PDF or email

PDFs lose the link between the report and the conversation around it. Email
attachments lose version control. Screenshots in Slack scatter feedback
across threads.

HTML, rendered as a document with anchored comments, is the format that
keeps the report and the discussion in one place. When the routine fires
again next week, the next revision lands on the same document. Comments
from last week persist. The team sees a diff, not a fresh inbox.

## What replaces what

| What you have now                              | What the routine replaces                                 |
| ---------------------------------------------- | --------------------------------------------------------- |
| Python script + crontab on a laptop            | Comma-hosted schedule, no laptop                          |
| GitHub Action emailing the team                | Routine posting a new revision on a Comma report          |
| Slack screenshot every Monday                  | Same shareable link with a new revision and live comments |
| PDF attachment with version-number-in-filename | Revision history on one canonical artifact                |
| "Hey can you re-run the report?"               | The schedule already did                                  |

## Three patterns

### 1. Replace the Monday morning script

You have a script that runs by hand every Monday. The output gets pasted
into a Notion page, a Slack channel, or a Google Doc. Feedback gets lost.

Wrap the script as a skill. Wire it as a daily or weekly routine. The HTML
posts to a Comma report. Reviewers comment in-place. Next week's revision
lands at the same URL.

### 2. Replace the email-to-the-team digest

You have a service that emails a digest every morning. People stop reading
it after week three.

Replace the email rail with a routine that posts the new HTML revision on
a Comma report. Subscribers get a notification with a link, not an attachment.
The diff between this revision and yesterday's is visible in the report
itself.

### 3. Replace the "I'll just rerun it later" workflow

You have a notebook or dashboard you re-run by hand when someone asks. There
is no schedule. Sometimes it's stale; sometimes it's twelve days old.

Wire it to a routine on a cadence that matches the underlying data refresh.
The team gets the same link they had before. The artifact is current.

## What you give Comma

- **A skill.** The Markdown instruction-set for how to regenerate the
  report. The skill can call your warehouse, your eval harness, your
  internal API, or just produce an HTML report from a prompt.
- **A target report.** Either a new placeholder, or an existing report where
  the routine should append revisions.
- **A cadence.** Monthly, daily, hourly, or sub-hourly — any cadence, on any
  plan.
- **A compute source.** Bring your own Bedrock key (free on Comma) or draw
  down prepaid credit; set an optional per-run spend limit.

## What Comma handles

- The cron schedule.
- The skill execution against AWS Bedrock.
- The cost cap.
- The scoped credential.
- The posting of the new HTML as a revision.
- The notification to reviewers.
- The run history and audit trail.

## Cadence

Any cadence works on any plan — pick the one that matches the underlying
data refresh.

| Cadence    | Use case shape                              |
| ---------- | ------------------------------------------- |
| Monthly    | Monthly check-ins, retros, board prep       |
| Daily      | Daily eval, daily ops summary, daily digest |
| Hourly     | On-call dashboards, refresh-on-tick reports |
| Sub-hourly | Tight refresh loops; needs retries + dedupe |

## Anatomy of a scheduled report routine

```
Routine:
  report:       rpt_weekly_analytics
  skill:        analytics-monday-digest.md
  cadence:      weekly (Monday 09:00 UTC)
  cost cap:     $2.00 per run
  notify:       weekly-digest@team
  rail:         prepaid credit | BYOK (any plan)
```

Run output: a fresh HTML report, posted as revision N+1 on
`rpt_weekly_analytics`. Anchored comments from revision N persist. Diff
against the previous revision is one click.

## The honest scope

Routines are good at:

- Re-running a focused, well-defined skill.
- Posting the output to a Comma report.
- Capping the cost.
- Surviving as part of an ops rotation without anyone babysitting it.

Routines are not for:

- Multi-hour pipelines. Use a real orchestrator.
- Side-effects beyond Comma. Routines post to a report. They are not a
  general-purpose cron.
- Warehousing your data. The skill fetches what it needs at run time.

If your need fits in "a focused script that produces an HTML report on a
cadence," routines fit. If it doesn't, they won't pretend to.

## Try it

The shape is identical at every cadence. Start with the actual script you'd
run by hand, on whatever cadence fits. The next time you'd have run it, the
routine will already have.

**[Create your first routine →](https://commareports.com/)**

### Related

- [Routines — full feature reference](/features/routines)
- [Run a Claude skill on a schedule](/features/routines/run-claude-skill-on-schedule)
- [Weekly analytics digest, refreshed in place](/features/routines/weekly-analytics-digest)
- [Hosted cron for AI agents](/features/routines/cron-for-ai-agents)
