Python Harvest v2 API

Python library implementing v2 API for Harvest timesheeting

Visit Website
August 29, 2021 My First Customer!

As I am in Australia, I got my first customer as I slept. I wish I could say this is making money while I sleep. But the few months collective effort in writing the library in the first place, maintaining it and eventually launching it as a commercial product dulls the idea that I'm making money while I sleep. Like all overnight successes this has been a long time coming.

With this sale I think I've covered the costs of setting up the shopfront on squarespace and the connection with Stripe and, maybe, the coming couple of months.

Now that I've found one customer I am buoyed on finding more.

Lesson: ask for money, be patient and accept this is a marathon, not a sprint.

Comment

August 27, 2021 Bug Fix Pull Request Offered

I have had a pull request offered to fix the HTTP 400 errors.

This is really frustrating as it suggests there is a community forming around the library which is what I had hoped was going to happen.

I had to politely inform the person offering the PR that a version of the library is on offer for sale with that fix and so I wouldn't be merging their change. They took it well and congratulated me on taking the steps to charge for the library. This person has put forward that they'll try and get their business to buy a copy in good faith. The person who put the PR forward is an electrical engineer and they are using the library for reporting and are working on using it to migrate away from Harvest.

I noticed, however, a company for whom I'd done some work on my library last year (for free) had cloned the PR with the fix. This company is using the library in a commercial product and are owned by IBM. At this stage my expectation is that they are unlikely to pay for a copy. This is frustrating. Nothing I can do about it. And it puts the support burden onto them which is the point of abandoning the open source project and getting paid to support the commercial release. Eventually, when I make the repository private, the ability to scalp the code will be removed.

I have learned that making a commercial product was a very, very good move as my target market, knowledge domain experts who want to interface with Harvest, appreciates the library.

I have also learned people who could write it for themselves don't value my edition of the library beyond using it as a stepping stone to poach. That fits what I had been seeing around the Internet. GitHub has a LOT of projects for Python libraries to interface Harvest CRUD API but none of them are complete. Most are either empty or have one API endpoint supported and not the login process. This suggests to me that the code is too easy to write and once they start writing it's too easy to simply integrate the API calls into code. Which is what I thought when I started writing my edition of a library... The question of "where's the value?". But in reality this is where there is huge value. Even if the code is considered too simple to care about the value is in having a coherent, maintained, focused, out-sourced library where someone who is interested in the interface is actually watching for changes and keeping things aligned.

To a large degree this last point is echoed in almost every single IndieHackers interview that I've listened to.

Comment

August 23, 2021 Harvest Brown-out

So, it turns out the breaking change didn't appear on Sunday the 15th as I'd been told would happen.

Today I found out that Harvest did a brown-out on Tuesday the 17th of August which is when the previously mentioned queries came through. This would also account for the lack of queries for the library in the mean time.

The people who queried about the breaking change on the 17th will have been able to continue using the legacy version from the 18th onwards.

I have been told the switch-over to the new environment will happen on August 24.

I have learned there is a higher risk than I'd like in running a business when I'm not in charge of change management.

Comment

August 18, 2021 Harvest breaking change has had an impact

Today I started getting inquiries about HTTP 400 errors and when the next version is being released.

One person had made contact with Harvest who had duly pointed the user in my direction. They were a student and have asked if I can help get around the price I'm asking. Going into this commercial situation I hadn't known students were using my product. I have responded with an offer to create a student discount.

Another person has commented on the v1.11.0 no longer working and is asking when the next release will be available. There is a conversation thread specifically telling people about the change. Plus a handful of posts above their comment saying the same. I have politely responded.

I have learned knowing about your userbase is really important. And that communicating a major change (at short notice) is not easy.

Comment

August 16, 2021 Harvest system migration

Sunday August 15 Harvest had scheduled to migrate their systems which would trigger the breaking change.

People have not flocked to either the GitHub repository or the squarespace shopfront since August 15, the day Harvest implemented a breaking change.

Either people have discovered the bug and fixed it themselves, or their reports have not stopped working yet and they've not been motivated to look for an upgrade.

This would support the hypothesis from the documentation, where people are more likely to be using the library for reporting purposes rather than systems integration.

So, maybe there will be more action toward the end of the month.

Comment

August 12, 2021 Completed documentation

I completed documentation. It's taken a couple of weeks of extremely boring work but there has been a lot come from the journey.

While I was writing up the documentation I discovered a number of bugs. This is not surprising as, working largely alone, I have not had anyone to help with code reviews or challenge design or implementation decisions.

In comparing the bugs I found with the bugs people have reported over the life of the library I learned that people appear to have been using this library for reporting rather than systems integrations.

Lesson: knowing your solution and watching which things become a priority to fix can indicate how people are using your software.

Comment

August 9, 2021 My first visitor to the shop

Today I looked at the analytics of the squarespace shop I have for the Python-Harvest library and found I had my first "non-friend" visitor / someone I don't know.

I have supplied a hyperlink from the GitHub repository to my squarespace store. This person has used that link and found my store. No browsing to buy, but my site has been seen :D

They are from Norway.

I have learned that putting a trail of breadcrumbs is useful when you are moving from Free (as in beer) to commercial.

Comment

August 4, 2021 Made a code change and started a website

The breaking change proposed by Harvest was addressed.

In making the change I noticed that a number of changes in the past 12 - 18 months have been requested where there has been a specific date expected (by the requester) for the feature or change. There is yet to be a situation where someone asks for a change by a particular due-date who has offered to pay for the change.

Also I have noticed that contributions to the project have rarely been of a quality where they can be merged without being altered by me. I can accept this is sounding like I might have too-high standards but what's actually going on is that people who like to use my library are good enough to code a report or an integration but are not interested or good enough to add to the library. And that fits the target market. Analysts or domain experts (probably accountants) who can code enough to get a report together are not necessarily likely to be skilled enough for software development.

This has brought me to the decision that I am not operating in an open source community, I am operating in giving away work.

So. The challenge is to get my software library from GitHub and into a situation where I can charge for it.

I looked at making a private PyPi repository. This is far easier than it sounds. A PyPi repository is simply a directory accessible by HTTP. But to password protect it is a secondary concern. Again, easier than it sounds through HTTP Basic. But then I need more than one password. And that password needs to be created after someone has paid. Surprisingly, I cannot find a Commercial Off The Shelf (COTS) product for that. (maybe my next project..) So this got too difficult.

I asked family, friends and my ISP to try and find how other people do it. As far as I can tell there's no good answer for a Python library.

I ended up starting a squarespace website. I have three products available.

  • on purchase, the buyer gets a link to download a copy of a particular version of the library (cheapest)
  • subscribe for 12 months of updates to the library (however many there ends up being) (middle range price)
  • subscribe for 12 months to get contributor access to the repository, get a deploy key attributed to the repository (most expensive)

In starting the website I discovered I need to put a lot of effort into the product in terms of documentation, advertising change logs and todo lists. Documentation I had left up to the tests but when I move the repo to private, people will not necessarily continue to have access to the tests. And I never really cultured a change log or todo list. So I need to communicate these things more expressly.

Comment

August 2, 2021 Harvest contacted my via LinkedIn

The same evening I responded to the Harvest e-mail, a representative contacted my through LinkedIn to bring the breaking change to my attention.

I was able to respond and, again, let them know message was received.

Lesson: reply to e-mails on time.

Comment

August 2, 2021 I found the e-mail from Harvest

I was going through my e-mail for some unrelated things and found the e-mail from Harvest about their up coming breaking change.

I responded to the e-mail letting Harvest know I received their message and am happy to proactively fix the bug.

Lesson: Don't leave e-mails too long.

Comment

About

I had a need to write a two-way integration between Harvest and Xero. Harvest had moved their API from v1 to v2 and the existing library from another vendor only supported v1.