Overview
Quarterly business reviews (QBRs) follow a predictable format: KPIs vs. plan, trends, risks, and next steps. The pptx.dev API's quarterly-review narrative automates this structure so you can generate consistent QBR decks from your data.
The Quarterly Review Structure
The quarterly-review narrative generates:
- KPIs — quarterly metrics vs. plan, shown as charts
- Risks — identified risks with mitigations
Full API Example
curl -X POST https://api.pptx.dev/v1/presentations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"$schema": "https://openpresentation.org/schema/opf/v1",
"name": "Q1 2026 Business Review",
"slides": [
{
"layout": "title-center",
"title": "Q1 2026 Business Review",
"subtitle": "Board Meeting — March 28, 2026",
"design": {
"titleAlignment": "center"
}
},
{
"layout": "number-4x-title-center",
"title": "Q1 Scorecard",
"blocks": [
{
"metric": {
"value": "$4.8M",
"label": "Revenue (Plan: $4.5M)"
}
},
{
"metric": {
"value": "92%",
"label": "Gross Margin"
}
},
{
"metric": {
"value": "1,240",
"label": "Active Customers"
}
},
{
"metric": {
"value": "72",
"label": "NPS Score"
}
}
],
"design": {
"titleAlignment": "center",
"contentAlignment": "center"
}
},
{
"layout": "chart-1x-title-center",
"title": "Revenue: Actual vs. Plan",
"chart": {
"type": "clustered-column",
"data": {
"columns": [
"Series",
"Jan",
"Feb",
"Mar"
],
"rows": [
[
"Actual",
1500,
1600,
1700
],
[
"Plan",
1400,
1500,
1600
]
]
}
},
"design": {
"titleAlignment": "center",
"contentAlignment": "center"
}
},
{
"layout": "chart-2x",
"title": "Customer Metrics",
"blocks": [
{
"chart": {
"type": "line-with-markers",
"data": {
"columns": [
"Series",
"Jan",
"Feb",
"Mar"
],
"rows": [
[
"New Customers",
45,
52,
68
]
]
}
}
},
{
"chart": {
"type": "doughnut",
"data": {
"columns": [
"Series",
"Enterprise",
"Mid-Market",
"SMB"
],
"rows": [
[
"Mix",
40,
35,
25
]
]
}
}
}
],
"design": {
"contentAlignment": "center"
}
},
{
"layout": "list-3x-title-center",
"title": "Key Risks & Mitigations",
"blocks": [
{
"items": [
{
"text": "Churn in SMB segment",
"description": "Mitigation: Launching self-serve onboarding in Q2 to reduce time-to-value."
}
]
},
{
"items": [
{
"text": "Engineering hiring behind plan",
"description": "Mitigation: Opened remote positions and partnered with two new recruiting firms."
}
]
},
{
"items": [
{
"text": "Competitor pricing pressure",
"description": "Mitigation: Shipping enterprise tier with custom SLAs in April."
}
]
}
],
"design": {
"titleAlignment": "center",
"contentAlignment": "center"
}
},
{
"layout": "list-3x-title-center",
"title": "Q2 Priorities",
"blocks": [
{
"items": [
{
"text": "Launch Enterprise Tier",
"description": "Custom pricing, SLAs, and SSO"
}
]
},
{
"items": [
{
"text": "Expand Sales Team",
"description": "Hire 3 AEs for mid-market segment"
}
]
},
{
"items": [
{
"text": "Reduce Churn",
"description": "Self-serve onboarding and health scoring"
}
]
}
],
"design": {
"titleAlignment": "center",
"contentAlignment": "center"
}
}
],
"narrative": "quarterly-review",
"design": {
"colorScheme": "slate-gray",
"fontScheme": "calibri"
},
"catalogs": {
"layouts": {
"records": [
{
"$schema": "https://openpresentation.org/schema/opf-layout/v1",
"id": "title-center",
"name": "Title Center",
"placeholders": [
{
"type": "title"
},
{
"type": "subtitle"
}
]
},
{
"$schema": "https://openpresentation.org/schema/opf-layout/v1",
"id": "number-4x-title-center",
"name": "Number 4x Title Center",
"placeholders": [
{
"type": "title"
},
{
"type": "metric"
},
{
"type": "metric"
},
{
"type": "metric"
},
{
"type": "metric"
}
],
"composition": {
"mode": "grid",
"columns": 2
}
},
{
"$schema": "https://openpresentation.org/schema/opf-layout/v1",
"id": "chart-1x-title-center",
"name": "Chart 1x Title Center",
"placeholders": [
{
"type": "title"
},
{
"type": "chart"
}
]
},
{
"$schema": "https://openpresentation.org/schema/opf-layout/v1",
"id": "list-3x-title-center",
"name": "List 3x Title Center",
"placeholders": [
{
"type": "title"
},
{
"type": "list"
},
{
"type": "list"
},
{
"type": "list"
}
],
"composition": {
"mode": "row"
}
}
]
}
}
}'
Automating QBR Generation
Since QBRs follow the same structure every quarter, you can automate deck generation by pulling data from your analytics tools:
const kpis = await fetchQuarterlyKPIs("2026-Q1");
const risks = await fetchRiskRegister();
const response = await fetch("https://api.pptx.dev/v1/presentations", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.PPTX_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
title: `Q1 2026 Business Review`,
narrative: "quarterly-review",
colorScheme: "slate-gray",
fontScheme: "calibri",
slides: buildQBRSlides(kpis, risks),
}),
});
This pattern lets you generate consistent QBR decks in seconds instead of hours.
Best Practices for QBRs
- Always show plan vs. actual. Context matters more than raw numbers.
- Lead with the scorecard. Use a
number-4xlayout for the headline metrics. - Use
slate-grayorforest-greenfor a professional, understated tone. - End with priorities, not risks. Leave the audience with forward momentum.
Next Steps
- Learn about KPI number slides for scorecards
- Explore chart types for data visualization
- Browse all narratives