Back to Consulting

CASE STUDY · AUTO GLASS INDUSTRY · CANADA

Complex reporting to structured reporting system 1,100 users use every day

An auto glass platform was capturing every job, part and invoice in its own CRM — and none of it was answering business questions. I designed and built the analytics layer that now sits inside their customer portal, measuring the full chain from vehicle lookup to paid invoice.

1,100+

end users on the client portal

20+

reports on one shared data model

300

tables modelled into one structure

3 years

of history kept current daily

~2×

faster refresh after model tuning

Built with  Azure SQL · SQL ETL and views · Power BI semantic model · Power BI Service · Power BI Embedded · Dynamic row-level security · Power Automate · Incremental refresh · ALM Toolkit

Role  Solution architect and delivery lead — requirements, architecture, build, client communication, and leading the developer and ETL engineer.

PROJECT AT A GLANCE

Business problem I solved

Manual reportingSelf-service BI
Inconsistent numbersOne trusted view
Delayed insightsCurrent reporting
Separate reportsEmbedded analytics

Technology stack

Power BI
Azure SQL
Microsoft Azure
DAX Studio
Tabular Editor
Power Automate
ALM Toolkit
Microsoft Fabric
Trello
Power BI
Azure SQL
Microsoft Azure
DAX Studio
Tabular Editor
Power Automate
ALM Toolkit
Microsoft Fabric
Trello

Industry

Auto glass industry — CRM platform used across the network

Location

Canada

Project Type

Embedded analytics layer inside the client’s customer portal (Power BI Embedded)

My Role

Solution architect and delivery lead — requirements, architecture, build and client communication, leading the developer and ETL engineer.

Technology

Azure SQL · SQL ETL and views · Power BI semantic model · Power BI Service · Power BI Embedded · Dynamic row-level security · Power Automate · Incremental refresh · ALM Toolkit

Scale

~300 tables modelled into one Power BI semantic model · 20+ reports

Users

1,100+ end users — branch and franchise owners, operations managers, finance, head office

SECTION 1 · WHAT BUSINESS PROBLEM I SOLVED

The business was running well. It just could not see itself.

Everything needed to answer a management question was already being captured — it simply had no way out of the system that captured it. The company operates its own CRM platform for the auto glass industry. Every vehicle lookup, glass part search, quote, booking, job, customer message, invoice and refund passes through it. That system was built to run the business day to day, which it did properly. It was never built to explain the business, and that gap had started to cost real money.

Data was being collected, not used

Years of operational history sat in the platform database. Getting an answer out of it meant asking someone to write a query or export a file, so most questions were never asked at all.

Reporting depended on people, not systems

Numbers were assembled manually in spreadsheets. That work consumed skilled staff every month, it could not scale as the business grew, and it stopped entirely whenever the person who did it was away.

The same number meant different things

Because each report carried its own logic, two people could answer the same question differently and both be defensible. Management meetings were spent reconciling figures instead of deciding what to do about them.

Information arrived too late to act on

By the time a monthly figure was circulated, the period was closed. Problems were confirmed rather than caught — the cost had already been incurred before anyone saw it.

Customers were asking for reporting the platform could not give them

The people using the CRM wanted their own performance visible inside the tool they already worked in. Sending them a file was not an answer, and building a separate reporting product for each customer was not affordable.

What I was actually asked to deliver

Not a dashboard. A reporting capability that becomes part of the product: every customer signs in to the portal they already use, sees only their own business, and gets numbers that are current, consistent and trusted — with no separate login, no export, and no analyst in the middle.

SECTION 2 · WHICH TECHNOLOGY I USED

Every component was chosen for a business reason

Not because it was new. The test each one had to pass: does it still work when there are thousands of users and more customers next year than this year?

LayerTechnologyWhy it is there
SourceIn-built CRM platformThe system of record. Jobs, customers, parts, technicians and invoices are captured here as work happens.
StorageAzure SQL DatabaseAll CRM data lands in structured tenant tables, designed from day one so additional customers can be added without redesign.
PreparationSQL ETL, stored logicRaw operational data is cleaned and reshaped into reporting-ready tables. Business rules live here once, where they can be tested.
Reporting layerSQL viewsA stable, controlled surface between the database and the reports. Underlying tables can change without breaking anything downstream.
Data modelPower BI, import modeAround 300 tables modelled into one governed structure with agreed calculations. One definition of every number, used by every report.
SecurityRow-level and dynamic RLSEach user sees only their own data, enforced inside the data itself rather than hidden in the interface.
PublishingPower BI ServiceCentral home for the model and reports, with controlled promotion from development to production.
DeliveryPower BI Embedded, service principalReports appear inside the client’s own portal. End users need no Power BI licence and never leave the product they know.
FreshnessIncremental refresh, Power AutomateA rolling three-year window is kept current daily, using modification dates so only changed records are reprocessed.
QualityDedicated validation reportAn internal report that checks daily values across every published report, so errors are found before users find them.
Change controlALM ToolkitModel changes are compared and deployed deliberately, not by republishing and hoping.
Delivery processTrelloRequests, build work and releases tracked visibly so the client always knows what is in progress.
Next platformMicrosoft Fabric, OneLakeReporting is being migrated onto OneLake to consolidate storage, reduce duplication and support larger data volumes.

SECTION 3 · HOW I BUILT IT — THE METHOD

Removing the three ways reporting projects fail, in order

Reporting projects fail for predictable reasons: the wrong questions get answered, the numbers do not tie to reality, or nobody trusts the result. The method below exists to remove those three risks in order.

The approach

I start from the decision, not the data. Before any table is touched, I establish what someone is going todo differently once they can see a number. That single discipline is what stops a project from producing twenty reports that look impressive and change nothing.

01UnderstandWhat decisions arebeing made blind?02Agree the numbersOne written definitionper metric, signed off.03Build the modelClean the data, modelit once, reuse it.04Prove itTie every figure backto the source system.05Put it in their handsInside the softwarethey already use.Delivery sequence
Figure 1. Nothing gets built until stage 2 is agreed in writing. Disagreement about what a number means is far cheaper to resolve before the build than after it.

How the data travels

Data moves through six deliberate stages between the CRM and the screen. Each stage exists so that a failure in one place does not become a failure everywhere, and so that a change at the source does not break what users see.

SOURCECRM platformJobs, customers, parts, technicians and invoices are recorded as work happens.STOREAzure SQL — tenant tablesEvery customer's data lands in a structured, separated store built to hold many customers.CLEANETL into clean tablesMessy operational data is corrected, standardised and shaped for reporting.SHAPEPurpose-built reporting tablesA dedicated set of tables designed around the questions the business actually asks.PUBLISHSQL viewsA stable surface for reporting, so the database can evolve without breaking reports.MODELPower BI data model — 300 tablesRelationships, calculations and security defined once and shared by every report.DELIVER20+ reports, embedded in the client portalUsers open their own portal and see their own numbers. No export, no second login.1,100+ usersBranch and franchise owners · operations managers · finance · head officeEach one seeing only what belongs to them.
Figure 2. The two middle stages are what most reporting projects skip. They are the reason the numbers stay correct when the source system changes.

What the reports actually measure

Reports are only worth building if they map to how the business makes money. In auto glass that chain is unusually traceable: someone looks up a vehicle, that becomes a search for a specific glass part, that becomes a quote, a booking, a fitted job, an invoice — and sometimes a return, a refund or a warranty claim. Almost every commercial question lives somewhere on that chain, so that is how the reporting was organised.

Vehicle and part lookups

What is measured

Vehicle lookup volume by make, model and year; glass part lookup volume; lookup value; searches that returned nothing

What it tells the business

Where real demand is, before it becomes a sale. Failed lookups are the most useful number here — they are demand the business could not serve, and they point straight at catalogue gaps and stock decisions.

Sales funnel

What is measured

Lookup → quote → booking → job completed → invoiced, with drop-off at every stage

What it tells the business

Exactly where revenue is being lost. A business can be busy at the top of the funnel and still be leaking money at one specific step.

Sales category

What is measured

Revenue and volume split by category — windscreen, side and rear glass, repair versus replacement, calibration, accessories

What it tells the business

Which work is genuinely worth taking. Volume and margin rarely sit in the same category, and the split is invisible without this view.

Upsell

What is measured

Upsell attach rate, upsell revenue per job, attach rate by branch and by staff member

What it tells the business

Where added-value selling is working and where it is being forgotten. The gap between the best and worst performer is usually the fastest money in the business.

Returns and refunds

What is measured

Return rate by part, supplier and branch; refund value and reason; credit notes as a share of revenue; breakage and rework

What it tells the business

What is quietly eroding margin after the sale is recorded. Grouping by reason separates a supplier quality issue from an ordering mistake from a fitting problem.

Customer messaging

What is measured

Message volume by category — quotes, booking confirmations, reminders, follow-ups; response rates and timing

What it tells the business

Which communication actually converts and which prevents no-shows. Often the cheapest fix available to a branch.

Risk and theft detection

What is measured

Parts consumed without a matching job; jobs completed without recorded parts; invoices edited or voided after completion; unusual discount and refund patterns by user; stock variance by branch

What it tells the business

Losses that never appear on any sales report. Exceptions are surfaced automatically so they are investigated as they happen rather than discovered at stocktake.

Operations

What is measured

Job volume and cycle time, technician utilisation, first-time completion, rework and warranty rate, mobile versus in-shop mix

What it tells the business

Whether capacity is being used well, and which work is coming back at the company’s own cost.

THE CHAIN THE REPORTS FOLLOWWhere a drop-off pointsVehicle lookupMarketing reach andcatalogue coverageGlass part lookupPart availability andpricing competitivenessQuote issuedSpeed of response andfollow-up disciplineBooking confirmedScheduling capacity andreminder messagingJob completed and invoicedNo-shows, cancellationsand parts not arrivingEach stage is measured separately, so a fall in revenue can be traced to the specific step that caused it rather than explained after the fact.Returns, refunds and warranty work are tracked against the same chain, because a completed job is not the same as a profitable one.
Figure 3. Measuring the whole chain rather than only closed sales is what turns reporting from a scoreboard into a diagnostic tool.

Making one system serve everybody

The hardest requirement was not the reports. It was that more than a thousand people needed to use the same reports and each see a different slice of the business — without building a separate system for each of them. I solved this with dynamic security. Instead of creating a report per customer, there is one model and one set of reports. When a user opens the portal, their identity is passed through, and the data filters itself to what that person is allowed to see before anything is displayed. Adding a new customer or branch is a data entry task, not a development project.

One data model · 20+ reportsBuilt once. Every number defined in a single place.Dynamic row-level securityThe portal passes the user's identity in. Data filters before it is shown.Branch ownerSees: their own branch onlyUses it for: daily job flow,staff workload, reworkRegional managerSees: every branch in regionUses it for: comparing sites,moving people and stockHead officeSees: the whole networkUses it for: margin, pricing,growth and investmentSame reports. Same definitions. Different data — decided by who is looking, not by which file they were sent.
Figure 4. This is why the platform can add customers without adding cost. Onboarding a new branch changes a row in a permissions table, not the reports.

Keeping the data current, and proving it is right

Two things destroy confidence in a reporting system: stale data, and one wrong number. Both are handled automatically rather than by someone remembering to check. A three-year rolling window of history is kept live. Each day, an automated process identifies only the records that changed — using their modification date — and refreshes just those. Reloading three years of history every night would be slow and would put unnecessary load on the source system; reloading only what moved takes a fraction of the time. Alongside the business reports sits a validation report that checks daily figures across every published report, so a discrepancy is found by the system rather than by a customer.

THE ROLLING WINDOWThree years of history — held, not reprocessedRecent period — refreshed dailyOnly records with a changed modification date are reprocessed. Everything older stays as it is.THE DAILY CYCLETriggerPower Automate startsthe cycle on scheduleFind what changedModification dates identifyonly the moved recordsRefreshIncremental refresh updatesthat slice of the modelValidateA test report checks dailyvalues across all reportsIf a check fails, it is caught here — before a user opens the report.ResultUsers open the portal to numbers that are current and already checked. Refresh time roughly halved after model and query tuning.Changes to the model are deployed deliberately using ALM Toolkit; work and releases are tracked in Trello so the client can see what is in progress.
Figure 5. Freshness and accuracy are engineered in, not monitored manually. Nobody has to remember to run anything.

Where this is heading

The platform is now moving onto Microsoft Fabric and OneLake. The reason is practical rather than fashionable: as the number of customers grows, holding one copy of the data that every report reads from is cheaper and simpler than maintaining several. The reporting layer is being migrated so that storage is consolidated, duplication is removed, and the same platform can carry substantially larger volumes without a rebuild.

TODAYAzure SQL reporting layerData cleaned and shaped in SQLImported into the Power BI modelProven, stable, in production todaySeparate copies as customers growMIGRATING TOMicrosoft Fabric — OneLakeOne copy of the data for all reportingLess duplication, lower storage costRoom for far larger data volumesSame reports, no rebuild for users
Figure 6. Migration is being done underneath the reports, so users keep working while the foundation changes.

SECTION 4 · WHAT THE BUSINESS GOT OUT OF IT

Not how many reports it produces — how many decisions get made faster

Decisions made on evidence instead of instinct

Managers can see which work, which sites and which customers actually perform — and act on it while the period is still open. Discussion moved from arguing about whose figure was right to deciding what to do about it.

Outcome · faster, better-founded decisions

Reporting became a system, not a job

The monthly assembly of spreadsheets stopped. Reports are produced by the platform, on schedule, in the same format every time. Skilled staff moved off report production and onto work that uses the reports.

Outcome · recurring manual effort removed

Numbers users can rely on

Every figure comes from one model with one agreed definition, and is checked daily by an automated validation report before anyone sees it. Trust is what makes a reporting system get used; without it, people quietly go back to their own spreadsheets.

Outcome · one version of the truth, verified daily

Data current enough to act on

A rolling three-year history refreshed daily means users are looking at the business as it is now, not as it was at the end of last month. Problems surface while they can still be corrected.

Outcome · near-current operational visibility

Hidden opportunities became visible

Once lookups, sales, messaging and financial data sat in the same model, patterns appeared that no single screen could have shown. Vehicle and part searches that returned nothing turned out to be measurable lost demand, pointing straight at catalogue and stock gaps. Upsell attach rates varied widely between branches and staff, which made the gap closable. Sales category analysis separated the work that carried volume from the work that carried margin. Funnel drop-off identified the exact step where quotes were going cold.

Outcome · unserved demand, upsell gaps and margin leakage found in existing data

Losses that no sales report would ever show

Returns, refunds and credit notes are analysed by reason, part, supplier and branch, which separates a supplier quality problem from an ordering error from a fitting fault. Alongside that, exception metrics flag parts consumed without a matching job, invoices edited after completion, and unusual discount or refund patterns by user. Issues surface as they happen rather than at stocktake.

Outcome · shrinkage, rework and refund leakage brought into view

Analytics became part of the product

Reporting now sits inside the client’s own portal for 1,100+ users. It is something the platform offers its customers rather than something it apologises for lacking — and it scales to new customers without new development.

Outcome · a capability that grows with the business

Faster and cheaper to run

Model and query tuning roughly halved refresh time, and incremental refresh means the system reprocesses only what changed. The platform carries more users and more data without a matching rise in running cost or effort.

Outcome · ~2× faster refresh, lower ongoing load

SECTION 5 · SUMMARY

In business terms, and in technical terms

In business terms

  • A CRM that recorded everything and explained nothing now drives daily management decisions.
  • Manual monthly spreadsheet reporting was replaced by a system that produces itself.
  • 1,100+ users across branches, regions and head office each see their own business, inside the portal they already use.
  • Every number carries one agreed definition, checked automatically before anyone reads it.
  • Operational and financial data were joined for the first time, exposing margin and efficiency opportunities that neither system could show alone.
  • Reporting follows the full commercial chain — vehicle and part lookups, funnel conversion, sales category, upsell, returns and refunds, customer messaging, and exception metrics for loss and theft detection.
  • New customers and branches are onboarded as a configuration change, not a development project.

In technical terms

  • CRM data landed in Azure SQL tenant tables, structured for a multi-customer future.
  • SQL ETL into clean tables, then purpose-built reporting tables, exposed through views.
  • ~300 tables modelled into one Power BI import-mode semantic model with shared calculations.
  • 20+ reports on that single model, covering lookups, funnel conversion, sales and category performance, returns and refunds, messaging, operations and risk exceptions — published through Power BI Service.
  • Dynamic row-level security enforcing per-user data access at scale.
  • Power BI Embedded with service principal authentication, delivered inside the client portal.
  • Incremental refresh over a rolling three-year window, orchestrated by Power Automate using modification dates.
  • Automated validation report covering daily values across all reports.
  • ALM Toolkit for controlled model deployment; Trello for delivery tracking.
  • Migration in progress to Microsoft Fabric and OneLake.

My role. I built the initial platform and then led its growth — owning requirements, solution architecture, the data model and client communication end to end, while leading an internal Power BI developer and a dedicated ETL engineer.

What this project demonstrates. Not that I can build reports. That I can take a system built to run a business, turn it into something that explains the business, and deliver it to a thousand people in a form they will actually use — securely, accurately, and without the cost growing every time a customer is added.

NEXT PROJECT

Financial Reporting Platform

Germany · Financial Services

View project