Systems Library / Sales Automation / How to Automate CRM Reporting for Sales Meetings
Sales Automation crm pipeline

How to Automate CRM Reporting for Sales Meetings

Generate pre-meeting pipeline reports and agendas automatically.

Jay Banlasan

Jay Banlasan

The AI Systems Guy

Nobody should spend 30 minutes pulling CRM data before a meeting. This system automates crm reporting for weekly sales meetings so reports land in inboxes before anyone walks in.

What You Need Before Starting

Step 1: Define Report Sections

Every sales meeting needs the same data: pipeline snapshot, new deals, risks, and wins/losses.

from datetime import datetime, timedelta

def build_meeting_report(crm_client):
    last_week = datetime.now() - timedelta(days=7)
    return {
        "pipeline_total": crm_client.get_pipeline_value(),
        "new_deals": crm_client.get_deals(created_after=last_week),
        "at_risk": crm_client.get_deals(stalled_days=7),
        "closed_won": crm_client.get_deals(status="won", closed_after=last_week),
        "closed_lost": crm_client.get_deals(status="lost", closed_after=last_week),
    }

Step 2: Format as HTML Email

Clean, scannable report.

from jinja2 import Template

TEMPLATE = Template("""
<h2>Pipeline Review - {{ date }}</h2>
<table style="border-collapse: collapse;">
<tr><td><strong>Pipeline</strong></td><td>${{ "{:,.0f}".format(pipeline_total) }}</td></tr>
<tr><td><strong>New Deals</strong></td><td>{{ new_deals|length }}</td></tr>
<tr><td><strong>At Risk</strong></td><td>{{ at_risk|length }}</td></tr>
<tr><td><strong>Won</strong></td><td>{{ closed_won|length }}</td></tr>
</table>
""")

Step 3: Add Rep-Level Breakdown

Per-rep section so everyone knows their numbers.

def rep_breakdown(crm_client, team_reps):
    breakdown = []
    for rep in team_reps:
        deals = crm_client.get_deals(owner=rep["id"], status="open")
        breakdown.append({
            "name": rep["name"],
            "deal_count": len(deals),
            "pipeline_value": sum(d["amount"] for d in deals),
        })
    return breakdown

Step 4: Auto-Generate Agenda Items

Turn data anomalies into discussion points.

def auto_agenda(report):
    agenda = []
    if len(report["at_risk"]) > 3:
        agenda.append(f"Review {len(report['at_risk'])} at-risk deals")
    for deal in report["closed_lost"]:
        if deal["amount"] > 25000:
            agenda.append(f"Post-mortem: {deal['name']}")
    return agenda

Step 5: Schedule Pre-Meeting Delivery

Send 1 hour before the meeting. Give people time to review.

# Monday meeting at 10am, send at 9am
0 9 * * 1 cd /root/sales-meeting && python generate_report.py

What to Build Next

Add action item tracking from previous meetings. Show what was committed, what got done, and what carried over.

Related Reading

Want this system built for your business?

Get a free assessment. We will map every system your business needs and show you the ROI.

Get Your Free Assessment

Related Systems