Joe Archondis

July 4, 2026 · 9 min read

Business AI Automation

AI Morning Digest: Replacing Manual Business Reporting

AI Morning Digest: Replacing Manual Business Reporting

The Shawar'Mama owner used to start every morning the same way. Open Zelty, check yesterday's revenue across 6 locations. Open Deliverect, check delivery numbers. Open Google Business Profile, scan for new reviews. Three apps, 15 to 20 minutes, before service started. Just to answer one question: how did yesterday go?

Now he reads one Telegram message at 8 AM. It takes 45 seconds. Then he puts his phone down and runs his business.

I built that system. Here's what it does, why it works, and how to replicate it.

The Hidden Cost of Manual Morning Reporting

The time isn't the real problem. Fifteen minutes a day is annoying, not catastrophic. The actual cost shows up in two places: inconsistency and avoidance.

When reporting is manual, it happens on quiet mornings and gets skipped on busy ones. The days you most need operational data — the days something went wrong — are the days you have the least time to go find it. Manual reporting has highest friction precisely when stakes are highest.

Avoidance is the other cost. If checking Google Reviews means logging into a platform, navigating to the review tab, and reading through critical feedback one by one, most owners do it less often than they know they should. That's how a 1-star review sits unanswered for four days, visible to every potential customer searching for you online.

The Shawar'Mama owner had built reports in Zelty. Given his managers logins. Set up review notifications. He still wasn't staying on top of it consistently. The problem wasn't data access. It was the interface — every source demanded attention on its own schedule rather than his.

What a Morning Digest Actually Solves

A good morning digest is not a report. It's an interrupt — a proactive signal that arrives whether or not you asked for it. Three things separate one you read every day from one that gets ignored after a week:

The Shawar'Mama digest sends to Telegram every day at 8:00 AM Paris time. Six locations, one message. He reads it on the way in and already knows where to focus before service starts.

How the System Works

Two components: a scheduler and a report generator.

The scheduler lives inside a FastAPI app on Google Cloud Run. At 7:55 AM, APScheduler fetches the previous day's data from the Zelty POS API across all 6 locations and runs it through the aggregation layer — computing totals, week-over-week deltas, per-location breakdowns, and top items. By 8:00 AM the structured data is assembled and report generation starts.

The report generator passes that structured context to Claude. The model's job is narrow: write the narrative around the numbers. The directional summary. The attention flag. The formatted location list with emoji signals. It does not generate numbers. Numbers come from Zelty. Prose comes from the model.

async def send_morning_digest(sales_data: dict):
    context = format_sales_context(sales_data)

    prompt = f"""Write a daily ops digest for a restaurant owner.
Language: French. Be direct, no filler. Format: Telegram message.

Data for {sales_data['date']}:
{context}

Include:
1. One summary sentence with total revenue and direction vs. last week
2. Per-location breakdown with emoji signals (up, minor drop, major drop)
3. Top 3 selling items
4. One attention flag if any location is down more than 10% for 3+ days
"""
    response = await claude_client.messages.create(
        model="claude-haiku-4-5",
        max_tokens=400,
        messages=[{"role": "user", "content": prompt}]
    )

    await telegram_bot.send_message(
        chat_id=OWNER_CHAT_ID,
        text=response.content[0].text
    )

The split between "numbers from API, prose from AI" is load-bearing. The first time you let a model infer or estimate a revenue figure from context rather than fetching it from a live source, you will eventually get a wrong answer. The owner catches it. The digest stops being trusted. Build the data pipeline first; give AI only the formatting layer.

What the Digest Actually Looks Like

Three formats before settling on one the owner reads every single morning.

The first was complete. Every item sold, full location breakdown, delivery versus dine-in, weekly trend table. Comprehensive, unreadable. He stopped opening it by day 5. The second stripped it to four bullet points: fast to read, but no context. He still had to do mental math to decide if yesterday was good or bad.

The third format uses directional signals and a single attention flag:

📊 Vendredi 3 juillet — 6 établissements

💰 CA total : 9 140 € (+7% vs vendredi dernier)
👥 Couverts : 441 · Ticket moyen : 20,73 €

📍 Par établissement :
• République : 2 100 € ✅ (+11%)
• Châtelet : 1 960 € ✅ (+8%)
• Opéra : 1 820 € ✅ (+9%)
• Nation : 1 440 € ⚠️ (-4%)
• Bastille : 1 010 € ⚠️ (-6%)
• Marais : 810 € 🔴 (-14%)

🔝 Top articles : Shawarma bœuf (201), Assiette mixte (158), Ayran (112)
⚠️ Marais à surveiller — baisse 3 jours consécutifs

The signals are generated dynamically: positive growth gets ✅, 0 to -10% decline gets ⚠️, worse than -10% gets 🔴. The attention flag fires when a location has declined for three or more consecutive days. The owner sees Marais immediately. No math required, no scrolling required.

The numbers come directly from Zelty. The narrative sentences and emoji signals are generated by Claude. Structured data from the source, prose from AI — that split is why the digest has been accurate every single day for three months.

Extending to Multiple Data Sources

The Shawar'Mama digest pulls from one source: Zelty. Most businesses have 3 to 5 morning-relevant data sources. The same architecture handles them all — each source is a separate async fetch, results are normalized into a unified context object, and Claude formats them together into one message.

Data Source What to Pull Typical API Latency
POS (Zelty, Square, Toast) Revenue, covers, top items 300–800ms
Delivery (Deliverect, Uber Eats) Orders, ratings, cancellations 400–1,000ms
Google Business Profile New reviews, average rating 500–900ms
Shopify Orders, revenue, top products 200–500ms
CRM (HubSpot, Salesforce) Pipeline movement, new leads 300–700ms

Adding a new data source means writing one async fetch function and one section in the context template. The scheduler, report generator, and Telegram delivery stay unchanged. Build the pattern once and add sources incrementally.

Parallel fetching matters at scale. With 5 sources averaging 600ms each, sequential fetching takes 3 seconds. Parallel fetching takes as long as the slowest — usually under 1 second. For a scheduled 8 AM digest, both are fine. For on-demand reporting, parallel is the only acceptable approach.

Three Months In: What Changed

The owner no longer checks Zelty in the morning. He opens it maybe twice a week when he needs to drill into something specific — a particular location's item breakdown, or a comparison across a longer date window.

The morning reporting loop moved entirely to Telegram. Three months in, the digest has sent every single day without a missed morning. One API timeout in week 2 — the digest sent with a warning note rather than failing silently. He replied "ok" and that was the last time that failure mode came up.

The behavior change that matters most: he now responds to weekly patterns on Monday morning instead of piecing them together from memory. Months of digests sitting in Telegram history mean he can scroll back, compare Friday to Friday, spot trends. The data was always in Zelty. He just never had it in a place he would actually look.

What It Costs to Build

Monthly infrastructure for a single-source implementation runs $23 to $30:

Build time from scratch is typically 2 to 3 weeks: one week on data source integrations, one week on the scheduler and report generator, one week on formatting, failure handling, and edge cases. The useful question before starting: which 5 numbers, if you read them every morning, would tell you whether your business had a good day? Start there. A lean digest that gets read daily beats a comprehensive one that gets ignored after a week.

Frequently Asked Questions

Does an AI morning digest work for businesses outside restaurants?

Yes. The data sources change, the architecture doesn't. A retail business pulls from Shopify and ad platforms. A B2B operation pulls from a CRM and a support ticket system. The scheduler, aggregation layer, and AI report generator are identical across all of them. What you're really building is a daily ops briefing system — the restaurant is one instance of the pattern.

Does the AI generate the numbers in the digest?

No, and it shouldn't. Numbers come directly from API calls to your data sources. The model formats and contextualizes those numbers. If you let the model infer or estimate figures from its context window, you will eventually get a wrong number. The owner catches it. The digest loses credibility and stops being read. Build the data pipeline first; give AI only the formatting layer.

Why use Telegram instead of email?

Open rates and friction. Email digests compete with every other message in the inbox. A Telegram notification arrives with the same weight as a personal message because the owner already has Telegram open for supplier and team conversations all day. The Shawar'Mama owner stopped checking email digests within two weeks. He has not missed a Telegram digest in three months.

What happens if a data source API is unavailable at digest time?

The digest sends with an explicit warning rather than failing silently. The owner gets a message noting which source was unavailable and why. He knows the digest is incomplete. He doesn't have to wonder if the bot is broken. Visible, informative failures are manageable — silent failures erode trust in the system over time.

What if my data lives in a spreadsheet rather than an API?

Google Sheets has a REST API — if your data lives there, you can connect directly. For Excel or CSV exports, the cleanest path is automating the export to a Google Sheet or a cloud database and connecting from there. Manual file-based pipelines are fragile inside scheduled jobs: one missed export and the digest sends incomplete data with no warning.

Working on something similar?

I build AI agents and low-latency systems. If you're trying to solve a version of this, let's talk.

Get in touch

Author: Joe Archondis — AI systems engineer and HFT infrastructure builder.

Last updated: 2026-07-04