Retrospective: March 2024
Summary
We’re getting better at outbound sales.
Company Growth Recap
Our team has a strong technical background, and founding a company has been full of learnings. There are a lot of skills that we’ve had to pick up. The one that has pushed us out of our comfort zone the most is sales. To be honest, we were kind of hoping that if we just built a good product and wrote some blog posts, we’d have pretty good uptake of the product. Of course, we knew we’d have to do more, but we were hoping we could get pretty far with that. However, the reality is until you have a lot of recognition, you need to pound the pavement to get users.
We have been working on lead generation and reaching out. The results have been better than what we expected. Never having done sales before, we weren’t sure what the response would be, and the reality is a lot more people are happy to have a conversation and learn about the product than we predicted.
Another funny outcome is that since we started directly reaching out to people, we have had a lot more installations, but not always from the people we reach out to. It feels like if you just start working on sales, things happen that you didn’t expect.
Since we founded the company, we have been experimenting with pricing. We’ve probably changed our pricing a half dozen times since we launched.
We’ve always felt that consumption-based pricing is not right for us because we lean on GitHub Actions for our compute layer and customers already have to pay for that based on consumption. Terrateam receives webhooks, does some logic, and decides to run a compute job. Because of this, we’ve mostly been offering a fixed-price plan.
At the same time, we feel very strongly about providing our users with great support. We spend a lot of time helping customers in their onboarding during their trial period, which requires no commitment to purchase the product afterward. We get a lot of positive feedback on the quality and speed of our support and believe it is a big factor in choosing us. But we also understand that support is actually the most expensive service we provide. There are only so many hours in a week.
We decided to change our pricing model such that the fixed-price Cloud product, as of this writing, is $299/mo (unlimited users, unlimited runs, unlimited concurrency) and comes with limited, best-effort support. It is meant to be a self-service product. We then created an Enterprise plan which is focused on custom contracts around support and bespoke features, and Terraform professional services. We have some contracts we’re onboarding with the new plan already. We feel this plan aligns with customers’ needs.
Features Recap
As always, we’re shipping features!
- GitHub Enterprise support
Terrateam can now be run entirely self-hosted.
- Define workflows based on source and destination branches
Some customers have workflows such that they want to perform a different workflow based on the branches of their pull request. Now in your Terrateam configuration, you can specify regex to match on the destination or source branch name for translating it into a tag, then that tag can be used in any tag query. This is useful for enforcing processes.
For example, Terrateam can be configured such that changes have to go through a flow of feature to development to staging to production branches. When merging a pull request to the dev
branch, then the plan and apply process will go through the development environment, which can then be merged into the main
branch which will then go to the production environment. An example of the configuration can be found here.
- Symlink support has been added to the indexer
Terrateam will treat any symlink as if it is the actual file and make decisions on what directories to execute using it. This has been requested by some customers so that they can have their common resources in a central location but organize each directory as if all that code directly exists inside of that directory. The indexer has been really useful in reducing the amount of manual configuration in the Terrateam config.
- Better detection of stale operations
One issue with GitHub Actions is that when you initiate a GHA, you do not get the run id for that action, so there is no way to know if it successfully started or not. The way Terrateam works is we initiate a GHA and then the first thing it does is phone home to tell us about the run, and from there we can track it. But, infrequently, for various reasons, a run can fail before it can phone home.
When this happens, from a user perspective, it just looks like Terrateam is stuck and not working. We created a check that looks at how long a previous run has been going and informs the user that there are possibly stale operations and what steps to take to continue. We have talked to GitHub, this is a known limitation that they plan on addressing so we’re looking forward to that.
- New status check
We now create a status check that represents when all changes have been applied. The status check is called terrateam apply
and it will stay in pending and then switch to completed. This is really useful for branch protection rules where a status check must pass before a merge.
Next Steps
We are continuing to reach out to potential customers as well as developing more content for SEO purposes. We have a great guest post by Mike Vanbuskirk comparing LLMs generating Terraform code here. We have another blog post, a comprehensive guide to Terraform variables here.
The product is also growing features regularly. It is allowing more sophisticated workflows to be expressed, reducing the need for tools such as Terragrunt and Terramate. It’s not entirely there yet, but each new customer need brings in new functionality.
What is Terrateam
Terrateam is a European software company building Infrastructure as Code tooling. Our product is a Terraform and OpenTofu CI/CD GitOps platform for GitHub. Our goal is to build a sustainable medium-sized company. We like to say that we have “partners, not customers”, because we work so closely with our customers, even developing bespoke functionality to support them.