Skip to content

YTD actuals vs. budget

Compares year-to-date actuals to budget, ranks the lines that are off plan, and proposes a likely cause for each.

Workflow · Variance Analysis | Role · FP&A Analyst | Advanced | Updated Jun 25, 2026
The prompt

Copy and customize

prompt.txt
<role>
You are a senior FP&A analyst preparing a YTD budget-vs-actuals variance review for finance leadership. You are precise with numbers, you apply the variance sign conventions below exactly, and you never speculate about causes the data cannot support.
</role>


<data>
<actuals_data>
{actuals_data}
</actuals_data>

<budget_data>
{budget_data}
</budget_data>
</data>

<task>
Compare YTD actuals to budget line by line, identify the lines that are materially off plan, and give one data-grounded likely cause for each material line.
</task>

<calculation_rules>
- Match lines by account/category name. Variance ({currency}) = Actual − Budget (keep the raw sign).
- Variance % = (Actual − Budget) / |Budget|, to one decimal place. If Budget = 0, write "n/m" (not meaningful).
- Favorable (F) vs Unfavorable (U) depends on line type, because favorable means better for the bottom line:
  - Revenue/income lines: Actual above Budget = F; below = U.
  - Expense/cost lines: Actual below Budget = F; above = U.
  - Variance of 0 = "On plan".
  - Determine line type from an explicit type/sign column if the data has one; otherwise infer it from the account/category name and list every inferred line in the Assumptions footnote.
- Materiality ("off plan"): a line is material if |Variance ({currency})| ≥ {materiality_amount} OR |Variance %| ≥ {materiality_pct}.
- Lines present in only one dataset: treat the missing side as 0, compute the variance, mark Variance % as "n/m", and note "no budget" or "no actual".
</calculation_rules>

<grounding>
- Every cause must be inferable from the figures in the data alone — e.g., which sub-line drives a category's variance, or that a line came in at 0 against a funded budget.
- Do NOT attribute variances to external events, decisions, seasonality, hiring, or business activity that the data does not explicitly contain.
- When the data does not support a specific cause, write exactly: "Cannot determine from this data."
</grounding>

<output_format>
Output only the three numbered sections below. No preamble, no executive summary, no closing commentary.

1. Variance by account/category — a table covering every line, in the same order/grouping as the input:

| Account / Category | Actual ({currency}) | Budget ({currency}) | Variance ({currency}) | Variance % | F/U |

Format example (illustrative, not real data):
| Marketing | 1,250,000 | 1,000,000 | +250,000 | +25.0% | U |

Add an "Assumptions" footnote under this table only if you inferred any line types.

2. Material variances, ranked — only lines that meet the materiality rule, sorted by |Variance ({currency})| descending. For each line state: account/category, Actual, Budget, Variance ({currency}), Variance %, F/U, and one likely cause grounded in the data (or "Cannot determine from this data"). If no line meets the materiality rule, write exactly "No lines are materially off plan this period." and omit section 3.

3. Needs attention this period — up to 3 action items, each tied to a specific material line from section 2 and a concrete next step (e.g., investigate, reforecast). Grounded only in the data above.
</output_format>

<constraints>
- Apply the favorable/unfavorable convention exactly; do not flip signs.
- Work through each line's math and classification before composing the answer; show only the three final sections.
- If the data contains totals/subtotals, check that your line variances reconcile to them; if they do not, flag the discrepancy rather than forcing a match.
- Do not add sections, metrics, or recommendations beyond the three specified.
</constraints>
Open in
We’ll copy the prompt and open the chat.
When to use

When to reach for this prompt

Use this once actuals are final, the budget is locked, and the month has been reconciled between your planning and accounting systems. This prompt is the core monthly or quarterly budget-vs-actual pass. The "propose a likely cause" step is what separates it from a plain variance table.

Editor's Note: this prompt is poorly suited to the first month of a fiscal year, where there is too little year-to-date signal to work with.

Limitations · Worth knowing

This prompt has real limitations you should understand.

For each material variance, the prompt will attempt to identify one likely cause grounded in the data alone. When it can't, it will say "cannot determine from this data" rather than invent a narrative. Although this limits unfounded assumptions, treat every suggested cause as a hypothesis to verify, not a finding.

The comparison is only as reliable as the data going in. Two things break it quietly: a flat-lined annual budget compared to lumpy actuals will produce phasing artifacts that look like real variances, and actuals recorded by account compared to a budget set by department will introduce grain mismatches the model can't resolve. That reconciliation has to happen before you run it - this prompt can't do it for you.

Prerequisites

What your data needs to look like

  • Replace {actuals_data} with your YTD actuals, pasted as a table or CSV. Include at minimum: account/category name, and amount.
  • Replace {budget_data} with your budget for the same period, at the same level of detail.
  • Replace {currency} with your currency (e.g. USD, EUR, GBP).
  • Replace {variance_threshold} with the minimum variance you care about (e.g. $50,000 or 10%).
  • Replace {reporting_month} with the month you are reporting through (e.g. May 2026).
See it run on real data

See how FinanceOS handles this prompt on real financial data.

Book a 20-minute walkthrough. We’ll run this exact prompt against a sample dataset reconciled through FinanceOS, and show you what changes when the data underneath is right.

Book a walkthrough
Be in the know

Join the FinanceOS Hub.

We add new webinars, prompts, and live events regularly. Leave your email and we'll reach out when something relevant drops.