<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sheaf</title>
    <description>The latest articles on DEV Community by Sheaf (@sheaf).</description>
    <link>https://dev.to/sheaf</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4187690%2F657c1177-f193-4842-94ed-e5ac31d2e9aa.png</url>
      <title>DEV Community: Sheaf</title>
      <link>https://dev.to/sheaf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sheaf"/>
    <language>en</language>
    <item>
      <title>My import worked on clean data. Messy data broke it six ways.</title>
      <dc:creator>Sheaf</dc:creator>
      <pubDate>Fri, 16 Oct 2026 02:15:38 +0000</pubDate>
      <link>https://dev.to/sheaf/my-import-worked-on-clean-data-messy-data-broke-it-six-ways-1cfg</link>
      <guid>https://dev.to/sheaf/my-import-worked-on-clean-data-messy-data-broke-it-six-ways-1cfg</guid>
      <description>&lt;p&gt;The first version of our Harvest import worked great.&lt;/p&gt;

&lt;p&gt;On my test account. Which had three clients, two projects, and nothing weird in it at all.&lt;/p&gt;

&lt;p&gt;Some context. I'm building &lt;a href="https://sheaf.guestleaf.app" rel="noopener noreferrer"&gt;Sheaf&lt;/a&gt;, a time tracking and invoicing app for small agencies. A lot of the people trying it are leaving Harvest after its price change, and the first thing they ask is whether they can bring their history with them. So the import matters more than almost anything else in the app. If it gets someone's invoices wrong, they're gone.&lt;/p&gt;

&lt;p&gt;Real accounts aren't three clients and two projects. They're years of stuff. Old clients, deleted projects, invoices in four currencies, notes someone pasted a whole email into.&lt;/p&gt;

&lt;p&gt;So before letting anyone near it, I made a fake account that looked like it had been used for years. Messy on purpose. Then I ran the import again.&lt;/p&gt;

&lt;p&gt;It broke in six different ways.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Canadian invoice was off by a cent.&lt;/strong&gt; Quebec sales tax is 9.975%. I was storing tax rates with two decimals. A cent sounds like nothing until it's on an invoice someone's accountant is checking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Invoice numbers stopped making sense.&lt;/strong&gt; Most accounts number invoices 1001, 1002, 1003. One of mine used INV-0099. After importing it, Sheaf had no idea what the next number should be.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A long note got chopped.&lt;/strong&gt; Someone had pasted almost 6,000 characters into a time entry note. My limit was lower than that, so the end just vanished. Nobody would have noticed until they needed it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mileage lost its miles.&lt;/strong&gt; An expense for 120 miles came across as just an amount. The miles were gone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One permission error killed everything.&lt;/strong&gt; If the person importing isn't an admin, Harvest won't show them invoices. My import treated that as a fatal error and stopped. Now it brings over everything they can see and tells them what's missing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Importing twice undid people's work.&lt;/strong&gt; This one scared me the most. People don't switch tools in a day. They import, try it for a week, and import again to catch up. My second run was quietly overwriting things they had already fixed in Sheaf. Now it only adds what's new and leaves their changes alone.&lt;/p&gt;

&lt;p&gt;None of these would have shown up with clean test data. Every one of them would have shown up with a real customer, probably in their first week, which is the worst possible time.&lt;/p&gt;

&lt;p&gt;So that's my lesson, and it's not a new one: your test data is too clean. Make a version that looks like five years of real, careless use, and run everything against that.&lt;/p&gt;

&lt;p&gt;And if you're leaving Harvest yourself, &lt;a href="https://sheaf.guestleaf.app" rel="noopener noreferrer"&gt;Sheaf&lt;/a&gt; is free while it's in beta. The import takes a couple of minutes, and now it handles the messy stuff too.&lt;/p&gt;

&lt;p&gt;What's the weirdest thing you've found in a customer's real data?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>startup</category>
      <category>testing</category>
      <category>saas</category>
    </item>
  </channel>
</rss>
