EXECUTIVE PROGRAMME BRIEF · 2026-07-08 · v3

Excel Ribbons &
Snowflake ODS
Decommission.

The full estate audit. The Finance Shadow narrative. The Snowflake ODS finding.
Three tracks. One programme. Approval-ready.

Prepared for the OfficeMax leadership team
~85
Ribbon apps
in scope
744K
Lines of VBA
catalogued
1
Shared credential
across the estate
0 / 106
Snowflake ODS
consumers
3
Hidden Oracle-ODS
dependents
EXECUTIVE SUMMARY

What we found, what we're asking for.

A code-and-file audit of the Excel Ribbons estate, extended to the Snowflake ODS layer. One page. Everything else is evidence.

THE RISK

Finance runs on a shadow estate

85 workbooks. One shared credential. Cleartext auth. Live-Pronto reads and writes. When any of the people who wrote them leaves, they still hold the key.

THE HIDDEN LAYER

Snowflake ODS has zero consumers

106 tables audited. 181 dashboards, 875 widgets, 400 SQL, 85 ribbons, 744K VBA lines - not one binds to Snowflake ODS. The 287 "ODS" ribbon hits target Oracle, not Snowflake.

THE PATHWAY

Three tracks, one programme

Ribbons migrate onto Excel4Data + Power BI + MuleSoft. Snowflake ODS retires by tiers. Finance stabilises the shadow into a governed rebuild - owned by Finance, not IT.

THE ASK Approve the four-week discovery mandate. Authorise the "no ODS in Snowflake" rule. Kill live-Pronto reads immediately. Detail on page 12.
CHAPTER I
01

The Excel Ribbons estate.

What was scanned. What was found. Where the security exposure sits, and how the Finance function became a shadow-IT organisation without meaning to.

METHODOLOGY

How the review was done.

Seven stages. Static-analysis only - no runtime probing of Pronto. Every finding is evidenced from the code and the file share, not from interview.

01
Isolation & transfer

969 files pulled from the O:\ share into a controlled workspace. SHA hashed. Duplicates and archives removed.

02
VBA extraction

744,093 lines of VBA across 170 modules dumped for review. 50 apps carry meaningful automation.

03
Connection catalogue

Every connection string, every SELECT / INSERT / UPDATE / DELETE across the estate identified and grouped.

04
Snowflake ODS inventory

82 tables mapped, 4,238 columns catalogued, 31 identified as direct replicas of a LANDING source.

05
Usage aggregation

77 of 118 ribbons are self-logging, 3 workbooks do real business writes, the rest read and export.

06
Sisense cross-check

181 dashboards, 875 widgets, 400 repaired SQL, 15 elasticubes, 203 datasources all searched for ODS bindings.

07
ETL evidence

Every LANDING external-table stage mapped to its blob container. Direct-from-Pronto vs from-Oracle-ODS resolved by container path.

WHAT THIS REVIEW DOES NOT DO

  • No live queries against Pronto Prod or Oracle DW.
  • No changes to production systems, no data movement.
  • No interview-only claims - every finding traces back to a file, a table, a query or a log.

DATA QUALITY OF THE FINDINGS

  • File share coverage: 969 / 969 files scanned.
  • VBA coverage: 100% of extractable modules.
  • Snowflake coverage: OMX_PRD.ODS + LANDING + STAGING + DW + PRESENTED.
  • Sisense coverage: full production tenant metadata.
IDENTIFICATION · WHAT WE FOUND

The Excel Ribbons estate in numbers.

The scale that makes this a strategic issue, not a housekeeping one. Numbers below are from the static scan, all reproducible.

FILES
969

Files scanned on the O:\ share - Excel workbooks, shortcuts and orphans.

APPLICATIONS
~85

Distinct applications once duplicates and archives are removed. 50 carry meaningful automation.

RIBBONS / ENTRY POINTS
118

Auto-open handlers, ribbon buttons, custom menus. Each one a live entry point into the estate.

VBA LINES
744,093

Across 170 modules. Larger than most in-house apps, unversioned, unowned.

SELF-LOGGING RIBBONS
77

Of 118. Write their own usage log back to ODS. Not business writes - diagnostics that stayed on.

REAL BUSINESS WRITES
3

Workbooks that push data into Pronto Prod. Pricing and business-case flows. The concentration risk.

IDENTIFICATION · THE SECURITY CASE

Three concerns, in order of severity.

Every one is a rotation-and-migration problem, not a firefight. But it is a rotation-and-migration problem that has not been solved for years.

SEVERITY 1

Live Pronto reads from user workbooks

A subset of ribbons connect direct to Pronto Prod. Some carry write credentials. Any workbook, any user, no ceremony. Highest blast radius.

SEVERITY 2

Cleartext credentials in VBA

One shared username / password, embedded across 85 workbooks. Reads and writes on Oracle DW. Rotating it is a co-ordinated release, and until we do, anyone who has ever seen the workbook still holds the key.

SEVERITY 3

Unattended file-drop into Pronto load

Several ribbons write CSV to an O:\ staging folder. An 8pm overnight job picks whatever is there up and loads it into Pronto Prod. Controls around what actually gets loaded need review.

WHY IT STAYS UNSOLVED

The credential rotation is a coordinated release across 85 workbooks. Every workbook needs a code change. Every user needs to pick up the new build. The estate has no owner, no version control, no rollout pipeline. So it doesn't get done.

WHAT MOVES IT

Rotate under a migration plan, not as a standalone. Every workbook that moves onto Excel4Data or Power BI drops the cleartext credential in the same change. Sequence the estate: the migration IS the rotation.

THE FINANCE SHADOW

Finance is running a shadow IT function. It didn't set out to.

The ribbons weren't a project. They were the way Finance got its work done when official tooling didn't. Fifteen years later, they run the reporting stack - and the risk sits with the individuals who wrote them.

SHADOW · TODAY Finance owns the code by accident - 85 workbooks in production use - 744,093 lines of VBA, unversioned - 1 shared credential, embedded - Business rules scattered per workbook - When the author leaves, knowledge leaves - IT does not own it, Finance does not fund it - Reports get built here because official BI is slow GOVERNED · TARGET Finance owns the model by design - Finance leads Power BI + Excel4Data build - Analytics supplies the Snowflake model - Business rules move to Power BI + O:\ drive - User SSO, RBAC, no embedded creds - Central SQL library, versioned, auditable - Rotation is instant - it's a role revoke - Reports built once, consumed by everyone THE MOVE Code → Model Finance still owns it. Governance changes.

WHAT SHIFTS

Ownership: Finance keeps the model. Analytics builds the Snowflake layer. IT provides the platform. No one hands the whole thing to IT and hopes.

WHAT DOESN'T SHIFT

Speed: the ribbons exist because Finance needs fast turnaround. Excel4Data + Power BI preserve that. This is not slower - it is safer and centrally maintained.

CHAPTER II
02

The Snowflake ODS finding.

The programme extended into the data layer. Zero Snowflake ODS consumers - which was expected. Three hidden Oracle-ODS dependencies in LANDING - which was not.

HEADLINE FINDING

Zero consumers. Anywhere.

Every scanned surface came back the same. Not one Sisense dashboard, ribbon or repaired SQL binds to OMX_PRD.ODS.

SNOWFLAKE ODS CONSUMERS
0 / 106

tables in scope are referenced by any scanned system. The schema is a duplicate landing zone that shadows Pronto's Oracle ODS. It has no downstream reader.

How we tested: 181 dashboards, 875 widgets, 400 repaired SQL, 15 elasticubes, 203 datasources, 85 ribbon workbooks, 744,093 lines of VBA - every one searched for the 106 ODS-scope names. Zero matches.

SISENSE · 0 HITS

181 dashboards / 875 widgets / 400 repaired SQL / 15 elasticubes / 203 datasources. No binding.

RIBBONS · 0 HITS

85 workbooks, 744,093 lines of VBA. Zero references to OMX_PRD. Zero references to snowflake.

REPAIRED SQL · 0 HITS

243 hit PRESENTED, 74 hit DW, 3 hit LANDING. Zero hit ODS.

THE TRAP WE ALMOST FELL INTO

Oracle and Snowflake share the names. They are different databases.

287 ribbon "ODS" references exist - but every one targets Oracle prontoods.*, not Snowflake OMX_PRD.ODS. Same names, different physical objects.

ORACLE · NZBIPROD prontoods.ods_tbl_* Oracle physical objects on NZBIPROD/PRONTOODS RIBBON HITS (VBA scan) 287+ across 85 workbooks Status Retires with the wider Oracle DW decommission. SNOWFLAKE · OMX_PRD OMX_PRD.ODS.* Snowflake physical objects in the ODS schema RIBBON HITS (VBA scan) 0 references. Anywhere. Status Zero consumers. Retire the schema. SAME NAME different databases
EVIDENCE · SNOWFLAKE EXTERNAL TABLE STAGES

Where the data actually comes from.

Every LANDING external table points at a blob container. The container name tells us the source system. Three tables land from an Oracle ODS export container - and were previously invisible.

SOURCE SYSTEM AZURE BLOB CONTAINER (STAGE URL) TABLES STATUS Pronto ERP (direct) /prod/010_pronto/ 64 SAFE from Pronto Pronto ERP (legacy path) /pronto/PROD 11 SAFE migrate path Salesforce (direct) /prod/030_salesforce/ 12 SAFE SF connector Manual uploads (users) /prod/130_manual-files/ 11 SAFE user-side Stibo MDM (direct) /prod/140_stibo/ & nzomaxstiboblob 32 SAFE Stibo connector Oracle ODS export /prod/110_oracle-ods/ 3 AT RISK dies with Oracle
CHAPTER III
03

Pathways forward.

One target state. Three parallel tracks. A four-week discovery mandate to lock the sequencing plan and start the migration.

TARGET STATE

Where we are heading.

One source. One warehouse. Governed reads via Excel4Data and Power BI. Governed writes via MuleSoft and the overnight loader.

SOURCE Pronto ERP Salesforce Stibo MDM INTEGRATION MuleSoft canonical API layer writes & sync ADF Pipelines Pronto -> Snowflake direct, no ODS hop SNOWFLAKE LANDING (direct, ADF) DW (D_ / F_ / DM_) PRESENTED (VW_) ODS · RETIRED USER LAYER Excel4Data Snowflake-native tabular in Excel Power BI Finance-led rules + write-back Sisense → Lens (BI viewing) User SSO. Row/column RBAC. No embedded credentials. Auditable. Power BI -> overnight loader -> Pronto (governed write-back)
PATHWAYS FORWARD

Three parallel tracks. One programme sponsor.

Each track has its own owner, its own cadence, its own exit criteria. They share a single steering group so dependencies stay visible.

TRACK A · RIBBONS MIGRATION

85 apps into 7 lanes

Owner: Finance + Commercial (lead), Analytics + IT (support).

Pattern: Reads via Excel4Data on Snowflake. Writes via Power BI + overnight loader OR MuleSoft canonical API.

Exit: zero live-Pronto reads from user workbooks. Zero embedded credentials.

TRACK B · ODS RETIREMENT

106 tables in three tiers

Owner: Analytics (lead), FDL (Donovan) walk-list, IT quarantine.

Tiers: DROP-READY 79 (Phase 1) / KEEP 21 verified Pronto-direct / RETIRE-WITH-ORACLE 3.

Exit: OMX_PRD.ODS schema dropped. FDL Gold Standard forbids re-creation.

TRACK C · FINANCE STABILISATION

Shadow to steward

Owner: Finance (lead), IT (platform), Analytics (model).

Change: Finance keeps the reporting model, moves off scattered VBA. Business rules land in Power BI + O:\ drive.

Exit: credential rotation is a role revoke, not a coordinated 85-workbook release.

Reports 20 apps Excel4Data on Snowflake. Commercial rebuilds its own; Analytics supplies model + reference report. TRACK A
Pricing uploads 7 apps Power BI -> governed table -> overnight loader -> Pronto. Highest single risk, first to move. TRACK A
Customer orders / quotes 4 apps MuleSoft canonical API for writes. Reads via Snowflake. TRACK A
Master data 3 apps MuleSoft canonical API for writes. Reads via Snowflake. TRACK A
Discount recalc (ops close) 1 app Migrate calculation into dbt on Snowflake. Ops close routine. TRACK A
Retire outright 3 apps Business Case Template, Sales Targets DB, ods_table_log self-logging - all retire. TRACK A
THE ASK · APPROVE TODAY

Approve the four-week discovery mandate. Authorise the "no ODS in Snowflake" rule. Kill live-Pronto reads immediately.

WEEK 1

Kill live-Pronto reads

Rotate the shared DW credential inside the migration change. Formalise the "no ODS in Snowflake" rule as a written policy. Enable Snowflake query-history alerting on any read of OMX_PRD.ODS.*.

WEEK 2

Finance + Commercial start Power BI

Business rules for pricing and reporting lanes move out of VBA and into Power BI + O:\ drive. Analytics stands up the Snowflake model behind them. Weekly readout starts.

WEEK 3

Pilot the write-back

Pricing lane: Power BI outputs wire into the overnight loader. Excel4Data pilot on a reference report. Per-ribbon ODS-to-DW mapping in flight. Walk 6 VERIFY + 3 RETIRE-WITH-ORACLE tables with Donovan / FDL.

WEEK 4

Verdict per ribbon, lock sequencing

Each of the ~85 apps gets a verdict: swap, land-then-swap, or retire. Dependency map locked. Single owner per lane. Programme cadence hands over from discovery to migration.

PHASE 2

Freeze then retire ODS

Revoke INSERT / UPDATE / MERGE from ADF into OMX_PRD.ODS.*. 30 days of read alerting. Drop DROP-READY 79 in batches by prefix. Retire the schema.

PHASE 3

Close the door

Update FDL Gold Standard v2.0 to forbid ODS in Snowflake. Migrate Excel Ribbons off Oracle prontoods.* onto Snowflake LANDING.EXT_*. Rewire or retire the 3 Oracle-ODS dependents.

SPONSOR
Jeff Sutton
OWNERS
Finance · Commercial · Analytics · IT · FDL
NEXT DOCUMENT
Lane-by-lane workstream plan