# Finance Month End Variance Analysis

> Runs month-end variance analysis in the only order that works: reconciliation first, explanation second, so that anything failing to tie out is reported as the finding rather than explained as a variance. Decomposes explained movement into price, volume, mix, timing, FX and one-off effects and refuses to produce commentary when the ledger, sub-ledger or prior-period figures were not supplied. Use at month-end or quarter-end close, when a P&L or cost line moved unexpectedly, when preparing the close pack, or when a reviewer asks why a number changed. Trigger on 'month-end', 'variance analysis', 'why did this line move', 'close pack', 'flux analysis', 'reconciliation', 'period-over-period'. Not for forward-looking budget narrative and forecast implications (use finance-budget-vs-actual-commentary) or for assessing individual expense claims (use finance-expense-policy-triage).

- Skill: `alihusains/finance-month-end-variance-analysis` (Agent Skill)
- Install (CLI): `npx skillmds@latest add alihusains/finance-month-end-variance-analysis`
- Raw SKILL.md: https://api.skillmd.com/api/skills/alihusains/finance-month-end-variance-analysis/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Finance & Business
- Author: alihusains (https://skillmd.com/u/alihusains)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/alihusains/finance-month-end-variance-analysis

---


## Purpose

The standard failure at close is writing a confident explanation for a variance
that was actually a posting error, a missing accrual, or a reclassification. Once
that sentence is in the pack, nobody looks again. This skill forces the
reconciliation block to complete before any explanation is written, and treats
every break as a finding with an owner rather than a rounding annoyance.

## Data classification

**Confidential.** Unpublished period financials are price-sensitive in a listed
group and commercially sensitive in a private one. Do not circulate drafts outside
the close distribution list.

**STOP CONDITIONS:**

| Trigger | Action |
| --- | --- |
| Bank account numbers, IBANs, sort codes, card numbers (full or partial), or payment credentials appear in the input | Stop. Say what category was detected without repeating the value. Ask for the extract to be re-supplied with those columns removed. |
| Customer- or counterparty-identifiable positions, balances, or holdings are pasted | Stop. Ask for aggregated or de-identified data. Client positions do not belong in a variance workbook. |
| Named individuals' pay or a small enough population that pay is derivable | Stop. Aggregate payroll to a level that does not identify individuals. |
| The request is to make a figure agree by adjusting the explanation, or to book a balancing entry with no support | Stop. A plug is a misstatement. Report the break and its size; escalate to the financial controller. |

**NON-FABRICATION RULE.** Never estimate a figure that was not supplied, never
carry a prior month's number forward as current, never infer a driver from the
account name, and never reuse last period's commentary because the direction
matches. If the trial balance, comparative period, or sub-ledger detail is missing,
state exactly which is missing and stop. An invented variance driver is
indistinguishable from a real one once it is in the board pack.

## Prerequisites

- **Inputs (mandatory):** current-period trial balance or GL extract; the
  comparative (prior period and/or budget); the mapping from account to reporting
  line.
- **Inputs (mandatory for the reconciliation block):** sub-ledger control totals
  (AR, AP, fixed assets, inventory, payroll), bank reconciliation status,
  intercompany matching status, accrual/prepayment schedules.
- **Inputs (if multi-currency):** the rates used, and which lines are translated at
  average versus closing rate.
- **Inputs (for materiality):** the agreed materiality thresholds. If absent, ask.
  Do not invent a threshold.
- **Runtime:** none required. If the user wants a workbook, code execution and a
  spreadsheet library are needed — confirm availability before promising a file.

If a mandatory input is missing, name it and stop. Partial variance analysis with
an unreconciled ledger is worse than none, because it reads as assurance.

## Procedure

### 1. Reconciliation block — complete this before writing one word of commentary

Every row gets a status. `NOT PROVIDED` is a valid, reportable status; guessing is
not.

| Check | Passes when | If it fails |
| --- | --- | --- |
| TB balances | Debits equal credits | Stop entirely. Nothing downstream is valid. |
| AR sub-ledger to control | Aged debtor total ties to the control account | Report break and age it |
| AP sub-ledger to control | Aged creditor total ties | Report break; check for unposted invoice batches |
| Bank | Per-account reconciliations complete and reviewed | List unreconciled items over threshold with age |
| Intercompany | Both legs agree, in both currencies | Report the mismatch by pair; do not eliminate a difference into P&L |
| Fixed assets | Register ties to NBV; additions and disposals agreed | Report break; check for capex posted to opex |
| Inventory | Count or perpetual record ties to GL | Report break and its P&L effect |
| Payroll | Payroll report ties to GL cost and to the control accounts | Report break |
| Accruals and prepayments | Schedule supports the balance; releases match plan | List unsupported balances — these are the classic hidden P&L |
| Suspense and clearing | Nil, or fully explained and aged | Any non-nil balance is a finding, not a variance |
| FX translation | Reserve movement recomputes from the rates used | Report; do not net it into operating lines |

**Rule: what does not tie out is the finding.** Report every break with its
amount, its age, its owner, and whether it is P&L-affecting — above the commentary,
not in a footnote. If total unexplained breaks exceed materiality, state that the
variance analysis below is unreliable and say so at the top.

### 2. Set the materiality gate

Use both an absolute and a relative threshold; a line moving 300% on a small base
is noise, a 1% move on the largest cost is not. Explain every line breaching
*either* threshold. State both thresholds in the output.

### 3. Clean before decomposing

Strip these out first, or every driver below will be wrong:

- Reclassifications and mapping changes → restate the comparative on a like-for-like
  basis and show the restatement, or the variance is an artefact.
- Prior-period corrections → separate line, never blended into current performance.
- Acquisitions, disposals, entity or perimeter changes.
- One-off items → separate, and state whether they recur.

### 4. Decompose the remaining movement

| Driver | Test | Evidence needed |
| --- | --- | --- |
| Volume | Units changed, rate held | Unit data for both periods |
| Price / rate | Rate changed, units held | Price or rate schedule |
| Mix | Composition shifted between products, channels or grades | Split by the dimension |
| Timing / phasing | Cost or revenue landed in a different period than planned | The period it moved from *and* to — both, or it is not timing |
| FX | Translation or transaction effect | Rates used; compute at constant currency to isolate |
| Headcount | FTE and start-date changes | FTE movement, not a headline number |
| One-off | Non-recurring event | The document supporting it |
| Accounting | Policy, estimate or judgement change | The paper approving it |

"Phasing" without a stated recovery period is not an explanation, it is a deferral
of the question. Require the month it lands in.

### 5. Write commentary that survives review

Each material line: **what moved (amount and %) · the driver from the table above ·
the evidence · whether it recurs · the owner · the action if any.** No line may
combine two drivers into one sentence — split it, or the number cannot be traced.

Self-check before issue: does every material line have a driver backed by evidence?
Does the sum of explained drivers reconcile to the total variance, with a stated
unexplained residual? Is the residual below materiality? If not, say so.

## Boundaries

- **Not for** forward-looking narrative, reforecast, or budget-holder commentary —
  that is `finance-budget-vs-actual-commentary`.
- **Not for** individual expense claim decisions — that is
  `finance-expense-policy-triage`.
- **Not for** statutory accounts preparation, technical accounting judgements, or
  disclosure decisions. Those need the reporting standard and a qualified
  accountant; this skill will not opine on treatment.
- **Not for** assembling an audit evidence pack; hand breaks to the internal
  audit or assurance function with the trail attached.

## Hand-offs

- Receives from: the close checklist and the ledger extract.
- Routes to: `finance-budget-vs-actual-commentary` once the actuals are reconciled
  and the pack needs a forward view.
- Routes to: the internal audit / assurance function (outside this skill set)
  when a break becomes an audit item needing a documented trail.
- Escalates to: the financial controller whenever a break exceeds materiality or a
  plug is requested.

