user agents metrics identify user groups

We love our developer community and I personally love learning about you. How you use SparkPost, what tools you favor, where you are and what you need. In a recent post, we took a brief peek into the software stacks you collectively use. This time, we’ll go a little deeper into a one of the key community data sources that we follow: the User-Agent HTTP request header.

For those familiar with it, the User-Agent header might not seem like a very rich source of information. I often find it easy to go a little non-linear while analysing large data sets so it’s instructive to stick to just a single bite-sized chunk of data at a time: in this case, your user agent strings.

What’s In User Agents?

When your app hits the SparkPost API, it can optionally include a User-Agent HTTP header in its request. User-Agent includes some details on your HTTP client, your software stack and occasionally even your host operating system. Web admins commonly use it to learn about what browsers people use on their site. However, it’s also very useful with a developer-centric email API service like SparkPost because it shows what client libraries you all use with which versions, and some other interesting tidbits too. With that out of the way, let’s dig into some data.

Client Library Usage By Version

We like to follow the usage patterns of our “Big 3” client libraries: PHP, Python and Node.js. You can see how they stack up in my last post on the topic. We find it useful to break down client library usage of each one by version so our library maintainers can see the spread of versions you all use.

We’ll look at PHP first because it forms the largest single group with 44% of transmission requests in the last week.

php sparkpost client library usage

Most requests come from php-sparkpost/1.x with only 13% coming from our 2.x series client which was released in June. The 2.0.0 release introduces a refactored client library with a new interface so it’s possible that mostly new PHP users will pick it up since 1.x still functions nicely and is presumably integrated with many customer stacks at this point. Still, those folks will also get a nicer experience. PHP was the first client library to bump to 2.0 – uptake is farthest along there.

Python is next on our leaderboard with 33% of transmission traffic. Python users are more spread across versions with about half using either last or last-but-one releases.

python sparkpost client library usage

Last but by no means least, we have node-sparkpost where version 2 was released just a few weeks ago.

node sparkpost client library usage

Node.js users seem to keep up quite well with client library releases. Even though node-sparkpost/2.x was released 2 weeks ago, we are already seeing traffic from it. Given that our Node.js client is 2 years old (happy birthday node-sparkpost!), the 2.x release was overdue so if you’re a Node coder, go check it out. With features like in-built promise support and a slew of cleanups and usability improvements, we predict some quick uptake here.

It’s Not Just The Software

Beyond identifying our own client libraries, there are other useful details in our trusty little User-Agent header. For example, we can identify subcommunities or at least users with common needs and once we do that, we can learn about their needs and how best to support them.

One such subcommunity we recently discovered is the Google App Engine user-base. After fielding questions from the occasional community member, we found that App Engine users live under quite specific constraints. For instance, python App Engine users need special attention due to the nature of the App Engine python environment. Also it’s interesting to see that App Engine adds its own details to its customers’ outbound HTTP requests. That means we can gauge popularity of the platform with our users. On the back of these discoveries, we’ll be paying close attention to our App Engine user-base from now on.

The Imperfection Of One-Dimensional Data

No data set is without its foibles and ours has some ‘unique’ features worth mentioning. We collect User-Agent information from calls to /api/v1/transmissions since we use it to send emails. Interestingly, a good half of requests to transmissions have no User-Agent header at all. That privacy is your right but it does reduce our sample size so we’re calling it out here.

Further, we’re comparing call volumes with a given User-Agent string. It’s tempting but not 100% correct to consider “call volume” as a proxy for popularity.

For instance, if we see 1 million calls marked with ‘User-Agent: captain-clown/1.0’, we might assume the captain-clown HTTP client to be quite popular when it might just be very inefficient. Maybe those 1 million calls could be condensed into 2 or 10. This case is exaggerated to show the issue. Call volume as popularity still has some value, especially across groups of User-Agents as we have done in this article.


I hope you’ve enjoyed our brief look into the SparkPost community. Our community is hugely diverse, using widely varied tools and technologies and with an exciting and ever changing spread of business models. We’re still discovering our community’s make-up and looking for ways to serve more people, better, quicker. We also strive to be as open and welcoming as possible. Want to learn more about our community, share your own experiences, or draw our attention to your own subcommunities? Come find us on Slack or fire us a tweet.


10 Steps Great Deliverability Blog Footer