How to Automate CRM Reporting for Sales Meetings
Generate pre-meeting pipeline reports and agendas automatically.
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
- Python 3.8+
- CRM API access
- Jinja2 for templating
- SMTP for delivery
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
- How to Automate Your Weekly Status Report - automate weekly status report guide
- How to Set Up Automated Reporting for Clients - automated reporting clients guide
- Setting Up Automated Client Reporting Pipelines - automated client reporting pipeline
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