Shane Jones DATA SOLUTIONS

Analytics engineering & internal tools

I build the systems that make the numbers agree.

Reporting is easy until two systems disagree about the same dollar. My work is the unglamorous part in between — the reconciliation, the row-level security, the data-health checks — delivered as web applications people actually open on a Monday morning.

Power BI Microsoft Fabric Azure SQL & Synapse Python Reconciliation

Signal check

Revenue against plan

    Live demos

    Five working tools, not five screenshots

    Everything below runs in this page: the filters recompute, the charts respond, and every chart has a table view. The figures are synthetic, generated deterministically so the numbers stay put between visits — the mechanics are the point.

    Demo one

    Revenue performance vs plan

    Year
    Business unit

    Actual and plan by month

      Top ten customers by revenue

      Selected year and business units. Values labelled at the bar tip.

      Synthetic demo data — no real customer or company figures.

      Demo two

      Commission tie-out and exceptions

      Exception reason

      Uncredited dollars by reason

      One bar per reason, labelled at the tip. Reflects the reason filter.

      Exception worklist

      Each row carries an icon and a written status, so severity never depends on colour.

      Synthetic demo data — invoice numbers, names and amounts are generated.

      Demo three

      Receivables ageing

      Break out by

      Balance by ageing bucket

      Buckets are an ordered scale, so they take a single hue stepped by severity rather than four unrelated colours.

        Collection watchlist

        Largest overdue balances, worst first.

        Synthetic demo data — no real customer balances.

        Demo four

        One metric, one definition

        Rules applied

        Four people export “revenue” from four tools and get four answers. None of them is lying — they are applying different rules. A semantic model is the written agreement about which of these switches are on, so the number stops being a matter of opinion.

        What each rule is worth

        Active rules only, measured against the raw invoice total. Bars read left for reductions, right for additions.

          Synthetic demo data — rule impacts are illustrative, not a real close.

          Demo five

          Warehouse pipeline health

          Environment

          A lakehouse laid out bronze to gold, so a bad load is caught at the layer it entered rather than in front of a board. Rejected rows are quarantined and counted, never dropped.

          Layer status

          Each layer reports its own row count, refresh duration and rejects.

          Rejected rows by source table

          Where the quarantine is filling up. Ties to the quarantined total above, to the row.

          Synthetic demo data — table names and counts are generated.

          Selected work

          Problems that only show up at production scale

          Built in-house for a commercial print manufacturer: one Python application serving sales reps, managers and finance, reading a live Azure SQL warehouse and deployed to Azure App Service.

          Reconciliation Commission platform tie-out
          ODataPython stdlibAzure SQL

          Making two systems agree to the cent

          Payout figures from the commission platform never matched what the sales warehouse said had been invoiced, and nobody could say which was wrong. I wrote a connector against the platform's OData feed and joined its calculation records back to invoice documents in the warehouse.

          Two things were causing the drift. Negative draw-offset rows carried no user id at all and had to be attributed through a separate beneficiary field, and per-row rounding was being applied before aggregation. With both fixed, every person's payout matched the source system exactly.

          Result Per-beneficiary payouts tie to the cent; the residual gap was ~$202K of invoices that had never been credited to any plan.

          Data quality Duplicate invoice detection
          SQLDynamic query buildingExcel export

          A data-health page that finds real money

          A weekly warehouse import was occasionally landing the same invoice twice, which quietly inflated revenue and commissions. Rather than dedupe blindly, I built a data-health page that surfaces duplicate document numbers with per-row detail — source id, document date, and net amount — so a human can judge each case.

          That judgement mattered: several flagged invoices turned out to be legitimate multi-line orders, so the page gained a per-invoice override to count all rows. Applying one exemption restored a five-figure sum that blind deduplication had been removing.

          Result Duplicates reviewed weekly instead of discovered at quarter close.

          Platform Sales portal
          SQLiteRow-level securityAzure App Service

          One application, three very different audiences

          Reps need their own numbers, managers need everyone's, and finance needs the variance explained. The portal enforces row-level security keyed to the rep on every query path, with dashboards, forecast and budget comparison, receivables, quotes and a report builder that exports to Excel.

          The most valuable fix was the least visible. A headline revenue metric was summing a column that silently dropped postage on fulfilment invoices, which is how a $50K discrepancy had survived for months. Tracing it to a single invoice ended the metric, not just the symptom.

          Result A start-up migration bug also taught the rule now enforced everywhere: schema migrations must never be able to take the site down at boot.

          Capabilities

          What I can take off your plate

          Warehouse reporting

          SQL against Azure SQL, Synapse and SQLite — modelling, aggregation and the awkward joins that reporting layers hide from you.

          System reconciliation

          Two sources, one truth. Tie-outs between ERP, commission and billing systems, with the exceptions itemised rather than rounded away.

          Internal web applications

          Python back ends with authentication, sessions, role-based access and row-level security, deployed to Azure App Service.

          Dashboards people use

          Filterable views with drill-down, saved filters, sortable tables and Excel export — built for the person answering a question under time pressure.

          API & feed integration

          OData and REST connectors with tolerant field mapping and caching, so an upstream schema change is a warning and not an outage.

          Data quality tooling

          Duplicate detection, override tracking and health checks that put a reviewable list in front of a human every week.

          Power BI reporting

          Semantic models and DAX measures that reconcile to the source system, row-level security so each person sees only their book, and refreshes that fail loudly rather than silently.

          Fabric warehousing

          Lakehouse and warehouse builds in Microsoft Fabric — pipelines, Dataflows Gen2 and notebooks, layered bronze to gold so lineage is obvious and a bad load never reaches a report.

          Custom reporting

          The deliverables a BI tool cannot express: scheduled Excel packs, reconciliation workbooks and board summaries built to the format finance already reads.