Make heavy calculations cheaper (2 of 2 met the bar)
Formulas that take a large share of a model's measured calculation effort and match a pattern with a known, safer alternative.
1. Consider replacing the long chain of IF tests in the line item 'Forecast Opex' in the module 'CAL03 Opex' with a lookup table
Caldergate FP&A
Why
A long chain of 'if this then that' tests is hard to maintain: each new case means editing the formula, and the mapping is easier to check when it sits as rows in a small table read with one lookup. Whether the table also calculates faster depends on the engine and the formula (Anaplan documents that IF stops at the first true branch), so treat the performance side as something to measure, not assume. In Caldergate FP&A, the line item 'Forecast Opex' in the module 'CAL03 Opex' carries 16.0% of the model's measured calculation effort, which is why it is worth a trial.
The line item
Line item
Module
Effort
Cells
Formula
Forecast Opex
CAL03 Opex
16.0%
5.0M
IF ITEM(Accounts) = Accounts.'6100 Rent' THEN 'INP02 Opex Drivers'.Rent ELSE IF ITEM(Accounts) = Accounts.'6110 Rates' THEN 'INP02 Opex Drivers'.Business Rates ELSE IF ITEM(Accounts) = Accounts.'6120 Utilities' THEN 'INP02 Opex Drivers'.Utilities ELSE IF ITEM(Accounts) = Accounts.'6200 Travel' THEN 'INP02 Opex Drivers'.Travel ELSE IF ITEM(Accounts) = Accounts.'6210 Subsistence' THEN 'INP02 Opex Drivers'.Subsistence ELSE IF ITEM(Accounts) = Accounts.'6300 Marketing' THEN 'INP02 Opex Drivers'.Marketing Events ELSE IF ITEM(Accounts) = Accounts.'6310 Digital' THEN 'INP02 Opex Drivers'.Marketing Digital ELSE IF ITEM(Accounts) = Accounts.'6400 Software' THEN 'INP02 Opex Drivers'.Software Licences ELSE IF ITEM(Accounts) = Accounts.'6410 Hardware' THEN 'INP02 Opex Drivers'.Hardware ELSE IF ITEM(Accounts) = Accounts.'6500 Professional Fees' THEN 'INP02 Opex Drivers'.Consultancy ELSE IF ITEM(Accounts) = Accounts.'6510 Audit' THEN 'INP02 Opex Drivers'.Audit Fees ELSE IF ITEM(Accounts) = Accounts.'6600 Recruitment' THEN 'INP02 Opex Drivers'.Recruitment Fees ELSE 0
Steps
In a development copy, load the 'case to value' table (listed below) into a small mapping module keyed by the list the tests refer to.
Replace the chain in the line item 'Forecast Opex' in the module 'CAL03 Opex' with a single lookup on that table; keep the old formula in a note until the check below passes.
Export the line item before and after and confirm every cell is equal; read Calculation Effort before and after and keep the change only if it is at least as good.
Done when
Every cell is equal before and after, the table holds every case the chain held, and the measured effort is no worse.
2. Stop repeating text-to-item lookups (FINDITEM) on every cell in Caldergate FP&A (1 formula)
Caldergate FP&A
Why
Anaplan runs a formula once for every cell of a module. When a formula only turns a text value into a label or a list item (for example a month code into a Time item), and that answer is the same for every cell that shares the code, working it out on every cell of a large grid is wasted effort. Moving the formula into a small helper module that has only the list the answer depends on means it is worked out once per item and simply looked up from there. In Caldergate FP&A this applies to the line item 'Journal Cost Centre' in the module 'DAT01 Actuals GL': together 5.0M cells and 6.2% of the model's measured calculation effort.
The line item
Line item
Module
Effort
Cells
Formula
Journal Cost Centre
DAT01 Actuals GL
6.2%
5.0M
FINDITEM(Cost Centres, Source Journal)
Steps
Open the line item 'Journal Cost Centre' in the module 'DAT01 Actuals GL' (6.2% of measured effort) and note which list its value actually changes with (often Time, or one list).
In a development copy of the model, create a small system module with just that list, put the formula there, and point the places that used the old formula at the new one. Keep the old line item until the check below passes.
Compare the results before and after, and read the Calculation Effort column before and after.
Done when
Every value that used the result still matches the original, cell for cell, and the measured effort share has fallen.
Check whether modules are still used (1 of 4 met the bar)
Modules that no formula reads and no export uses; someone has to check pages and views before they can be kept or retired.
3. Find out whether anyone still uses the module 'CAL05 Opex OLD' in Caldergate FP&A
Caldergate FP&A
Why
A module that no formula reads and no export uses may be left over from earlier work, or it may be read only by pages and views, which the exports do not show. Until someone checks, it can neither be removed nor trusted. In Caldergate FP&A, no formula outside the module 'CAL05 Opex OLD' reads any of its 14 line items and no export reads it; it occupies 70.2M cells and 50.8% of the model's measured calculation effort. That is what it takes up now, not a saving.
Steps
Ask the page builder whether any page, dashboard, saved view or line item subset still uses 'CAL05 Opex OLD'.
Ask whether another model imports from a saved view on it.
Record the decision: keep, or retire. If retire: make the change in a development copy first, keep the original for comparison, check the owner's key outputs over a full cycle, then sign off.
Done when
Every question above has a recorded answer and the owner has signed a keep-or-retire decision.
5. Find out whether anyone still uses the module 'SYS01 Time' in Board Reporting
Board Reporting
Why
A module that no formula reads and no export uses may be left over from earlier work, or it may be read only by pages and views, which the exports do not show. Until someone checks, it can neither be removed nor trusted. In Board Reporting, no formula outside the module 'SYS01 Time' reads any of its 2 line items and no export reads it; it occupies 72 cells and 2.8% of the model's measured calculation effort. That is what it takes up now, not a saving.
Steps
Ask the page builder whether any page, dashboard, saved view or line item subset still uses 'SYS01 Time'.
Ask whether another model imports from a saved view on it.
Record the decision: keep, or retire. If retire: make the change in a development copy first, keep the original for comparison, check the owner's key outputs over a full cycle, then sign off.
Done when
Every question above has a recorded answer and the owner has signed a keep-or-retire decision.
Below the bar: the module holds 72 cells and 2.8% of its model's measured effort, below the 50M cells or 5% of effort at which a consumer check is worth someone's time before the actions above.
9. Find out whether anyone still uses the module 'zz Archive - 2021 Cost' in Workforce Planning
Workforce Planning
Why
A module that no formula reads and no export uses may be left over from earlier work, or it may be read only by pages and views, which the exports do not show. Until someone checks, it can neither be removed nor trusted. In Workforce Planning, no formula outside the module 'zz Archive - 2021 Cost' reads any of its 3 line items and no export reads it; it occupies 13.4K cells. That is what it takes up now, not a saving.
Steps
Ask the page builder whether any page, dashboard, saved view or line item subset still uses 'zz Archive - 2021 Cost'.
Ask whether another model imports from a saved view on it.
Record the decision: keep, or retire. If retire: make the change in a development copy first, keep the original for comparison, check the owner's key outputs over a full cycle, then sign off.
Done when
Every question above has a recorded answer and the owner has signed a keep-or-retire decision.
Below the bar: the module holds 13.4K cells, below the 50M cells or 5% of effort at which a consumer check is worth someone's time before the actions above.
10. Find out whether anyone still uses the module 'SYS01 Time Settings' in Caldergate Data Hub
Caldergate Data Hub
Why
A module that no formula reads and no export uses may be left over from earlier work, or it may be read only by pages and views, which the exports do not show. Until someone checks, it can neither be removed nor trusted. In Caldergate Data Hub, no formula outside the module 'SYS01 Time Settings' reads any of its 5 line items and no export reads it; it occupies 180 cells. That is what it takes up now, not a saving.
Steps
Ask the page builder whether any page, dashboard, saved view or line item subset still uses 'SYS01 Time Settings'.
Ask whether another model imports from a saved view on it.
Record the decision: keep, or retire. If retire: make the change in a development copy first, keep the original for comparison, check the owner's key outputs over a full cycle, then sign off.
Done when
Every question above has a recorded answer and the owner has signed a keep-or-retire decision.
Below the bar: the module holds 180 cells, below the 50M cells or 5% of effort at which a consumer check is worth someone's time before the actions above.
Look at where the calculation time goes (0 of 2 met the bar)
The heaviest calculations in a model that match no known pattern: a place to look with the owner, not a change to make.
4. Look at the five heaviest calculations in Caldergate Data Hub
Caldergate Data Hub
Why
Anaplan records how much of a model's calculation effort each line item takes. In Caldergate Data Hub, ten line items take 99.9% of it, led by the line item 'Loaded?' in the module 'DAT01 GL Transactions' at 88.3%. None of them matches a known pattern this report can name, so this is a place to look, not a change to make: heavy calculation is often simply the model doing its main job.
With the owner, read the five heaviest formulas (listed below) and note what each one is for and how often it changes.
For each, decide: leave as is, or one named change to try (for example the patterns in the other actions).
Try at most one change in a development copy, reading Calculation Effort before and after.
Done when
Each of the five has a recorded decision (keep, or one named change to trial) agreed with the owner.
Below the bar: this is an observation of where calculation time goes, not a change with a measured benefit; the five line items hold 1.3M cells (under 50M), so it is not worth someone's time before the actions above.
8. Look at the five heaviest calculations in Board Reporting
Board Reporting
Why
Anaplan records how much of a model's calculation effort each line item takes. In Board Reporting, ten line items take 89.7% of it, led by the line item 'Revenue per FTE' in the module 'CAL01 KPIs' at 11.2%. None of them matches a known pattern this report can name, so this is a place to look, not a change to make: heavy calculation is often simply the model doing its main job.
With the owner, read the five heaviest formulas (listed below) and note what each one is for and how often it changes.
For each, decide: leave as is, or one named change to try (for example the patterns in the other actions).
Try at most one change in a development copy, reading Calculation Effort before and after.
Done when
Each of the five has a recorded decision (keep, or one named change to trial) agreed with the owner.
Below the bar: this is an observation of where calculation time goes, not a change with a measured benefit; the five line items hold 720 cells (under 50M), so it is not worth someone's time before the actions above.
Remove duplicated calculations (0 of 2 met the bar)
The same calculation kept under more than one name; one copy can be dropped once the reason for the second is ruled out.
6. Remove 1 duplicate copy of one calculation in Caldergate FP&A
Caldergate FP&A
Why
The same calculation exists more than once under different names, with the same formula and the same dimensions. Two copies can drift apart when one is changed, and each copy takes space and calculation time. In Caldergate FP&A, the line item 'Depreciation' in the module 'OUT01 Management Pack' is the same calculation as the line item 'Depreciation' in the module 'CAL07 P&L by Cost Centre'; the copies occupy 19.2K cells and 0 other formulas read them.
The 2 line items
Line item
Module
Role
Cells
Formula
Depreciation
CAL07 P&L by Cost Centre
kept
19.2K
'CAL10 Depreciation'.Charge
Depreciation
OUT01 Management Pack
copy
19.2K
'CAL10 Depreciation'.Charge
Steps
Ask the owner and page builder whether any copy exists for a reason: a page that shows it under that name, an export column, or different access rights.
In a development copy, point the 0 formulas that read the copies at the line item 'Depreciation' in the module 'CAL07 P&L by Cost Centre' instead; keep the copies until the check below passes.
Compare the outputs that depend on them cell for cell, get sign-off, then remove the copies.
Done when
Everything that read the copies gives the same values from the kept line item, and the copies are gone with no blank page or missing export column.
Below the bar: the footprint is small (under 1% of its model's measured effort and under 1M cells), so the gain is unlikely to repay the work.
7. Remove 1 duplicate copy of one calculation in Workforce Planning
Workforce Planning
Why
The same calculation exists more than once under different names, with the same formula and the same dimensions. Two copies can drift apart when one is changed, and each copy takes space and calculation time. In Workforce Planning, the line item 'Headcount' in the module 'zz Archive - 2021 Cost' is the same calculation as the line item 'Headcount' in the module 'Calcs - Attrition'; the copies occupy 4.5K cells and 1 other formulas read them.
Ask the owner and page builder whether any copy exists for a reason: a page that shows it under that name, an export column, or different access rights.
In a development copy, point the 1 formulas that read the copies at the line item 'Headcount' in the module 'Calcs - Attrition' instead; keep the copies until the check below passes.
Compare the outputs that depend on them cell for cell, get sign-off, then remove the copies.
Done when
Everything that read the copies gives the same values from the kept line item, and the copies are gone with no blank page or missing export column.
Below the bar: the footprint is small (under 1% of its model's measured effort and under 1M cells), so the gain is unlikely to repay the work.
The module 'zz Archive - 2021 Cost' may no longer be used: do that check first, since a retired module needs no tuning.
All 10 candidates are shown; 3 met the bar for being worth doing. The order is a hypothesis, not a verdict. How chosen · Coverage · All findings
The findings catalogue and the Change impact explorer apply to any model the exports describe. The action cards are pattern-matched suggestions from a small set of known patterns (per-cell text labels, SUM with LOOKUP, long IF chains, duplicated calculations, modules with no detected reader); on an estate whose problems lie elsewhere they will be few or absent, and the catalogue is the place to look.
Change impact
Select a model, module or line item. What depends on this follows readers downstream; what this depends on follows sources upstream. Links are parsed formula references; actions are shown at module level; model feeds are inferred from names and are a boundary, not a lineage.
Suggested start: SYS01 Time Settings.Actual? in Caldergate FP&A, the most-read line item there (36 direct readers).
No selection yet.
Evidence
Findings catalogue
Every finding, compact. Open one for the working detail: what was found, the proposed step, preconditions, dependencies, the validation plan, reasons to keep the design, all affected objects and the evidence. Search covers every object name, evidence row and formula. Status and note are yours; they are stored in this browser only and travel only through the working register download.
3 modules with no consumer detected in the inspected dependency types All 3 modules: CAL05 Opex OLD, CAL06 Department Summary, CAL08 Cash Flow
Caldergate FP&A
Complete the consumer and retention checks (pages, saved views, line item subsets, integrations, access drivers, retained data) for the largest module first, then the rest of the five largest, and record a keep-or-retire recommendation for each.
Where measured calculation effort concentrates Showing 3 of 15 line items: DAT01 GL Transactions.Loaded?, CAL01 Volume Summary.Units, CAL01 Volume Summary.Revenue
Caldergate Data Hub
Read the formulas of the top five and match each against the other findings that name it (SUM with LOOKUP, IF chains, text in large modules); decide which one to trial in a development copy first.
Where measured calculation effort concentrates Showing 3 of 20 line items: CAL03 Opex.Forecast Opex, CAL03 Opex.Opex GBP, CAL05 Opex OLD.Opex GBP
Caldergate FP&A
Read the formulas of the top five and match each against the other findings that name it (SUM with LOOKUP, IF chains, text in large modules); decide which one to trial in a development copy first.
Where measured calculation effort concentrates Showing 3 of 13 line items: CAL01 KPIs.Revenue per FTE, CAL01 KPIs.Opex Ratio, CAL01 KPIs.Revenue Growth
Board Reporting
Read the formulas of the top five and match each against the other findings that name it (SUM with LOOKUP, IF chains, text in large modules); decide which one to trial in a development copy first.
Calculated line items with no consumer detected, outside output modules All 3 modules: DAT01 Actuals GL, CAL03 Opex, CAL02 Revenue
Caldergate FP&A
Complete the consumer and retention checks (pages, saved views, subsets, integrations, retained data) for the largest module's line items, then record a keep-or-retire recommendation for each.
1 module with no consumer detected in the inspected dependency types All 1 modules: SYS01 Time
Board Reporting
Complete the consumer and retention checks (pages, saved views, line item subsets, integrations, access drivers, retained data) for the largest module first, then the rest of the five largest, and record a keep-or-retire recommendation for each.
Line items that only copy another line item Showing 3 of 14 copy line items: CAL07 P&L by Cost Centre.Depreciation, CAL11 Reporting Prep.Revenue, CAL11 Reporting Prep.EBITDA
Caldergate FP&A
For the largest copies, establish what shows or exports them under their own name and whether access differs, then decide which copies are interfaces to keep.
Same calculation made more than once under different names All 1 groups (kept line item named): CAL07 P&L by Cost Centre.Depreciation
Caldergate FP&A
Validate equivalence and the reasons for separate objects in the largest group (access boundaries, a reporting contract on the copy's name, a page that shows it), then decide whether consolidation is appropriate.
Same calculation made more than once under different names All 1 groups (kept line item named): Calcs - Attrition.Headcount
Workforce Planning
Validate equivalence and the reasons for separate objects in the largest group (access boundaries, a reporting contract on the copy's name, a page that shows it), then decide whether consolidation is appropriate.
Text, FINDITEM and per-item functions in large multi-dimensional line items All 2 line items: DAT01 GL Transactions.Source System, DAT06 Sales Orders.Last Order Ref
Caldergate Data Hub
Start with the largest by cells; compute it once in a SYS module dimensioned by the list it depends on.
Text, FINDITEM and per-item functions in large multi-dimensional line items Showing 3 of 13 line items: DAT01 Actuals GL.Source Journal, DAT01 Actuals GL.Journal Cost Centre, CAL02 Revenue.Revenue Label
Caldergate FP&A
Start with the largest by cells; compute it once in a SYS module dimensioned by the list it depends on.
Hard-coded time period or version selections All 3 formulas: CAL07 P&L by Cost Centre.Opex Budget, OUT02 Board Pack.Budget Revenue, OUT02 Board Pack.Old Budget Revenue
Caldergate FP&A
Where the period is a moving concept (current year, prior year), hold it in a time-formatted line item and use LOOKUP.
Text, FINDITEM and per-item functions in large multi-dimensional line items All 3 line items: Data - Employees.Employee Name, Data - Employees.Name and Role, Data - Employees.Name and Role
Workforce Planning
Start with the largest by cells; compute it once in a SYS module dimensioned by the list it depends on.
DIVIDE() where a zero divisor shows Infinity All 3 formulas: Calcs - Headcount by CC.Average Salary, Reports - Headcount.Cost per FTE, zz Archive - 2021 Cost.Cost per Head
Workforce Planning
Confirm for each whether Infinity or NaN is acceptable on the pages that show it; no change is needed where it is.
1 module with no consumer detected in the inspected dependency types All 1 modules: zz Archive - 2021 Cost
Workforce Planning
Complete the consumer and retention checks (pages, saved views, line item subsets, integrations, access drivers, retained data) for the largest module first, then the rest of the five largest, and record a keep-or-retire recommendation for each.
2 modules with no consumer detected in the inspected dependency types All 2 modules: SYS01 Time Settings, SYS02 Data Checks
Caldergate Data Hub
Complete the consumer and retention checks (pages, saved views, line item subsets, integrations, access drivers, retained data) for the largest module first, then the rest of the five largest, and record a keep-or-retire recommendation for each.
Imports and exports with no recent recorded run or outside every process All 3 actions: Export Pipeline for Sales Ops, Import Customers from Salesforce, Import Products from PIM file
Caldergate Data Hub
For each action with no recorded run in the window, ask the owner how and how often it runs; document the answer in the action's notes.
Summary methods on large line items no formula reads Showing 3 of 30 line items: CAL01 Volumes.Volume Growth, CAL02 Revenue.Average Price, CAL02 Revenue.Revenue Growth
Caldergate FP&A
Check the largest ones on their pages; where no total is shown, set the summary to None.
Imports and exports with no recent recorded run or outside every process Showing 3 of 5 actions: Export Assumptions for Workforce, Export Opex Drivers to Excel, Import Budget from Excel
Caldergate FP&A
For each action with no recorded run in the window, ask the owner how and how often it runs; document the answer in the action's notes.
Imports and exports with no recent recorded run or outside every process All 3 actions: Export Headcount by Department, Export Leavers Report, Import from Caldergate FP&A - Assumptions
Workforce Planning
For each action with no recorded run in the window, ask the owner how and how often it runs; document the answer in the action's notes.
Caldergate Data Hub · DAT01 GL Transactions.Loaded? · CAL01 Volume Summary.Units · CAL01 Volume Summary.Revenue(Showing 3 of 15 line items; top 15 line items by effort share; ten summarised)
What was found
Ten line items carry 99.9% of Caldergate Data Hub's measured calculation effort; the largest is DAT01 GL Transactions.Loaded? at 88.3%.
Why it matters
Effort is where a redesign would show. Effort shares are Anaplan's Calculation Effort column for this model only. The engine is not in the export: Classic measures across the whole model at open, Polaris over the last ten minutes. A share of effort is not a promise of faster recalculation after removal.
Proposed step and benefit
Read the formulas of the top five and match each against the other findings that name it (SUM with LOOKUP, IF chains, text in large modules); decide which one to trial in a development copy first. Observed footprint only; no reduction is claimed. (footprint)
Caldergate FP&A · CAL03 Opex.Forecast Opex · CAL03 Opex.Opex GBP · CAL05 Opex OLD.Opex GBP(Showing 3 of 20 line items; top 20 line items by effort share; ten summarised)
What was found
Ten line items carry 68.0% of Caldergate FP&A's measured calculation effort; the largest is CAL03 Opex.Forecast Opex at 16.0%.
Why it matters
Effort is where a redesign would show. Effort shares are Anaplan's Calculation Effort column for this model only. The engine is not in the export: Classic measures across the whole model at open, Polaris over the last ten minutes. A share of effort is not a promise of faster recalculation after removal.
Proposed step and benefit
Read the formulas of the top five and match each against the other findings that name it (SUM with LOOKUP, IF chains, text in large modules); decide which one to trial in a development copy first. Observed footprint only; no reduction is claimed. (footprint)
IF ITEM(Accounts) = Accounts.'6100 Rent' THEN 'INP02 Opex Drivers'.Rent ELSE IF ITEM(Accounts) = Accounts.'6110 Rates' THEN 'INP02 Opex Drivers'.Business Rates ELSE IF ITEM(Accounts) = Accounts.'6120 Utilities' THEN 'INP02 Opex Drivers'.Utilities ELSE IF ITEM(Accounts) = Accounts.'6200 Travel' THEN 'INP02 Opex Drivers'.Travel ELSE IF ITEM(Accounts) = Accounts.'6210 Subsistence' THEN 'INP02 Opex Drivers'.Subsistence ELSE IF ITEM(Accounts) = Accounts.'6300 Marketing' THEN 'INP02 Opex Drivers'.Marketing Events ELSE IF ITEM(Accounts) = Accounts.'6310 Digital' THEN 'INP02 Opex Drivers'.Marketing Digital ELSE IF ITEM(Accounts) = Accounts.'6400 Software' THEN 'INP02 Opex Drivers'.Software Licences ELSE IF ITEM(Accounts) = Accounts.'6410 Hardware' THEN 'INP02 Opex Drivers'.Hardware ELSE IF ITEM(Accounts) = Accounts.'6500 Professional Fees' THEN 'INP02 Opex Drivers'.Consultancy ELSE IF ITEM(Accounts) = Accounts.'6510 Audit' THEN 'INP02 Opex Drivers'.Audit Fees ELSE IF ITEM(Accounts) = Accounts.'6600 Recruitment' THEN 'INP02 Opex Drivers'.Recruitment Fees ELSE 0
CAL03 Opex.Opex GBP
9.26%
5.0M
Opex * 'SYS05 FX Rates'.Rate to GBP[LOOKUP: 'SYS02 Cost Centre Attributes'.Currency]
CAL05 Opex OLD.Opex GBP
9.26%
5.0M
Opex * 'SYS05 FX Rates'.Rate to GBP[LOOKUP: 'SYS02 Cost Centre Attributes'.Currency]
Board Reporting · CAL01 KPIs.Revenue per FTE · CAL01 KPIs.Opex Ratio · CAL01 KPIs.Revenue Growth(Showing 3 of 13 line items; top 13 line items by effort share; ten summarised)
What was found
Ten line items carry 89.7% of Board Reporting's measured calculation effort; the largest is CAL01 KPIs.Revenue per FTE at 11.2%.
Why it matters
Effort is where a redesign would show. Effort shares are Anaplan's Calculation Effort column for this model only. The engine is not in the export: Classic measures across the whole model at open, Polaris over the last ten minutes. A share of effort is not a promise of faster recalculation after removal.
Proposed step and benefit
Read the formulas of the top five and match each against the other findings that name it (SUM with LOOKUP, IF chains, text in large modules); decide which one to trial in a development copy first. Observed footprint only; no reduction is claimed. (footprint)
Caldergate Data Hub · DAT01 GL Transactions.Source System · DAT06 Sales Orders.Last Order Ref(All 2 line items; 2 line items)
What was found
2 line items compute a text value, a FINDITEM, a text join or a per-item function (ITEM, PARENT, NAME, CODE) in a line item with many cells.
Why it matters
Computed once per cell here; computed once per list item in a one-dimension system module. Anaplan's checklist recommends the system module.
Proposed step and benefit
Start with the largest by cells; compute it once in a SYS module dimensioned by the list it depends on. Observed footprint only; improvement would be measured after the change. (footprint)
text: Text, FINDITEM and per-item functions in large multi-dimensional line items 2 line items compute a text value, a FINDITEM, a text join or a per-item function (ITEM, PARENT, NAME, CODE) in a line item with many cells. Computed once per cell here; computed once per list item in a one-dimension system module. Anaplan's checklist recommends the system module. 2 line items
object: DAT01 GL Transactions.Source System
object: DAT06 Sales Orders.Last Order Ref
evidence: Line item | What | Cells | Effort share | Formula
object: DAT01 GL Transactions.Source System
evidence: DAT01 GL Transactions.Source System | Text-formatted line item | 1.3M | 0.00% |
object: DAT06 Sales Orders.Last Order Ref
evidence: DAT06 Sales Orders.Last Order Ref | Text-formatted line item | 726K | 0.00% |
1 formulas combine SUM with LOOKUP or SELECT. Anaplan's documentation: "Never use SUM and LOOKUP in the same formula. This can lead to extremely long calculation times." and "Never combine SUM and SELECT in the same formula."
Why it matters
The documented concern is calculation time. Whether splitting a particular formula helps is not guaranteed; the documented approach is one line item to aggregate and another to look up or select from it.
Proposed step and benefit
Take the formula with the largest effort share; split it in a sandbox copy; compare Calculation Effort before and after. Observed: the listed effort shares. Improvement would have to be measured after the change. (footprint)
Preconditions and missing information
measured effort after a trial split
Preconditions and steps
Prerequisites: a development copy and a Calculation Effort reading before the change. Then split, reconcile values cell for cell, read effort again; keep the split only if it pays.
text: SUM combined with LOOKUP or SELECT in one formula 1 formulas combine SUM with LOOKUP or SELECT. Anaplan's documentation: "Never use SUM and LOOKUP in the same formula. This can lead to extremely long calculation times." and "Never combine SUM and SELECT in the same formula." The documented concern is calculation time. Whether splitting a particular formula helps is not guaranteed; the documented approach is one line item to aggregate and another to look up or select from it. 1 formula; together 0.0% of Caldergate FP&A's measured effort
object: CAL06 Department Summary.Benchmark Opex
evidence: Line item | Combination | Effort share | Formula
object: CAL06 Department Summary.Benchmark Opex
formula: 'CAL03 Opex'.Opex GBP[SUM: 'SYS02 Cost Centre Attributes'.Department, LOOKUP: 'SYS09 Department Settings'.Benchmark Account]
evidence: CAL06 Department Summary.Benchmark Opex | SUM with LOOKUP in one formula (in the same bracket) | 0.00% | 'CAL03 Opex'.Opex GBP[SUM: 'SYS02 Cost Centre Attributes'.Department, LOOKUP: 'SYS09 Department Settings'.Benchmark Account]
Caldergate FP&A · DAT01 Actuals GL.Source Journal · DAT01 Actuals GL.Journal Cost Centre · CAL02 Revenue.Revenue Label(Showing 3 of 13 line items; 13 line items)
What was found
13 line items compute a text value, a FINDITEM, a text join or a per-item function (ITEM, PARENT, NAME, CODE) in a line item with many cells.
Why it matters
Computed once per cell here; computed once per list item in a one-dimension system module. Anaplan's checklist recommends the system module.
Proposed step and benefit
Start with the largest by cells; compute it once in a SYS module dimensioned by the list it depends on. Observed footprint only; improvement would be measured after the change. (footprint)
IF ITEM(Accounts) = Accounts.'6100 Rent' THEN 'INP02 Opex Drivers'.Rent ELSE IF ITEM(Accounts) = Accounts.'6110 Rates' THEN 'INP02 Opex Drivers'.Business Rates ELSE IF ITEM(Accounts) = Accounts.'6120 Utilities' THEN 'INP02 Opex Drivers'.Utilities ELSE IF ITEM(Accounts) = Accounts.'6200 Travel' THEN 'INP02 Opex Drivers'.Travel ELSE IF ITEM(Accounts) = Accounts.'6210 Subsistence' THEN 'INP02 Opex Drivers'.Subsistence ELSE IF ITEM(Accounts) = Accounts.'6300 Marketing' THEN 'INP02 Opex Drivers'.Marketing Events ELSE IF ITEM(Accounts) = Accounts.'6310 Digital' THEN 'INP02 Opex Drivers'.Marketing Digital ELSE IF ITEM(Accounts) = Accounts.'6400 Software' THEN 'INP02 Opex Drivers'.Software Licences ELSE IF ITEM(Accounts) = Accounts.'6410 Hardware' THEN 'INP02 Opex Drivers'.Hardware ELSE IF ITEM(Accounts) = Accounts.'6500 Professional Fees' THEN 'INP02 Opex Drivers'.Consultancy ELSE IF ITEM(Accounts) = Accounts.'6510 Audit' THEN 'INP02 Opex Drivers'.Audit Fees ELSE IF ITEM(Accounts) = Accounts.'6600 Recruitment' THEN 'INP02 Opex Drivers'.Recruitment Fees ELSE 0
CAL05 Opex OLD.Fees Forecast
Unchanging function in a calculation module
5.0M
2.47%
IF ITEM(Accounts) = Accounts.'6500 Professional Fees' THEN 'INP02 Opex Drivers'.Consultancy ELSE 0
CAL05 Opex OLD.Marketing Forecast
Unchanging function in a calculation module
5.0M
2.47%
IF ITEM(Accounts) = Accounts.'6300 Marketing' THEN 'INP02 Opex Drivers'.Marketing Events ELSE 0
CAL05 Opex OLD.Other Forecast
Unchanging function in a calculation module
5.0M
2.47%
IF ITEM(Accounts) = Accounts.'6900 Other' THEN 'INP02 Opex Drivers'.Other Opex ELSE 0
CAL05 Opex OLD.Rates Forecast
Unchanging function in a calculation module
5.0M
2.47%
IF ITEM(Accounts) = Accounts.'6110 Rates' THEN 'INP02 Opex Drivers'.Business Rates ELSE 0
CAL05 Opex OLD.Rent Forecast
Unchanging function in a calculation module
5.0M
2.47%
IF ITEM(Accounts) = Accounts.'6100 Rent' THEN 'INP02 Opex Drivers'.Rent ELSE 0
CAL05 Opex OLD.Software Forecast
Unchanging function in a calculation module
5.0M
2.47%
IF ITEM(Accounts) = Accounts.'6400 Software' THEN 'INP02 Opex Drivers'.Software Licences ELSE 0
CAL05 Opex OLD.Travel Forecast
Unchanging function in a calculation module
5.0M
2.47%
IF ITEM(Accounts) = Accounts.'6200 Travel' THEN 'INP02 Opex Drivers'.Travel ELSE 0
CAL05 Opex OLD.Utilities Forecast
Unchanging function in a calculation module
5.0M
2.47%
IF ITEM(Accounts) = Accounts.'6120 Utilities' THEN 'INP02 Opex Drivers'.Utilities ELSE 0
Validation plan
Baseline: record the outputs the owner names (and Calculation Effort where relevant) in production before any change.
Make the proposed change in a development copy, keeping the original state for comparison and recovery.
Use comparable inputs and scenarios in both copies; reconcile the named outputs cell for cell.
Agree acceptance criteria with the model owner before promotion. A status change in this report is not evidence of success.
Workforce Planning · Data - Employees.Employee Name · Data - Employees.Name and Role · Data - Employees.Name and Role(All 3 line items; 3 line items)
What was found
3 line items compute a text value, a FINDITEM, a text join or a per-item function (ITEM, PARENT, NAME, CODE) in a line item with many cells.
Why it matters
Computed once per cell here; computed once per list item in a one-dimension system module. Anaplan's checklist recommends the system module.
Proposed step and benefit
Start with the largest by cells; compute it once in a SYS module dimensioned by the list it depends on. Observed footprint only; improvement would be measured after the change. (footprint)
text: Text, FINDITEM and per-item functions in large multi-dimensional line items 3 line items compute a text value, a FINDITEM, a text join or a per-item function (ITEM, PARENT, NAME, CODE) in a line item with many cells. Computed once per cell here; computed once per list item in a one-dimension system module. Anaplan's checklist recommends the system module. 3 line items
object: Data - Employees.Employee Name
object: Data - Employees.Name and Role
object: Data - Employees.Name and Role
evidence: Line item | What | Cells | Effort share | Formula
object: Data - Employees.Employee Name
evidence: Data - Employees.Employee Name | Text-formatted line item | 66.6K | n/a |
object: Data - Employees.Name and Role
formula: Employee Name & " (" & NAME(Role) & ")"
evidence: Data - Employees.Name and Role | Text-formatted line item | 66.6K | n/a | Employee Name & " (" & NAME(Role) & ")"
object: Data - Employees.Name and Role
formula: Employee Name & " (" & NAME(Role) & ")"
evidence: Data - Employees.Name and Role | Text concatenation in a large line item | 66.6K | n/a | Employee Name & " (" & NAME(Role) & ")"
Objects with no consumer detected in the inspected dependency types. Pages, saved views and subsets are not in the exports, so each carries outstanding checks.
F1. 3 modules with no consumer detected in the inspected dependency types
F1. 3 modules with no consumer detected in the inspected dependency types
Caldergate FP&A · CAL05 Opex OLD · CAL06 Department Summary · CAL08 Cash Flow(All 3 modules; 3 modules, 30 line items)
What was found
No formula outside these modules reads any of their line items, and no export action reads them. Together they hold 70.3M cells and 50.8% of Caldergate FP&A's measured calculation effort. The five largest: CAL05 Opex OLD, CAL06 Department Summary, CAL08 Cash Flow.
Why it matters
No consumer was detected in the inspected relationships (parsed formula references, export actions). Pages, saved views, subsets and integrations are not in the exports, and incomplete parsing or missing metadata can hide a reader, so a consumer remains possible. The footprint says which to ask about first.
Proposed step and benefit
Complete the consumer and retention checks (pages, saved views, line item subsets, integrations, access drivers, retained data) for the largest module first, then the rest of the five largest, and record a keep-or-retire recommendation for each. If no consumer is found: 70.3M cells as exported; 50.8% of Caldergate FP&A's measured calculation effort would no longer be held or measured. Per module in the table. (conditional)
Preconditions and missing information
UX pages and classic dashboards that show each listed module (no export exists; the page builder or the Modules export's Used in Dashboards column for classic dashboards)
saved views on each listed module: another model can import from a saved view without any export action existing here
line item subsets that include line items of each listed module (COLLECT sources are not in the export)
filters, access drivers, DCA and integration (CloudWorks, API) references
Preconditions and steps
Prerequisites: every consumer check returned none, retained data is not needed, and the model owner has accepted the recommendation.
Then: in a development copy, make the proposed change (retire or repoint) while keeping the original module intact for comparison and recovery; reconcile the outputs the owner names against production over a full cycle; obtain owner sign-off; only then apply in production.
A module containing matching line items: repoint any page from the module to the matching line items first, and account for the unmatched line items separately.
partial. No formula consumer detected (parsed references, checked against Referenced By); export actions: none detected. Dependency coverage for Caldergate FP&A: parsed-formula edges agree with Anaplan's Referenced By at 100% (0 edges Anaplan lists that the parse did not).
Reasons to keep the design
A module read only by pages, a view another model imports, or an audit-retained snapshot is doing its job with no formula reader. Retained data in an import target may be needed for history. A module containing matching line items is not a duplicate of the module they match until the unmatched line items and the consumers are accounted for.
All affected objects (3 modules)
CAL05 Opex OLD · CAL06 Department Summary · CAL08 Cash Flow
Evidence (3 rows)
Module
Line items
Cells
Effort share
Exact twin in a read module
Coverage
Unmatched
Import target
Unparsed / COLLECT
Note
CAL05 Opex OLD
14
70.2M
50.8%
0 / 0
Replaced by CAL03 in 2021. Keep until the FY22 audit is closed.
CAL06 Department Summary
6
15.6K
0.0%
0 / 0
CAL08 Cash Flow
10
5.8K
0.0%
0 / 0
Validation plan
After a removal, the Line Items export no longer lists the module and every page listed in the check opens without a blank card. Cell counts are an observed footprint; any memory or open-time change is measured in the workspace, not assumed from cells.
Baseline: record the outputs the owner names (and Calculation Effort where relevant) in production before any change.
Make the proposed change in a development copy, keeping the original state for comparison and recovery.
Use comparable inputs and scenarios in both copies; reconcile the named outputs cell for cell.
Agree acceptance criteria with the model owner before promotion. A status change in this report is not evidence of success.
text: 3 modules with no consumer detected in the inspected dependency types No formula outside these modules reads any of their line items, and no export action reads them. Together they hold 70.3M cells and 50.8% of Caldergate FP&A's measured calculation effort. The five largest: `CAL05 Opex OLD`, `CAL06 Department Summary`, `CAL08 Cash Flow`. No consumer was detected in the inspected relationships (parsed formula references, export actions). Pages, saved views, subsets and integrations are not in the exports, and incomplete parsing or missing metadata can hide a reader, so a consumer remains possible. The footprint says which to ask about first. 3 modules, 30 line items
object: CAL05 Opex OLD
object: CAL06 Department Summary
object: CAL08 Cash Flow
evidence: Module | Line items | Cells | Effort share | Exact twin in a read module | Coverage | Unmatched | Import target | Unparsed / COLLECT | Note
object: CAL05 Opex OLD
evidence: CAL05 Opex OLD | 14 | 70.2M | 50.8% | | | | | 0 / 0 | Replaced by CAL03 in 2021. Keep until the FY22 audit is closed.
object: CAL06 Department Summary
evidence: CAL06 Department Summary | 6 | 15.6K | 0.0% | | | | | 0 / 0 |
object: CAL08 Cash Flow
evidence: CAL08 Cash Flow | 10 | 5.8K | 0.0% | | | | | 0 / 0 |
5 calculated line items in 3 modules are read by no formula, are not read by an export action, are not in an output-style module and have no matching line item elsewhere.
Why it matters
Each is computed and stored; if nothing reads it the footprint is spare. If a page reads it, it is an output that lives in a calculation module.
Proposed step and benefit
Complete the consumer and retention checks (pages, saved views, subsets, integrations, retained data) for the largest module's line items, then record a keep-or-retire recommendation for each. If no consumer is found: 15.1M cells as exported; 10.0% of Caldergate FP&A's measured calculation effort. (conditional)
Preconditions and missing information
pages, saved views, line item subsets and integrations for each listed module
the 29 unreferenced line items that look like outputs by module name, format or time scale are not listed here
Preconditions and steps
Prerequisites: consumer checks returned none and the owner accepts. Then make the proposed change in a development copy with the originals kept for comparison, reconcile named outputs over a cycle, owner sign-off, apply.
partial. Parsed references and export actions only. Dependency coverage for Caldergate FP&A: parsed-formula edges agree with Anaplan's Referenced By at 100% (0 edges Anaplan lists that the parse did not).
Reasons to keep the design
A line item read only by a page is not spare. A calculation kept for audit or reconciliation can be right to keep even if nothing reads it now.
All affected objects (3 modules)
DAT01 Actuals GL · CAL03 Opex · CAL02 Revenue
Evidence (3 rows)
Module
Line items with no formula consumer
Cells
Effort share
DAT01 Actuals GL
Journal Cost Centre, Loaded?
10.0M
7.7%
CAL03 Opex
Opex Variance
5.0M
2.3%
CAL02 Revenue
Revenue USD, VAT
72.6K
0.0%
Validation plan
Re-run this report after removal: the list shrinks to the line items a page needs.
Baseline: record the outputs the owner names (and Calculation Effort where relevant) in production before any change.
Make the proposed change in a development copy, keeping the original state for comparison and recovery.
Use comparable inputs and scenarios in both copies; reconcile the named outputs cell for cell.
Agree acceptance criteria with the model owner before promotion. A status change in this report is not evidence of success.
text: Calculated line items with no consumer detected, outside output modules 5 calculated line items in 3 modules are read by no formula, are not read by an export action, are not in an output-style module and have no matching line item elsewhere. Each is computed and stored; if nothing reads it the footprint is spare. If a page reads it, it is an output that lives in a calculation module. 5 line items in 3 modules
object: DAT01 Actuals GL
object: CAL03 Opex
object: CAL02 Revenue
evidence: Module | Line items with no formula consumer | Cells | Effort share
object: DAT01 Actuals GL
object: Journal Cost Centre
object: Loaded?
evidence: DAT01 Actuals GL | Journal Cost Centre, Loaded? | 10.0M | 7.7%
object: CAL03 Opex
object: Opex Variance
evidence: CAL03 Opex | Opex Variance | 5.0M | 2.3%
object: CAL02 Revenue
object: Revenue USD
object: VAT
evidence: CAL02 Revenue | Revenue USD, VAT | 72.6K | 0.0%
No formula outside these modules reads any of their line items, and no export action reads them. Together they hold 72 cells and 2.8% of Board Reporting's measured calculation effort. The five largest: SYS01 Time.
Why it matters
No consumer was detected in the inspected relationships (parsed formula references, export actions). Pages, saved views, subsets and integrations are not in the exports, and incomplete parsing or missing metadata can hide a reader, so a consumer remains possible. The footprint says which to ask about first.
Proposed step and benefit
Complete the consumer and retention checks (pages, saved views, line item subsets, integrations, access drivers, retained data) for the largest module first, then the rest of the five largest, and record a keep-or-retire recommendation for each. If no consumer is found: 72 cells as exported; 2.8% of Board Reporting's measured calculation effort would no longer be held or measured. Per module in the table. (conditional)
Preconditions and missing information
UX pages and classic dashboards that show each listed module (no export exists; the page builder or the Modules export's Used in Dashboards column for classic dashboards)
saved views on each listed module: another model can import from a saved view without any export action existing here
line item subsets that include line items of each listed module (COLLECT sources are not in the export)
filters, access drivers, DCA and integration (CloudWorks, API) references
Preconditions and steps
Prerequisites: every consumer check returned none, retained data is not needed, and the model owner has accepted the recommendation.
Then: in a development copy, make the proposed change (retire or repoint) while keeping the original module intact for comparison and recovery; reconcile the outputs the owner names against production over a full cycle; obtain owner sign-off; only then apply in production.
A module containing matching line items: repoint any page from the module to the matching line items first, and account for the unmatched line items separately.
Dependencies
SYS01 Time(Change impact: what depends on it, what it depends on)
Evidence strength
partial. No formula consumer detected (parsed references, checked against Referenced By); export actions: none detected. Dependency coverage for Board Reporting: parsed-formula edges agree with Anaplan's Referenced By at 100% (0 edges Anaplan lists that the parse did not).
Reasons to keep the design
A module read only by pages, a view another model imports, or an audit-retained snapshot is doing its job with no formula reader. Retained data in an import target may be needed for history. A module containing matching line items is not a duplicate of the module they match until the unmatched line items and the consumers are accounted for.
All affected objects (1 modules)
SYS01 Time
Evidence (1 rows)
Module
Line items
Cells
Effort share
Exact twin in a read module
Coverage
Unmatched
Import target
Unparsed / COLLECT
Note
SYS01 Time
2
72
2.8%
0 / 0
Validation plan
After a removal, the Line Items export no longer lists the module and every page listed in the check opens without a blank card. Cell counts are an observed footprint; any memory or open-time change is measured in the workspace, not assumed from cells.
Baseline: record the outputs the owner names (and Calculation Effort where relevant) in production before any change.
Make the proposed change in a development copy, keeping the original state for comparison and recovery.
Use comparable inputs and scenarios in both copies; reconcile the named outputs cell for cell.
Agree acceptance criteria with the model owner before promotion. A status change in this report is not evidence of success.
text: 1 module with no consumer detected in the inspected dependency types No formula outside these modules reads any of their line items, and no export action reads them. Together they hold 72 cells and 2.8% of Board Reporting's measured calculation effort. The five largest: `SYS01 Time`. No consumer was detected in the inspected relationships (parsed formula references, export actions). Pages, saved views, subsets and integrations are not in the exports, and incomplete parsing or missing metadata can hide a reader, so a consumer remains possible. The footprint says which to ask about first. 1 module, 2 line items
object: SYS01 Time
evidence: Module | Line items | Cells | Effort share | Exact twin in a read module | Coverage | Unmatched | Import target | Unparsed / COLLECT | Note
object: SYS01 Time
evidence: SYS01 Time | 2 | 72 | 2.8% | | | | | 0 / 0 |
No formula outside these modules reads any of their line items, and no export action reads them. Together they hold 13.4K cells. The five largest: zz Archive - 2021 Cost.
Why it matters
No consumer was detected in the inspected relationships (parsed formula references, export actions). Pages, saved views, subsets and integrations are not in the exports, and incomplete parsing or missing metadata can hide a reader, so a consumer remains possible. The footprint says which to ask about first.
Proposed step and benefit
Complete the consumer and retention checks (pages, saved views, line item subsets, integrations, access drivers, retained data) for the largest module first, then the rest of the five largest, and record a keep-or-retire recommendation for each. If no consumer is found: 13.4K cells as exported would no longer be held or measured. Per module in the table. (conditional)
Preconditions and missing information
UX pages and classic dashboards that show each listed module (no export exists; the page builder or the Modules export's Used in Dashboards column for classic dashboards)
saved views on each listed module: another model can import from a saved view without any export action existing here
line item subsets that include line items of each listed module (COLLECT sources are not in the export)
filters, access drivers, DCA and integration (CloudWorks, API) references
Preconditions and steps
Prerequisites: every consumer check returned none, retained data is not needed, and the model owner has accepted the recommendation.
Then: in a development copy, make the proposed change (retire or repoint) while keeping the original module intact for comparison and recovery; reconcile the outputs the owner names against production over a full cycle; obtain owner sign-off; only then apply in production.
A module containing matching line items: repoint any page from the module to the matching line items first, and account for the unmatched line items separately.
partial. No formula consumer detected (parsed references, checked against Referenced By); export actions: none detected. Dependency coverage for Workforce Planning: parsed-formula edges agree with Anaplan's Referenced By at 100% (0 edges Anaplan lists that the parse did not).
Reasons to keep the design
A module read only by pages, a view another model imports, or an audit-retained snapshot is doing its job with no formula reader. Retained data in an import target may be needed for history. A module containing matching line items is not a duplicate of the module they match until the unmatched line items and the consumers are accounted for.
All affected objects (1 modules)
zz Archive - 2021 Cost
Evidence (1 rows)
Module
Line items
Cells
Effort share
Exact twin in a read module
Coverage
Unmatched
Import target
Unparsed / COLLECT
Note
zz Archive - 2021 Cost
3
13.4K
0.0%
0 / 0
Old cost calc from go-live. Kept for reference.
Validation plan
After a removal, the Line Items export no longer lists the module and every page listed in the check opens without a blank card. Cell counts are an observed footprint; any memory or open-time change is measured in the workspace, not assumed from cells.
Baseline: record the outputs the owner names (and Calculation Effort where relevant) in production before any change.
Make the proposed change in a development copy, keeping the original state for comparison and recovery.
Use comparable inputs and scenarios in both copies; reconcile the named outputs cell for cell.
Agree acceptance criteria with the model owner before promotion. A status change in this report is not evidence of success.
text: 1 module with no consumer detected in the inspected dependency types No formula outside these modules reads any of their line items, and no export action reads them. Together they hold 13.4K cells. The five largest: `zz Archive - 2021 Cost`. No consumer was detected in the inspected relationships (parsed formula references, export actions). Pages, saved views, subsets and integrations are not in the exports, and incomplete parsing or missing metadata can hide a reader, so a consumer remains possible. The footprint says which to ask about first. 1 module, 3 line items
object: zz Archive - 2021 Cost
evidence: Module | Line items | Cells | Effort share | Exact twin in a read module | Coverage | Unmatched | Import target | Unparsed / COLLECT | Note
object: zz Archive - 2021 Cost
evidence: zz Archive - 2021 Cost | 3 | 13.4K | 0.0% | | | | | 0 / 0 | Old cost calc from go-live. Kept for reference.
Caldergate Data Hub · SYS01 Time Settings · SYS02 Data Checks(All 2 modules; 2 modules, 10 line items)
What was found
No formula outside these modules reads any of their line items, and no export action reads them. Together they hold 360 cells and 0.0% of Caldergate Data Hub's measured calculation effort. The five largest: SYS01 Time Settings, SYS02 Data Checks.
Why it matters
No consumer was detected in the inspected relationships (parsed formula references, export actions). Pages, saved views, subsets and integrations are not in the exports, and incomplete parsing or missing metadata can hide a reader, so a consumer remains possible. The footprint says which to ask about first.
Proposed step and benefit
Complete the consumer and retention checks (pages, saved views, line item subsets, integrations, access drivers, retained data) for the largest module first, then the rest of the five largest, and record a keep-or-retire recommendation for each. If no consumer is found: 360 cells as exported; 0.0% of Caldergate Data Hub's measured calculation effort would no longer be held or measured. Per module in the table. (conditional)
Preconditions and missing information
UX pages and classic dashboards that show each listed module (no export exists; the page builder or the Modules export's Used in Dashboards column for classic dashboards)
saved views on each listed module: another model can import from a saved view without any export action existing here
line item subsets that include line items of each listed module (COLLECT sources are not in the export)
filters, access drivers, DCA and integration (CloudWorks, API) references
Preconditions and steps
Prerequisites: every consumer check returned none, retained data is not needed, and the model owner has accepted the recommendation.
Then: in a development copy, make the proposed change (retire or repoint) while keeping the original module intact for comparison and recovery; reconcile the outputs the owner names against production over a full cycle; obtain owner sign-off; only then apply in production.
A module containing matching line items: repoint any page from the module to the matching line items first, and account for the unmatched line items separately.
partial. No formula consumer detected (parsed references, checked against Referenced By); export actions: none detected. Dependency coverage for Caldergate Data Hub: parsed-formula edges agree with Anaplan's Referenced By at 100% (0 edges Anaplan lists that the parse did not).
Reasons to keep the design
A module read only by pages, a view another model imports, or an audit-retained snapshot is doing its job with no formula reader. Retained data in an import target may be needed for history. A module containing matching line items is not a duplicate of the module they match until the unmatched line items and the consumers are accounted for.
All affected objects (2 modules)
SYS01 Time Settings · SYS02 Data Checks
Evidence (2 rows)
Module
Line items
Cells
Effort share
Exact twin in a read module
Coverage
Unmatched
Import target
Unparsed / COLLECT
Note
SYS01 Time Settings
5
180
0.0%
0 / 0
Standard time flags. Built Mar 2019.
SYS02 Data Checks
5
180
0.0%
0 / 0
Reconciliation flags read by the load dashboard.
Validation plan
After a removal, the Line Items export no longer lists the module and every page listed in the check opens without a blank card. Cell counts are an observed footprint; any memory or open-time change is measured in the workspace, not assumed from cells.
Baseline: record the outputs the owner names (and Calculation Effort where relevant) in production before any change.
Make the proposed change in a development copy, keeping the original state for comparison and recovery.
Use comparable inputs and scenarios in both copies; reconcile the named outputs cell for cell.
Agree acceptance criteria with the model owner before promotion. A status change in this report is not evidence of success.
text: 2 modules with no consumer detected in the inspected dependency types No formula outside these modules reads any of their line items, and no export action reads them. Together they hold 360 cells and 0.0% of Caldergate Data Hub's measured calculation effort. The five largest: `SYS01 Time Settings`, `SYS02 Data Checks`. No consumer was detected in the inspected relationships (parsed formula references, export actions). Pages, saved views, subsets and integrations are not in the exports, and incomplete parsing or missing metadata can hide a reader, so a consumer remains possible. The footprint says which to ask about first. 2 modules, 10 line items
object: SYS01 Time Settings
object: SYS02 Data Checks
evidence: Module | Line items | Cells | Effort share | Exact twin in a read module | Coverage | Unmatched | Import target | Unparsed / COLLECT | Note
object: SYS01 Time Settings
evidence: SYS01 Time Settings | 5 | 180 | 0.0% | | | | | 0 / 0 | Standard time flags. Built Mar 2019.
object: SYS02 Data Checks
evidence: SYS02 Data Checks | 5 | 180 | 0.0% | | | | | 0 / 0 | Reconciliation flags read by the load dashboard.
text: Line items with the widest change impact 1 line items are read directly by 25 or more formulas. A change to any of these moves numbers across the model. Not a fault: a fact for change control and for choosing what to test after a release. 1 line item
object: SYS01 Time Settings.Actual?
evidence: Line item | Direct readers | Downstream (transitive) | Modules downstream
object: SYS01 Time Settings.Actual?
evidence: SYS01 Time Settings.Actual? | 36 | 101 | 13
4 chains where A copies B copies C. Intermediate line items hold 153K cells.
Why it matters
Each step is a stored copy and a place a change of source must be repeated. Anaplan's checklist advises against chains. An intermediate can also be a deliberate interface: a reporting layer, a security boundary, a stable import source for another model.
Proposed step and benefit
For each chain, establish what each intermediate is for (page, export, access boundary); decide which intermediates are interfaces to keep. Footprint of the intermediates: 153K cells. (footprint)
Preconditions and missing information
whether an intermediate is read by a page, a view or another model's import
Preconditions and steps
Prerequisites: the intermediate has no consumer and no interface role; owner accepts. Then repoint the head in a development copy, reconcile, sign-off.
12 IF THEN ELSE in one formula. The branches map Accounts items to values; the table below is what the formula encodes.
Why it matters
Every new case is a formula edit, and a long chain is hard to check. Anaplan's checklist: refactor above 10 IF conditions. Whether a mapping module also calculates faster depends on the engine and the formula (IF stops at the first true branch), so measure rather than assume. This line item carries 16.0% of the model's measured effort.
Proposed step and benefit
Load the table into a mapping module and replace the chain with one LOOKUP; compare values before and after. Observed effort share only; improvement would be measured after the change. (footprint)
Preconditions and missing information
whether the mapping is stable enough to hold in a module
Preconditions and steps
Prerequisites: the mapping is stable and the owner accepts a module in place of the formula. Then build the mapping module in a development copy, replace the formula, reconcile every cell, sign-off.
A short, stable chain that a finance user can read may be clearer than a mapping module, and a chain that usually exits at an early branch may already be cheap.
All affected objects (1 objects)
CAL03 Opex.Forecast Opex
Evidence (12 rows)
Formula: IF ITEM(Accounts) = Accounts.'6100 Rent' THEN 'INP02 Opex Drivers'.Rent ELSE IF ITEM(Accounts) = Accounts.'6110 Rates' THEN 'INP02 Opex Drivers'.Business Rates ELSE IF ITEM(Accounts) = Accounts.'6120 Utilities' THEN 'INP02 Opex Drivers'.Utilities ELSE IF ITEM(Accounts) = Accounts.'6200 Travel' THEN 'INP02 Opex Drivers'.Travel ELSE IF ITEM(Accounts) = Accounts.'6210 Subsistence' THEN 'INP02 Opex Drivers'.Subsistence ELSE IF ITEM(Accounts) = Accounts.'6300 Marketing' THEN 'INP02 Opex Drivers'.Marketing Events ELSE IF ITEM(Accounts) = Accounts.'6310 Digital' THEN 'INP02 Opex Drivers'.Marketing Digital ELSE IF ITEM(Accounts) = Accounts.'6400 Software' THEN 'INP02 Opex Drivers'.Software Licences ELSE IF ITEM(Accounts) = Accounts.'6410 Hardware' THEN 'INP02 Opex Drivers'.Hardware ELSE IF ITEM(Accounts) = Accounts.'6500 Professional Fees' THEN 'INP02 Opex Drivers'.Consultancy ELSE IF ITEM(Accounts) = Accounts.'6510 Audit' THEN 'INP02 Opex Drivers'.Audit Fees ELSE IF ITEM(Accounts) = Accounts.'6600 Recruitment' THEN 'INP02 Opex Drivers'.Recruitment Fees ELSE 0
Accounts item
Value
6100 Rent
INP02 Opex Drivers.Rent
6110 Rates
INP02 Opex Drivers.Business Rates
6120 Utilities
INP02 Opex Drivers.Utilities
6200 Travel
INP02 Opex Drivers.Travel
6210 Subsistence
INP02 Opex Drivers.Subsistence
6300 Marketing
INP02 Opex Drivers.Marketing Events
6310 Digital
INP02 Opex Drivers.Marketing Digital
6400 Software
INP02 Opex Drivers.Software Licences
6410 Hardware
INP02 Opex Drivers.Hardware
6500 Professional Fees
INP02 Opex Drivers.Consultancy
6510 Audit
INP02 Opex Drivers.Audit Fees
6600 Recruitment
INP02 Opex Drivers.Recruitment Fees
Validation plan
Export the line item before and after; every cell equal.
Calculation Effort read before and after; keep the change only if it is no worse.
Baseline: record the outputs the owner names (and Calculation Effort where relevant) in production before any change.
Make the proposed change in a development copy, keeping the original state for comparison and recovery.
Use comparable inputs and scenarios in both copies; reconcile the named outputs cell for cell.
Agree acceptance criteria with the model owner before promotion. A status change in this report is not evidence of success.
text: IF chain that encodes a lookup table 12 IF THEN ELSE in one formula. The branches map Accounts items to values; the table below is what the formula encodes. Every new case is a formula edit, and a long chain is hard to check. Anaplan's checklist: refactor above 10 IF conditions. Whether a mapping module also calculates faster depends on the engine and the formula (IF stops at the first true branch), so measure rather than assume. This line item carries 16.0% of the model's measured effort. 1 line item; 1 reader
object: CAL03 Opex.Forecast Opex
formula: IF ITEM(Accounts) = Accounts.'6100 Rent' THEN 'INP02 Opex Drivers'.Rent ELSE IF ITEM(Accounts) = Accounts.'6110 Rates' THEN 'INP02 Opex Drivers'.Business Rates ELSE IF ITEM(Accounts) = Accounts.'6120 Utilities' THEN 'INP02 Opex Drivers'.Utilities ELSE IF ITEM(Accounts) = Accounts.'6200 Travel' THEN 'INP02 Opex Drivers'.Travel ELSE IF ITEM(Accounts) = Accounts.'6210 Subsistence' THEN 'INP02 Opex Drivers'.Subsistence ELSE IF ITEM(Accounts) = Accounts.'6300 Marketing' THEN 'INP02 Opex Drivers'.Marketing Events ELSE IF ITEM(Accounts) = Accounts.'6310 Digital' THEN 'INP02 Opex Drivers'.Marketing Digital ELSE IF ITEM(Accounts) = Accounts.'6400 Software' THEN 'INP02 Opex Drivers'.Software Licences ELSE IF ITEM(Accounts) = Accounts.'6410 Hardware' THEN 'INP02 Opex Drivers'.Hardware ELSE IF ITEM(Accounts) = Accounts.'6500 Professional Fees' THEN 'INP02 Opex Drivers'.Consultancy ELSE IF ITEM(Accounts) = Accounts.'6510 Audit' THEN 'INP02 Opex Drivers'.Audit Fees ELSE IF ITEM(Accounts) = Accounts.'6600 Recruitment' THEN 'INP02 Opex Drivers'.Recruitment Fees ELSE 0
evidence: Formula: IF ITEM(Accounts) = Accounts.'6100 Rent' THEN 'INP02 Opex Drivers'.Rent ELSE IF ITEM(Accounts) = Accounts.'6110 Rates' THEN 'INP02 Opex Drivers'.Business Rates ELSE IF ITEM(Accounts) = Accounts.'6120 Utilities' THEN 'INP02 Opex Drivers'.Utilities ELSE IF ITEM(Accounts) = Accounts.'6200 Travel' THEN 'INP02 Opex Drivers'.Travel ELSE IF ITEM(Accounts) = Accounts.'6210 Subsistence' THEN 'INP02 Opex Drivers'.Subsistence ELSE IF ITEM(Accounts) = Accounts.'6300 Marketing' THEN 'INP02 Opex Drivers'.Marketing Events ELSE IF ITEM(Accounts) = Accounts.'6310 Digital' THEN 'INP02 Opex Drivers'.Marketing Digital ELSE IF ITEM(Accounts) = Accounts.'6400 Software' THEN 'INP02 Opex Drivers'.Software Licences ELSE IF ITEM(Accounts) = Accounts.'6410 Hardware' THEN 'INP02 Opex Drivers'.Hardware ELSE IF ITEM(Accounts) = Accounts.'6500 Professional Fees' THEN 'INP02 Opex Drivers'.Consultancy ELSE IF ITEM(Accounts) = Accounts.'6510 Audit' THEN 'INP02 Opex Drivers'.Audit Fees ELSE IF ITEM(Accounts) = Accounts.'6600 Recruitment' THEN 'INP02 Opex Drivers'.Recruitment Fees ELSE 0
evidence: Accounts item | Value
object: INP02 Opex Drivers.Rent
evidence: 6100 Rent | INP02 Opex Drivers.Rent
object: INP02 Opex Drivers.Business Rates
evidence: 6110 Rates | INP02 Opex Drivers.Business Rates
object: INP02 Opex Drivers.Utilities
evidence: 6120 Utilities | INP02 Opex Drivers.Utilities
object: INP02 Opex Drivers.Travel
evidence: 6200 Travel | INP02 Opex Drivers.Travel
object: INP02 Opex Drivers.Subsistence
evidence: 6210 Subsistence | INP02 Opex Drivers.Subsistence
object: INP02 Opex Drivers.Marketing Events
evidence: 6300 Marketing | INP02 Opex Drivers.Marketing Events
object: INP02 Opex Drivers.Marketing Digital
evidence: 6310 Digital | INP02 Opex Drivers.Marketing Digital
object: INP02 Opex Drivers.Software Licences
evidence: 6400 Software | INP02 Opex Drivers.Software Licences
object: INP02 Opex Drivers.Hardware
evidence: 6410 Hardware | INP02 Opex Drivers.Hardware
object: INP02 Opex Drivers.Consultancy
evidence: 6500 Professional Fees | INP02 Opex Drivers.Consultancy
object: INP02 Opex Drivers.Audit Fees
evidence: 6510 Audit | INP02 Opex Drivers.Audit Fees
object: INP02 Opex Drivers.Recruitment Fees
evidence: 6600 Recruitment | INP02 Opex Drivers.Recruitment Fees
Caldergate FP&A · CAL07 P&L by Cost Centre.Depreciation · CAL11 Reporting Prep.Revenue · CAL11 Reporting Prep.EBITDA(Showing 3 of 14 copy line items; 14 copy line items)
What was found
14 line items have the formula B = A with the same context as A. Together they hold 268K cells.
Why it matters
A copy gives a page a friendlier name, moves a value into a module with different access, or provides a stable name for an export. Where none of those applies, its readers could read the source.
Proposed step and benefit
For the largest copies, establish what shows or exports them under their own name and whether access differs, then decide which copies are interfaces to keep. Footprint of the copies: 268K cells. Released only for copies without a page, export or access reason. (footprint)
Preconditions and missing information
pages that show the alias under its name
exports and views that read the alias module (the 'module exported' column shows export actions only)
Preconditions and steps
Prerequisites: no page, export or access reason for the copy; owner accepts. Then repoint readers in a development copy, reconcile, sign-off, remove.
Caldergate FP&A · CAL07 P&L by Cost Centre.Depreciation(All 1 groups (kept line item named); 1 group; 1 duplicate line item plus one kept line item per group)
What was found
1 calculated line items in 1 groups have the same resolved formula and the same context (dimensions, time scale, time range, versions, data type, summary, formula scope) as another line item in the model. Together the copies hold 19.2K cells.
Why it matters
Two copies of one calculation drift apart when one is changed. Where a page or process needs the second name, the copy is doing a job; where it does not, readers can share one.
Proposed step and benefit
Validate equivalence and the reasons for separate objects in the largest group (access boundaries, a reporting contract on the copy's name, a page that shows it), then decide whether consolidation is appropriate. Footprint of the copies: 19.2K cells. Released only for copies that no page, view or process needs. (footprint)
Preconditions and missing information
pages and views that show the copy under its own name
access boundaries and reporting contracts that justify a separate object
Preconditions and steps
Prerequisites: equivalence validated for the group, the reason for the second object ruled out, the owner accepts.
Then: repoint each reader of the copy to the kept line item in a development copy, reconcile the outputs that read it, owner sign-off, remove the copy.
confirmed. Resolved formula text and every context field agree; COLLECT() formulas and items with blank context are excluded and listed separately.
Reasons to keep the design
Different access (DCA or selective access) on the two modules, a reporting contract on the copy's name, or a deliberately separate process are reasons to keep both. Summary methods already match within a group, so they do not explain the copy.
All affected objects (1 groups (kept line item named))
CAL07 P&L by Cost Centre.Depreciation
Evidence (1 rows)
Kept (most read)
Also computed as
Context
Summary methods
Redundant cells
Readers to repoint
CAL07 P&L by Cost Centre.Depreciation
OUT01 Management Pack.Depreciation
Cost Centres; Month; All; NUMBER
SUM
19.2K
0
Formulas (one per group):
CAL07 P&L by Cost Centre.Depreciation: CAL10 Depreciation.Charge
Validation plan
Re-run this report: the group count falls; no page shows a blank; no export loses a column.
Baseline: record the outputs the owner names (and Calculation Effort where relevant) in production before any change.
Make the proposed change in a development copy, keeping the original state for comparison and recovery.
Use comparable inputs and scenarios in both copies; reconcile the named outputs cell for cell.
Agree acceptance criteria with the model owner before promotion. A status change in this report is not evidence of success.
text: Same calculation made more than once under different names 1 calculated line items in 1 groups have the same resolved formula and the same context (dimensions, time scale, time range, versions, data type, summary, formula scope) as another line item in the model. Together the copies hold 19.2K cells. Two copies of one calculation drift apart when one is changed. Where a page or process needs the second name, the copy is doing a job; where it does not, readers can share one. 1 line item in 1 group; 0 formulas would be re-pointed
object: CAL07 P&L by Cost Centre.Depreciation
evidence: Kept (most read) | Also computed as | Context | Summary methods | Redundant cells | Readers to repoint
object: CAL07 P&L by Cost Centre.Depreciation
object: OUT01 Management Pack.Depreciation
evidence: CAL07 P&L by Cost Centre.Depreciation | OUT01 Management Pack.Depreciation | Cost Centres; Month; All; NUMBER | SUM | 19.2K | 0
evidence: Formulas (one per group):
object: CAL07 P&L by Cost Centre.Depreciation
object: CAL10 Depreciation.Charge
evidence: CAL07 P&L by Cost Centre.Depreciation: CAL10 Depreciation.Charge
Workforce Planning · Calcs - Attrition.Headcount(All 1 groups (kept line item named); 1 group; 1 duplicate line item plus one kept line item per group)
What was found
1 calculated line items in 1 groups have the same resolved formula and the same context (dimensions, time scale, time range, versions, data type, summary, formula scope) as another line item in the model. Together the copies hold 4.5K cells.
Why it matters
Two copies of one calculation drift apart when one is changed. Where a page or process needs the second name, the copy is doing a job; where it does not, readers can share one.
Proposed step and benefit
Validate equivalence and the reasons for separate objects in the largest group (access boundaries, a reporting contract on the copy's name, a page that shows it), then decide whether consolidation is appropriate. Footprint of the copies: 4.5K cells. Released only for copies that no page, view or process needs. (footprint)
Preconditions and missing information
pages and views that show the copy under its own name
access boundaries and reporting contracts that justify a separate object
Preconditions and steps
Prerequisites: equivalence validated for the group, the reason for the second object ruled out, the owner accepts.
Then: repoint each reader of the copy to the kept line item in a development copy, reconcile the outputs that read it, owner sign-off, remove the copy.
confirmed. Resolved formula text and every context field agree; COLLECT() formulas and items with blank context are excluded and listed separately.
Reasons to keep the design
Different access (DCA or selective access) on the two modules, a reporting contract on the copy's name, or a deliberately separate process are reasons to keep both. Summary methods already match within a group, so they do not explain the copy.
All affected objects (1 groups (kept line item named))
text: Same calculation made more than once under different names 1 calculated line items in 1 groups have the same resolved formula and the same context (dimensions, time scale, time range, versions, data type, summary, formula scope) as another line item in the model. Together the copies hold 4.5K cells. Two copies of one calculation drift apart when one is changed. Where a page or process needs the second name, the copy is doing a job; where it does not, readers can share one. 1 line item in 1 group; 1 formulas would be re-pointed
object: Calcs - Attrition.Headcount
evidence: Kept (most read) | Also computed as | Context | Summary methods | Redundant cells | Readers to repoint
object: Calcs - Attrition.Headcount
object: zz Archive - 2021 Cost.Headcount
evidence: Calcs - Attrition.Headcount | zz Archive - 2021 Cost.Headcount | Roles; Month; All; NUMBER | SUM | 4.5K | 1
evidence: Formulas (one per group):
object: Calcs - Attrition.Headcount
formula: 'Data - Employees'.FTE[SUM: 'Data - Employees'.Role]
evidence: Calcs - Attrition.Headcount: 'Data - Employees'.FTE[SUM: 'Data - Employees'.Role]
Caldergate Data Hub · CAL01 Volume Summary.Average Order Value(All 1 formulas; 1 formulas)
What was found
1 formulas use DIVIDE(). Anaplan's documentation: "If the divisor is zero, the operator returns zero as the result (the DIVIDE function returns Infinity)." and "DIVIDE(50,0) returns Infinity; DIVIDE(-45,0) returns -Infinity."
Why it matters
Neither behaviour is an error. Where a divisor can be zero, the page shows Infinity or NaN with DIVIDE() and zero with /. This is a display decision for the owner, not a defect.
Proposed step and benefit
Confirm for each whether Infinity or NaN is acceptable on the pages that show it; no change is needed where it is. not applicable (none)
text: DIVIDE() where a zero divisor shows Infinity 1 formulas use DIVIDE(). Anaplan's documentation: "If the divisor is zero, the operator returns zero as the result (the DIVIDE function returns Infinity)." and "DIVIDE(50,0) returns Infinity; DIVIDE(-45,0) returns -Infinity." Neither behaviour is an error. Where a divisor can be zero, the page shows Infinity or NaN with DIVIDE() and zero with /. This is a display decision for the owner, not a defect. 1 formula
object: CAL01 Volume Summary.Average Order Value
evidence: Line item | Formula
object: CAL01 Volume Summary.Average Order Value
formula: DIVIDE(Revenue, Orders)
evidence: CAL01 Volume Summary.Average Order Value | DIVIDE(Revenue, Orders)
6 formulas contain numeric literals other than the usual structural ones (0, 1, 12, 100 and the like). Most repeated: 1.27 (1), 0.2 (1), 30 (1), 0.25 (1), 10 (1).
Why it matters
A literal that is an assumption (a rate, a threshold, a conversion) cannot be seen or changed without a builder. The same literal can mean different things in different formulas, so each occurrence needs its own reading before anything is shared.
Proposed step and benefit
Read the formulas with the most repeated literal; where a literal is a business assumption, give it a named input with a note. not quantified from the exports (none)
Structural numbers (months in a year, a unit conversion fixed by definition) are fine inline. Unrelated occurrences of the same value must not share one input.
Revenue * 'INP05 Balance Sheet Drivers'.Debtor Days / 30
CAL08 Cash Flow.Tax
0.25
IF EBITDA > 0 THEN EBITDA * 0.25 ELSE 0
CAL10 Depreciation.Charge
10, 119, 120, 239
IF ISBLANK('INP04 Capex'.Asset Class) THEN 0 ELSE IF 'INP04 Capex'.Useful Life Years = 3 THEN MOVINGSUM('INP04 Capex'.Capex Spend, -35, 0) / 36 ELSE IF 'INP04 Capex'.Useful Life Years = 5 THEN MOVINGSUM('INP04 Capex'.Capex Spend, -59, 0) / 60 ELSE IF 'INP04 Capex'.Useful Life Years = 7 THEN MOVINGSUM('INP04 Capex'.Capex Spend, -83, 0) / 84 ELSE IF 'INP04 Capex'.Useful Life Years = 10 THEN MOVINGSUM('INP04 Capex'.Capex Spend, -119, 0) / 120 ELSE IF 'INP04 Capex'.Useful Life Years > 10 THEN MOVINGSUM('INP04 Capex'.Capex Spend, -239, 0) / 240 ELSE 'INP04 Capex'.Capex Spend / 12
INP03 Headcount.Pension
0.05
Monthly Salary * 0.05
Validation plan
Baseline: record the outputs the owner names (and Calculation Effort where relevant) in production before any change.
Make the proposed change in a development copy, keeping the original state for comparison and recovery.
Use comparable inputs and scenarios in both copies; reconcile the named outputs cell for cell.
Agree acceptance criteria with the model owner before promotion. A status change in this report is not evidence of success.
text: Numeric literals inside formulas 6 formulas contain numeric literals other than the usual structural ones (0, 1, 12, 100 and the like). Most repeated: 1.27 (1), 0.2 (1), 30 (1), 0.25 (1), 10 (1). A literal that is an assumption (a rate, a threshold, a conversion) cannot be seen or changed without a builder. The same literal can mean different things in different formulas, so each occurrence needs its own reading before anything is shared. 6 formulas
object: CAL02 Revenue.Revenue USD
object: CAL02 Revenue.VAT
object: CAL08 Cash Flow.Debtors
object: CAL08 Cash Flow.Tax
object: CAL10 Depreciation.Charge
object: INP03 Headcount.Pension
evidence: Line item | Constants | Formula
object: CAL02 Revenue.Revenue USD
formula: Revenue GBP * 1.27
evidence: CAL02 Revenue.Revenue USD | 1.27 | Revenue GBP * 1.27
object: CAL02 Revenue.VAT
formula: Net Revenue * 0.2
evidence: CAL02 Revenue.VAT | 0.2 | Net Revenue * 0.2
object: CAL08 Cash Flow.Debtors
formula: Revenue * 'INP05 Balance Sheet Drivers'.Debtor Days / 30
evidence: CAL08 Cash Flow.Debtors | 30 | Revenue * 'INP05 Balance Sheet Drivers'.Debtor Days / 30
object: CAL08 Cash Flow.Tax
formula: IF EBITDA > 0 THEN EBITDA * 0.25 ELSE 0
evidence: CAL08 Cash Flow.Tax | 0.25 | IF EBITDA > 0 THEN EBITDA * 0.25 ELSE 0
object: CAL10 Depreciation.Charge
formula: IF ISBLANK('INP04 Capex'.Asset Class) THEN 0 ELSE IF 'INP04 Capex'.Useful Life Years = 3 THEN MOVINGSUM('INP04 Capex'.Capex Spend, -35, 0) / 36 ELSE IF 'INP04 Capex'.Useful Life Years = 5 THEN MOVINGSUM('INP04 Capex'.Capex Spend, -59, 0) / 60 ELSE IF 'INP04 Capex'.Useful Life Years = 7 THEN MOVINGSUM('INP04 Capex'.Capex Spend, -83, 0) / 84 ELSE IF 'INP04 Capex'.Useful Life Years = 10 THEN MOVINGSUM('INP04 Capex'.Capex Spend, -119, 0) / 120 ELSE IF 'INP04 Capex'.Useful Life Years > 10 THEN MOVINGSUM('INP04 Capex'.Capex Spend, -239, 0) / 240 ELSE 'INP04 Capex'.Capex Spend / 12
evidence: CAL10 Depreciation.Charge | 10, 119, 120, 239 | IF ISBLANK('INP04 Capex'.Asset Class) THEN 0 ELSE IF 'INP04 Capex'.Useful Life Years = 3 THEN MOVINGSUM('INP04 Capex'.Capex Spend, -35, 0) / 36 ELSE IF 'INP04 Capex'.Useful Life Years = 5 THEN MOVINGSUM('INP04 Capex'.Capex Spend, -59, 0) / 60 ELSE IF 'INP04 Capex'.Useful Life Years = 7 THEN MOVINGSUM('INP04 Capex'.Capex Spend, -83, 0) / 84 ELSE IF 'INP04 Capex'.Useful Life Years = 10 THEN MOVINGSUM('INP04 Capex'.Capex Spend, -119, 0) / 120 ELSE IF 'INP04 Capex'.Useful Life Years > 10 THEN MOVINGSUM('INP04 Capex'.Capex Spend, -239, 0) / 240 ELSE 'INP04 Capex'.Capex Spend / 12
object: INP03 Headcount.Pension
formula: Monthly Salary * 0.05
evidence: INP03 Headcount.Pension | 0.05 | Monthly Salary * 0.05
Caldergate FP&A · CAL01 Volumes.Launched?(All 1 line items; 1 line items)
What was found
1 line items are dimensioned differently from their module and are read by formulas.
Why it matters
The line item's dimensions are not visible at module level, so a reader can misjudge what a reference returns, and the engine maps between the two dimension sets on every read. Anaplan's checklist: display and export only.
Proposed step and benefit
For each, decide whether a module dimensioned as the line item is would make its readers clearer. not quantified from the exports (none)
text: Subsidiary views used in calculation 1 line items are dimensioned differently from their module and are read by formulas. The line item's dimensions are not visible at module level, so a reader can misjudge what a reference returns, and the engine maps between the two dimension sets on every read. Anaplan's checklist: display and export only. 1 line item; 1 readers
object: CAL01 Volumes.Launched?
evidence: Line item | Applies to | Module applies to | Readers
object: CAL01 Volumes.Launched?
evidence: CAL01 Volumes.Launched? | Products | Products, Regions | 1
Anaplan's checklist suggests reviewing modules above 50: many line items can mean mixed purposes. It can also be a deliberate input grid that users know.
Proposed step and benefit
Group the line items by what reads them; if the groups have different purposes, consider a split. Reducing the count is not the goal. not quantified from the exports (none)
Dependencies
INP02 Opex Drivers(Change impact: what depends on it, what it depends on)
Evidence strength
confirmed. Line item count.
Reasons to keep the design
A module users open as one grid is easier to keep as one grid.
All affected objects (1 objects)
INP02 Opex Drivers
Validation plan
Baseline: record the outputs the owner names (and Calculation Effort where relevant) in production before any change.
Make the proposed change in a development copy, keeping the original state for comparison and recovery.
Use comparable inputs and scenarios in both copies; reconcile the named outputs cell for cell.
Agree acceptance criteria with the model owner before promotion. A status change in this report is not evidence of success.
text: Module with more than 50 line items `INP02 Opex Drivers` has 58 line items. Anaplan's checklist suggests reviewing modules above 50: many line items can mean mixed purposes. It can also be a deliberate input grid that users know. 1 module; 50 readers outside it; 1 export
object: INP02 Opex Drivers
A long formula that is correct, documented and rarely touched is a known quantity; splitting it has its own risk.
All affected objects (1 formulas)
CAL03 Opex.Forecast Opex
Evidence (1 rows)
Line item
Tokens
Formula
CAL03 Opex.Forecast Opex
133
IF ITEM(Accounts) = Accounts.'6100 Rent' THEN 'INP02 Opex Drivers'.Rent ELSE IF ITEM(Accounts) = Accounts.'6110 Rates' THEN 'INP02 Opex Drivers'.Business Rates ELSE IF ITEM(Accounts) = Accounts.'6120 Utilities' THEN 'INP02 Opex Drivers'.Utilities ELSE IF ITEM(Accounts) = Accounts.'6200 Travel' THEN 'INP02 Opex Drivers'.Travel ELSE IF ITEM(Accounts) = Accounts.'6210 Subsistence' THEN 'INP02 Opex Drivers'.Subsistence ELSE IF ITEM(Accounts) = Accounts.'6300 Marketing' THEN 'INP02 Opex Drivers'.Marketing Events ELSE IF ITEM(Accounts) = Accounts.'6310 Digital' THEN 'INP02 Opex Drivers'.Marketing Digital ELSE IF ITEM(Accounts) = Accounts.'6400 Software' THEN 'INP02 Opex Drivers'.Software Licences ELSE IF ITEM(Accounts) = Accounts.'6410 Hardware' THEN 'INP02 Opex Drivers'.Hardware ELSE IF ITEM(Accounts) = Accounts.'6500 Professional Fees' THEN 'INP02 Opex Drivers'.Consultancy ELSE IF ITEM(Accounts) = Accounts.'6510 Audit' THEN 'INP02 Opex Drivers'.Audit Fees ELSE IF ITEM(Accounts) = Accounts.'6600 Recruitment' THEN 'INP02 Opex Drivers'.Recruitment Fees ELSE 0
Validation plan
Baseline: record the outputs the owner names (and Calculation Effort where relevant) in production before any change.
Make the proposed change in a development copy, keeping the original state for comparison and recovery.
Use comparable inputs and scenarios in both copies; reconcile the named outputs cell for cell.
Agree acceptance criteria with the model owner before promotion. A status change in this report is not evidence of success.
text: Very long formulas 1 formulas exceed 120 tokens. Hard to review and to test. Anaplan's checklist: a formula should be explainable in one sentence. 1 formula
object: CAL03 Opex.Forecast Opex
evidence: Line item | Tokens | Formula
object: CAL03 Opex.Forecast Opex
formula: IF ITEM(Accounts) = Accounts.'6100 Rent' THEN 'INP02 Opex Drivers'.Rent ELSE IF ITEM(Accounts) = Accounts.'6110 Rates' THEN 'INP02 Opex Drivers'.Business Rates ELSE IF ITEM(Accounts) = Accounts.'6120 Utilities' THEN 'INP02 Opex Drivers'.Utilities ELSE IF ITEM(Accounts) = Accounts.'6200 Travel' THEN 'INP02 Opex Drivers'.Travel ELSE IF ITEM(Accounts) = Accounts.'6210 Subsistence' THEN 'INP02 Opex Drivers'.Subsistence ELSE IF ITEM(Accounts) = Accounts.'6300 Marketing' THEN 'INP02 Opex Drivers'.Marketing Events ELSE IF ITEM(Accounts) = Accounts.'6310 Digital' THEN 'INP02 Opex Drivers'.Marketing Digital ELSE IF ITEM(Accounts) = Accounts.'6400 Software' THEN 'INP02 Opex Drivers'.Software Licences ELSE IF ITEM(Accounts) = Accounts.'6410 Hardware' THEN 'INP02 Opex Drivers'.Hardware ELSE IF ITEM(Accounts) = Accounts.'6500 Professional Fees' THEN 'INP02 Opex Drivers'.Consultancy ELSE IF ITEM(Accounts) = Accounts.'6510 Audit' THEN 'INP02 Opex Drivers'.Audit Fees ELSE IF ITEM(Accounts) = Accounts.'6600 Recruitment' THEN 'INP02 Opex Drivers'.Recruitment Fees ELSE 0
evidence: CAL03 Opex.Forecast Opex | 133 | IF ITEM(Accounts) = Accounts.'6100 Rent' THEN 'INP02 Opex Drivers'.Rent ELSE IF ITEM(Accounts) = Accounts.'6110 Rates' THEN 'INP02 Opex Drivers'.Business Rates ELSE IF ITEM(Accounts) = Accounts.'6120 Utilities' THEN 'INP02 Opex Drivers'.Utilities ELSE IF ITEM(Accounts) = Accounts.'6200 Travel' THEN 'INP02 Opex Drivers'.Travel ELSE IF ITEM(Accounts) = Accounts.'6210 Subsistence' THEN 'INP02 Opex Drivers'.Subsistence ELSE IF ITEM(Accounts) = Accounts.'6300 Marketing' THEN 'INP02 Opex Drivers'.Marketing Events ELSE IF ITEM(Accounts) = Accounts.'6310 Digital' THEN 'INP02 Opex Drivers'.Marketing Digital ELSE IF ITEM(Accounts) = Accounts.'6400 Software' THEN 'INP02 Opex Drivers'.Software Licences ELSE IF ITEM(Accounts) = Accounts.'6410 Hardware' THEN 'INP02 Opex Drivers'.Hardware ELSE IF ITEM(Accounts) = Accounts.'6500 Professional Fees' THEN 'INP02 Opex Drivers'.Consultancy ELSE IF ITEM(Accounts) = Accounts.'6510 Audit' THEN 'INP02 Opex Drivers'.Audit Fees ELSE IF ITEM(Accounts) = Accounts.'6600 Recruitment' THEN 'INP02 Opex Drivers'.Recruitment Fees ELSE 0
3 formulas select a specific time period or version with SELECT.
Why it matters
Anaplan's SELECT page: "We don't recommend the use of the SELECT function in conjunction with non-generic time periods.." The hard-coded element must be revisited when the timescale or versions change.
Proposed step and benefit
Where the period is a moving concept (current year, prior year), hold it in a time-formatted line item and use LOOKUP. not quantified from the exports (none)
text: Hard-coded time period or version selections 3 formulas select a specific time period or version with SELECT. Anaplan's SELECT page: "We don't recommend the use of the SELECT function in conjunction with non-generic time periods.." The hard-coded element must be revisited when the timescale or versions change. 3 formulas
object: CAL07 P&L by Cost Centre.Opex Budget
object: OUT02 Board Pack.Budget Revenue
object: OUT02 Board Pack.Old Budget Revenue
evidence: Line item | Selection | Formula
object: CAL07 P&L by Cost Centre.Opex Budget
formula: Opex[SELECT: VERSIONS.Budget]
evidence: CAL07 P&L by Cost Centre.Opex Budget | SELECT: VERSIONS.Budget | Opex[SELECT: VERSIONS.Budget]
object: OUT02 Board Pack.Budget Revenue
formula: 'OUT01 Management Pack'.Revenue[SELECT: VERSIONS.Budget]
evidence: OUT02 Board Pack.Budget Revenue | SELECT: VERSIONS.Budget | 'OUT01 Management Pack'.Revenue[SELECT: VERSIONS.Budget]
object: OUT02 Board Pack.Old Budget Revenue
formula: 'OUT01 Management Pack'.Revenue[SELECT: VERSIONS.'Budget v2 DO NOT USE']
evidence: OUT02 Board Pack.Old Budget Revenue | SELECT: VERSIONS.Budget v2 DO NOT USE | 'OUT01 Management Pack'.Revenue[SELECT: VERSIONS.'Budget v2 DO NOT USE']
8 formulas use DIVIDE(). Anaplan's documentation: "If the divisor is zero, the operator returns zero as the result (the DIVIDE function returns Infinity)." and "DIVIDE(50,0) returns Infinity; DIVIDE(-45,0) returns -Infinity."
Why it matters
Neither behaviour is an error. Where a divisor can be zero, the page shows Infinity or NaN with DIVIDE() and zero with /. This is a display decision for the owner, not a defect.
Proposed step and benefit
Confirm for each whether Infinity or NaN is acceptable on the pages that show it; no change is needed where it is. not applicable (none)
3 formulas contain numeric literals other than the usual structural ones (0, 1, 12, 100 and the like). Most repeated: 0.1 (2), 11 (1).
Why it matters
A literal that is an assumption (a rate, a threshold, a conversion) cannot be seen or changed without a builder. The same literal can mean different things in different formulas, so each occurrence needs its own reading before anything is shared.
Proposed step and benefit
Read the formulas with the most repeated literal; where a literal is a business assumption, give it a named input with a note. not quantified from the exports (none)
Structural numbers (months in a year, a unit conversion fixed by definition) are fine inline. Unrelated occurrences of the same value must not share one input.
text: Numeric literals inside formulas 3 formulas contain numeric literals other than the usual structural ones (0, 1, 12, 100 and the like). Most repeated: 0.1 (2), 11 (1). A literal that is an assumption (a rate, a threshold, a conversion) cannot be seen or changed without a builder. The same literal can mean different things in different formulas, so each occurrence needs its own reading before anything is shared. 3 formulas
object: Calcs - Attrition.Annualised Attrition
object: Calcs - Cost.Bonus
object: Calcs - Headcount by CC.Bonus %
evidence: Line item | Constants | Formula
object: Calcs - Attrition.Annualised Attrition
formula: MOVINGSUM(Leavers by Role, -11, 0) / Headcount
evidence: Calcs - Attrition.Annualised Attrition | 11 | MOVINGSUM(Leavers by Role, -11, 0) / Headcount
object: Calcs - Cost.Bonus
formula: Inflated Salary * 0.1
evidence: Calcs - Cost.Bonus | 0.1 | Inflated Salary * 0.1
object: Calcs - Headcount by CC.Bonus %
object: 0.1
evidence: Calcs - Headcount by CC.Bonus % | 0.1 | 0.1
Workforce Planning · Calcs - Attrition.Leavers(All 1 line items; 1 line items)
What was found
1 line items are dimensioned differently from their module and are read by formulas.
Why it matters
The line item's dimensions are not visible at module level, so a reader can misjudge what a reference returns, and the engine maps between the two dimension sets on every read. Anaplan's checklist: display and export only.
Proposed step and benefit
For each, decide whether a module dimensioned as the line item is would make its readers clearer. not quantified from the exports (none)
text: Subsidiary views used in calculation 1 line items are dimensioned differently from their module and are read by formulas. The line item's dimensions are not visible at module level, so a reader can misjudge what a reference returns, and the engine maps between the two dimension sets on every read. Anaplan's checklist: display and export only. 1 line item; 1 readers
object: Calcs - Attrition.Leavers
evidence: Line item | Applies to | Module applies to | Readers
object: Calcs - Attrition.Leavers
evidence: Calcs - Attrition.Leavers | Employees | Roles | 1
1 formulas select a specific time period or version with SELECT.
Why it matters
Anaplan's SELECT page: "We don't recommend the use of the SELECT function in conjunction with non-generic time periods.." The hard-coded element must be revisited when the timescale or versions change.
Proposed step and benefit
Where the period is a moving concept (current year, prior year), hold it in a time-formatted line item and use LOOKUP. not quantified from the exports (none)
text: Hard-coded time period or version selections 1 formulas select a specific time period or version with SELECT. Anaplan's SELECT page: "We don't recommend the use of the SELECT function in conjunction with non-generic time periods.." The hard-coded element must be revisited when the timescale or versions change. 1 formula
object: Reports - Headcount.FTE Budget
evidence: Line item | Selection | Formula
object: Reports - Headcount.FTE Budget
formula: FTE[SELECT: VERSIONS.Budget]
evidence: Reports - Headcount.FTE Budget | SELECT: VERSIONS.Budget | FTE[SELECT: VERSIONS.Budget]
Workforce Planning · Calcs - Headcount by CC.Average Salary · Reports - Headcount.Cost per FTE · zz Archive - 2021 Cost.Cost per Head(All 3 formulas; 3 formulas)
What was found
3 formulas use DIVIDE(). Anaplan's documentation: "If the divisor is zero, the operator returns zero as the result (the DIVIDE function returns Infinity)." and "DIVIDE(50,0) returns Infinity; DIVIDE(-45,0) returns -Infinity."
Why it matters
Neither behaviour is an error. Where a divisor can be zero, the page shows Infinity or NaN with DIVIDE() and zero with /. This is a display decision for the owner, not a defect.
Proposed step and benefit
Confirm for each whether Infinity or NaN is acceptable on the pages that show it; no change is needed where it is. not applicable (none)
text: DIVIDE() where a zero divisor shows Infinity 3 formulas use DIVIDE(). Anaplan's documentation: "If the divisor is zero, the operator returns zero as the result (the DIVIDE function returns Infinity)." and "DIVIDE(50,0) returns Infinity; DIVIDE(-45,0) returns -Infinity." Neither behaviour is an error. Where a divisor can be zero, the page shows Infinity or NaN with DIVIDE() and zero with /. This is a display decision for the owner, not a defect. 3 formulas
object: Calcs - Headcount by CC.Average Salary
object: Reports - Headcount.Cost per FTE
object: zz Archive - 2021 Cost.Cost per Head
evidence: Line item | Formula
object: Calcs - Headcount by CC.Average Salary
formula: DIVIDE(Salary, FTE)
evidence: Calcs - Headcount by CC.Average Salary | DIVIDE(Salary, FTE)
object: Reports - Headcount.Cost per FTE
formula: DIVIDE(Total Cost, FTE)
evidence: Reports - Headcount.Cost per FTE | DIVIDE(Total Cost, FTE)
object: zz Archive - 2021 Cost.Cost per Head
formula: DIVIDE(Cost, Headcount)
evidence: zz Archive - 2021 Cost.Cost per Head | DIVIDE(Cost, Headcount)
3 formulas use DIVIDE(). Anaplan's documentation: "If the divisor is zero, the operator returns zero as the result (the DIVIDE function returns Infinity)." and "DIVIDE(50,0) returns Infinity; DIVIDE(-45,0) returns -Infinity."
Why it matters
Neither behaviour is an error. Where a divisor can be zero, the page shows Infinity or NaN with DIVIDE() and zero with /. This is a display decision for the owner, not a defect.
Proposed step and benefit
Confirm for each whether Infinity or NaN is acceptable on the pages that show it; no change is needed where it is. not applicable (none)
text: DIVIDE() where a zero divisor shows Infinity 3 formulas use DIVIDE(). Anaplan's documentation: "If the divisor is zero, the operator returns zero as the result (the DIVIDE function returns Infinity)." and "DIVIDE(50,0) returns Infinity; DIVIDE(-45,0) returns -Infinity." Neither behaviour is an error. Where a divisor can be zero, the page shows Infinity or NaN with DIVIDE() and zero with /. This is a display decision for the owner, not a defect. 3 formulas
object: CAL01 KPIs.EBITDA Margin
object: CAL01 KPIs.Opex Ratio
object: CAL01 KPIs.Revenue Growth
evidence: Line item | Formula
object: CAL01 KPIs.EBITDA Margin
formula: DIVIDE('DAT02 Board Lines'.EBITDA, 'DAT02 Board Lines'.Revenue)
evidence: CAL01 KPIs.EBITDA Margin | DIVIDE('DAT02 Board Lines'.EBITDA, 'DAT02 Board Lines'.Revenue)
object: CAL01 KPIs.Opex Ratio
formula: DIVIDE('DAT01 P&L'.Opex, 'DAT01 P&L'.Revenue)
evidence: CAL01 KPIs.Opex Ratio | DIVIDE('DAT01 P&L'.Opex, 'DAT01 P&L'.Revenue)
object: CAL01 KPIs.Revenue Growth
formula: DIVIDE('DAT02 Board Lines'.Revenue - Revenue Prior Year, Revenue Prior Year)
evidence: CAL01 KPIs.Revenue Growth | DIVIDE('DAT02 Board Lines'.Revenue - Revenue Prior Year, Revenue Prior Year)
text: Summary methods on large line items no formula reads 1 number line items with 10,000 cells or more have a summary method set and no formula reader. Summaries are calculated on every parent of every dimension. Only a page or export could need the totals; the exports cannot show whether one does. 1 line item
object: DAT05 CRM Pipeline.Weighted Pipeline
evidence: Line item | Summary | Cells
object: DAT05 CRM Pipeline.Weighted Pipeline
evidence: DAT05 CRM Pipeline.Weighted Pipeline | SUM | 17.3K
text: Summary methods on large line items no formula reads 1 number line items with 10,000 cells or more have a summary method set and no formula reader. Summaries are calculated on every parent of every dimension. Only a page or export could need the totals; the exports cannot show whether one does. 1 line item
object: Calcs - Headcount by CC.Average Salary
evidence: Line item | Summary | Cells
object: Calcs - Headcount by CC.Average Salary
evidence: Calcs - Headcount by CC.Average Salary | FORMULA | 594K
text: Summary methods on large line items no formula reads 5 number line items with 10,000 cells or more have a summary method set and no formula reader. Summaries are calculated on every parent of every dimension. Only a page or export could need the totals; the exports cannot show whether one does. 5 line items
object: DAT01 P&L.COGS
object: DAT01 P&L.Depreciation
object: DAT01 P&L.EBIT
object: DAT01 P&L.EBITDA
object: DAT01 P&L.Staff Cost
evidence: Line item | Summary | Cells
object: DAT01 P&L.COGS
evidence: DAT01 P&L.COGS | SUM | 19.2K
object: DAT01 P&L.Depreciation
evidence: DAT01 P&L.Depreciation | SUM | 19.2K
object: DAT01 P&L.EBIT
evidence: DAT01 P&L.EBIT | SUM | 19.2K
object: DAT01 P&L.EBITDA
evidence: DAT01 P&L.EBITDA | SUM | 19.2K
object: DAT01 P&L.Staff Cost
evidence: DAT01 P&L.Staff Cost | SUM | 19.2K
Estate · COGS? · Current Period? · Employer NI(Showing 3 of 8 line item names; 8 line item names)
What was found
8 line items appear in more than one model with the same name and the same formula tree.
Why it matters
The same text can operate on different local data (a filter over a local list, a local rate), so identical formulas are not automatically one calculation. Where they are one calculation, a change must be made in each copy.
Proposed step and benefit
Pick the copies that are genuinely one rule and record where it is owned; leave local filters and formatting where they are. not quantified from the exports (none)
Preconditions and missing information
whether the referenced lists and modules hold the same data in each model
which model is the source of truth for each
Evidence strength
inferred. Name and formula text only; the referenced objects live in different models.
Reasons to keep the design
A rule that must be evaluated locally in each model (a filter, a format, a local flag) is right to repeat.
All affected objects (8 line item names)
COGS? · Current Period? · Employer NI · Group · Opex? · Revenue? · Sign · Working Days
Evidence (8 rows)
Line item
Models
Formula
COGS?
Caldergate Data Hub, Caldergate FP&A
(Account Type = Account Types.COGS)
Current Period?
Caldergate Data Hub, Caldergate FP&A
(ITEM(Time) = SYS00 Model Settings.Current Period)
Employer NI
Caldergate FP&A, Workforce Planning
(IF (Monthly Salary > NI Threshold) THEN ((Monthly Salary - NI Threshold) * NI Rate) ELSE 0)
Group
Caldergate Data Hub, Caldergate FP&A
PARENT(ITEM(Cost Centres))
Opex?
Caldergate Data Hub, Caldergate FP&A
(Account Type = Account Types.Opex)
Revenue?
Caldergate Data Hub, Caldergate FP&A
(Account Type = Account Types.Revenue)
Sign
Caldergate Data Hub, Caldergate FP&A
(IF 'Revenue?' THEN -1 ELSE 1)
Working Days
Caldergate FP&A, Workforce Planning
(Days in Month - Weekend Days - Bank Holidays)
Validation plan
Baseline: record the outputs the owner names (and Calculation Effort where relevant) in production before any change.
Make the proposed change in a development copy, keeping the original state for comparison and recovery.
Use comparable inputs and scenarios in both copies; reconcile the named outputs cell for cell.
Agree acceptance criteria with the model owner before promotion. A status change in this report is not evidence of success.
text: Same line item name and formula in more than one model 8 line items appear in more than one model with the same name and the same formula tree. The same text can operate on different local data (a filter over a local list, a local rate), so identical formulas are not automatically one calculation. Where they are one calculation, a change must be made in each copy. 8 line items across 3 models
object: COGS?
object: Current Period?
object: Employer NI
object: Group
object: Opex?
object: Revenue?
object: Sign
object: Working Days
evidence: Line item | Models | Formula
object: COGS?
formula: (Account Type = Account Types.COGS)
evidence: COGS? | Caldergate Data Hub, Caldergate FP&A | (Account Type = Account Types.COGS)
object: Current Period?
formula: (ITEM(Time) = SYS00 Model Settings.Current Period)
evidence: Current Period? | Caldergate Data Hub, Caldergate FP&A | (ITEM(Time) = SYS00 Model Settings.Current Period)
object: Employer NI
formula: (IF (Monthly Salary > NI Threshold) THEN ((Monthly Salary - NI Threshold) * NI Rate) ELSE 0)
evidence: Employer NI | Caldergate FP&A, Workforce Planning | (IF (Monthly Salary > NI Threshold) THEN ((Monthly Salary - NI Threshold) * NI Rate) ELSE 0)
object: Group
formula: PARENT(ITEM(Cost Centres))
evidence: Group | Caldergate Data Hub, Caldergate FP&A | PARENT(ITEM(Cost Centres))
object: Opex?
formula: (Account Type = Account Types.Opex)
evidence: Opex? | Caldergate Data Hub, Caldergate FP&A | (Account Type = Account Types.Opex)
object: Revenue?
formula: (Account Type = Account Types.Revenue)
evidence: Revenue? | Caldergate Data Hub, Caldergate FP&A | (Account Type = Account Types.Revenue)
object: Sign
formula: (IF 'Revenue?' THEN -1 ELSE 1)
evidence: Sign | Caldergate Data Hub, Caldergate FP&A | (IF 'Revenue?' THEN -1 ELSE 1)
object: Working Days
formula: (Days in Month - Weekend Days - Bank Holidays)
evidence: Working Days | Caldergate FP&A, Workforce Planning | (Days in Month - Weekend Days - Bank Holidays)
Caldergate Data Hub · Export Pipeline for Sales Ops · Import Customers from Salesforce · Import Products from PIM file(All 3 actions; 3 actions)
What was found
Export date unknown. Latest recorded action run: 2026-09-21. 2 imports and exports have no recorded run since 2025-09-26 (12 months before the latest recorded run), 0 have no recorded run at all, and 3 are not in any process.
Why it matters
An action outside a process can still run from a page, the Actions pane or the API; a run date older than the window may be right for a quarterly or annual load. What the list gives is the set to ask about, not a verdict.
Proposed step and benefit
For each action with no recorded run in the window, ask the owner how and how often it runs; document the answer in the action's notes. not quantified from the exports (none)
Preconditions and missing information
how each action is triggered (page, API, CloudWorks, by hand)
the expected frequency of each load
run history beyond the most recent run
Evidence strength
partial. Actions export: most recent run per action, process membership. Workspace administrators can run both import and export actions from the Actions pane; add them to a page in the user experience; any user can run import or export actions via the Anaplan Integrations API.
Reasons to keep the design
Year-end loads, ad-hoc reloads and API-driven actions legitimately show no recent run and no process. Retiring an import does not by itself justify removing its target module or the data it loaded.
All affected objects (3 actions)
Export Pipeline for Sales Ops · Import Customers from Salesforce · Import Products from PIM file
Evidence (3 rows)
Action
Kind
Most recent recorded run
In a process
Target or source
Import Products from PIM file
import
2023-06-14
no
DAT04 Product Master
Export Pipeline for Sales Ops
export
2025-02-11
no
DAT05 CRM Pipeline
Import Customers from Salesforce
import
2026-08-30
no
DAT07 Customer Master
Validation plan
Baseline: record the outputs the owner names (and Calculation Effort where relevant) in production before any change.
Make the proposed change in a development copy, keeping the original state for comparison and recovery.
Use comparable inputs and scenarios in both copies; reconcile the named outputs cell for cell.
Agree acceptance criteria with the model owner before promotion. A status change in this report is not evidence of success.
text: Imports and exports with no recent recorded run or outside every process Export date unknown. Latest recorded action run: 2026-09-21. 2 imports and exports have no recorded run since 2025-09-26 (12 months before the latest recorded run), 0 have no recorded run at all, and 3 are not in any process. An action outside a process can still run from a page, the Actions pane or the API; a run date older than the window may be right for a quarterly or annual load. What the list gives is the set to ask about, not a verdict. 3 actions
object: Export Pipeline for Sales Ops
object: Import Customers from Salesforce
object: Import Products from PIM file
evidence: Action | Kind | Most recent recorded run | In a process | Target or source
object: Import Products from PIM file
object: DAT04 Product Master
evidence: Import Products from PIM file | import | 2023-06-14 | no | DAT04 Product Master
object: Export Pipeline for Sales Ops
object: DAT05 CRM Pipeline
evidence: Export Pipeline for Sales Ops | export | 2025-02-11 | no | DAT05 CRM Pipeline
object: Import Customers from Salesforce
object: DAT07 Customer Master
evidence: Import Customers from Salesforce | import | 2026-08-30 | no | DAT07 Customer Master
Caldergate FP&A · Export Assumptions for Workforce · Export Opex Drivers to Excel · Import Budget from Excel(Showing 3 of 5 actions; 5 actions)
What was found
Export date unknown. Latest recorded action run: 2026-09-08. 3 imports and exports have no recorded run since 2025-09-13 (12 months before the latest recorded run), 0 have no recorded run at all, and 5 are not in any process.
Why it matters
An action outside a process can still run from a page, the Actions pane or the API; a run date older than the window may be right for a quarterly or annual load. What the list gives is the set to ask about, not a verdict.
Proposed step and benefit
For each action with no recorded run in the window, ask the owner how and how often it runs; document the answer in the action's notes. not quantified from the exports (none)
Preconditions and missing information
how each action is triggered (page, API, CloudWorks, by hand)
the expected frequency of each load
run history beyond the most recent run
Evidence strength
partial. Actions export: most recent run per action, process membership. Workspace administrators can run both import and export actions from the Actions pane; add them to a page in the user experience; any user can run import or export actions via the Anaplan Integrations API.
Reasons to keep the design
Year-end loads, ad-hoc reloads and API-driven actions legitimately show no recent run and no process. Retiring an import does not by itself justify removing its target module or the data it loaded.
All affected objects (5 actions)
Export Assumptions for Workforce · Export Opex Drivers to Excel · Import Budget from Excel · Import FX from Treasury file · Import from Caldergate Hub v1 - Cost Centres
Evidence (5 rows)
Action
Kind
Most recent recorded run
In a process
Target or source
Import from Caldergate Hub v1 - Cost Centres
import
2021-03-19
no
SYS02 Cost Centre Attributes
Import FX from Treasury file
import
2023-11-02
no
SYS05 FX Rates
Export Opex Drivers to Excel
export
2024-05-30
no
INP02 Opex Drivers
Import Budget from Excel
import
2025-11-20
no
INP02 Opex Drivers
Export Assumptions for Workforce
export
2026-09-05
no
SYS00 Model Settings
Validation plan
Baseline: record the outputs the owner names (and Calculation Effort where relevant) in production before any change.
Make the proposed change in a development copy, keeping the original state for comparison and recovery.
Use comparable inputs and scenarios in both copies; reconcile the named outputs cell for cell.
Agree acceptance criteria with the model owner before promotion. A status change in this report is not evidence of success.
text: Imports and exports with no recent recorded run or outside every process Export date unknown. Latest recorded action run: 2026-09-08. 3 imports and exports have no recorded run since 2025-09-13 (12 months before the latest recorded run), 0 have no recorded run at all, and 5 are not in any process. An action outside a process can still run from a page, the Actions pane or the API; a run date older than the window may be right for a quarterly or annual load. What the list gives is the set to ask about, not a verdict. 5 actions
object: Export Assumptions for Workforce
object: Export Opex Drivers to Excel
object: Import Budget from Excel
object: Import FX from Treasury file
object: Import from Caldergate Hub v1 - Cost Centres
evidence: Action | Kind | Most recent recorded run | In a process | Target or source
object: Import from Caldergate Hub v1 - Cost Centres
object: SYS02 Cost Centre Attributes
evidence: Import from Caldergate Hub v1 - Cost Centres | import | 2021-03-19 | no | SYS02 Cost Centre Attributes
object: Import FX from Treasury file
object: SYS05 FX Rates
evidence: Import FX from Treasury file | import | 2023-11-02 | no | SYS05 FX Rates
object: Export Opex Drivers to Excel
object: INP02 Opex Drivers
evidence: Export Opex Drivers to Excel | export | 2024-05-30 | no | INP02 Opex Drivers
object: Import Budget from Excel
object: INP02 Opex Drivers
evidence: Import Budget from Excel | import | 2025-11-20 | no | INP02 Opex Drivers
object: Export Assumptions for Workforce
object: SYS00 Model Settings
evidence: Export Assumptions for Workforce | export | 2026-09-05 | no | SYS00 Model Settings
Workforce Planning · Export Headcount by Department · Export Leavers Report · Import from Caldergate FP&A - Assumptions(All 3 actions; 3 actions)
What was found
Export date unknown. Latest recorded action run: 2026-09-08. 2 imports and exports have no recorded run since 2025-09-13 (12 months before the latest recorded run), 0 have no recorded run at all, and 3 are not in any process.
Why it matters
An action outside a process can still run from a page, the Actions pane or the API; a run date older than the window may be right for a quarterly or annual load. What the list gives is the set to ask about, not a verdict.
Proposed step and benefit
For each action with no recorded run in the window, ask the owner how and how often it runs; document the answer in the action's notes. not quantified from the exports (none)
Preconditions and missing information
how each action is triggered (page, API, CloudWorks, by hand)
the expected frequency of each load
run history beyond the most recent run
Evidence strength
partial. Actions export: most recent run per action, process membership. Workspace administrators can run both import and export actions from the Actions pane; add them to a page in the user experience; any user can run import or export actions via the Anaplan Integrations API.
Reasons to keep the design
Year-end loads, ad-hoc reloads and API-driven actions legitimately show no recent run and no process. Retiring an import does not by itself justify removing its target module or the data it loaded.
All affected objects (3 actions)
Export Headcount by Department · Export Leavers Report · Import from Caldergate FP&A - Assumptions
Evidence (3 rows)
Action
Kind
Most recent recorded run
In a process
Target or source
Import from Caldergate FP&A - Assumptions
import
2022-08-17
no
Inputs - Settings
Export Leavers Report
export
2024-12-19
no
Calcs - Attrition
Export Headcount by Department
export
2026-09-08
no
Reports - Headcount
Validation plan
Baseline: record the outputs the owner names (and Calculation Effort where relevant) in production before any change.
Make the proposed change in a development copy, keeping the original state for comparison and recovery.
Use comparable inputs and scenarios in both copies; reconcile the named outputs cell for cell.
Agree acceptance criteria with the model owner before promotion. A status change in this report is not evidence of success.
text: Imports and exports with no recent recorded run or outside every process Export date unknown. Latest recorded action run: 2026-09-08. 2 imports and exports have no recorded run since 2025-09-13 (12 months before the latest recorded run), 0 have no recorded run at all, and 3 are not in any process. An action outside a process can still run from a page, the Actions pane or the API; a run date older than the window may be right for a quarterly or annual load. What the list gives is the set to ask about, not a verdict. 3 actions
object: Export Headcount by Department
object: Export Leavers Report
object: Import from Caldergate FP&A - Assumptions
evidence: Action | Kind | Most recent recorded run | In a process | Target or source
object: Import from Caldergate FP&A - Assumptions
object: Inputs - Settings
evidence: Import from Caldergate FP&A - Assumptions | import | 2022-08-17 | no | Inputs - Settings
object: Export Leavers Report
object: Calcs - Attrition
evidence: Export Leavers Report | export | 2024-12-19 | no | Calcs - Attrition
object: Export Headcount by Department
object: Reports - Headcount
evidence: Export Headcount by Department | export | 2026-09-08 | no | Reports - Headcount
Export date unknown. Latest recorded action run: 2026-09-08. 0 imports and exports have no recorded run since 2025-09-13 (12 months before the latest recorded run), 0 have no recorded run at all, and 1 are not in any process.
Why it matters
An action outside a process can still run from a page, the Actions pane or the API; a run date older than the window may be right for a quarterly or annual load. What the list gives is the set to ask about, not a verdict.
Proposed step and benefit
For each action with no recorded run in the window, ask the owner how and how often it runs; document the answer in the action's notes. not quantified from the exports (none)
Preconditions and missing information
how each action is triggered (page, API, CloudWorks, by hand)
the expected frequency of each load
run history beyond the most recent run
Evidence strength
partial. Actions export: most recent run per action, process membership. Workspace administrators can run both import and export actions from the Actions pane; add them to a page in the user experience; any user can run import or export actions via the Anaplan Integrations API.
Reasons to keep the design
Year-end loads, ad-hoc reloads and API-driven actions legitimately show no recent run and no process. Retiring an import does not by itself justify removing its target module or the data it loaded.
All affected objects (1 actions)
Export Board Pack PDF Data
Evidence (1 rows)
Action
Kind
Most recent recorded run
In a process
Target or source
Export Board Pack PDF Data
export
2026-09-08
no
OUT01 Board Dashboard
Validation plan
Baseline: record the outputs the owner names (and Calculation Effort where relevant) in production before any change.
Make the proposed change in a development copy, keeping the original state for comparison and recovery.
Use comparable inputs and scenarios in both copies; reconcile the named outputs cell for cell.
Agree acceptance criteria with the model owner before promotion. A status change in this report is not evidence of success.
text: Imports and exports with no recent recorded run or outside every process Export date unknown. Latest recorded action run: 2026-09-08. 0 imports and exports have no recorded run since 2025-09-13 (12 months before the latest recorded run), 0 have no recorded run at all, and 1 are not in any process. An action outside a process can still run from a page, the Actions pane or the API; a run date older than the window may be right for a quarterly or annual load. What the list gives is the set to ask about, not a verdict. 1 action
object: Export Board Pack PDF Data
evidence: Action | Kind | Most recent recorded run | In a process | Target or source
object: Export Board Pack PDF Data
object: OUT01 Board Dashboard
evidence: Export Board Pack PDF Data | export | 2026-09-08 | no | OUT01 Board Dashboard
10 candidates were built from the findings and all are shown; 3 met the bar for being worth doing, the rest are listed after them with the reason. The number is not fixed.
What counts as worth doing
A change is worth doing when its evidence is not merely inferred, its scope is bounded, and its observed footprint is at least medium (1% of its model's measured effort, or 1M cells).
An investigation is worth doing only when the footprint is high (5% of its model's measured effort, or 50M cells): asking someone to check a small module is not a good use of their time.
A prerequisite (for example a consumer check on a module that a change would tune) is included whenever the action that needs it is.
Order
Inferred evidence last: a candidate resting on names or an unresolved comparison is a hypothesis, whatever its footprint.
Scope: a bounded scope (10 named objects or fewer) before an open-ended review.
Materiality band from the observed footprint: high (5% or more of its own model's measured effort, or 50M cells or more), medium (1% or 1M), low. Effort shares are banded within one model and never compared across models as absolute value.
Kind: a concrete change with a validation criterion before an investigation.
Evidence: confirmed before partial (observation confidence, not confidence in the recommendation).
Then the larger observed footprint in cells, then the title. Ties never depend on the order the files were read.
Overlapping findings on the same objects are merged into one decision; a change whose objects sit in a module with no consumer detected depends on that consumer check, which is then placed first.
All candidates in rank order (10)
#
Candidate
Evidence
Kind
Scope
Footprint
Depends on
1
Consider replacing the long chain of IF tests in the line item 'Forecast Opex' in the module 'CAL03 Opex' with a lookup table F2F5F16F21
confirmed
change
bounded (1)
5.0M cells; 16.0% of its model
2
Stop repeating text-to-item lookups (FINDITEM) on every cell in Caldergate FP&A (1 formula) F5F16
confirmed
change
bounded (1)
5.0M cells; 6.2% of its model
3
Find out whether anyone still uses the module 'CAL05 Opex OLD' in Caldergate FP&A F1
partial
investigation
bounded (1)
70.2M cells; 50.8% of its model
4
Look at the five heaviest calculations in Caldergate Data Hub F3
confirmed
investigation
bounded (5)
1.3M cells
5
Find out whether anyone still uses the module 'SYS01 Time' in Board Reporting F8
partial
investigation
bounded (1)
72 cells; 2.8% of its model
6
Remove 1 duplicate copy of one calculation in Caldergate FP&A F11
confirmed
change
bounded (2)
19.2K cells
7
Remove 1 duplicate copy of one calculation in Workforce Planning F12
confirmed
change
bounded (2)
4.5K cells
retire:Workforce Planning
8
Look at the five heaviest calculations in Board Reporting F6
confirmed
investigation
bounded (5)
720 cells
9
Find out whether anyone still uses the module 'zz Archive - 2021 Cost' in Workforce Planning F30
partial
investigation
bounded (1)
13.4K cells
10
Find out whether anyone still uses the module 'SYS01 Time Settings' in Caldergate Data Hub F31
partial
investigation
bounded (1)
180 cells
Rules, ranking and presentation were developed around a small number of estates; the three-action, 450-word plan is a design choice, not an established optimum, and the ordering is a hypothesis to revise. Nothing here was validated in a live Anaplan model.
Coverage and limitations
Pages, saved views, line item subsets, filters, access drivers and integrations are not in any export; each 'no consumer detected' finding lists the checks that remain.
Export date unknown for every file; the latest recorded action run is not an export date.
4 models reviewed · 8 findings to review first · 32 additional low-importance findings. No finding is a validated defect; all are observations or review candidates.
Observations
Caldergate FP&A holds 90% of the estate's 145M exported cells; CAL05 Opex OLD alone holds 70.2M.
Ten line items carry 68.0% of Caldergate FP&A's measured calculation effort (per model; the engine is not in the export).
Caldergate Data Hub feeds Caldergate FP&A, Workforce Planning through 6 import actions; all 6 feeds are inferred from action names.
Models, inventory and coverage
Caldergate Data Hub
Files supplied
line_items: Line Items.csv, modules: Modules.csv, actions: Actions.csv
Columns absent
none of the columns the analyses rely on
Input notices
none
Export date
unknown (not in the files)
Latest recorded action run
2026-09-21
Analysis generated
2026-09-24
Engine
not in any export (Classic or Polaris unknown)
Modules / line items / calculated
12 / 63 / 28
Cells as exported
8,060,698
Formulas parsed
100.00% (0 not parsed)
Referenced By agreement
1.0: edges present in both the parsed graph and Anaplan's Referenced By, over edges present in either (both 24, parse only 0, Anaplan only 0). Agreement between two observed edge sets, not the share of all dependencies known.
formula references (parsed from Formula); Referenced By (Anaplan's column, used as the check); module dimensions and notes (Modules export); import target modules and export source modules (Action column); process membership and most recent run per action
Inferred from names
model-to-model feeds, from the words after 'from' in import action names; external source names, from the same words
Missing
pages, dashboards and saved views (no export exists); line item subset membership (COLLECT sources); filters, access drivers and DCA usage; CloudWorks, API and integration schedules; engine (Classic or Polaris): not in any export; cell counts of summary levels (as exported); the date the Line Items and Modules exports were taken (not in the file)
DAT05 CRM Pipeline.Weighted Pipeline: summary SUM, referenced by no formula
Check whether a page or export needs the totals before changing the summary method.
minor
A-TEXT-FORMAT
DAT01 GL Transactions.Source System
1
DAT01 GL Transactions.Source System: TEXT with 1,254,456 cells
Use a list-formatted item or move text to a system module.
minor
A-TEXT-FORMAT
DAT06 Sales Orders.Last Order Ref
1
DAT06 Sales Orders.Last Order Ref: TEXT with 725,760 cells
Use a list-formatted item or move text to a system module.
info
F-DIVIDE-FN
CAL01 Volume Summary.Average Order Value
1
CAL01 Volume Summary.Average Order Value: DIVIDE() present
Confirm that Infinity or NaN is acceptable where the divisor is zero; if a zero is wanted, / gives it.
info
G-UNUSED
DAT01 GL Transactions.Loaded?
1
DAT01 GL Transactions.Loaded?: calculated, 1,254,456 cells, no formula consumer detected
Check pages, saved views, line item subsets and integrations before treating as unused.
info
H-NOTES
(model)
1
(model): 8 of 12 modules have no notes; largest: DAT06 Sales Orders, DAT05 CRM Pipeline, CAL01 Volume Summary, DAT07 Customer Master, DAT03 Account Master
Add a one-line purpose note to each module, largest first.
All rule findings for Caldergate Data Hub (6)
Rule
Severity
Object
Finding
Suggested reading
A-SUMMARY-ON
minor
DAT05 CRM Pipeline.Weighted Pipeline
summary SUM, referenced by no formula
Check whether a page or export needs the totals before changing the summary method.
A-TEXT-FORMAT
minor
DAT01 GL Transactions.Source System
TEXT with 1,254,456 cells
Use a list-formatted item or move text to a system module.
A-TEXT-FORMAT
minor
DAT06 Sales Orders.Last Order Ref
TEXT with 725,760 cells
Use a list-formatted item or move text to a system module.
F-DIVIDE-FN
info
CAL01 Volume Summary.Average Order Value
DIVIDE() present
Confirm that Infinity or NaN is acceptable where the divisor is zero; if a zero is wanted, / gives it.
G-UNUSED
info
DAT01 GL Transactions.Loaded?
calculated, 1,254,456 cells, no formula consumer detected
Check pages, saved views, line item subsets and integrations before treating as unused.
H-NOTES
info
(model)
8 of 12 modules have no notes; largest: DAT06 Sales Orders, DAT05 CRM Pipeline, CAL01 Volume Summary, DAT07 Customer Master, DAT03 Account Master
Add a one-line purpose note to each module, largest first.
Caldergate FP&A
Files supplied
line_items: Line Items.csv, modules: Modules.csv, actions: Actions.csv
Columns absent
none of the columns the analyses rely on
Input notices
none
Export date
unknown (not in the files)
Latest recorded action run
2026-09-08
Analysis generated
2026-09-24
Engine
not in any export (Classic or Polaris unknown)
Modules / line items / calculated
30 / 278 / 171
Cells as exported
130,001,662
Formulas parsed
100.00% (0 not parsed)
Referenced By agreement
1.0: edges present in both the parsed graph and Anaplan's Referenced By, over edges present in either (both 384, parse only 0, Anaplan only 0). Agreement between two observed edge sets, not the share of all dependencies known.
formula references (parsed from Formula); Referenced By (Anaplan's column, used as the check); module dimensions and notes (Modules export); import target modules and export source modules (Action column); process membership and most recent run per action
Inferred from names
model-to-model feeds, from the words after 'from' in import action names; external source names, from the same words
Missing
pages, dashboards and saved views (no export exists); line item subset membership (COLLECT sources); filters, access drivers and DCA usage; CloudWorks, API and integration schedules; engine (Classic or Polaris): not in any export; cell counts of summary levels (as exported); the date the Line Items and Modules exports were taken (not in the file)
Calculated line items with a blank context field
0
Where measured calculation effort sits
Line item
Effort share
Cells
Formula
CAL03 Opex.Forecast Opex
16.04%
5.0M
IF ITEM(Accounts) = Accounts.'6100 Rent' THEN 'INP02 Opex Drivers'.Rent ELSE IF ITEM(Accounts) = Accounts.'6110 Rates' T
CAL03 Opex.Opex GBP
9.26%
5.0M
Opex * 'SYS05 FX Rates'.Rate to GBP[LOOKUP: 'SYS02 Cost Centre Attributes'.Currency]
CAL05 Opex OLD.Opex GBP
9.26%
5.0M
Opex * 'SYS05 FX Rates'.Rate to GBP[LOOKUP: 'SYS02 Cost Centre Attributes'.Currency]
36 direct dependents, 101 downstream across 13 modules
Include in change-impact checks.
G-UNUSED
info
CAL03 Opex.Opex Variance
calculated, 5,017,824 cells, no formula consumer detected
Check pages, saved views, line item subsets and integrations before treating as unused.
G-UNUSED
info
CAL05 Opex OLD.Opex Cumulative
calculated, 5,017,824 cells, no formula consumer detected
Check pages, saved views, line item subsets and integrations before treating as unused.
G-UNUSED
info
CAL05 Opex OLD.Opex Run Rate
calculated, 5,017,824 cells, no formula consumer detected
Check pages, saved views, line item subsets and integrations before treating as unused.
G-UNUSED
info
DAT01 Actuals GL.Journal Cost Centre
calculated, 5,017,824 cells, no formula consumer detected
Check pages, saved views, line item subsets and integrations before treating as unused.
G-UNUSED
info
DAT01 Actuals GL.Loaded?
calculated, 5,017,824 cells, no formula consumer detected
Check pages, saved views, line item subsets and integrations before treating as unused.
H-NOTES
info
(model)
23 of 30 modules have no notes; largest: CAL03 Opex, INP02 Opex Drivers, CAL12 Driver Phasing, CAL02 Revenue, INP01 Volumes
Add a one-line purpose note to each module, largest first.
Workforce Planning
Files supplied
line_items: Line Items.csv, modules: Modules.csv, actions: Actions.csv
Columns absent
none of the columns the analyses rely on
Input notices
none
Export date
unknown (not in the files)
Latest recorded action run
2026-09-08
Analysis generated
2026-09-24
Engine
not in any export (Classic or Polaris unknown)
Modules / line items / calculated
9 / 55 / 36
Cells as exported
6,343,559
Formulas parsed
100.00% (0 not parsed)
Referenced By agreement
1.0: edges present in both the parsed graph and Anaplan's Referenced By, over edges present in either (both 64, parse only 0, Anaplan only 0). Agreement between two observed edge sets, not the share of all dependencies known.
effort: Calculation Effort column absent or blank: no effort figures for this model
Confirmed from metadata
formula references (parsed from Formula); Referenced By (Anaplan's column, used as the check); module dimensions and notes (Modules export); import target modules and export source modules (Action column); process membership and most recent run per action
Inferred from names
model-to-model feeds, from the words after 'from' in import action names; external source names, from the same words
Missing
pages, dashboards and saved views (no export exists); line item subset membership (COLLECT sources); filters, access drivers and DCA usage; CloudWorks, API and integration schedules; engine (Classic or Polaris): not in any export; cell counts of summary levels (as exported); the date the Line Items and Modules exports were taken (not in the file)
Calculated line items with a blank context field
0
Calculation Effort: unavailable (column absent or blank), not zero.
Largest modules by cells
Module
Cells
Share
Calcs - Headcount by CC
3.0M
46.8%
Calcs - Cost
2.4M
37.8%
Data - Employees
666K
10.5%
Calcs - Attrition
284K
4.5%
zz Archive - 2021 Cost
13.4K
0.2%
Reports - Headcount
13.0K
0.2%
Data - Cost Centre Map
532
0.0%
Inputs - Calendar
252
0.0%
Inputs - Settings
7
0.0%
Most depended-on line items
Line item
Direct readers
Data - Employees.Role
8
Calcs - Cost.Inflated Salary
4
Data - Employees.FTE
3
Data - Employees.Cost Centre
3
Reports - Headcount.FTE
3
Data - Employees.End Date
2
Calcs - Cost.Monthly Salary
2
Calcs - Cost.Total Cost
2
Calcs - Headcount by CC.FTE
2
Calcs - Attrition.Leavers by Role
2
Actions
3 imports, 3 exports, 5 processes; latest recorded run 2026-09-08; window 12 months (cutoff 2025-09-13)
Not in any process: 3; no recorded run since cutoff: 2; no recorded run at all: 0
Slowest recorded: Import Employees from Workday 22s, Export Headcount Cost to FP&A 4s, Import from Caldergate Data Hub - Cost Centre Map 0s, Export Headcount by Department 0s, Export Leavers Report 0s, Import from Caldergate FP&A - Assumptions 0s
Import targets: Data - Employees (1), Data - Cost Centre Map (1), Inputs - Settings (1)
Rule findings grouped into patterns (16)
Severity
Rule
Pattern
Count
Example
Suggested reading
major
A-SUBSIDIARY
Calcs - Attrition.Leavers
1
Calcs - Attrition.Leavers: applies to Employees in a module on Roles; used by 1 formulas
Consider a module dimensioned as the line item is, if the readers would be clearer for it.
minor
A-SUMMARY-ON
Calcs - Headcount by CC.Average Salary
1
Calcs - Headcount by CC.Average Salary: summary FORMULA, referenced by no formula
Check whether a page or export needs the totals before changing the summary method.
minor
A-TEXT-FORMAT
Data - Employees.Employee Name
1
Data - Employees.Employee Name: TEXT with 66,600 cells
Use a list-formatted item or move text to a system module.
minor
A-TEXT-FORMAT
Data - Employees.Name and Role
1
Data - Employees.Name and Role: TEXT with 66,600 cells
Use a list-formatted item or move text to a system module.
minor
A-TEXT-JOIN
Data - Employees.Name and Role
1
Data - Employees.Name and Role: & in a 66,600-cell line item
Check whether a time-formatted or version-formatted line item and LOOKUP would remove the hard-coded period.
info
F-DIVIDE-FN
Calcs - Headcount by CC.Average Salary
1
Calcs - Headcount by CC.Average Salary: DIVIDE() present
Confirm that Infinity or NaN is acceptable where the divisor is zero; if a zero is wanted, / gives it.
info
F-DIVIDE-FN
Reports - Headcount.Cost per FTE
1
Reports - Headcount.Cost per FTE: DIVIDE() present
Confirm that Infinity or NaN is acceptable where the divisor is zero; if a zero is wanted, / gives it.
info
F-DIVIDE-FN
zz Archive - 2021 Cost.Cost per Head
1
zz Archive - 2021 Cost.Cost per Head: DIVIDE() present
Confirm that Infinity or NaN is acceptable where the divisor is zero; if a zero is wanted, / gives it.
info
G-UNUSED
Calcs - Headcount by CC.Average Salary
1
Calcs - Headcount by CC.Average Salary: calculated, 593,712 cells, no formula consumer detected
Check pages, saved views, line item subsets and integrations before treating as unused.
info
G-UNUSED
Calcs - Headcount by CC.Bonus %
1
Calcs - Headcount by CC.Bonus %: calculated, 593,712 cells, no formula consumer detected
Check pages, saved views, line item subsets and integrations before treating as unused.
info
G-UNUSED
Data - Employees.Name and Role
1
Data - Employees.Name and Role: calculated, 66,600 cells, no formula consumer detected
Check pages, saved views, line item subsets and integrations before treating as unused.
info
H-NOTES
(model)
1
(model): 5 of 9 modules have no notes; largest: Calcs - Cost, Calcs - Attrition, Reports - Headcount, Inputs - Calendar, Inputs - Settings
Add a one-line purpose note to each module, largest first.
All rule findings for Workforce Planning (16)
Rule
Severity
Object
Finding
Suggested reading
A-SUBSIDIARY
major
Calcs - Attrition.Leavers
applies to Employees in a module on Roles; used by 1 formulas
Consider a module dimensioned as the line item is, if the readers would be clearer for it.
A-SUMMARY-ON
minor
Calcs - Headcount by CC.Average Salary
summary FORMULA, referenced by no formula
Check whether a page or export needs the totals before changing the summary method.
A-TEXT-FORMAT
minor
Data - Employees.Employee Name
TEXT with 66,600 cells
Use a list-formatted item or move text to a system module.
A-TEXT-FORMAT
minor
Data - Employees.Name and Role
TEXT with 66,600 cells
Use a list-formatted item or move text to a system module.
A-TEXT-JOIN
minor
Data - Employees.Name and Role
& in a 66,600-cell line item
Build the text once in a systems module.
F-HARDCODE
minor
Calcs - Attrition.Annualised Attrition
constants 11
Decide whether the number is an assumption; if so, give it a named input line item and a note.
F-HARDCODE
minor
Calcs - Cost.Bonus
constants 0.1
Decide whether the number is an assumption; if so, give it a named input line item and a note.
F-HARDCODE
minor
Calcs - Headcount by CC.Bonus %
constants 0.1
Decide whether the number is an assumption; if so, give it a named input line item and a note.
F-SELECT-TIME
minor
Reports - Headcount.FTE Budget
SELECT: VERSIONS.Budget
Check whether a time-formatted or version-formatted line item and LOOKUP would remove the hard-coded period.
F-DIVIDE-FN
info
Calcs - Headcount by CC.Average Salary
DIVIDE() present
Confirm that Infinity or NaN is acceptable where the divisor is zero; if a zero is wanted, / gives it.
F-DIVIDE-FN
info
Reports - Headcount.Cost per FTE
DIVIDE() present
Confirm that Infinity or NaN is acceptable where the divisor is zero; if a zero is wanted, / gives it.
F-DIVIDE-FN
info
zz Archive - 2021 Cost.Cost per Head
DIVIDE() present
Confirm that Infinity or NaN is acceptable where the divisor is zero; if a zero is wanted, / gives it.
G-UNUSED
info
Calcs - Headcount by CC.Average Salary
calculated, 593,712 cells, no formula consumer detected
Check pages, saved views, line item subsets and integrations before treating as unused.
G-UNUSED
info
Calcs - Headcount by CC.Bonus %
calculated, 593,712 cells, no formula consumer detected
Check pages, saved views, line item subsets and integrations before treating as unused.
G-UNUSED
info
Data - Employees.Name and Role
calculated, 66,600 cells, no formula consumer detected
Check pages, saved views, line item subsets and integrations before treating as unused.
H-NOTES
info
(model)
5 of 9 modules have no notes; largest: Calcs - Cost, Calcs - Attrition, Reports - Headcount, Inputs - Calendar, Inputs - Settings
Add a one-line purpose note to each module, largest first.
Board Reporting
Files supplied
line_items: Line Items.csv, modules: Modules.csv, actions: Actions.csv
Columns absent
none of the columns the analyses rely on
Input notices
none
Export date
unknown (not in the files)
Latest recorded action run
2026-09-08
Analysis generated
2026-09-24
Engine
not in any export (Classic or Polaris unknown)
Modules / line items / calculated
7 / 30 / 13
Cells as exported
137,882
Formulas parsed
100.00% (0 not parsed)
Referenced By agreement
1.0: edges present in both the parsed graph and Anaplan's Referenced By, over edges present in either (both 16, parse only 0, Anaplan only 0). Agreement between two observed edge sets, not the share of all dependencies known.
formula references (parsed from Formula); Referenced By (Anaplan's column, used as the check); module dimensions and notes (Modules export); import target modules and export source modules (Action column); process membership and most recent run per action
Inferred from names
model-to-model feeds, from the words after 'from' in import action names; external source names, from the same words
Missing
pages, dashboards and saved views (no export exists); line item subset membership (COLLECT sources); filters, access drivers and DCA usage; CloudWorks, API and integration schedules; engine (Classic or Polaris): not in any export; cell counts of summary levels (as exported); the date the Line Items and Modules exports were taken (not in the file)
3 imports, 1 exports, 4 processes; latest recorded run 2026-09-08; window 12 months (cutoff 2025-09-13)
Not in any process: 1; no recorded run since cutoff: 0; no recorded run at all: 0
Slowest recorded: Import from Caldergate FP&A - P&L by Cost Centre 3s, Import from Caldergate FP&A - Board Pack 1s, Import from Workforce Planning - Headcount by Department 0s, Export Board Pack PDF Data 0s
Relationship types inspected: line-item references parsed from every formula (checked against Anaplan's Referenced By column where present); import target modules and export source modules from the Action column; process membership. Not inspected because not exported: pages, dashboards, saved views, line item subsets (COLLECT sources), filters, access drivers, CloudWorks and API schedules.
Caldergate Data Hub: agreement 100%; Anaplan-only edges by cause none
Cause
Examples (referencing line item -> referenced line item)
collect
none
unparsed
none
other
none
ours_only
none
Caldergate FP&A: agreement 100%; Anaplan-only edges by cause none
Cause
Examples (referencing line item -> referenced line item)
collect
none
unparsed
none
other
none
ours_only
none
Workforce Planning: agreement 100%; Anaplan-only edges by cause none
Cause
Examples (referencing line item -> referenced line item)
collect
none
unparsed
none
other
none
ours_only
none
Board Reporting: agreement 100%; Anaplan-only edges by cause none
Cause
Examples (referencing line item -> referenced line item)
collect
none
unparsed
none
other
none
ours_only
none
Source-name candidates
Words after "from" in import action names that matched no model in the set. Candidates, not confirmed systems; generic words are excluded.
Candidate
Imports
Example
NetSuite
3
Caldergate Data Hub: Import GL from NetSuite
Salesforce
3
Caldergate Data Hub: Import Orders from Salesforce
Workday
2
Caldergate Data Hub: Import Employees from Workday
PIM file
1
Caldergate Data Hub: Import Products from PIM file
Treasury file
1
Caldergate FP&A: Import FX from Treasury file
Caldergate Hub v1
1
Caldergate FP&A: Import from Caldergate Hub v1 - Cost Centres
Excel
1
Caldergate FP&A: Import Budget from Excel
Dimensions shared across models
Dimension
Models
Cost Centres
Caldergate Data Hub, Caldergate FP&A, Workforce Planning, Board Reporting
(ITEM(Time) = SYS00 Model Settings.Current Period)
Employer NI
Caldergate FP&A, Workforce Planning
(IF (Monthly Salary > NI Threshold) THEN ((Monthly Salary - NI Threshold) * NI Rate) ELSE 0)
Group
Caldergate Data Hub, Caldergate FP&A
PARENT(ITEM(Cost Centres))
Opex?
Caldergate Data Hub, Caldergate FP&A
(Account Type = Account Types.Opex)
Revenue?
Caldergate Data Hub, Caldergate FP&A
(Account Type = Account Types.Revenue)
Sign
Caldergate Data Hub, Caldergate FP&A
(IF 'Revenue?' THEN -1 ELSE 1)
Working Days
Caldergate FP&A, Workforce Planning
(Days in Month - Weekend Days - Bank Holidays)
Methodology
Every rule that ran, its source, and the official documentation it rests on (consulted 2026-09-22). Rule results are automated readings of the exports; nothing here was validated in a live Anaplan model.
Rules and documentation (27)
Rule
Severity
Source
Description
Planual
Documentation
A-LI-COUNT More than 50 line items in a module
minor
ANAPLAN
Anaplan's checklist suggests reviewing modules with more than 50 line items. Many line items can be a sign of mixed purposes; it can also be a deliberate, well-understood input grid. Prompts a review, not a target.
2.01-12 Group formulas with like dimensionality; 2.02-18 Break up formulas
A-SUMMARY-ON Summary method on where a formula suggests it is not needed
minor
ANAPLAN
Summaries calculate on every parent; turn them off unless a parent value is used. Flags large number line items with a summary that no formula references.
2.01-10 Avoid summary methods unless strictly required; 2.03-01 Keep summary options off by default
A-TEXT-FORMAT Text-formatted line item
minor
ANAPLAN
Text line items use more memory and cannot aggregate. Anaplan's checklist: minimise; prefer list-formatted items.
2.03-02 Avoid using TEXT formats
A-SUBSIDIARY Subsidiary view on a calculation line item
major
ANAPLAN
A line item whose Applies To differs from its module's is a subsidiary view. The concern: its dimensions are not visible at module level, so readers and the next builder can misjudge what a reference returns, and the engine maps between the two dimension sets on every read. Anaplan's checklist: display and export only.
2.01-06 Avoid using Subsidiary views
A-DAISY Daisy-chain formula
major
ANAPLAN
A references B references C where each is a pure copy. Each step is a stored copy of the same values, and a change of source needs every step re-pointed. A pass-through can also be a deliberate interface (a reporting contract, a security boundary, a stable import source). Anaplan's checklist advises against chains.
2.02-19 Avoid daisy-chaining when writing formulas
A-IF-COUNT Formula with more than 10 IF THEN ELSE
major
ANAPLAN
Anaplan's checklist: refactor above 10 IF conditions; use a LOOKUP or Boolean flag line items.
2.02-01 Nested IFs; 2.02-02 Fewer than 12 expressions in a formula
A-SYSTEMS-FN Unchanging function in a calculation module
minor
ANAPLAN
PARENT(), text joins, START(), CURRENTPERIODSTART() produce values that do not change per cell; Anaplan's checklist: compute once in a systems module.
2.01-08 Create a system module for all key lists; 2.01-09 Use Lookup or Constants modules
A-TEXT-JOIN Text concatenation in a large line item
minor
ANAPLAN
Anaplan's checklist: combining text strings takes memory; restructure into systems modules.
2.02-04 Concatenate text strings with caution; 2.02-05 Create joins in the smallest hierarchy
A-FINDITEM FINDITEM in a large line item
minor
ANAPLAN
Anaplan's checklist: FINDITEM is expensive; minimise and null-check first.
2.02-15 Avoid using FINDITEM on blank values
F-MIXED-CLAUSE SUM with LOOKUP or SELECT in the same formula
major
FORMULA
Anaplan's LOOKUP page: never use SUM and LOOKUP in the same formula; the SELECT page: never combine SUM and SELECT in the same formula, create two line items. LOOKUP together with SELECT is not covered by that guidance and is not flagged here. Whether splitting helps a given formula is not guaranteed; it is the documented starting point.
2.02-08 Avoid combining SUM and LOOKUP; 2.02-14 Avoid using SELECT
LOOKUP: Never use SUM and LOOKUP in the same formula. This can lead to extremely long calculation times. SELECT: Never combine SUM and SELECT in the same formula. Create two separate line items. We don't recommend the use of the SELECT function in conjunction with non-generic time periods.
F-SELECT-TIME SELECT on a specific time period or version
minor
FORMULA
Anaplan's SELECT page: not recommended with non-generic time periods, because the hard-coded element has to be revisited when the timescale changes. Version selections are listed for the same reason.
2.02-12 Do not hardcode references to list members; 2.02-14 Avoid using SELECT
SELECT: Never combine SUM and SELECT in the same formula. Create two separate line items. We don't recommend the use of the SELECT function in conjunction with non-generic time periods.
F-HARDCODE Hard-coded constant in a formula
minor
FORMULA
Numbers inside formulas may be assumptions (a rate, a threshold) that belong in a named input line item. The same literal can mean different things in different formulas; each occurrence needs its own reading.
2.01-09 Use Lookup or Constants modules; 2.02-12 Do not hardcode references to list members
F-LONG Very long formula
minor
FORMULA
Anaplan's checklist: a formula should be explainable in one sentence.
2.02-02 Fewer than 12 expressions in a formula; 2.02-18 Break up formulas
F-DIVIDE-FN DIVIDE() used: Infinity on a zero divisor
info
FORMULA
Anaplan's operator page: the / operator returns zero when the divisor is zero, and the DIVIDE function returns Infinity (DIVIDE(-45,0) returns -Infinity). Neither is an error. Listed so the owner can confirm which display is intended where a divisor can be zero; ordinary division with / needs no guard.
Operators and constants: If the divisor is zero, the operator returns zero as the result (the DIVIDE function returns Infinity). DIVIDE: DIVIDE(50,0) returns Infinity; DIVIDE(-45,0) returns -Infinity.
F-PARSE Formula not parsed (analysis limitation)
info
FORMULA
The parser did not follow this formula, so its references are missing from the dependency graph. This is a limitation of the analysis, not evidence of a model defect.
G-CYCLE Circular reference
info
GRAPH
Line items that depend on each other at the line-item level. Anaplan rejects a direct circular reference at formula entry, so a real cycle always passes through a time or version offset (PREVIOUS, LAG, OFFSET, CUMULATE, PREVIOUSVERSION): an opening balance from last period's closing balance. Reported as info to confirm it is intended. A cycle with NO such function cannot exist in Anaplan; if one appears, the parser has misread a reference and it is reported as critical.
G-UNUSED No consumers detected within the inspected dependency types
info
GRAPH
Calculated, and no formula in the export references it. Consumers the exports do not show: pages and dashboards, saved views (including views another model imports), line item subsets, filters, access drivers, actions and integrations. Not the same as unused.
G-HUB Hub line item
info
GRAPH
Referenced by many line items; a change here has a wide blast radius. Not a fault, a fact for reviewers.
G-EMPTY-MODULE Module with no line items
minor
GRAPH
Empty modules are usually leftovers.
H-NOTES Modules without notes
info
GRAPH
Documentation coverage. One finding per model: how many modules carry no notes, and the largest of them.
REDUNDANT-EXACT Same calculation under different names
info
GRAPH
Same resolved formula and same context (dimensions, time scale, time range, versions, data type, summary, formula scope). COLLECT() and blank-context rows excluded.
COLLECT: The source modules must contain the line items in the line item subset used in the result module. The result module must have a line item subset as a dimension.
REDUNDANT-ALIAS Line item that only copies another
info
GRAPH
Formula is a single reference to a line item with identical context.
REDUNDANT-NEAR Formulas that differ in one leaf
info
GRAPH
Same skeleton and context; one constant, reference or list item differs. May be intentional.
ACTIONS Imports and exports: recorded runs and process membership
info
ACTIONS
Most recent recorded run per action relative to the export's latest run; process membership. Not a verdict on use.
Imports and exports as actions: Workspace administrators can run both import and export actions from the Actions pane; add them to a page in the user experience; any user can run import or export actions via the Anaplan Integrations API.
EFFORT Calculation Effort concentration
info
ANAPLAN
Anaplan's per-line-item share, as exported, per model.
2.03-07 Review the calculation effort
Configure line items: Calculation Effort: a percentage that represents the calculation effort of the line item. Classic: measured across the entire model when the model opens. Polaris: against the total effort of all line items over the last 10 minutes.
DUP-CROSS Same name and formula in more than one model
info
GRAPH
Formula tree equality across models; local data may differ.
Evidence strength labels
confirmed. Everything this finding relies on is in the exports and was checked against Anaplan's Referenced By column.
partial. Formulas, imports and exports are in the exports; pages, saved views, line item subsets and integrations are not, and can hold consumers.
inferred. Rests on names or on a comparison the exports cannot fully resolve. A hypothesis to test, not an observation.
Glossary
Cells. Every line item multiplied out over its dimensions and time, as the export counts them. Workspace size and model open time follow cells; contractual cost does not follow from cells alone.
Calculation effort. Anaplan's own measure of where the engine spends its time, per line item, as a share of one model. Classic measures the whole model at open; Polaris measures a rolling ten-minute window. The exports do not say which engine produced the column, and shares are never added across models.
No consumer detected. No formula in the export references the object and, where an Actions export was supplied, no export action reads its module (otherwise action usage is not assessed). Pages, saved views, line item subsets, filters, access drivers and integrations are not in the exports and can hold consumers; incomplete parsing can hide a reader. Not the same as unused.
Referenced By agreement. Agreement between two observed edge sets: edges present in both the parsed dependency graph and Anaplan's Referenced By column, over edges present in either. It measures how far the two agree, not what share of every dependency is known; 100% does not establish complete coverage of the estate. Discrepancies are listed by cause.
Observed footprint. The cells of the objects reached or named, each counted once. Not a saving, a changed value or a predicted runtime; those are measured after a validated change.
Inferred. Read off names, not off a system table. Model-to-model feeds come from the words after 'from' in import action names; the same words give the source-name candidates.
Footprint. What objects occupy now. A conditional benefit is what would be released if an investigation confirms they can go. A measured improvement needs a before-and-after reading in the model; this report contains none.
Evidence strength. Confirmed: everything relied on is in the exports. Partial: formulas and actions are, pages and subsets are not. Inferred: rests on names or on a comparison the exports cannot fully resolve.
Register and downloads
The register lists every finding with its complete object set. The working register adds your review status and note per finding (identified by a stable id that survives regeneration). Both are built in this page from the embedded data; nothing is sent anywhere. The full evidence print is under the view buttons.