I recently was working for a client who has their own time tracking system–they use Harvest. They want me to enter time that I work for them into that system–they want more insight into my time use than monthly invoice. However, I still use my own invoicing system, FreshBooks (more on that choice here) and will need to invoice them as well. Before the days when APIs were common, or if either of these sites did not have an API, I would have had three, equally unsavory, choices:
- Convince the client to use my system or at least access it for whatever data they needed
- Send reports (spreadsheets) to the client from my system and let them process it
- Enter my time in both places. This option would have won, as I don’t like to inconvenience people who write me checks.
Luckily, both Harvest and FreshBooks provide APIs for time tracking (Harvest doco here, FreshBooks doco here). I was surprised at how similar the time tracking data formats were. With the combination of curl, gnu date, sed, Perl and bash, I was able to write a small script (~80 lines) that
- pulled down my time data for this client, for this week, from FreshBooks (note you have to enable API access to your account for this to work)
- mapped it it from the FreshBooks format to the Harvest format
- then posted it to Harvest.
A couple of caveats:
- I still log in to Harvest to submit my time (I didn’t see a way to submit my time in the API documentation), but it’s a heck a lot easier to press one button and submit a weeks worth of time than to do double entry.
- I used similar project and task codes in both systems (or, more accurately, I set up the FreshBooks tasks and projects to map to the Harvest ones, since FreshBooks is what I had control over). That mapping was probably the most tedious part of writing the script.
You can view my script here, or at least a sanitized version thereof. it took about an hour and a half to do this. Double entry might have been quicker in the short term, but now I’m not worried about entry mistakes, and submitting my time every week is easy! I could also have used XSLT to transform from one data format to the other, but they were so similar it was easier just parse text.