Monthly business review
Business task
The CEO and board of directors need a Monthly Business Review (MBR) with a complete picture of marketing and sales performance. The report should include: a marketing P&L (spend → leads → sales → revenue → profit), cohort ROAS by month, trends for key metrics over the last 6 months, comparison against planned targets, and a forecast for the next month. This is a strategic document for budgeting decisions.
Report architecture
This recipe is a top-level composite — it aggregates weekly and daily reports and builds a monthly picture on top of them:
- Weekly marketing report — data for the 4 weeks of the month, aggregated into a month
- Multi-channel ROAS → Kommo — ROAS by channel for the month
- Deal loss reasons in HubSpot — loss analysis for the month
- Bitrix24 sales rep performance report — manager KPIs for the month
Historical data from the previous 5 months is also used to build the 6-month trend. On the first run, data will only cover the current month — the full trend will appear after 5 months.
Connections (via compose reports)
All connections are configured in the underlying recipes. A complete MBR requires:
| Connector | Used in which recipes |
|---|---|
meta-ads | weekly-marketing-report, multi-source-roas |
google-ads | weekly-marketing-report, multi-source-roas |
tiktok-ads | multi-source-roas |
kommo | multi-source-roas, weekly-marketing-report |
bitrix24 | sales-by-manager |
hubspot | lost-deal-reasons |
If your company uses different CRM systems or ad channels, replace the corresponding source recipes with the equivalents.
Report settings
- Name:
Monthly business review (MBR) - Report type: second-level composite
- Source reports:
weekly-marketing-report,multi-source-roas,lost-deal-reasons,sales-by-manager - Date range:
last_monthfor the current review - Historical depth: 6 months for trends (requires 6 consecutive runs)
- Grouping: by source report, channel, and month
- Timezone:
Europe/Moscow
Parameters
{
"type": "composite",
"source_reports": [
"weekly-marketing-report",
"multi-source-roas",
"lost-deal-reasons",
"sales-by-manager"
],
"date_range": "last_month",
"historical_depth_months": 6,
"group_by": ["source_report", "channel", "month"],
"timezone": "Europe/Moscow"
}The historical_depth_months: 6 parameter requests data for the last 6 months from each source report. LightLead automatically aggregates it by month and builds a 6-month trend. If data for a given month is missing (for example, a channel launched only 3 months ago), that month is skipped in the trend.
Report metrics
Block 1: Marketing P&L (Profit and Loss)
| Metric | Type | Description |
|---|---|---|
total_spend | currency | Total ad budget for the month |
total_leads | number | Total number of leads |
total_mql | number | Number of MQLs |
total_sql | number | Number of SQLs |
total_deals | number | Number of deals |
won_deals | number | Number of deals won |
total_revenue | currency | Revenue from won deals |
gross_profit | currency | Gross profit = Revenue × Margin − Spend |
Calculated metrics for the P&L block:
{
"calculated_metrics": [
{
"name": "cpl",
"formula": "IF([total_leads] > 0, ROUND([total_spend] / [total_leads], 2), 0)",
"type": "money",
"description": "Cost per lead"
},
{
"name": "cac",
"formula": "IF([won_deals] > 0, ROUND([total_spend] / [won_deals], 2), 0)",
"type": "money",
"description": "Customer acquisition cost"
},
{
"name": "roas",
"formula": "IF([total_spend] > 0, ROUND([total_revenue] / [total_spend] * 100, 1), 0)",
"type": "percent",
"description": "ROAS: return on ad spend"
}
]
}Block 2: ROAS by channel
| Metric | Type | Description |
|---|---|---|
meta_ads_roas | percent | Meta Ads ROAS |
google_ads_roas | percent | Google Ads ROAS |
tiktok_ads_roas | percent | TikTok Ads ROAS |
channel_spend_share | percent | Channel's share of the budget |
Block 3: 6-month trend
| Metric | Type | Description |
|---|---|---|
monthly_spend | currency | Spend by month (6 data points) |
monthly_revenue | currency | Revenue by month (6 data points) |
monthly_roas | percent | ROAS by month (6 data points) |
monthly_cpl | currency | CPL by month (6 data points) |
monthly_leads | number | Leads by month (6 data points) |
Block 4: Loss reasons and manager KPIs
| Metric | Type | Description |
|---|---|---|
total_lost_amount | currency | Total amount of lost deals |
top_lost_reason | string | Leading loss reason |
preventable_lost_amount | currency | Preventable losses |
top_manager_revenue | currency | Revenue from the top-performing manager |
avg_win_rate | percent | Team average Win Rate |
Calculated metrics for the trend block:
{
"calculated_metrics": [
{
"name": "revenue_growth_mom",
"formula": "IF([revenue_prev_month] > 0, ROUND(([total_revenue] - [revenue_prev_month]) / [revenue_prev_month] * 100, 1), 0)",
"type": "percent",
"description": "Month-over-month revenue growth"
},
{
"name": "spend_efficiency",
"formula": "IF([total_spend] > 0, ROUND([total_revenue] / [total_spend], 2), 0)",
"type": "percent",
"description": "Spend efficiency: revenue generated per dollar of ad spend"
},
{
"name": "cac_payback_months",
"formula": "IF([won_deals] > 0 AND [avg_monthly_revenue_per_client] > 0, ROUND([cac] / [avg_monthly_revenue_per_client], 1), 0)",
"type": "number",
"description": "CAC payback period in months"
}
]
}The cac_payback_months metric shows how many months it takes for a customer to pay back their acquisition cost. A value < 1 is excellent, 1-3 is normal, > 6 is concerning — the business may not survive long enough to break even.
Filters
No filters are applied at the composite report level — each source report uses its own filters.
For the MBR, it's important that filters in the source reports aren't too aggressive — for example, spend > 500 in ad reports is fine, but spend > 5000 would exclude smaller-budget channels, distorting the overall picture.
Write mode
Mode: Replace
A composite report always uses a full rewrite.
Schedule
{
"schedule": {
"enabled": true,
"interval": "monthly",
"time": "08:00",
"timezone": "Europe/Moscow",
"day_of_month": 1,
"retry_on_failure": true,
"max_retries": 3
}
}Runs on the 1st of every month at 8:00 AM. By this date, data for the previous month is guaranteed to be complete (all ad platforms and CRMs have at least a full day for data finalization).
Important: if the 1st falls on a weekend, the report still runs. To run on the first business day of the month instead, manually change day_of_month or use a manual run.
Expected result
After a successful run:
- Status:
completed - Format: a structured document with 4 blocks, ready to present to the board
- Contents:
- Block 1: Marketing P&L — the complete economics: how much was spent, how much was earned, what the margin is
- Block 2: ROAS by channel — an efficiency comparison and justification for next month's budget
- Block 3: 6-month trend — trends, seasonality, forecast
- Block 4: loss analysis and manager KPIs — operational efficiency
- Forecast: based on the 6-month trend, a forecast of key metrics for the next month is built (trend extrapolation)
- Decisions: budget reallocation across channels based on ROAS; strategy changes based on loss reasons; hiring plan adjustments based on manager workload
- Export: PDF for distribution to the board, Google Slides for presentation, CSV for the finance department
Screenshot
[Screenshot]
[Screenshot]