# Financial Model Specification: [Model name]

> Specification for a spreadsheet-based financial model, written before
> the model is built or rebuilt and kept up to date while it is in
> use: purpose, users and decisions, scope and timeline, architecture
> and sheet map, inputs register, calculation logic and key formulas,
> outputs, design conventions, scenarios and sensitivities, checks and
> error flags, version control, testing and review, and known
> limitations. Design conventions are informed by the FAST Standard
> (version 02c, July 2019, FAST Standard Organisation, CC BY 4.0); the
> ICAEW Financial Modelling Code is cited by name as further reading.
> Replace every `[bracketed]` value and every row marked *Example*. This
> is a document format, not financial, investment, tax, legal or
> accounting advice.

<!--
Guidance: How to use this template
- A model specification is the contract between the people who will use
  a model's answers and the person who builds it. It fixes what the
  model must do before formulas are written, and it is the baseline the
  reviewer tests against.
- Fill sections 1 and 2 (purpose and scope) with the decision owner,
  then section 4 (inputs) with the data owners, before any build starts.
  Sections 9 to 11 (checks, version control, testing) are what make the
  model safe to rely on; do not leave them to the end.
- Keep the specification short where the model is simple. Appropriate
  detail is a design principle: a model with more precision than its
  inputs support misleads its users.
- The worked example specifies the integrated planning model of the
  fictional Corvid Commerce Group (SaaS retailer, IFRS reporter,
  functional currency EUR, financial year = calendar year; listed parent
  Corvid Commerce Group plc, CC-HOLD; operating companies CC-DE, CC-UK,
  CC-US and CC-VN). The model produces the FY2027
  budget in Annual Budget (`finance/annual-budget`), the forecasts in
  Rolling Forecast (`finance/rolling-forecast`) and the covenant tests
  reported in Monthly Management Report
  (`finance/monthly-management-report`). Amounts are EUR thousand.
- Related documents: Investment Appraisal (`finance/investment-appraisal`),
  Unit Economics Analysis (`finance/unit-economics-analysis`), Model
  Development Document (`finance/model-development-document`), Model
  Risk Management Policy (`finance/model-risk-management-policy`), Model
  Validation Report (`ai-data/model-validation-report`), Valuation
  Report (`finance/valuation-report`), Feasibility Study
  (`business/feasibility-study`).
-->

## Document control

<!-- Guidance: The specification and the model carry linked version numbers. When the model changes in a way that changes logic, outputs or inputs, update this document in the same release. Pitfall: a specification written once for the first build and never updated, so reviewers test against a model that no longer exists. -->

| Field | Value |
|---|---|
| Document ID | [FMS-NNN] *Example:* FMS-001 |
| Model name and ID | [Model name], [MOD-NNN] *Example:* Corvid Integrated Planning Model, MOD-CCG-001 |
| Model type | [Integrated three-statement / project finance / valuation / budget / transaction] *Example:* integrated three-statement planning and covenant model |
| Platform | [Microsoft Excel version / Google Sheets / other] *Example:* Microsoft Excel (Microsoft 365), single workbook, no macros |
| Model file location | [Path or document management link] |
| Model version covered | [vX.Y] *Example:* v3.0 |
| Model owner | [@head-of-fpa] |
| Builder | [@financial-modeller] |
| Reviewer | [@independent-reviewer] |
| Model risk tier | [High / Medium / Low per policy] *Example:* Medium (feeds board budget and lender covenant tests) |
| Version | [1.0] |
| Status | [Draft / In review / Approved / Superseded] |
| Owner | [@head-of-fpa] |
| Approvers/reviewers | [@cfo], [@independent-reviewer] |
| Last updated | YYYY-MM-DD |
| Classification | [Confidential: finance only] |

### Approvals

| Role | Name | Decision | Date |
|---|---|---|---|
| Model owner | [@name] | [Specification agreed] | YYYY-MM-DD |
| Decision owner (main user) | [@name] | [Specification agreed] | YYYY-MM-DD |
| Independent reviewer | [@name] | [Review scope agreed] | YYYY-MM-DD |
| Chief Financial Officer | [@name] | [Approved for build / Approved for use] | YYYY-MM-DD |

### Revision history

| Version | Date | Author | Change summary |
|---|---|---|---|
| 0.1 | YYYY-MM-DD | [@name] | Purpose, scope and inputs agreed |
| 0.9 | YYYY-MM-DD | [@name] | *Example:* Calculation logic, checks and test plan added for model v3.0 rebuild |
| 1.0 | YYYY-MM-DD | [@name] | *Example:* Approved after independent review; model v3.0 released for FY2027 budget |

## Contents

<!-- Guidance: Keep this list aligned with the headings. -->

1. [Purpose, users and decisions](#1-purpose-users-and-decisions)
2. [Scope, timeline and granularity](#2-scope-timeline-and-granularity)
3. [Architecture and sheet map](#3-architecture-and-sheet-map)
4. [Inputs register](#4-inputs-register)
5. [Calculation logic and key formulas](#5-calculation-logic-and-key-formulas)
6. [Outputs and reports](#6-outputs-and-reports)
7. [Design conventions](#7-design-conventions)
8. [Scenarios and sensitivities](#8-scenarios-and-sensitivities)
9. [Checks and error flags](#9-checks-and-error-flags)
10. [Version control and change management](#10-version-control-and-change-management)
11. [Testing and model review plan](#11-testing-and-model-review-plan)
12. [Known limitations and qualifications](#12-known-limitations-and-qualifications)
13. [Glossary and references](#13-glossary-and-references)

## 1. Purpose, users and decisions

<!-- Guidance: Name the decisions the model supports and who makes them. Every later design choice (granularity, horizon, scenarios) follows from these decisions. Questions: what decision fails if the model is wrong, who relies on it outside the team, what is out of scope? Pitfall: "a model of the business" with no decision attached, which grows without limit. -->

[Two or three paragraphs: the business question, the decisions, the users and the consequence of an error.]

*Example:* MOD-CCG-001 is Corvid Commerce Group's single source for the annual budget, the quarterly rolling forecast and the quarterly covenant tests. It turns operational drivers (ARR movements, commerce orders, services days, hiring plan, capital projects, FX rates) into a monthly income statement, balance sheet and cash flow for the parent, each of the four operating subsidiaries and the group. The board approves the budget from its outputs and the lenders receive covenant calculations derived from it, so an error could lead to a wrong funding decision or a misstatement to lenders.

| ID | Decision supported | Decision owner | Frequency | Key outputs used |
|---|---|---|---|---|
| DEC-001 *(Example)* | Approve the annual budget and capex envelope | Board | Annual | Budget P&L, cash flow, capex, KPIs |
| DEC-002 *(Example)* | Re-allocate spend and hiring within the year | Executive committee | Quarterly | Rolling forecast, scenario outputs |
| DEC-003 *(Example)* | Confirm covenant compliance and liquidity headroom | CFO, treasurer | Quarterly and on demand | Covenant tests, headroom, 18-month cash |
| DEC-004 *(Example)* | Size dividend and facility drawings | Board, treasurer | Annual | Cash flow, net debt, leverage |

| User group | Use | Access |
|---|---|---|
| FP&A team *(Example)* | Run cycles, update inputs, produce outputs | Edit inputs and controls |
| Budget holders | Review their cost centre outputs | Read-only extract |
| Treasurer | Covenant and liquidity outputs | Read-only model |
| Board and lenders | Receive outputs in reports, never the model | No model access |

Out of scope: [list]. *Example:* statutory consolidation and tax filings, transfer pricing calculations, valuation for impairment testing (Impairment Test Memo, `finance/impairment-test-memo`), weekly cash (13-Week Cash Flow Forecast, `finance/13-week-cash-flow-forecast`).

## 2. Scope, timeline and granularity

<!-- Guidance: Fix the time axis, the period length, the entities and the level of detail. Choose granularity from the decisions in section 1, not from the detail available in the ledger. Pitfall: monthly detail for ten years, which multiplies size and error risk without improving any decision. -->

| Dimension | Specification |
|---|---|
| Timeline start *(Example)* | 2026-01-01 (FY2026 actuals loaded as the base year) |
| Period length | Calendar month |
| Timeline end | 2031-12-31 (72 monthly columns) |
| Actuals and forecast boundary | Input cell "Last actual month"; columns up to it read actuals, later columns calculate |
| Annual views | Built on presentation sheets by summing months with annual flags; no separate annual calculation axis |
| Entities | CC-HOLD Corvid Commerce Group plc (EUR, listed parent), CC-DE Corvid Commerce GmbH (EUR), CC-UK Corvid Commerce Ltd (GBP), CC-US Corvid Commerce Inc (USD, subscription sales only), CC-VN Corvid Commerce Vietnam LLC (VND, cost-plus service centre with no external revenue), group eliminations |
| Segments | Subscription platform, commerce, professional services, central |
| Cost detail | Function (cost of sales, sales and marketing, research and development, general and administrative) by entity; cost-centre detail stays in the budget submission files |
| Headcount detail | Role family by entity and month; individual positions only for open roles |
| Currency | Calculations in local currency per entity; translation to EUR at average rates (flows) and closing rates (balances) |
| Units | EUR thousand on presentation sheets; full units in input sheets where source data is in full units (marked by the units column) |
| Day count | Actual days in the month over 365 for interest; 30-day months are not used |
| Sign convention | Inflows and assets positive; outflows and liabilities negative in calculations; presentation sheets show costs in brackets |

## 3. Architecture and sheet map

<!-- Guidance: Lay out the workbook so that the logic flows one way: from inputs and timing, through workings, to presentation, with control sheets alongside. Keep each sheet to one purpose and one time axis. Pitfall: inputs scattered across calculation sheets, so nobody can tell which numbers are assumptions. -->

The FAST Standard groups sheets into four functional classes: foundation (inputs, timing, indexation), workings (calculations), presentation (statements, charts, summaries) and control (checks, scenario control, change log, contents). The sheet map follows that grouping.

```mermaid
flowchart LR
  subgraph Foundation
    I1[Inputs: macro and FX]
    I2[Inputs: operational drivers]
    I3[Inputs: financing and tax]
    T[Time and flags]
    A[Actuals import]
  end
  subgraph Workings
    W1[Revenue]
    W2[People cost]
    W3[Operating cost]
    W4[Capex and depreciation]
    W5[Working capital]
    W6[Debt, leases and interest]
    W7[Tax]
    W8[FX translation and consolidation]
  end
  subgraph Presentation
    P1[Income statement]
    P2[Balance sheet]
    P3[Cash flow]
    P4[Covenants and headroom]
    P5[KPI dashboard]
  end
  subgraph Control
    C1[Checks]
    C2[Scenario control]
    C3[Change log]
    C4[Contents and model notes]
  end
  I1 --> W1
  I2 --> W1
  I2 --> W2
  I2 --> W3
  I3 --> W6
  I3 --> W7
  T --> W1
  A --> W8
  W1 --> W5
  W2 --> W8
  W3 --> W8
  W4 --> W8
  W5 --> W8
  W6 --> W8
  W7 --> W8
  W8 --> P1
  W8 --> P2
  W8 --> P3
  P1 --> P4
  P2 --> P4
  P1 --> P5
  C2 --> I2
  P1 --> C1
  P2 --> C1
  P3 --> C1
```

| Sheet ID | Sheet name | Class | Content | Time axis |
|---|---|---|---|---|
| S01 *(Example)* | Contents | Control | Table of contents, model purpose, flow description, colour key, standards used | None |
| S02 *(Example)* | Checks | Control | All checks, master check, alerts | Monthly |
| S03 *(Example)* | Scenarios | Control | Scenario selector and scenario input table | None |
| S04 *(Example)* | ChangeLog | Control | Version, change, author, reviewer, date | None |
| S05 *(Example)* | Inp_Macro | Foundation | FX rates, inflation, interest benchmarks | Monthly |
| S06 *(Example)* | Inp_Ops | Foundation | ARR movements, orders, AOV, services days, hiring plan, cost drivers | Monthly |
| S07 *(Example)* | Inp_Fin | Foundation | Facilities, leases, tax rates, dividend policy, covenant limits | Constants and monthly |
| S08 *(Example)* | Time | Foundation | Period dates, period flags, actual and forecast flags, annual and quarter flags | Monthly |
| S09 *(Example)* | Actuals | Foundation | Monthly ledger trial balance mapped to model lines (import sheet) | Monthly |
| S10 to S17 *(Example)* | Rev, People, Opex, Capex, WC, Debt, Tax, Consol | Workings | Calculation blocks listed in section 5 | Monthly |
| S18 to S22 *(Example)* | IS, BS, CF, Covenants, KPI | Presentation | Outputs listed in section 6 | Monthly with annual summaries |

Import of actuals: the ledger extract is pasted as values into S09 through a fixed mapping table; no direct external links to other workbooks. If several workbooks are unavoidable, exchange data through dedicated import and export sheets.

## 4. Inputs register

<!-- Guidance: List every input with its unit, value or range, source, owner, update frequency and the scenario it belongs to. Inputs live only on input sheets. Pitfall: hard-coded numbers inside formulas, which are invisible to reviewers and impossible to flex. -->

| ID | Input | Unit | Base value or range | Source | Owner | Updated | Budget reference |
|---|---|---|---|---|---|---|---|
| INP-001 *(Example)* | EUR/USD rate, budget | USD per EUR | 1.10 | Treasury view | [@treasurer] | Annual, frozen | ASM-001 |
| INP-002 *(Example)* | EUR/GBP rate, budget | GBP per EUR | 0.86 | Treasury view | [@treasurer] | Annual, frozen | ASM-002 |
| INP-003 *(Example)* | EUR/VND rate, budget | VND per EUR | 28,500 | Treasury view | [@treasurer] | Annual, frozen | ASM-003 |
| INP-004 *(Example)* | General cost inflation | % per year | 2.5% | Consensus forecasts | [@head-of-fpa] | Annual | ASM-004 |
| INP-005 *(Example)* | Pay review, effective 1 April | % | 3.5% | HR benchmark | [@chro] | Annual | ASM-005 |
| INP-006 *(Example)* | New ARR, expansion, contraction, churn by month | EUR k per month | Sales plan | CRM pipeline and plan | [@cro] | Monthly | ASM-006, ASM-007 |
| INP-007 *(Example)* | Commerce orders and AOV by month | thousand, EUR | 1,200k orders at EUR 45 for FY2027 | Commerce plan | [@commerce-director] | Monthly | ASM-008 |
| INP-008 *(Example)* | Services days and day rate | days, EUR | 50,000 days at EUR 200 | Services plan | [@services-director] | Quarterly | ASM-009 |
| INP-009 *(Example)* | Effective tax rate by entity | % | Group 25% | Tax plan | [@head-of-tax] | Annual | ASM-010 |
| INP-010 *(Example)* | Term loan balance and rate | EUR k, % | 30,000 at 4.0% | Facility agreement | [@treasurer] | On change | ASM-011 |
| INP-011 *(Example)* | Receivable, inventory, payable days (quarter-end balance / quarter flow x 90) | days | 31, 52, 43 | Working capital plan | [@financial-controller] | Quarterly | ASM-012 |
| INP-012 *(Example)* | Covenant limits | x | Leverage 3.00x maximum; interest cover 4.00x minimum | Facility agreement | [@treasurer] | On change | Not in budget |
| INP-013 *(Example)* | Capital projects: amount, month, asset class, useful life | EUR k, months | CAP-001 to CAP-004 | Capex register | [@cfo] | Quarterly | Budget section 8 |
| INP-014 *(Example)* | Discount rate for appraisal outputs | % | 10% | Group hurdle rate | [@cfo] | Annual | Not in budget |

Input rules:

- Every input row has a label, a unit, a source note and an owner in a dedicated comments column.
- Constants (single values) and time series (one value per period) are clearly distinguished by layout and format.
- Data validation restricts inputs to plausible ranges (for example, rates between 0% and 25%); values outside the range trigger an input alert on S02.
- Scenario inputs sit in one table on S03, selected by a single scenario switch (section 8).

## 5. Calculation logic and key formulas

<!-- Guidance: Describe each calculation block in words and, where helpful, as a formula, so a reviewer can rebuild it independently. Use balance "corkscrews" for every balance. Pitfall: logic that exists only in the spreadsheet, so a reviewer must reverse-engineer intent from formulas. -->

### 5.1 Calculation block catalogue

| ID | Block | Sheet | Logic in words | Key inputs | Outputs |
|---|---|---|---|---|---|
| CALC-001 *(Example)* | ARR corkscrew | S10 Rev | Opening ARR plus new, expansion, less contraction and churn, equals closing ARR; next month opens with this closing | INP-006 | ARR, customers |
| CALC-002 *(Example)* | Subscription revenue | S10 Rev | Average of opening and closing ARR divided by 12 | CALC-001 | Revenue by entity |
| CALC-003 *(Example)* | Commerce revenue and cost | S10 Rev | Orders times AOV; cost at product, freight and fulfilment rates | INP-007 | Revenue, cost of sales |
| CALC-004 *(Example)* | People cost | S11 People | FTE by role family times loaded cost, pay review from the review month flag | INP-005 | Cost by function |
| CALC-005 *(Example)* | Fixed asset corkscrew and depreciation | S13 Capex | Opening cost plus additions less disposals; straight-line depreciation from the month after commissioning | INP-013 | PPE, intangibles, D&A |
| CALC-006 *(Example)* | Working capital | S14 WC | Balance = flow of the month times days over days in month | INP-011 | Receivables, inventories, payables |
| CALC-007 *(Example)* | Debt corkscrew and interest | S15 Debt | Opening plus drawings less repayments; interest on average balance at the rate times actual days over 365 | INP-010 | Debt, interest |
| CALC-008 *(Example)* | Tax | S16 Tax | Profit before tax times effective rate per entity; payments on account per local calendar | INP-009 | Tax charge, tax payable |
| CALC-009 *(Example)* | Translation and consolidation | S17 Consol | Local flows at average rate, balances at closing rate, translation difference to equity; eliminate intercompany | INP-001 to INP-003 | Group statements |
| CALC-010 *(Example)* | Covenants | S21 Covenants | LTM covenant EBITDA (EBITDA plus permitted add-backs) and LTM finance charges by rolling 12-month sums; covenant net debt at month end (borrowings plus lease liabilities less freely available cash) | INP-012 | Ratios, headroom |

### 5.2 Key formulas

ARR corkscrew (CALC-001), for month t:

$$
\text{ARR}_{t}^{\text{close}} = \text{ARR}_{t}^{\text{open}} + \text{New}_{t} + \text{Expansion}_{t} - \text{Contraction}_{t} - \text{Churn}_{t}, \qquad \text{ARR}_{t+1}^{\text{open}} = \text{ARR}_{t}^{\text{close}}
$$

Subscription revenue (CALC-002):

$$
\text{Revenue}_{t} = \frac{\text{ARR}_{t}^{\text{open}} + \text{ARR}_{t}^{\text{close}}}{2 \times 12}
$$

Working capital balance (CALC-006), receivables shown, on the ASM-012 convention of the flow of the three months ending in month t; inventories use commerce cost of sales and payables use total cost of sales:

$$
\text{Receivables}_{t} = \left( \sum_{k=t-2}^{t} \text{Revenue}_{k} \right) \times \frac{\text{DSO}}{90}
$$

Interest (CALC-007):

$$
\text{Interest}_{t} = \frac{\text{Debt}_{t}^{\text{open}} + \text{Debt}_{t}^{\text{close}}}{2} \times i \times \frac{\text{Days}_{t}}{365}
$$

Covenants (CALC-010):

$$
\text{Leverage}_{t} = \frac{\text{Debt}_{t} + \text{Lease liabilities}_{t} - (\text{Cash}_{t} - \text{Trapped cash}_{t})}{\sum_{k=t-11}^{t} \text{Covenant EBITDA}_{k}}
$$

The model also reports the management ratio (borrowings less all cash, excluding leases, over LTM EBITDA) on a separate, clearly labelled row, because the budget pack uses it as a headline; the covenant row is the only one that feeds the compliance certificate.

Discounting for appraisal outputs: discount factors are calculated on their own line from the period flags and the discount rate, and present values are their product with the cash flow line. The spreadsheet NPV function is not used, because it assumes equally spaced periods and discounts the first cash flow in the range by one full period, hiding the timing assumption.

$$
\text{DF}_{t} = \frac{1}{(1+d)^{\tau_{t}}}, \qquad \text{NPV} = \sum_{t} \text{CF}_{t} \times \text{DF}_{t}
$$

where the time in years from the valuation date to the cash flow is calculated from period end dates on S08.

### 5.3 Worked check of the logic

*Example:* with the FY2027 budget inputs, ARR opens at EUR 86,000k and closes at EUR 106,000k. If the monthly movements are spread evenly, subscription revenue is close to (86,000 + 106,000) / 2 = EUR 96,000k, the figure in the budget. Management leverage at 2027-12-31 is (30,000 - 26,400) / 21,600 = 0.17x; covenant leverage, with lease liabilities of 6,400 and trapped cash of 1,000, is (30,000 + 6,400 - 25,400) / 21,600 = 11,000 / 21,600 = 0.51x. Net finance cost is 1,200: term loan interest 1,200 plus lease interest 360 less interest income 360 (Annual Budget ASM-011). These are the first regression tests in section 11.

## 6. Outputs and reports

<!-- Guidance: List every output, its users and its format, and say which outputs leave the finance team. Outputs must be readable without opening other software. Pitfall: outputs built outside the model (pasted into slides) that silently diverge from the model after the next change. -->

| ID | Output | Sheet | Users | Format | Leaves finance? |
|---|---|---|---|---|---|
| OUT-001 *(Example)* | Monthly and annual income statement by segment and entity | S18 IS | Executive committee, board | Table, EUR k | Yes, via budget pack and MMR |
| OUT-002 *(Example)* | Balance sheet | S19 BS | CFO, treasurer | Table | Yes, summary only |
| OUT-003 *(Example)* | Cash flow and net debt | S20 CF | Treasurer, board | Table and chart | Yes |
| OUT-004 *(Example)* | Covenant tests and headroom | S21 Covenants | Treasurer, lenders | Table | Yes, via compliance certificate |
| OUT-005 *(Example)* | KPI dashboard (ARR, customers, orders, FTE, margins) | S22 KPI | Executive committee | Table and charts | Yes |
| OUT-006 *(Example)* | Scenario comparison | S03 Scenarios | Executive committee | Table | Internal |

Output rules:

- Each presentation sheet states the units (for example EUR thousand), the scenario shown and the model version in its header.
- The scenario name and the master check status are printed on every output page.
- Charts match the data type: lines for time series, bars for comparisons, a waterfall for bridges.
- Outputs that go to lenders use the facility agreement definitions; see Covenant Compliance Certificate (`finance/covenant-compliance-certificate`).

## 7. Design conventions

<!-- Guidance: State the conventions the builder must follow and the reviewer will test. This template draws on the FAST Standard 02c (open licence) and paraphrases the conventions in its own words; cite rule IDs so the builder can look up the full rule. Pitfall: adopting a standard by name without saying which rules apply, so neither builder nor reviewer can check compliance. -->

### 7.1 Principles

The FAST acronym sets four priorities: models are **flexible** (users can run scenarios and adapt the model over time, which comes from simplicity rather than a switch for every case), **appropriate** (assumptions are reflected faithfully without detail or precision beyond what the decision needs), **structured** (a consistent layout of workbooks, sheets and formulas keeps logic intact as authors change) and **transparent** (simple formulas and clear layout that another person can follow).

### 7.2 Conventions for this model

| ID | Convention (own wording) | FAST rule reference | Test by |
|---|---|---|---|
| DC-001 *(Example)* | Separate sheets by class: foundation, workings, presentation, control | 1.01-01 | Sheet map review |
| DC-002 *(Example)* | Each column has one purpose; all series sheets use the same monthly time axis in the same columns | 1.01-02, 1.01-03, 2.01-01, 2.01-02 | Column header comparison |
| DC-003 *(Example)* | Logic flows top to bottom and left to right; backward references only for opening balances, shaded | 2.01-04 to 2.01-06 | Precedent tracing |
| DC-004 *(Example)* | Nothing is hidden except unused future columns | 2.01-08 | Unhide all and compare |
| DC-005 *(Example)* | Calculations sit in separate blocks that list their inputs locally in formula order; balances use corkscrews | 2.02-01 to 2.02-05 | Block review |
| DC-006 *(Example)* | Time axis, period end date, master check and alert indicators sit in a frozen header on every series sheet | 2.03-01, 2.03-02, 2.03-05 | Visual check |
| DC-007 *(Example)* | Input sheets carry a comments column and explain themselves | 2.04-02, 2.04-03 | Input register vs sheet |
| DC-008 *(Example)* | Contents sheet with model description, flow and colour key; a list of qualifications and weaknesses | 2.05-03 to 2.05-05, 2.06-01, 2.06-02 | S01 review |
| DC-009 *(Example)* | One formula per row, consistent across the row; temporary code marked | 3.02-01, 3.02-02 | Row consistency scan |
| DC-010 *(Example)* | Short formulas that can be explained quickly; no nested IF; flags instead of IF; INDEX rather than CHOOSE | 3.03-01 to 3.03-07, 4.01-01 | Formula length scan |
| DC-011 *(Example)* | No constants embedded in formulas except universal ones (12 months, 100%) | 3.04-01 | Constant scan |
| DC-012 *(Example)* | Every row has a unique label with units; balances say "balance"; opening and closing clearly marked | 3.05-01 to 3.05-13 | Label scan |
| DC-013 *(Example)* | No links to links (daisy chains); no OFFSET or INDIRECT; no NPV function | 3.06-02, 4.01-02, 4.01-03 | Function inventory |
| DC-014 *(Example)* | Timing flags drive period logic and are created only when needed | 3.07-01 to 3.07-03 | Flag inventory |
| DC-015 *(Example)* | No merged cells; defined cell styles for inputs, calculations, links and checks | 4.02-01, 4.02-02 | Style audit |

### 7.3 Departures from the conventions

| ID | Departure | Reason | Approved by |
|---|---|---|---|
| DEV-001 *(Example)* | One Excel name used for the error tolerance (0.001) | Displaying it locally in every check block adds noise; FAST allows this exception | [@head-of-fpa] |
| DEV-002 *(Example)* | Data table used for the two-way sensitivity on S03 | Array-type feature is the clearest way to show the grid; calculation set to automatic except tables | [@head-of-fpa] |

The ICAEW Financial Modelling Code and the Best Practice Spreadsheet Modelling Standards (BPM, Spreadsheet Standards Review Board) are alternative style frameworks; if the organisation adopts one of them instead, replace the rule references in 7.2 and keep the same table.

## 8. Scenarios and sensitivities

<!-- Guidance: Define how scenarios are stored and selected, and which sensitivities the model must produce. One switch, one scenario table, no copies of the model per scenario. Pitfall: saving a separate workbook for each scenario, so a later fix reaches only one of them. -->

### 8.1 Scenario mechanics

- A single selector on S03 chooses the live scenario; the selected values flow to the input sheets through one lookup row per scenario input.
- Scenario values are stored side by side in one table with a column per scenario; the base case is a column like the others.
- Every output carries the live scenario name. Stored results for comparison are pasted as values on S03 by a documented step, with the model version and date.

| Scenario ID | Name | Driver changes | Owner |
|---|---|---|---|
| SCN-001 *(Example)* | Base | Budget or latest forecast inputs | [@head-of-fpa] |
| SCN-002 *(Example)* | Upside | Commerce orders at budget from Q3; new ARR +10% | [@head-of-fpa] |
| SCN-003 *(Example)* | Downside | Commerce orders -10% for Q2 to Q4; US churn +2 points | [@head-of-fpa] |
| SCN-004 *(Example)* | Lender stress | EBITDA -30% from next quarter; no new drawings; dividend suspended | [@treasurer] |

The scenarios match those in Rolling Forecast (`finance/rolling-forecast`) section 7.

### 8.2 Required sensitivities

| ID | Sensitivity | Range | Output |
|---|---|---|---|
| SEN-001 *(Example)* | Commerce volume | -20% to +10% in steps of 5% | EBITDA, closing cash |
| SEN-002 *(Example)* | Subscription churn | +0 to +3 points | ARR, EBITDA |
| SEN-003 *(Example)* | EUR/USD | 1.00 to 1.25 | Revenue, EBITDA, leverage |
| SEN-004 *(Example)* | Interest rate on the term loan | +0 to +300 basis points | Interest cover |
| SEN-005 *(Example)* | Two-way: commerce volume against churn | Grid of SEN-001 and SEN-002 | Leverage |

Break-even outputs: the model reports the EBITDA fall at which each covenant breaches (as in the management report) and the lowest month-end liquidity in each scenario.

## 9. Checks and error flags

<!-- Guidance: Build checks for arithmetic integrity, data integrity and business sense, sum them into one master check shown in every sheet header, and separate errors (the model is wrong) from alerts (the model is right but the business result needs attention). Pitfall: checks that are switched off or that use a tolerance so wide they never fire. -->

| ID | Check | Type | Rule | Tolerance | Location |
|---|---|---|---|---|---|
| CHK-001 *(Example)* | Balance sheet balances | Error | Total assets + total liabilities and equity (signed) = 0 every month and entity | 0.001 | S02, S19 |
| CHK-002 *(Example)* | Cash flow ties to balance sheet cash | Error | Opening cash + net cash flow = closing cash | 0.001 | S02, S20 |
| CHK-003 *(Example)* | Corkscrew continuity | Error | Every opening balance equals the previous closing balance | 0 | S02 |
| CHK-004 *(Example)* | Segment and entity totals | Error | Sum of segments = sum of entities = group | 0.001 | S02 |
| CHK-005 *(Example)* | Actuals import | Error | Imported trial balance sums to zero and maps every account | 0 | S02, S09 |
| CHK-006 *(Example)* | Translation | Error | Translated balance sheet balances; translation difference posted to equity | 0.001 | S02, S17 |
| CHK-007 *(Example)* | Flags | Error | Each month has exactly one actual or forecast flag; annual flags sum to 12 per year | 0 | S02, S08 |
| CHK-008 *(Example)* | Input ranges | Alert | Inputs within validation ranges | n/a | S02 |
| CHK-009 *(Example)* | Covenant breach | Alert | Leverage above 2.50x (warning) or 3.00x (breach) in any test period | n/a | S02, S21 |
| CHK-010 *(Example)* | Liquidity floor | Alert | Liquidity headroom below the treasury minimum in any month | n/a | S02, S20 |
| CHK-011 *(Example)* | Reasonableness | Alert | Gross margin per segment outside 5 points of last 12 months | n/a | S02 |

Master check = sum of absolute error check values; shown in the frozen header of every sheet and on every output page. Outputs are not released while the master check is not zero. Alerts are listed separately and explained in the cycle's commentary.

## 10. Version control and change management

<!-- Guidance: Spreadsheet standards concentrate on design; version control, change approval, access and back-up are the organisation's job. Define them here. Pitfall: "final_v7_really_final.xlsx" in an email thread as the model of record. -->

| Item | Rule |
|---|---|
| Model of record *(Example)* | One file in the finance document library, read-only except for the FP&A modeller group |
| File naming | [MOD-ID]_[vMajor.Minor]_[YYYY-MM-DD].xlsx |
| Major version | Logic, structure or output definition changes; requires review (section 11) and an update of this specification |
| Minor version | Input updates and actuals loads only; requires preparer and checker sign-off on S04 |
| Change log | S04 records version, date, change description, sheets affected, author, reviewer, test evidence |
| Change requests | Raised as CR-NNN with reason, expected effect on outputs, urgency; approved by the model owner |
| Back-up | Daily library back-up; each released version kept for [7] years |
| Access | Edit: FP&A modellers; read: treasury, controllership; outputs only for others |
| Comparison tool | Workbook comparison run for every major version; differences explained in the change log |

| CR ID | Change | Reason | Version | Reviewer | Status |
|---|---|---|---|---|---|
| CR-021 *(Example)* | Add CC-VN Corvid Commerce Vietnam LLC as a separate column set | Entity became a cost-plus service centre in 2026 (no external revenue) | v3.0 | [@independent-reviewer] | Released |
| CR-022 *(Example)* | Interest day count changed from 30/360 to actual/365 | Match facility agreement | v3.0 | [@independent-reviewer] | Released |
| CR-023 *(Example)* | Add lender stress scenario SCN-004 | Refinancing discussions | v3.1 | [@head-of-fpa] | In test |

Where a model falls within the organisation's model risk framework, record it in the model inventory and follow Model Risk Management Policy (`finance/model-risk-management-policy`).

## 11. Testing and model review plan

<!-- Guidance: Plan three layers: the builder's own tests, a peer review in the team, and an independent review proportionate to the model risk tier. Write expected results before running tests. Pitfall: a review that only reads formulas and never compares outputs with an independent calculation. -->

### 11.1 Review layers

| Layer | Who | Scope | When |
|---|---|---|---|
| Builder testing *(Example)* | [@financial-modeller] | All test cases below, checks at zero, convention scan | Before each release |
| Peer review | [@fpa-analyst] | Logic of changed blocks, inputs against sources, outputs against previous version | Each major version |
| Independent review | [@independent-reviewer] (internal team outside FP&A or external model reviewer) | Full specification compliance, rebuild of key calculations, scenario behaviour, conventions | Initial release, then every [24] months or on major change |
| Lender model audit (if required by contract) | [External model auditor] | As defined in the facility agreement | [Before financial close or refinancing] |

### 11.2 Test cases

| ID | Test | Input set | Expected result | Result |
|---|---|---|---|---|
| TC-001 *(Example)* | Budget regression: FY2027 revenue | SCN-001, budget inputs | 160,000 | [Pass / Fail] |
| TC-002 *(Example)* | Budget regression: FY2027 EBITDA | SCN-001 | 21,600 | [Pass / Fail] |
| TC-003 *(Example)* | Budget regression: closing cash 2027-12-31 | SCN-001 | 26,400 | [Pass / Fail] |
| TC-004 *(Example)* | Leverage 2027-12-31: management and covenant definitions | SCN-001 | 0.17x management; 0.51x covenant | [Pass / Fail] |
| TC-005 *(Example)* | Zero test: all drivers set to zero | Test inputs | No revenue, no variable cost, fixed cost only; checks zero | [Pass / Fail] |
| TC-006 *(Example)* | Doubling test: all volumes doubled | Test inputs | Revenue and variable cost double; fixed cost unchanged | [Pass / Fail] |
| TC-007 *(Example)* | FX invariance: EUR entity only | Rates changed | EUR entity results unchanged | [Pass / Fail] |
| TC-008 *(Example)* | Timeline: last actual month moved forward by one | Actuals loaded for March | March reads actuals; April onwards forecast; checks zero | [Pass / Fail] |
| TC-009 *(Example)* | Downside scenario reproduces rolling forecast | SCN-003 | Revenue 153,000; EBITDA 18,500; closing cash 22,400 | [Pass / Fail] |
| TC-010 *(Example)* | Interest calculation against independent recalculation | Facility inputs | Matches within 0.1 | [Pass / Fail] |

### 11.3 Traceability matrix

| Requirement | Section | Calculation or output | Check | Test |
|---|---|---|---|---|
| REQ-001 Board budget P&L *(Example)* | 1, 6 | CALC-001 to CALC-004, OUT-001 | CHK-004 | TC-001, TC-002 |
| REQ-002 Cash and net debt | 6 | CALC-006, CALC-007, OUT-003 | CHK-002 | TC-003 |
| REQ-003 Covenant tests | 1, 6 | CALC-010, OUT-004 | CHK-009 | TC-004, TC-010 |
| REQ-004 Scenarios | 8 | SCN-001 to SCN-004 | CHK-001 | TC-009 |
| REQ-005 Actuals and forecast blend | 2 | S09, S08 flags | CHK-005, CHK-007 | TC-008 |
| REQ-006 Multi-currency | 2 | CALC-009 | CHK-006 | TC-007 |

### 11.4 Review findings

| ID | Finding | Severity | Response | Status |
|---|---|---|---|---|
| RF-001 *(Example)* | Lease interest calculated on closing balance, not average | Medium | Corrected in v3.0 (CALC-007 applied to leases); budget net finance cost of 1,200 now shows lease interest and interest income separately | Closed |
| RF-002 *(Example)* | Two inputs without source notes on Inp_Ops | Low | Notes added | Closed |

Model validation for regulated or high-risk models uses Model Validation Report (`ai-data/model-validation-report`); model design documentation for risk models uses Model Development Document (`finance/model-development-document`).

### 11.5 How to run a review and what reviewers most often find

Give the reviewer the specification, the model, the input register and the expected results before the review starts, and agree the scope in writing: which sheets, which versions and which outputs. A reviewer who receives only the workbook will test what is easy to test, usually formula consistency, and miss the questions that matter to the decision makers, such as whether the covenant calculation uses the facility definitions.

Reviewers should work from outputs back to inputs. Start with the numbers that leave the model (the budget P&L, closing cash, covenant ratios) and rebuild them independently, in a separate small workbook or by hand, from the input register. Where the rebuild and the model disagree, trace the difference to a block, then to a row. Only after the key outputs agree should the reviewer scan the whole model for convention breaches, because a model can follow every layout rule and still compute the wrong thing.

Findings that recur in planning models of this kind:

- Definitions that drift from the contract. Covenant net debt that leaves out lease liabilities, nets trapped or pledged cash, or uses management EBITDA instead of the agreement's Consolidated EBITDA. The fix is a covenant block that reads the definitions from an input sheet referencing clause numbers, with a separate row for the management ratio.
- Double counting between operating expense and capital expenditure, typically capitalised development whose people cost is also left in the expense lines. Test it by reconciling gross spend by function to the sum of expensed and capitalised amounts.
- Interest on the wrong balance: closing instead of average, or leases and cash deposits left out of net finance cost.
- Timing errors at year boundaries, such as a pay review or a price increase applied from the first month of the year instead of its effective month.
- Hard-coded plugs left from an earlier cycle, often in working capital or tax rows, that make the balance sheet balance while hiding an error.
- Currency translation applied twice, or balances translated at average instead of closing rates.

Record each finding with a severity, the owner of the fix and the version in which it was closed, as in the table above. A finding is closed only when the regression tests in section 11.2 pass on the corrected version; re-run the full test set, not just the test for the changed block, because fixes in one calculation often move another.

## 12. Known limitations and qualifications

<!-- Guidance: List what the model does not do and where its answers should be used with care. This list is also shown on the model's contents sheet. Pitfall: limitations known to the builder but not to the board that relies on the outputs. -->

| ID | Limitation | Effect on users | Mitigation |
|---|---|---|---|
| LIM-001 *(Example)* | Tax at an effective rate per entity, not a full computation | Tax cash timing approximate; deferred tax not modelled | Tax team reviews the annual tax line |
| LIM-002 *(Example)* | Monthly granularity | Intra-month liquidity troughs not visible | Use 13-week cash forecast for short-term liquidity |
| LIM-003 *(Example)* | Working capital by days measures | Seasonal stock build approximated | Inventory input override by month allowed |
| LIM-004 *(Example)* | No intercompany interest or transfer pricing detail | Entity profits indicative only | Statutory and TP analysis outside the model |
| LIM-005 *(Example)* | Five-year horizon with monthly detail | Long-range years are directional | Strategic plan uses annual summaries only |
| LIM-006 *(Example)* | Scenario inputs are deterministic | No probability of outcomes | Probability-weighted risks reported in the forecast pack |

## 13. Glossary and references

<!-- Guidance: Define modelling terms once; list the standards and internal documents the model relies on. -->

### 13.1 Glossary

| Term | Meaning in this template |
|---|---|
| Alert | A check that flags a business result needing attention, not a model error |
| Calculation block | A group of rows that performs one calculation with its inputs shown locally |
| Corkscrew | Balance calculation: opening plus increases less decreases equals closing, carried to the next period |
| Daisy chain | A link that points to another link instead of the original source |
| Flag | A row of 1s and 0s that switches logic on or off by period |
| LTM | Last twelve months |
| Master check | Single cell summarising all error checks |
| Model of record | The only version of the model approved for producing outputs |
| Scenario | A named, stored set of input values selected by one switch |
| Sensitivity | Change of one or two inputs over a range to show the effect on outputs |

### 13.2 References

| Reference | Version or date checked | Use |
|---|---|---|
| FAST Standard, FAST Standard Organisation (fast-standard.org) | Version 02c, July 2019; licensed CC BY 4.0 (licence announced 2019-10-07), checked 2026-10-25 | Design principles and rule references in sections 3 and 7, adapted in own words |
| ICAEW Financial Modelling Code (ICAEW) | 2024 edition, name only | Alternative style framework |
| Best Practice Spreadsheet Modelling Standards (BPM), Spreadsheet Standards Review Board | Name only | Alternative style framework |
| [Group model risk policy] | [Version] | Tiering, inventory and review frequency |
| [Facility agreement] | [Date] | Covenant definitions, any model audit requirement |

## Standard and licence note

Structure aligned with common financial modelling practice for model
specifications. Design conventions informed by the FAST Standard 02c,
FAST Standard Organisation, CC BY 4.0 (fast-standard.org): the four
FAST principles, the four sheet classes and the rule references in
section 7 are adapted from that standard in original wording, with
changes (selection, rewording and model-specific examples); the FAST
Standard Organisation does not endorse this template. The ICAEW
Financial Modelling Code and the SSRB Best Practice Spreadsheet Modelling Standards
are cited by name only; no text from them is reproduced. Corvid
Commerce Group and every figure are fictional. This template is
original text written for this collection. Check the current official
version of each cited standard before use. Template licence: MIT.
