A few months ago, we shared an inspiring story from Mark Hansen, the co-founder of Upsolve and one of the first members of Segment’s Startup Program. In this post, Mark explains how Upsolve leverages Segment and SEO to drive thousands of high intent buyers to their product every month.
When you’re a cash-strapped nonprofit competing for attention against multi-billion dollar public companies, you have to focus on your mechanism for growth, and then become world-class at it.
The main mantra at Y Combinator has always been: “Make something people want.” But we also heard another mantra:
“Just because you built it, doesn’t mean they’ll come.”
We needed a cost-effective, scalable way to bring people to our service.
SEO could deliver that, but there was a problem: we couldn’t compete in traditional ways. We didn’t have the resources to hire dozens of writers, so we had to think of creative ways to supercharge our content creation.
There were two ways we could tackle SEO:
Editorial SEO. High quality, editorial, long-form landing pages, focused on topics related to our audience. Hubspot is the canonical example here.
Programmatic SEO. High volume landing pages produced at scale, often created automatically or user-generated, that rank for transactional intent. Pinterest and Zillow are the canonical examples here.
We started with the editorial approach and created long-form landing pages that spoke to the most common questions people had when considering filing for bankruptcy.
A guide on rebuilding credit after bankruptcy, an example of our editorial landing pages
But after a few weeks in YC, we complemented those with programmatic, locality-specific landing pages. We couldn’t compete on broad, highly trafficked keywords like “filing bankruptcy online” so long-tail keywords with less competition provided us with a great way to make our mark on search engines.
The first iteration of these was a New York bankruptcy guide, after which we rolled out similar pages for other states and smaller localities (a bankruptcy guide for Brooklyn, for example).
A bankruptcy guide for Brooklyn, an example of our programmatic landing pages
We saw some early promise with these approaches, but we were still in the dark as to which landing pages were performing better.
Which pages were bringing in committed users that finished the signup process? And which pages were bringing in people who were kicking the tires? We needed the answers to prioritize what content we should create going forward.
Uncovering the data that would help us answer this question was surprisingly hard to come by.
In the best-case scenario, the people I talked to would use content groups in Google Analytics. In the worst-case scenario, people had no idea how their content was performing. I couldn’t understand why people weren’t capturing meta-information about how people were interacting with their site, and then using that to help guide content creation. It seemed essential.
Eventually, I couldn’t wait to find the answer and had to try something that was stuck in the back of my head for some time.
A few weeks earlier we had spoken with Gustaf Alströmer, a partner at Y Combinator. During one of our office hours, he discussed his time leading Growth at Airbnb. To measure the impact of their work, his team had tracked the first interaction someone had with the Airbnb site and the last interaction before they hit the signup flow.
Multi-touch attribution for a hypothetical user journey at Airbnb. Credit: Airbnb
I didn’t ask him to go deeper, but this first/last interaction concept painted a wonderful picture in my head. It sounded like the perfect way to measure the effectiveness of our various landing pages.
At this point, we already had event tracking up and running throughout our product and were using Segment to handle Google Analytics (and, at times, FullStory) on our website. As a solo developer, I always make sure we don’t add additional tools for the sake of it and tie ourselves up in complexity.
So why not look at what we could do with the tools we already had?
As I was looking through Segment's identity docs, I stumbled into something interesting – a way to save data to users pre-signup via traits. Between page calls and tracking calls, a user’s actions were already stitched together in Segment behind the scenes. Adding a few user traits to those calls would be huge.
With traits saved to anonymous users, all that was needed was a GET request to the Segment’s Personas API. That meant we could pull their anonymous traits and store them with our new database of user records. Storing this information on a JSONB column made it easy to run analysis through Chartio and Postico and understand how our content was performing.
We started with the following set of traits. These were saved on each page redirection or transition a user made on upsolve.org:
This gave me two charts and two crucial insights.
Turning application code into programmatic content
Of the content we’d produced, only ~10% of our conversions were coming from our editorial articles while ~70% were coming from state and city page templates (created programmatically).
A breakdown of which landing page types were converting best in Personas
The data was even more surprising given the effort we were investing in each. We had four people working on editorial articles around the clock. Meanwhile, the city and state page templates were written once and dynamically generated with additional content from other data sources and our petition generating application code.
Based on the data we saw in Personas, we all quickly saw where our growth was coming from and devoted the time previously set aside for editorial toward improving the quality of our programmatic content. It’s been so successful, we’ve now created over 95,000 landing pages!
The time when my laptop kept running out of memory building our website
This mirrored recommendations we were getting from our SEO agency, who showed us that some of our programmatic content was marked as duplicate. When content is seen as duplicate, the algorithm struggles to understand which pages are best to serve, preventing these pages from ranking well.
This helped us understand that the key to success was a hybrid approach to SEO – programmatic content that was highly scalable, but with enough editorial value to avoid duplication.
Making the most of transactional intent
Segment also helped us understand what actions our visitors were taking on our landing pages. This may come as no surprise to others building landing pages, but we were surprised that the vast majority of our website visitors were not consuming multiple pieces of content during their visit.
A breakdown of how many pages were visited before conversion
Since our programmatic city pages had more clearly defined intent, visitors were converting from the first page they landed on. For example, if someone arrives at Upsolve having searched “Iowa Bankruptcy Forms” they are much more ready to convert than if they searched “What happens to secured debt in bankruptcy?
The data told us we needed to treat every page of our site like our home page, which drove a series of design changes on our landing pages.
We now have a large, bold call to action at the top of every page so visitors can covert right away.
Being exceptional at organic growth is the only way our team of 6 can compete with publicly traded companies willing to spend an incredible amount of money on paid ads. SEO continues to be our primary mechanism for growth today and is something we’ve continued to improve on.
Months ago, we were only getting the hang of Google Search Console. Now with the help of Segment’s infrastructure and deeper features, we’re able to easily grasp the impact and revenue each of the articles is bringing in. There’s no way we could have grown our bottom line impact or revenue to support the organization without it.
Shout out to the Segment team for supporting us in our experimentation with Personas, the GatsbyJS community for helping me get a 95,000-page build working, and everyone on the Upsolve team for coming together to make this growth possible – Andrea, Nicole, Rohan, and Tina.