CLOSE
megamenu-tech
CLOSE
service-image

Company

CLOSE
CLOSE
CLOSE
Our Works
Bronze to Gold

Bronze to Gold

Two production builds on the Databricks Lakehouse: one unifying a services group's CRM, email and calls into a single customer view, the other turning scanned visa documents into structured tables.

Bronze to Gold case study hero
Client

Multi-branch international education & migration services group

Region

AWS ap-southeast-2 (Sydney)

Platform

Databricks, serverless-only

Delivered by

Reckonsys Engineering

Background

  • A national network of branch offices guiding students and skilled migrants through visas, admissions and compliance.
  • Every journey generates data in three disconnected places: a CRM, a mail server and a VoIP phone system.
  • And every application is backed by paperwork, uploaded in whatever format it arrives.

Challenges

  • CRM data locked inside an operational RDS instance.
  • Manual report builds that took days per request.
  • Email and call activity with no link back to a CRM lead.
  • Document extraction on brittle Lambda/SQS glue, with no view of cost or failure.
  • No single source of truth across branches or systems.

Solutions

Reckonsys shipped two builds on one governed, serverless Databricks lakehouse:

  • One medallion pattern → CRM, email and calls from bronze to gold in four independent bundles.
  • A Lead 360° view → CRM leads joined to email senders and call records at query time.
  • Confidence-routed document AI → Claude Haiku 4.5 reads ~93%, Sonnet 4.6 takes the rest.
  • Cost intelligence on system tables → $3.2K+ a month in serverless spend identified for reduction.
Three small clay icons — a database, an envelope and a phone — sending glowing orange wires through a bronze, a silver and a gold block into a single terracotta customer card.

Chapter 01

Three systems, one medallion lakehouse

The platform ships as four independently deployed Databricks Asset Bundles — CRM, Email, Audio and Cost Intelligence — each owning its own bronze → silver → gold schema, schedule and CI/CD path.

They read across each other's gold layers at query time, which is how a single Lead 360° view assembles CRM, email and call data without any one bundle owning the whole picture.

  1. Sources

    CRM (RDS)
    Email (S3)
    3CX + Whisper call recordings
  2. Bronze

    Fivetran CDC external Delta
    Auto Loader mergeSchema
    Auto Loader transcripts
  3. Silver

    dedupe · try_cast quarantine rejects
    recipients · body attachments
    diarize · enrich
  4. Gold

    SCD2 dims dim_lead · dim_company
    dim_person edu_summaries (Haiku)
    dim_call call events
  5. Unified view

    Lead 360°
    • bridge_lead_email_person
    • bridge_lead_call
Three source systems, one medallion pattern, one 360° bridge layer joining CRM leads to email senders and call records.
Technical detail

The client runs a national network of branch offices helping students and skilled migrants through visa lodgement, education admissions, and compliance. Every one of those journeys generates data in three disconnected places: a SQL Server CRM behind an operational RDS instance, a mail server handling thousands of counsellor↔applicant threads a day, and a 3CX VoIP system recording every call.

None of the three could see the others. A counsellor could tell you a lead's visa status. They could not tell you, in the same screen, whether that lead had emailed twice this week asking about a delayed document, or called the office sounding frustrated. Reporting meant a one-off SQL export; there was no analytics surface on top of the operational database at all.

Each bundle deploys on its own timeline through GitHub Actions and owns its own job schedule, so a change to the audio pipeline never waits on a CRM release.

Unity Catalog
Single governance plane across two workspaces (dev/prod). Every job runs as a service principal, not a person — no human credential ever touches the pipeline. Grants are managed as code via migration SQL, and cross-catalog reads (e.g. CRM gold reading emails_gold.dim_person) are permissioned explicitly per bundle.
Delta Lake
Storage format for all three tiers. Bronze tables are registered as external Delta tables over Fivetran's CDC output; silver and gold are Databricks-managed. Liquid Clustering (CLUSTER BY) replaces manual partitioning on the highest-traffic dimensions (company_id, lead_id for CRM; call_id for audio).
Auto Loader
Streams newly landed email JSON and call-transcript JSON from S3 into bronze with schema inference and mergeSchema: true, so new upstream fields are picked up without a manual DDL change.
Serverless Compute
All four bundles run exclusively on serverless Jobs and SQL Warehouses — no managed or interactive clusters in any production path. Zero idle spend, but it also rules out .cache()/.persist() and custom pip installs, which shaped how the transforms were written (stdlib + PySpark builtins only).
Databricks Asset Bundles
Every job, schedule, permission, and file is defined as code and deployed with databricks bundle deploy through GitHub Actions. Dev and prod run the identical bundle, parameterized by target — no environment-specific branches of the code.
Databricks Workflows
Orchestrates the task DAGs — a single CRM job fans out 40 silver tasks in parallel, then 45 gold tasks, then facts and 360° bridges, with per-task retry and dependency-aware pausing on upstream failure.
AI Gateway (ai_query())
Email gold calls databricks-claude-haiku-4-5 directly from Spark SQL to summarize *.edu.au correspondence for institution-relationship tracking; the audio pipeline calls the same model via the Foundation Model API to score sentiment, flag critical calls, and classify call direction.
System Tables
The cost-intelligence bundle reads system.billing.usage, system.billing.list_prices, and system.lakeflow.jobs directly — no external cost-monitoring tool — to build a daily-refreshed spend dashboard by job, warehouse, and identity.
A clay conveyor of cream data blocks where one cracked block is lifted aside by a small copper arm into its own tray, while a terracotta warning beacon glows orange instead of the line carrying on silently.

Data reliability

Loud failure, not silent drops

Every slowly-changing dimension carries SCD Type 2 history, so re-running the pipeline with no upstream change writes nothing. Rows that would break a NOT NULL contract go to a paired _rejects table instead of being dropped or crashing the run.

And the cross-bundle 360° join fails the task outright if the email gold layer isn't there yet, rather than silently building an empty bridge.

Technical detail

Every slowly-changing dimension — leads, companies, products, users, people — carries a five-column SCD Type 2 pattern: a SHA-2 hash of the business key detects a real change, the old row closes with _effective_to, and a new current row opens. Re-running the pipeline with no upstream changes writes nothing, which makes the whole system safely idempotent.

The 360° bridge fails in both dev and prod if its upstream gold layer is missing. Below that, a quarantine pattern catches rows that would otherwise violate a NOT NULL contract downstream: they're routed to a paired _rejects table instead of being dropped or crashing the run, so the pipeline stays green while nothing gets lost.

“An empty bridge table silently passing is worse than a loud failure — analysts build dashboards assuming the table is populated.”

A clay dashboard panel with a descending copper bar chart, a small cream magnifier resting on the tallest bar and an idle cream server block switched off beside it, lit by a soft orange glow.

Results

A cost-intelligence bundle that pays for itself

Because the platform is serverless end to end, every job run is a metered line item in the system billing tables. Auditing real run history against schedule surfaced concrete savings.

86%
of CRM-lead sync runs wrote zero rows
$2,424/mo
saved by right-sizing sync and retiring an idle warehouse
$801/mo
saved by merging four email-silver tasks into one
0
human credentials anywhere in the pipeline
Technical detail

Because the platform is serverless end to end, every job run is a metered line item in system.billing.usage — which turned the cost-dashboard bundle into a genuine optimization tool rather than just a reporting exercise.

86% of CRM-lead sync runs wrote zero rows — pure cold-start overhead on an over-frequent schedule. Right-sizing sync frequency and retiring an idle SQL warehouse identified $2,424/mo; merging four sequential email-silver tasks into one, with no added latency, identified another $801/mo. Every job runs as a Unity Catalog service principal.

The same billing-driven analysis is now standing engineering practice: before proposing a schedule or a warehouse, look at what the last N runs actually cost against what they actually changed.

A stack of mixed clay documents — a passport, a folded letter and a spreadsheet page — passing along a glowing orange wire to a small copper reader, with one page diverted up to a larger terracotta reader before both land in neat cream trays.

Chapter 02

Confidence decides which model sees the document

Visa and enrolment documents arrive in every format a CRM upload allows. Each is normalised to PNG pages, then read by Claude Haiku 4.5 through the Databricks AI Gateway.

The ~7% that fall below 70% confidence get a 300 DPI re-render and a second pass from Sonnet 4.6 before anything is written.

  1. Ingest

    S3 upload any format
  2. Normalize

    PNG pages Word → PDF → PNG
  3. Read — AI Gateway

    Haiku 4.5 ~93% of volume
    Sonnet 4.6 ~7%, confidence < 70%
  4. Write

    Bronze 32 typed tables
    document_audit_log every failure
  5. Serve

    DLT gold hourly
The expensive model only sees the documents that actually need it.
Technical detail

Every visa lodgement and every education admission is backed by paperwork: passports, bank statements, academic transcripts, offer letters, compliance forms. Counsellors upload it all through the CRM into a shared S3 bucket, in whatever format it arrives — a scanned PDF, a phone photo, a Word document, an Excel bank statement export. Formats in scope: PDF, JPG / PNG, TIFF / HEIC / WebP, DOC / DOCX, XLS / XLSX.

The prior design — a Lambda/SQS/DynamoDB pipeline — worked, but every new document type meant new glue code, and there was no visibility into what a failed extraction actually cost or why it failed. The brief was to replace it without losing anything on cost, while gaining structured, per-document-type warehouse tables and a real audit trail.

Every non-image format is normalized first — Word documents render to PDF via headless LibreOffice, then every page becomes a PNG — so a single vision-capable model interface handles the entire format matrix.

AI Gateway
Hosts two governed endpoints — a primary databricks-claude-haiku-4-5 route and a databricks-claude-sonnet-4-6 fallback — so the document images never leave the Databricks security perimeter in ap-southeast-2 to reach a model provider directly, and switching the underlying model is a UI config change, not a code deploy.
Inference Tables
Auto-log every gateway call — tokens in, tokens out, model used, latency — straight into Unity Catalog. That gave the pipeline per-document cost attribution the prior Lambda design never had.
Auto Loader
Ingests normalized pages as they land, replacing the DynamoDB-based dedup layer from the previous architecture with a Delta-native dedup table.
Delta Lake
32 per-document-type bronze tables (passport, bank statement, transcript, offer letter, and so on) plus a dedicated document_audit_log table that captures every failure with its stage, error type, and a 3-hour pre-signed S3 URL for a human to pull the original file.
Delta Live Tables
Runs the gold transform hourly, building gold_client_profile, gold_document_status, and gold_compliance_readiness declaratively on top of the 32 bronze tables.
Unity Catalog
Governs who can query document_audit_log and generate a fresh pre-signed download link — the audit query itself filters out anything already reprocessed, so a resolved failure stops generating new links automatically.
A cream document with an orange warning tag in a review tray, a clay hand holding a copper pen beside it, and a glowing line back to the data pipeline.

Human in the loop

Every failure is recoverable, not just logged

A document that fails at any stage lands in document_audit_log with the stage, the error, the model that was tried and a working link to the original file.

A reprocessing job lets a staff member key in the correct fields directly, closing the loop without an engineer in the room.

Technical detail

A document that fails at any stage — normalization, the LLM call, a rate limit, a confidence score that never clears 70% even after the Sonnet pass — lands in document_audit_log with enough detail for a staff member to act on it: the failure stage, the error type, the model that was tried, and a working link to the original file. A manual reprocessing job lets that person key in the correct fields directly against the target bronze table.

Multi-page documents are handled the same way a person would read them: batches of up to 20 pages go to the model together with context (“page batch 2 of 3 of the same document”), fields are merged across batches, and the reported confidence is the average across all of them — so a 40-page bank statement doesn't get judged on its first page alone.

Neat rows of cream clay document trays, each with a small copper label plate, receiving pages along glowing orange wires, with a balanced copper scale in the foreground showing cost held level.

Results

Cost-neutral, with an audit trail it never had

Broadly cost-neutral against the prior Lambda/SQS/DynamoDB design, while gaining structured per-document-type tables, per-document cost attribution and a real audit trail.

90K
documents a month, across five formats and 32 types
$440–590
estimated monthly cost
93% / 7%
Haiku / Sonnet split
3 hrs
validity of every audit download link, auto-expiring once reprocessed
Every Databricks component, in one place
Unity Catalog
Cross-workspace governance: catalogs, schemas, grants, lineage, and service-principal identity for every job in both pipelines. No human credential is ever in the execution path.
Delta Lake
The storage format underneath every bronze, silver, and gold table in both builds — ACID merges, schema evolution, and time-travel-safe SCD2 history.
Auto Loader
Incremental, schema-inferring ingestion from S3 for email, call-transcript, and document JSON/images — no manual file-tracking state to maintain.
Liquid Clustering
CLUSTER BY on the highest-traffic join keys (company_id, lead_id, call_id) so Databricks SQL prunes files automatically, without hand-managed partitioning.
Serverless Compute
Every job and every SQL warehouse across four bundles and the document pipeline runs serverless — no cluster sizing, no idle spend, billed by the second.
Databricks Asset Bundles
Jobs, schedules, permissions, and code shipped together as one deployable unit through GitHub Actions — the same bundle runs unmodified in dev and prod.
Databricks Workflows
Task-level DAGs with parallel fan-out, per-task retry, and dependency-aware pausing — a single job can safely orchestrate dozens of interdependent tasks.
Delta Live Tables
Declarative hourly gold materialization for the document-intelligence pipeline's client-profile and compliance-readiness tables.
AI Gateway
Governed access to Claude Haiku and Sonnet from both Spark SQL (ai_query()) and the Foundation Model API — model swaps are a config change, and every call stays inside the workspace's cloud perimeter.
Inference Tables
Automatic per-call logging of tokens and model usage to Unity Catalog, giving the document pipeline cost attribution the prior architecture didn't have.
System Tables
system.billing.* and system.lakeflow.jobs power a daily cost-intelligence dashboard built entirely on platform-native metadata — no third-party FinOps tool.

Client details in this case study are described at the level of a services-industry profile rather than by name; architecture, scale, and figures are drawn directly from production engineering documentation. Available for reference calls on request.

Key takeaways

4
Independently deployed Databricks Asset Bundles
~150
Production PySpark notebooks, zero pip installs
43+
Gold-layer tables across CRM, email and audio
$3.2K+
Monthly serverless spend identified for reduction

View other works

All works

Modal_img.max-3000x1500

Discover Next-Generation AI Solutions for Your Business!

Let's collaborate to turn your business challenges into AI-powered success stories.

Get Started