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.
Multi-branch international education & migration services group
AWS ap-southeast-2 (Sydney)
Databricks, serverless-only
Reckonsys Engineering
Reckonsys shipped two builds on one governed, serverless Databricks lakehouse:
Chapter 01
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.
Sources
Bronze
Silver
Gold
Unified view
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.
Data reliability
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.
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.”
Results
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.
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.
Chapter 02
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.
Ingest
Normalize
Read — AI Gateway
Write
Serve
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.
Human in the loop
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.
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.
Results
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.
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.
Let's collaborate to turn your business challenges into AI-powered success stories.
Get Started