← The blogMigration

"The 10,000-Row Import Test (And Why It Mattered)"

Contents

#The moment that decides whether a switch works

There is a moment in every tracker switch that decides whether the new tool is real or just looks good in a demo. It is not the timer. It is not the invoice template. It is the import.

You have three years of entries in a CSV. Clients, projects, tasks, rates, notes. Your billing memory, in a file format the new tool has never seen. You drop the file in, and for about ten seconds you do not know if you just moved your history or lost it. Those ten seconds are the whole trust decision.

I knew that feeling before I ever built owntime, because I lived it switching tools as a consultant. Every switch had that moment. Most of them were fine. A couple of them dropped entries or scrambled rates, and I spent a weekend fixing the damage. I did not want anyone switching to owntime to have that weekend. So before I told anyone the import worked, I ran a test that was bigger than most people's real history.

#The test

Renting
Data on their servers. Price can change overnight. History is a hostage. Works only online.
Owning
Data on your disk. Price is done at purchase. History is a file you hold. Works offline, forever.

I built a script that generated a CSV the shape of a real Harvest export. Ten thousand rows. About three years of daily entries across a dozen clients, with projects under the clients and tasks under the projects, per-project and per-client rates, billable and non-billable flags, and notes of varying length, including some that were deliberately messy.

The messy part was the point. Real exports are not clean. They have entries with missing notes, entries where the client name is slightly different from the one two rows up, entries with special characters in the project field. If the import only worked on clean data, it did not work.

I dropped the file into owntime and watched the preview. The number it showed me was 10,000 rows found

15×
A 1500% increase means 16x the original price
, a small number skipped, and a breakdown of what would come in. The skipped rows were the ones I had deliberately broken, and the preview told me exactly which ones and why. I confirmed, the import ran, and the result was ten thousand entries in a local [SQLite](/help/your-data) file on my disk.

Then I did the thing that actually mattered. I opened the file in a SQLite browser and spot-checked the clients, the projects, the rates, and the notes. The structure was intact. The rates had mapped correctly. The messy rows had been handled the way the preview said they would be. Nothing had been silently dropped or silently changed.

I have run that test again on every import-related change since. It is the first thing I check before a release, because the import is the moment of truth and I do not ship a version that fails it.

#Why the number is 10,000 and not 100,000

✓License does not expire
✓Vendor cannot reprice you
✓Data is a file you hold
✓Works offline, forever

I want to be honest about the limit, because someone will ask.

Ten thousand rows covers about three years of active consulting for most people. That is a realistic worst case for the solo consultants and small agencies owntime is built for. It is not a realistic case for a fifty-person agency with a decade of history, and I am not going to pretend it is.

I have not tested 100,000 rows, because the product is not built for 100,000-row histories. owntime is a local-first, single-user desktop app. A studio that size is looking at a different category of tool, and I would rather be honest about the scope than fake a benchmark.

If your history is in the thousands of rows, the test I ran covers you. If your history is in the tens of thousands, try the trial with your own export before you buy. The preview will tell you exactly what comes in and what gets skipped, and you can decide based on your own data, not my marketing.

#The thing that made the test possible

There is a technical point here that matters for trust, and it is the same point that runs through every part of this product.

The import runs entirely on your machine. The CSV is parsed locally. The entries are written to a local SQLite file. Nothing is uploaded, because there is no server to upload to. When the preview says "10,000 rows found," that computation happened on your Mac, not on mine.

This is the same reason the app works offline, the same reason your data is a file you hold, and the same reason the license checks in once and never again. It is one architecture, applied to every operation. The import is not special. It just benefits from the same constraint as everything else: no server means nothing leaves your machine unless you send it.

#The honest limits

An import is a translation, not a magic transfer, and I want to be plain about what that means for your specific case.

owntime imports from Harvest, Toggl, Clockify, and FreshBooks. The fields it carries are the ones those CSVs contain: dates, clients, projects, tasks, rates, notes, billable flags. The things it does not carry are the things the CSV itself does not contain, or the things that were specific to the old tool's own system. Harvest's internal invoice linkages, for example, do not come through, because the CSV does not carry them in a way owntime can reconstruct.

The preview exists to show you exactly where those boundaries are before anything writes. Read it. If it looks right, confirm. If it looks off, cancel and nothing has changed. That is the whole point of the preview: you see the translation before you commit to it.

One more thing: re-importing the same file will create duplicate entries. The import does not silently dedupe. If you import the same CSV twice, you will see the duplicates in your timesheet. Import once, reconcile, and keep your export file as a backup.

#The test you can run yourself

You do not have to take my word for any of this. The trial is the full app, no email wall, and it runs the same import code I tested.

Export your history from your current tracker. Drop the CSV into owntime. Read the preview. If the number of rows and the skip reasons look right, confirm and spot-check a few clients in the project view. If it does not look right, cancel. Nothing has been written, and you have lost nothing but ten minutes.

That is the test. I ran it on ten thousand messy rows so you could run it on your own.

Try owntime free for 14 days · Read the honest migration scope · See where your data stays


Sources & further reading

  • owntime migration scope (https://owntime.click/migration), accessed 2026-09-02

Your time tracker can't raise your price if you own it.

Try owntime free for 14 days. No email wall. Or buy once for $99 early bird.

Download free trialSee pricing