---
name: general_ledger_flux_analysis
description: Explain why a general ledger account moved between periods: compute dollar and percentage variance from plain CSV balances, flag accounts on a dual dollar and percent threshold, pull the journal detail behind each flag, decompose drivers (volume, price, timing, one-off, currency, entity scope), reconcile drivers to the variance with an explicit residual, and write a flux note a reviewer can trace to evidence. Vendor neutral and file based, with a tested variance calculator and a price and volume bridge. Triggers on flux analysis, fluctuation analysis, period over period account explanation, variance explanation for close, balance sheet or P and L flux, or why did this account change.
---

# General Ledger Flux Analysis

## Purpose

Explain, in writing a reviewer can trace, why an account balance or activity total changed from one period to the next. Flux analysis compares actuals to actuals across periods. It is a close control and an audit support document, not a budget exercise: budget to actual and forecast to actual are variance analysis, a related but different job.

The deliverable is a set of flux notes, one per flagged account, where every named driver is tied to specific journals or source documents and the drivers plus an explicit residual sum back to the total variance. A note that restates the movement ("travel increased due to higher activity") fails. A note that names the events, amounts, and evidence passes.

This skill is file based and vendor neutral. It works from CSV exports any accounting system can produce. It does not connect to a live general ledger.

## Workflow

1. **Fix the comparison before calculating anything.** Confirm both periods are on the same basis: same close stage (post close trial balance against post close, not a pre close draft against a final), same chart of accounts structure, same entity scope. If an account split or merged, or an entity was acquired or disposed of, recast the prior period onto the current structure first and keep the mapping. Comparing unlike bases manufactures variances that are pure noise. Record the basis in the notes header.

2. **Set the dual threshold and write it down before seeing results.** Flag an account when either the dollar move or the percentage move breaches its threshold (OR logic). The dollar test catches large swings in big accounts where the percent looks small. The percent test catches sharp relative moves in small accounts. Common starting points in practice are a dollar floor tied to materiality (for example 1 percent of pre tax income, 0.25 percent of revenue, or 0.1 percent of total assets) with percent triggers around 5 percent for revenue and 10 percent for operating expenses, tuned per account risk. These are practice conventions, not standards. Set internal thresholds at or below the auditor's tolerable misstatement where that figure is known: PCAOB guidance on analytical procedures puts the investigation threshold at or below tolerable misstatement, influenced primarily by materiality. Estimate heavy, judgmental, covenant linked, and bonus linked accounts get lower thresholds or automatic review every period. Choosing thresholds after seeing the variances is not a control.

3. **Run the calculator.** Export balances as CSV with columns `account,prior,current` and optional `entity,currency`, plain numbers with no symbols or separators. Then run:

   `python3 scripts/flux.py calc balances.csv --dollar-threshold 25000 --pct-threshold 10 --detail detail.csv --out results.csv --report report.md`

   Dollar variance is current minus prior. Percentage variance is the dollar variance divided by the absolute prior balance, times 100, so credit and contra balances read sanely. A zero prior balance reports percent as n/a and can only flag on the dollar test. Output ranks flagged accounts by absolute dollar change, largest first. Work in that order. The easy accounts are not where errors hide. Worked example files live in `assets/` (`balances.example.csv`, `detail.example.csv`, `products.example.csv`).

4. **Pull the detail behind each flagged account.** From the ledger, extract the period's journal lines for the account: journal id, date, description, counterparty or vendor where present, amount. Group the lines into drivers. A driver is a named cause with its own subtotal: the two conferences, the rate increase, the extra payroll run. One driver per cause, never one driver called "various". If the account has thousands of lines, group by journal source, vendor, or project first, then read the largest groups individually.

5. **Classify and split each driver.** Use the taxonomy in `references/drivers-currency-entity.md`: volume, price or rate, mix, timing, one-off, accounting change, currency, entity scope. Two splits matter most:
   - Revenue and unit driven costs: run the price and volume bridge. `python3 scripts/flux.py bridge products.csv` with columns `product,prior_units,prior_price,current_units,current_price`. Price effect is (current price minus prior price) times current units. Volume effect is (current units minus prior units) times prior price. Products with no prior sales are new, products with no current sales are lost, and neither gets split. The bridge fails unless the components sum to the total change.
   - Currency: recompute the current period local amount at the prior period rate. The gap to the reported figure is the currency effect, the rest is local movement. State both rates in the note. Never explain a translation move as a business driver.

6. **Reconcile drivers to the variance and print the residual.** Feed the driver subtotals back as a detail CSV (`account,driver,amount`) and rerun the calculator. It reports the residual, the part of the variance the named drivers do not explain, and warns when the residual exceeds the tolerance (default 5 percent of the variance). A note with a large residual is unfinished: go back to the detail, or state plainly what remains unexplained and who is chasing it. Never plug a driver to force a tie.

7. **Check for the error signals before writing prose.** Round number drivers with no journal, one manual journal equal to the whole variance, a late close journal with a vague description, a variance that exactly reverses last period with no timing cause. Any of these stops the note. The output is a flagged item for correction, not a narrative that explains an error away. Auditors evaluating analytical procedures expect management explanations to be corroborated with evidence, and unexplained differences are treated as a risk signal, so a smooth note over a bad number hurts twice.

8. **Write the note from the template.** Use `assets/flux-notes-template.md`. Each note carries: the two balances and the signed variance in dollars and percent, each driver with its amount and evidence reference, one-off items called out inside their driver, the currency effect or an explicit none, the residual, and what is expected next period (recurs, reverses, runs off) with the reason. Follow the standard the SEC applies to MD&A: underlying reasons in quantitative and qualitative terms, including material changes inside a line item that offset each other, not a recitation of amounts. `references/worked-flux-notes.md` shows three finished notes, including a credit balance account and a revenue bridge.

9. **Close the loop.** List the accounts reviewed and not flagged with their count and largest move, so a reviewer can see the whole population was covered. List open items with an owner. Keep the input CSVs, the results file, and the notes together as one package with preparer and reviewer sign off and dates. Run the same thresholds and the same comparison bases next period: consistency across periods is what makes the package comparable and auditable.

## Output Contract

Deliver all of the following:

- **Results CSV** from the calculator: every account with prior, current, dollar variance, percent variance (or n/a), and flag status. Flagged accounts sorted first by absolute dollar change.
- **Flux notes document** built from `assets/flux-notes-template.md`: one section per flagged account with balances, signed variance, named drivers with amounts and evidence references, one-off flags, currency effect, residual, and expected next period behavior, plus the header recording thresholds, comparison basis, preparer, and reviewer.
- **Driver reconciliation**: for each flagged account, drivers plus residual equal the total variance, and any residual over tolerance is either resolved or listed as an open item with an owner.
- **Bridge output** where unit data exists: price, volume, new, and lost effects that reconcile to the total revenue or cost change, with a PASS reconciliation line.
- **Coverage line**: count of unflagged accounts and their largest move, proving the full population ran through the thresholds.

## Operating Rules

1. **Underlying reasons or it did not happen.** Every explanation names a cause a reviewer can open: a journal, an invoice, a contract, an event with a date. "Increased due to activity", "timing", and "various" without the specifics behind them are placeholders, not explanations.
2. **Thresholds before results.** Set the dollar and percent thresholds, and the OR or AND mode, before running the numbers. Document them in the header. Moving a threshold to unflag an awkward account voids the run.
3. **Percent on the absolute prior balance, n/a on zero.** Dividing by a signed negative prior flips the meaning of the percent. Dividing by zero invents one. The calculator handles both. Do not override its output in the notes with a hand computed figure.
4. **Offsetting moves are still moves.** A net variance under threshold can hide two large drivers moving in opposite directions. If the detail shows gross drivers that each breach the threshold, write the note for the gross moves and say the net is small.
5. **One-off means one-off.** Label an item one-off only with the reason it will not recur on schedule. An annual event is recurring with a yearly pattern, and the note should say which month it lands in so next year's reviewer expects it.
6. **Currency and scope get their own lines, always.** Even when the effect is zero, the note states that it was checked. A reviewer should never have to guess whether translation or an acquisition is hiding inside a business driver.
7. **Corroborate, do not transcribe.** Interview answers from budget owners are leads. The note cites the document that proves the amount, not the conversation that suggested it.
8. **No invented figures.** Every number in a note comes from the balances file, the journal detail, the bridge, or a named source document. If a driver amount cannot be tied to detail, it goes in the residual, not in a driver line with a guessed amount.
