Migrating a property inspection business off InventoryBase

A UK property inventory agency wanted its inspection history out of a third-party platform and into one it owns. I led the engineering of the new platform and the move, while the agency kept working.

The business

The agency inspects rented homes for letting agents and landlords: at check-in, at check-out and during tenancies. Each inspection produces a detailed report, with photos of every room, meter readings and notes on condition, which people may need to look at again long after the tenancy ends.

For years every job ran through InventoryBase, a hosted inventory platform. The agency’s team managed their day-to-day work in Airtable, and invoices went out through Xero.

Why it moved

The agency had three reasons to bring its data home: the cost of keeping years of history on InventoryBase, owning its records outright, and having a complete backup it controls.

Between InventoryBase and Airtable sat a sync service a freelance developer had started and never finished. It kept its own copy of the data it passed through, and the business depended on it every day.

When a sync failed, someone had to notice, find the failed job in an admin screen and run it again by hand. There was no record of what had changed, and no complete copy of the agency’s history anywhere it controlled.

60,000+ inspections

across more than 25,000 properties and 14 years, with over 4 TB of reports and photos, now sit in the agency’s own database and storage.

My role

I was the only engineer, working with the agency and with our design and product management team. I planned the move, built the new platform and ran the migration.

Taking over the live work first

Staff used the system all day, so the move could not interrupt them. The new Ruby on Rails platform first took over everything the old sync service did, keeping InventoryBase and Airtable in step in both directions, while the team carried on working in Airtable as normal.

With the live work moved, the new platform absorbed the old service’s database. Then it began importing the full history from InventoryBase, every property, inspection, report, meter reading and photo, into a database and file storage the agency owns.

Moving 14 years of records

InventoryBase limits how many requests an account can make, so the import was paced to stay under that limit. It backed off and retried when the platform pushed back, and could stop and resume at any point without losing its place or copying anything twice.

A single inspection is not one record. The import fetched each property with its contacts, meters and photos, and each inspection with its report, report details, contacts and attachments, across 14 inspection types, from inventories to mid-term visits.

Photos were the largest part of the job. Each inspection carries dozens of them, and together they came to more than 11 million files. Every property was checked against the source before anything on the old platform could be deleted.

The hard parts

Beyond rate limits and the volume of photos, two problems ran through the whole project. While Airtable and the new platform both held live data, every change had to land in both, without loops and without older information overwriting newer. And each Xero invoice and payment had to be matched to the right job and client, across years of records created in different systems.

Once the history was home, the work moved on to maintenance and updates: handling edge cases the old data exposed and adding what the team needed as they came to rely on the new platform.

Where it is now

The platform is live and used daily, and I still maintain it. The agency holds its full history in its own storage, and deletion from InventoryBase has begun in checked batches, with a few thousand records removed so far.

How it was built

The platform runs on Ruby on Rails and PostgreSQL, with Solid Queue for background jobs and DigitalOcean Spaces for files. Every change from InventoryBase and Airtable arrives as a signed webhook, is recorded before it is processed and can be replayed if processing fails, so a bad day on either platform means a retry, not lost data.

Each record fetched from InventoryBase is also stored exactly as it arrived, next to the tidied version the platform works with, so any question about the migrated data can be answered from the original.

Built with: Ruby on Rails, PostgreSQL, Solid Queue, DigitalOcean Spaces, InventoryBase, Airtable, Xero.

Have a service like this one?

Tell me what it does, who relies on it and what keeps you up at night about it. A few lines by email is enough. I reply within two working days.