Skip to content

Extraction · Migration · Integration · Warehousing

Data engineering for the systems nobody documented.

We get data out of any system, with or without an API, then migrate it, integrate it or build a warehouse on it, and reconcile every load so you can sign it off.

Based in Glossop, near Manchester. Working across the UK, on site when it helps.

map LEGACY.CUSTMAST to crm.accountmapped
SourceRuleTargetStatus
CUSNM1 + CUSNM2
'SMITH & SONS' 'ENGINEERING LTD'
join, trim, title case
name
Smith & Sons Engineering Ltd
Mapped
CRTDT
'840312'
YYMMDD, century pivot at 50
created_on
1984-03-12
Mapped
STATCD
'D'
lookup: D is dormant
status
Dormant
Mapped
CRLIM
'0000250000'
two implied decimal places
credit_limit
2500.00
Mapped
TELNO
'0161 496 0123'
international format
phone
+441614960123
Mapped
DELFLG
'Y'
soft-deleted: hold back
not loaded
listed on the sign-off sheet
Held back
Five fields mapped. One record held back, with the reason on the sign-off sheet.
Example data. Every rule like these goes into the mapping specification you sign off before anything moves.
  • SQL Server
  • MySQL
  • PostgreSQL
  • Access
  • Excel and VBA
  • SharePoint
  • REST
  • SOAP
  • OData
  • ODBC and JDBC
  • SFTP drops
  • Fixed-width files
  • XML
  • Azure Data Factory
  • Synapse
  • Databricks
  • Power BI
  • T-SQL
  • Python
  • .NET

Access and security

How access works
  • An NDA before any data moves
  • Read-only access, scoped to the job
  • Work inside your environment where possible
  • Credentials never sent by plain email
  • Working copies deleted, confirmed in writing
Dan Smith

Who does the work

Dan Smith

Data engineer and architect, Glossop, near Manchester

15 years of moving, modelling and reconciling business data, mostly on the Microsoft stack, across cybersecurity, social housing, manufacturing and professional services. The person who reads your enquiry writes the code.

Ways in

What can you get at?

The access you have decides the extraction route. Pick the closest.

How we get it out
Read-only access to a replica or a restored backup is the best case. We profile every table first: row counts, keys, nulls and orphans.
What we watch for
The meaning lives in the data, not the column names: status codes, soft deletes, packed dates, implied decimals. We work it out from the data and write it down.
Usual tooling
SQL ServerMySQLPostgreSQLAccessanything with an ODBC or JDBC driverT-SQLPython

The route

  1. 01Database accessWhat you have
  2. 02Profiled, read-onlyHow it is read
  3. 03Tables we can queryCounted and reconciled

Services

What we take on

Where most projects stall

Advanced extraction

Data out of systems with no API, no documentation or no export worth the name: traced databases, parsed file formats, internal endpoints and, when nothing else works, automated screens.

  • T-SQL
  • Python
  • .NET
  • browser automation

You get: Extraction code, a manifest of what was read, reconciliation against the source's own totals.

Data migration

One or more old systems into a new one: extraction, mapping, transformation, a rehearsed cutover and a reconciliation you can sign.

  • T-SQL
  • Python
  • Azure Data Factory

You get: Mapping specification, migration code, rehearsal reports, cutover runbook, sign-off sheet.

Integration

Systems kept in step after go-live: scheduled syncs, API integrations and file feeds that run unattended and say clearly when a person is needed.

  • REST and SOAP APIs
  • .NET
  • Python
  • Azure

You get: Interface specification, integration code, monitoring and alerts, runbook.

Data warehousing

Warehouses the business can report from: dimensional models, incremental loads and data quality checks on every run, with Power BI on top.

  • Synapse
  • Databricks
  • Data Factory
  • SQL Server
  • Power BI

You get: Pipelines, warehouse model, data dictionary and lineage, Power BI models and reports.

Partner capacity

Specialist extraction, migration and warehousing engineering for agencies, consultancies and systems integrators, working to your delivery lead.

  • Your project's stack

You get: Whatever your workstream needs, to your standards.

Spreadsheets into systems

When the spreadsheet has become the system

Macros, copies of copies, and one person who knows how it works. We read the workbook end to end, then rebuild it as a proper system, with its data moved across and reconciled.

The workbook

  1. 1J-1042's total was typed over its formula: 15 hours at 48.00 is 720.00, not 620.00.
  2. 2“Sen” isn't on the rate list. With no exact-match flag, the lookup quietly takes the Lead rate.
  3. 3J-1044's hours are stored as text, so the hours total reads 41, not 51.
  4. 4J-1045 shows #REF!: the column its rate pointed at was deleted.
  5. 5The total stops at row 5, so J-1045 is left out of it.

The system

  1. 1Totals are worked out from hours and rate, and can't be typed over.
  2. 2Grades come from a list and rates from one table, matched exactly.
  3. 3Hours is a number field, checked as it's entered.
  4. 4Rates are looked up by grade, not by column position.
  5. 5Every job is in the total, and the move is reconciled against the workbook.
Example data. The problems are common ones.

Edge cases

Edge cases we like

Bespoke systems and old data produce problems nobody plans for. Finding them before the load is most of the job.

foundrate=650 unit=hour
fixedrate=81.25 unit=hour

Meaning

Rates that changed meaning

The same column holds daily rates in one system and hourly rates in another.

Units are checked against totals before anything loads. In one migration this stopped project costs reading eight times too high.

foundnote="renews 14/2/27, call Sue"
fixedrenewal_date=2027-02-14

Meaning

The renewal date lives in the notes field

Users worked around a missing field by typing into a free-text one, for years.

Rules pull dates, phone numbers and emails out into real columns, and every value can be traced back to the note it came from.

found£1,200.00
fixed£1,200.00

Formats

£ turns up as £

UTF-8 text read as Windows-1252 somewhere along the way and saved again, so every £ gains a stray character.

We detect the encoding column by column, repair the damaged values, and count every repair on the sign-off sheet.

foundhours=26.5 cap=24
fixedsplit or held back, listed

Access and rules

Records the new system refuses

Archived items it treats as read-only, entries over its limits, values outside its picklists.

Every record is tested against the target's rules in SQL first. Then we decide with you what to fix, split or hold back.

Method

How a migration runs

Every cutover has a freeze window. We measure ours in rehearsal and tell you the number before you commit to a date.

  1. Step 1: Profile

    Read-only access to every source. Each table counted, keyed and checked for orphans, duplicates and values that don't fit their column.

    You getProfiling report

  2. Step 2: Map

    Field by field, source to target, with every transformation, lookup and default written down in plain language.

    You getMapping specification, signed off by you

  3. Step 3: Build

    Extraction and transformation code, with the validation rules alongside it, run inside your environment wherever possible.

    You getRepeatable migration code

  4. Step 4: Rehearse

    Full dry runs into a test copy of the target. Each one timed, reconciled and reviewed with your team.

    You getRehearsal reports and a measured cutover window

  5. Step 5: Cut over

    Freeze, final extract, load and checks, then a go or no-go call made against criteria agreed in advance.

    You getExecuted cutover runbook

  6. Step 6: Reconcile

    Counts, totals and record-level spot checks, source against target, for every object. Anything not moved is listed with the reason.

    You getSign-off sheet

Proof

What sign-off looks like

Counts and totals for every object, source against target. Anything not moved is listed with its reason. Nothing is signed off on trust.

Download the reconciliation checklist
sign-off sheet, rehearsal 3 of 3example figures7 of 7 reconciled
ObjectSourceLoadedHeld backReconciled
Accounts18,20418,1772727 soft-deleted in source, listed
Contacts41,87041,8700
Orders266,512266,5120
Order lines1,204,8801,204,8800
Order value (£)48,227,615.4048,227,615.400.00
Open balance (£)1,903,118.221,903,118.220.00
Attachments9,9129,90844 zero-byte files, listed

Plus record-level spot checks, the full held-back list and the mapping specification version it ran against.

Write-ups

Recent work

Clients aren't named, and nor is anything that would identify them. The problems, and how they were found, are real.

8×how far too high project costs would have read, caught before load

Two planning systems into one, with an eightfold costing error caught first

A professional services firm moving nine object types from two project and timesheet systems into one cloud platform. Every rule was tested in SQL before anything loaded.

Cost rates
Daily in one system, hourly in the other
Also found
A margin bug in the existing reports
Scope
Nine object types, years of history
Rule
No load without a passing validation run

32,000lines of undocumented VBA, read and reviewed

Reading 32,000 lines of undocumented VBA, straight from the file

A housing association needed to know what was inside a large Excel and VBA application before deciding its future. We pulled every module out with a purpose-built parser and reviewed all of it.

Modules
113, around 32,000 lines
Way in
A custom parser for the workbook file
Found
SQL injection risks, money held as Single
Delivered
A review and a fixed-price replacement plan

2 yearsleading the data team, before Bit Movers

Running a global firm's Azure data warehouse, tuned and cheaper to run

At a global cyber security consultancy: the business-critical warehouse, the Power BI reporting on it, and integrations for expense and HR data.

Tuned
Queries, partitioning, resource use
Result
Better performance, lower cloud costs
Reporting
Power BI across the organisation
Also built
Expense and HR data integrations

Stack

What we work with

Azure

  • Data Factory
  • Synapse Analytics
  • Databricks
  • Data Lake Storage

Languages

  • T-SQL
  • Python
  • C# and .NET
  • PowerShell

Reporting

  • Power BI
  • SQL Server
  • Excel, when it has to be

Ways in

  • REST, SOAP and OData
  • ODBC and JDBC
  • SFTP and flat files
  • Browser automation

For agencies and integrators

When your project needs an extraction, migration or warehousing specialist for a few weeks, we join your team: your delivery lead, your standards, your client.

How partner work runs

Describe your systems

Tell us what you are moving from and to, and how the data can be reached. No data or credentials at this stage: a description is enough.

Describe your systems
Home
Advanced extractionOut of systems with no API or export
Data migrationOld systems into new, reconciled
IntegrationSystems kept in step after go-live
Data warehousingWarehouses the business can report from
Spreadsheets into systemsCritical workbooks rebuilt as proper systems
Partner capacitySpecialist capacity for your team
Edge casesProblems that break migrations
How a migration runsProfile to reconcile
Write-upsThree write-ups
TemplatesFree downloads
Describe your systemsSend an enquiry
Privacy notice
£ turns up as £Formats
Three date formats in one columnFormats
Money stored as floating pointFormats
Mapping specification templateExcel
Reconciliation checklistPDF
Cutover runbook outlinePDF
Copy email address[email protected]
Write an email[email protected]
Switch theme
Dan Smith on LinkedIn