This workbook scores 59.7 out of 100 (grade D), reflecting meaningful structural and data-quality issues across its 11 sheets and 289 formula cells. The most serious concern is five critical error values sitting as static content in the Raw Data sheet — these are not live formula errors but hardcoded error states, almost certainly the result of a paste operation that overwrote underlying calculations. Until they are resolved, any formula downstream that references those cells will either inherit the error or silently ignore it.
Two circular references are present and both carry the intentional_iterative flag, meaning the model relies on Excel's iterative calculation setting being enabled. This is a portability risk: the model will behave incorrectly or refuse to calculate on any machine where iterative calculation is turned off, including many shared or locked-down environments. Beyond that, 76 instances of hardcoded constants embedded in formulas and 46 fragile VLOOKUP constructs (using hardcoded column indices and approximate matching) were flagged as worth reviewing; these are heuristic findings and may include some false positives, but the volume suggests systematic practices that could cause silent errors if the workbook is extended.
Lower-severity items include one inconsistent formula in a range, one merged cell inside a data or formula range, six numbers stored as text in referenced ranges, and two overly complex formulas. These are warnings or informational findings and do not individually threaten model integrity, but they add friction to auditing and maintenance. Collectively, the combination of static error values, iterative-dependency risk, and a high density of fragile lookups warrants a structured remediation pass before this workbook is used for decision-making.
Top fixes
Replace static error values in Raw Data
B12B13C12D13E14
Locate the original source data or calculations for these cells on the Raw Data sheet. The errors appear to have been pasted in as static values rather than retained as live formulas. Restore the underlying formulas or supply correct data values, then verify that all downstream references recalculate cleanly.
Address iterative circular references and document the dependency
Balance Sheet!B10Sensitivity!B10
Because these circular references require iterative calculation to be enabled, add a prominent workbook-level note documenting this requirement. Evaluate whether the circular logic can be restructured to remove the dependency; if not, ensure all users and any automated processes that open this file have iterative calculation switched on to avoid silent miscalculation.
Harden fragile VLOOKUP formulas in Order Book
F10F11F12
These VLOOKUPs use a hardcoded column index and approximate matching, making them worth reviewing for correctness. Replace them with INDEX/MATCH (or XLOOKUP if available) using exact-match mode, which eliminates the column-index brittleness and prevents silently wrong results from unsorted lookup tables. Audit the remaining flagged lookups across the workbook for the same pattern.
Generated from the findings above only — the AI never reads
your workbook. Heuristic findings are candidates to review, not verdicts.
Numbers stored as text in referenced rangesheuristic6 · −1.1 pts
Functions like SUM and AVERAGE silently skip text, so a number stored as text contributes nothing to the totals that read it. The total still looks plausible — it is simply missing rows — making this a classic source of invisible understatement.
Raw Data!B19
The value "1,240" is stored as text, not as a number, inside a range read by formulas such as Raw Data!B20.
Raw Data!C19
The value "1,255" is stored as text, not as a number, inside a range read by formulas such as Raw Data!B20.
Raw Data!D19
The value "1,283" is stored as text, not as a number, inside a range read by formulas such as Raw Data!B20.
Raw Data!E19
The value "1,310" is stored as text, not as a number, inside a range read by formulas such as Raw Data!B20.
Raw Data!F19
The value "1,342" is stored as text, not as a number, inside a range read by formulas such as Raw Data!B20.
Raw Data!G19
The value "1,371" is stored as text, not as a number, inside a range read by formulas such as Raw Data!B20.
Overly complex formulas2 · −0.9 pts
Formulas nobody can read are formulas nobody can verify — deeply nested or very long formulas hide mistakes during review and break silently when edited. They are prime candidates for refactoring into helper cells or named ranges (LAMBDA/LET).
DCF!B12
Formula is nested 7 functions deep (limit 5): =ROUND(MAX(0,SUM(B6:F6)+IF(ISNUMBER(B9),B9,MIN(ABS(SUM(B6:F6)),MAX(0,AVERAGE(B6:F6))*ROUND(MIN(9,CO…
DCF!B8
Formula is nested 7 functions deep (limit 5) and 228 characters long (limit 200): =IF(WACC!$B$10>Assumptions!$B$20,MAX(0,MIN(('Cash Flow'!F12*(1+Assumptions!$B$20))/(WACC!$B$10-Assu…
Fix pack Pro
Pro feature — shown in full here so you can see exactly what
you'd get. On your own reports the checklist below is part of Pro.
122 paste-ready corrections
(46 mechanical, 76 assisted) —
prepared from this audit's findings. Your workbook is never modified;
each fix is a formula you paste yourself.
Create these input cells first
The extraction fixes below reference labeled assumption
cells — add a sheet named Assumptions and enter each value
once (label in column A, value in column B):
Cell
Value
Suggested label
Assumptions!$B$1
0.25
Assumption 1 (was 0.25)
Assumptions!$B$2
0.82
Assumption 2 (was 0.82)
Assumptions!$B$3
0.019
Assumption 3 (was 0.019)
Assumptions!$B$4
9
Assumption 4 (was 9)
Assumptions!$B$5
4
Assumption 5 (was 4)
Assumptions!$B$6
6
Assumption 6 (was 6)
Assumptions!$B$7
14
Assumption 7 (was 14)
Assumptions!$B$8
1000
Assumption 8 (was 1000)
Assumptions!$B$9
8
Assumption 9 (was 8)
Assumptions!$B$10
0.21
Assumption 10 (was 0.21)
Assumptions!$B$11
1.02
Assumption 11 (was 1.02)
Assumptions!$B$12
1.04
Assumption 12 (was 1.04)
Assumptions!$B$13
1.06
Assumption 13 (was 1.06)
Assumptions!$B$14
1.08
Assumption 14 (was 1.08)
Assumptions!$B$15
1.21
Assumption 15 (was 1.21)
Assumptions!$B$16
3
Assumption 16 (was 3)
Assumptions!$B$17
1.052
Assumption 17 (was 1.052)
Assumptions!$B$18
-0.005
Assumption 18 (was -0.005)
Assumptions!$B$19
-0.0025
Assumption 19 (was -0.0025)
Assumptions!$B$20
0.0025
Assumption 20 (was 0.0025)
Assumptions!$B$21
0.005
Assumption 21 (was 0.005)
Assumptions!$B$22
-0.01
Assumption 22 (was -0.01)
Assumptions!$B$23
0.01
Assumption 23 (was 0.01)
The checklist
Order Book!F10mechanical40 cells share this pattern
before=VLOOKUP(C10,'Raw Data'!$A$24:$E$26,4)
after=VLOOKUP(C10,'Raw Data'!$A$24:$E$26,4,FALSE)
Adds the exact-match flag (FALSE) to 1 lookup so unsorted data returns errors instead of silently wrong values. The hardcoded column index still needs review — it will drift if columns are inserted.
Fill down: apply the same correction across
F4:F43 — the pattern is identical
in all 40 cells (adjust relative references as Excel does).
Revenue Build!B10mechanical3 cells share this pattern
before=VLOOKUP(A10,'Raw Data'!$A$24:$E$26,3)
after=VLOOKUP(A10,'Raw Data'!$A$24:$E$26,3,FALSE)
Adds the exact-match flag (FALSE) to 1 lookup so unsorted data returns errors instead of silently wrong values. The hardcoded column index still needs review — it will drift if columns are inserted.
Fill down: apply the same correction across
B9:B11 — the pattern is identical
in all 3 cells (adjust relative references as Excel does).
Sensitivity!B14mechanical3 cells share this pattern
before=VLOOKUP(B6,$H$15:$I$19,2)
after=VLOOKUP(B6,$H$15:$I$19,2,FALSE)
Adds the exact-match flag (FALSE) to 1 lookup so unsorted data returns errors instead of silently wrong values. The hardcoded column index still needs review — it will drift if columns are inserted.
Fill down: apply the same correction across
B14, D14, F14 — the pattern is identical
in all 3 cells (adjust relative references as Excel does).
Cash Flow!B10assisted5 cells share this pattern
before=B6*0.82
after=B6*Assumptions!$B$2
Replaces the buried constant (0.82 → Assumptions!$B$2) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Fill down: apply the same correction across
B10:F10 — the pattern is identical
in all 5 cells (adjust relative references as Excel does).
Income Statement!B10assisted5 cells share this pattern
before=MAX(0,B9*0.21)
after=MAX(0,B9*Assumptions!$B$10)
Replaces the buried constant (0.21 → Assumptions!$B$10) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Fill down: apply the same correction across
B10:F10 — the pattern is identical
in all 5 cells (adjust relative references as Excel does).
Income Statement!B6assisted5 cells share this pattern
before='Cash Flow'!B10*0.82
after='Cash Flow'!B10*Assumptions!$B$2
Replaces the buried constant (0.82 → Assumptions!$B$2) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Fill down: apply the same correction across
B6:F6 — the pattern is identical
in all 5 cells (adjust relative references as Excel does).
Order Book!E10assisted40 cells share this pattern
before=D10*1.21
after=D10*Assumptions!$B$15
Replaces the buried constant (1.21 → Assumptions!$B$15) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Fill down: apply the same correction across
E4:E43 — the pattern is identical
in all 40 cells (adjust relative references as Excel does).
Raw Data!F6assisted3 cells share this pattern
before=(E6/B6)^(1/3)-1
after=(E6/B6)^(1/Assumptions!$B$16)-1
Replaces the buried constant (3 → Assumptions!$B$16) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Fill down: apply the same correction across
F6:F8 — the pattern is identical
in all 3 cells (adjust relative references as Excel does).
Balance Sheet!B10assisted
before=B5+B6-MAX(0,B9*0.25)
after=B5+B6-MAX(0,B9*Assumptions!$B$1)
Replaces the buried constant (0.25 → Assumptions!$B$1) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Cash Flow!B8assisted
before='Revenue Build'!B12*0.019
after='Revenue Build'!B12*Assumptions!$B$3
Replaces the buried constant (0.019 → Assumptions!$B$3) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Replaces the buried constants (9 → Assumptions!$B$4, 4 → Assumptions!$B$5) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Replaces the buried constants (4 → Assumptions!$B$5, 6 → Assumptions!$B$6, 14 → Assumptions!$B$7, 1000 → Assumptions!$B$8, 8 → Assumptions!$B$9) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Income Statement!C8assisted
before='Balance Sheet'!B8*1.02
after='Balance Sheet'!B8*Assumptions!$B$11
Replaces the buried constant (1.02 → Assumptions!$B$11) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Income Statement!D8assisted
before='Balance Sheet'!B8*1.04
after='Balance Sheet'!B8*Assumptions!$B$12
Replaces the buried constant (1.04 → Assumptions!$B$12) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Income Statement!E8assisted
before='Balance Sheet'!B8*1.06
after='Balance Sheet'!B8*Assumptions!$B$13
Replaces the buried constant (1.06 → Assumptions!$B$13) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Income Statement!F8assisted
before='Balance Sheet'!B8*1.08
after='Balance Sheet'!B8*Assumptions!$B$14
Replaces the buried constant (1.08 → Assumptions!$B$14) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Revenue Build!D5assisted
before=C5*1.052
after=C5*Assumptions!$B$17
Replaces the buried constant (1.052 → Assumptions!$B$17) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Sensitivity!A4assisted
before=Assumptions!$B$20+-0.005
after=Assumptions!$B$20+Assumptions!$B$18
Replaces the buried constant (-0.005 → Assumptions!$B$18) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Sensitivity!A5assisted
before=Assumptions!$B$20+-0.0025
after=Assumptions!$B$20+Assumptions!$B$19
Replaces the buried constant (-0.0025 → Assumptions!$B$19) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Sensitivity!A7assisted
before=Assumptions!$B$20+0.0025
after=Assumptions!$B$20+Assumptions!$B$20
Replaces the buried constant (0.0025 → Assumptions!$B$20) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Sensitivity!A8assisted
before=Assumptions!$B$20+0.005
after=Assumptions!$B$20+Assumptions!$B$21
Replaces the buried constant (0.005 → Assumptions!$B$21) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Sensitivity!B3assisted
before=WACC!$B$10+-0.01
after=WACC!$B$10+Assumptions!$B$22
Replaces the buried constant (-0.01 → Assumptions!$B$22) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Sensitivity!C3assisted
before=WACC!$B$10+-0.005
after=WACC!$B$10+Assumptions!$B$18
Replaces the buried constant (-0.005 → Assumptions!$B$18) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Sensitivity!E3assisted
before=WACC!$B$10+0.005
after=WACC!$B$10+Assumptions!$B$21
Replaces the buried constant (0.005 → Assumptions!$B$21) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
Sensitivity!F3assisted
before=WACC!$B$10+0.01
after=WACC!$B$10+Assumptions!$B$23
Replaces the buried constant (0.01 → Assumptions!$B$23) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
WACC!B5assisted
before=B4*(1-0.21)
after=B4*(1-Assumptions!$B$10)
Replaces the buried constant (0.21 → Assumptions!$B$10) with a labeled input cell you create once on an 'Assumptions' sheet — one place to see and update it.
What we won't auto-fix — and why
2 ×
circular_refs — Breaking a reference loop is a modeling decision — which link to cut changes what the model means, so no automated edit is safe.
2 ×
complex_formulas — Splitting a long formula into steps is a restructuring exercise; an automated split would pick arbitrary boundaries.
5 ×
error_values — An error value marks a calculation that already failed or data pasted over a formula. Wrapping it in IFERROR would hide the failure, not repair it — the source calculation needs fixing.
1 ×
inconsistent_formulas — A formula that differs from its neighbours is either a silent copy error or a deliberate override; picking for you would be a guess, not a fix.
1 ×
merged_cells — Unmerging moves values between cells and changes what ranges cover — a layout change you should make with the sheet open.
6 ×
numbers_as_text — Text that looks numeric may be a code (an account number, a SKU) where '007' must stay text — converting blindly corrupts those.
Your workbook is never modified — fixes are prepared for you
to paste, because rewriting .xlsx files corrupts charts, pivots, and macros.
Findings by sheet, worst first. Sheets with no findings
aren't listed; workbook-level findings get their own card.
Raw Datacritical
14 findings across 3 checks
Error values in cells5
Hardcoded constants inside formulas3
Numbers stored as text in referenced ranges6
Order Bookwarning
80 findings across 2 checks
Fragile lookups40
Hardcoded constants inside formulas40
Income Statementwarning
Hardcoded constants inside formulas14
Sensitivitywarning
12 findings across 3 checks
Circular references1
Fragile lookups3
Hardcoded constants inside formulas8
Cash Flowwarning
Hardcoded constants inside formulas6
Revenue Buildwarning
5 findings across 3 checks
Fragile lookups3
Hardcoded constants inside formulas1
Inconsistent formulas in a range1
Balance Sheetwarning
3 findings across 3 checks
Circular references1
Hardcoded constants inside formulas1
Merged cells inside data/formula ranges1
DCFwarning
4 findings across 2 checks
Hardcoded constants inside formulas2
Overly complex formulas2
WACCwarning
Hardcoded constants inside formulas1
Audit your own workbookThis sample never expires and is identical for every
visitor. Your own report is private to you — findings expire
automatically unless you save them.
Everything above was produced by the real analysis
pipeline from the sample workbook — the same checks, scoring, summary,
and fix pack your file gets.