Nnamdi Iregbulem is a tech nerd at heart. A self-taught programmer who started building computers as a teenager, his interests in mathematics, economics and statistics eventually took him from investment banking at JPMorgan to Stanford’s graduate school. Now, he’s a partner at Lightspeed Venture Partners.
When not investing in enterprise software like GitLab, Alteryx and SurveyMonkey, Iregbulem spends his time writing about his theories on data and investing. In one of those essays, Iregbulem outlined a new metric he created called weighted average contract value (WACV), which he argues provides more meaningful information about SaaS revenues than the traditional average contract value (ACV). In the SaaS industry, where it’s common for a small number of customers to account for the majority of a startup’s revenue, calculating an average doesn’t properly account for the influence of large customers. WACV can tell a startup where most of the revenue is coming from, which customers are most important and where the most risk is.
In a conversation with Protocol, Iregbulem discussed revenue concentration in SaaS and why today’s revenue metrics don’t give investors the full picture.
This interview has been edited and condensed for clarity.
I want to dive into a couple of the concepts that you explore. You’ve written about the fat-tailed nature of SaaS revenue. Why is revenue in SaaS so concentrated?
If I had to go to first principles, the reason why SaaS revenue is so concentrated is because the distribution of companies that you sell into as a software company is very concentrated in terms of there being a large number of smaller companies, a moderate number of moderate-scale companies and a very small number of very large companies.
You also did an analysis of the revenue concentration of a subset of public software companies. Did you find anything surprising?
What was the most surprising was the consistency of the concentration. I think people talk about concentration as if there are a couple of companies that have revenue concentration issues, and then the rest are fine. It just turned out that literally every company has pretty high customer concentration, not in the sense that there was one customer that was 10% of revenue, but in the sense that there was a subset of customers that were a pretty meaningful share, something like 20% being 70% of revenue. That was fairly consistent across a bunch of different companies, so it was kind of shocking.
You can work through the theory and why that happens, and you go to the data, and it turns out that’s actually the way it plays out. So I thought that was really interesting. And it’s why I sometimes think it’s just a natural result of success. The fact that you were able to go public as a software company almost implies that you must have pretty high concentration.
You wrote that if you’re paying too much attention to the average customer, that can actually lead you astray. Is it because, as you noted, you’re not getting that opportunity to have that higher revenue and growth?
Taking your own data too seriously can be problematic because there’s sort of this shadow of customers over here that you could be acquiring, and it could vastly change how your economics look, if only you were to do that.
People are shocked at how large software markets tend to be. If you look at Salesforce when they went public, in their S-1 they say, “We’re selling into this market and that market.” It seems so small in retrospect if you look at them today. They totally blew all those expectations out of the water in terms of the markets they have access to and the scale of those markets. And I think it’s in part because of this dynamic of surprising to the upside: You land a larger customer than you’ve ever landed before.
I think it’s actually a very different dynamic on the consumer. This is probably a future blog post I want to write one day, but I think consumer companies tend to surprise to the downside a little bit because they tend to acquire their best, most rabid customers early. And then to keep growing, you have to find that next marginal customer that is a lower lifetime value, less excited about the product and what have you. And so your economics tend to get worse over time in a lot of cases.
What’s interesting on the enterprise side is, if you think about Salesforce, that they continue to grow. And that’s what’s interesting. You would think that they’ve already penetrated this market because they’ve been around forever. How do they continue to grow? Is there some limit that all these big SaaS companies are going to hit at some point?
You’re just picking off all my future blog posts. It’s actually great, because I literally have a draft right now that talks about the Salesforce example that we were both just alluding to. It’s really interesting. Normally, the way that people think about markets is that big markets, in terms of number of users, tend to have very small per-user monetization, and then markets that have very high per-user monetization tend to be more niche in terms of the number of people that you can acquire. So there’s this natural tendency to think that there’s a negative correlation between the size of the average customer and the number of customers.
What Salesforce has done that’s really interesting, is that by landing in multiple different markets, you can actually grow both the number of customers you have and the per-customer monetization in all those separate markets. Going back to the fat-tailed stuff, as they expand in each of these markets, their per-user monetization actually gets better over time. And if you do that in enough different places, it’s like you have seeds planted in each individual market, and in each of those markets your unit costs are getting better, almost independently of one another.
You came up with this metric called weighted average contract value that tries to capture a lot of what we’re talking about, which is [that] just looking at the average doesn’t necessarily account for some of these larger customers. Why is the standard ACV metric not as useful in comparing different companies with different customers?
The reason that the standard average calculation for contract value has limited usefulness across different companies is because if the underlying concentration in these different companies is very different, then the average is just not comparable. It’s not telling you the same thing.
In the same way that, again to go back to statistics, taking the average of a normal distribution is telling you something different than when you take the average of a skewed distribution. So people are implicitly assuming when they say, “Oh, this company has an ACV of this and this company has an ACV of that,” that they have very similar revenue concentration. But if they don’t, then you’re actually making a real mistake. But that standard average is so easy to calculate, people default to it.
What kind of insights does looking at the weighted average give a startup that only looking at the average doesn’t?
The most interesting takeaway from it is that it tells you where the revenue in your business is most concentrated. In other words, it shows what kind of customer is most responsible for the majority of your revenue. That is very interesting because it tells you where the risk in the business is, it tells you where the growth in the business likely is, it tells you whose bread needs to be buttered, so to speak, and who you really need to be paying attention to.
The average really does not tell you that. It tells you what the typical customer looks like, but not what the typical dollar revenue looks like. And so I think it’s actually a really useful reframing as one is thinking about, “OK, here’s all our revenue, here’s where it is. Where should we be spending time? Where should we be allocating resources?” It’s actually totally fair to have a more customer-centric view, too. But if you’re only thinking about unit economics, or ROI, that’s where having this revenue-centric view becomes really valuable.
What are some advantages for investors? As an investor, if I could see their weighted average versus their average, how might that inform my understanding of the company?
It’s a very common mistake I find among investors where they’ll meet a company, the company will have X number of customers and the standard ACV will be fairly small because most of their users are either free users or in some kind of lowest-tier version of the product. But they do have a couple of meaningful customers that are spending real revenue or paying the highest tier of a product or what have you. But because there’s so many total customers, their average number ends up being kind of small. And if you as an investor don’t dig into that a little bit more, you can be fooled into thinking, “Oh, these guys aren’t selling to enterprise-style customers, they’re only focused on small, lower-quality revenue.” When it turns out actually, most of the revenue is coming from pretty high-quality customers. Unless you double-click and go a layer deeper, you’ll miss that. So I think investors should be really focused on this as a metric, and should be calculating it if they have the data.
window.REBELMOUSE_ACTIVE_TASKS_QUEUE.push(function(){
window.REBELMOUSE_STDLIB.loadExternalScript("https://securepubads.g.doubleclick.net/tag/js/gpt.js", function() {
});
});
window.REBELMOUSE_ACTIVE_TASKS_QUEUE.push(function(){
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l="+l:"';j.async=true;j.src="https://www.googletagmanager.com/gtm.js?id="+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-TBZ76RQ');
var gotag = document.createElement('iframe'); gotag.src = "https://www.googletagmanager.com/ns.html?id=GTM-TBZ76RQ"; gotag.style.height = 0; gotag.style.width = 0; gotag.style.display = 'none';
document.body.appendChild(gotag); console.log('gtag appended')
});
window.REBELMOUSE_ACTIVE_TASKS_QUEUE.push(function(){
console.log("script runs"); const subscribeForm = document.getElementById("mc-embedded-subscribe-form");
subscribeForm && subscribeForm.addEventListener("submit", (event) => { const errorTarget = document.getElementsByClassName('mce_inline_error'); const responseTarget = document.getElementsByClassName('response');
if (errorTarget.length > 0) {
console.log("errors test");
for (let i = 0; i < errorTarget.length; i++) {
if(!errorTarget[i].classList.contains('newsletter-element__input')) {
setTimeout(() => {
errorTarget[i].style.display = 'none';
}, 4000);
}
}
}
if (responseTarget) {
setTimeout(() => {
for (let i = 0; i < responseTarget.length; i++) {
responseTarget[i].style.display = 'none';
}
}, 4000);
}
}, false);
});
window.REBELMOUSE_ACTIVE_TASKS_QUEUE.push(function(){
function mc_resp_0(a){a.style.display='none';a.removeAttribute("class");a.innerHTML='';}
document.querySelectorAll("form#MC").forEach(function(form){form.addEventListener("submit",function(e){e.preventDefault();if(document.querySelector('#MC_robot').value !==''){return false}var script = document.createElement('script');let email=form.querySelector('input#MC_email');script.src=this.action.replace('/post?','/post-json?')+'&EMAIL='+email.value;document.body.appendChild(script);var callback = 'callback';window[callback] = function(data) {delete window[callback];document.body.removeChild(script);
var parts = data.msg.split(' - ', 2);if (parts[1] === undefined) {msg = data.msg;} else {var i = parseInt(parts[0], 10);if (i.toString() === parts[0]) {index = parts[0];msg = parts[1];} else {index = -1;msg = data.msg;}}let resp=form.querySelector('#MC_resp');mc_resp_0(resp);resp.innerHTML=msg;if(data.result=='error'){resp.classList.add('bad');}else{resp.classList.add('good');email.value="";}
resp.style.display='inline-block';setTimeout(function(){mc_resp_0(resp)},3000);
console.log(data);}
})});
});
window.REBELMOUSE_ACTIVE_TASKS_QUEUE.push(function(){
(function(d,s){var DID="b0bf7582-16c5-4fc1-a03f-8f705ea43617";var js,fjs=d.getElementsByTagName(s)[0];js=d.createElement(s);js.async=1;js.src="https://track.cbdatatracker.com/Home?v=3&id='"+DID+"'";fjs.parentNode.insertBefore(js,fjs);}(document,'script'))
});
window.REBELMOUSE_ACTIVE_TASKS_QUEUE.push(function(){
!function(e,t,r,n){if(!e[n]){for(var a=e[n]=[],i=["survey","reset","config","init","set","get","event","identify","track","page","screen","group","alias"],s=0;s
var lastScrollTop = 0;
document.querySelector('.email-wrapper').parentNode.classList.add('sidebar-sticky');
window.addEventListener('scroll',function(){ var st = window.pageYOffset || document.documentElement.scrollTop; if(isInViewport(latestStories, false) && st > lastScrollTop){ console.log('I see it!'); document.querySelector('.email-wrapper').parentNode.classList.add('sidebar-unfixed');
} else if(isInViewport(latestStories, false) && st < lastScrollTop){ document.querySelector('.email-wrapper').parentNode.classList.remove('sidebar-unfixed'); } lastScrollTop = st <= 0 ? 0 : st; }); }); window.REBELMOUSE_ACTIVE_TASKS_QUEUE.push(function(){ window.REBELMOUSE_STDLIB.loadExternalScript("https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js", function() { }); }); window.REBELMOUSE_ACTIVE_TASKS_QUEUE.push(function(){ if(document.querySelector(".around-the-web")){document.querySelector(".around-the-web").setAttribute("data-section","related-stories");} }); window.REBELMOUSE_ACTIVE_TASKS_QUEUE.push(function(){ remove_col_with_empty_post(); }); window.REBELMOUSE_ACTIVE_TASKS_QUEUE.push(function(){ var threshold=600; REBELMOUSE_STDLIB.onElementInViewport({ selector: ".ad-place-holder:not(.processed)", isMatchingNode(node) { return node.classList.contains('ad-place-holder'); },threshold, onIntersect(entry) { let ad_diiv=entry.target; console.log("iin view ad div onElementInViewport"); if (ad_diiv.dataset.googleQueryId){ console.log("it has ad unit already") googletag .pubads() .getSlots() .forEach(function(slot) { if(ad_diiv.id == slot.getSlotElementId()){ googletag.pubads().refresh([slot]); } }); } else { googletag.cmd.push(function() { incontentMapping= googletag.sizeMapping(). addSize([768, 0], [[728, 90],[300, 250],[468, 60]]). addSize([0, 0], [[320, 50],[300, 250]]). build(); ad_id_count++; let ad_id="site-ad-"+ad_id_count; ad_diiv.classList.add("processed") ad_diiv.setAttribute("id",ad_id); googletag.defineSlot(`/21901267728/${ad_modifier}`, [[468, 60], [728, 90], [300, 250]], ad_id).defineSizeMapping(incontentMapping).addService(googletag.pubads()); googletag.display(ad_id); }); } } }); }); window.REBELMOUSE_ACTIVE_TASKS_QUEUE.push(function(){ var threshold=600; REBELMOUSE_STDLIB.onElementInViewport({ selector: ".ad-place-holder-bottom:not(.processed)", isMatchingNode(node) { return node.classList.contains('ad-place-holder-bottom'); },threshold, onIntersect(entry) { let ad_diiv=entry.target; console.log("iin view ad div onElementInViewport"); if (ad_diiv.dataset.googleQueryId){ console.log("it has ad unit already") googletag .pubads() .getSlots() .forEach(function(slot) { if(ad_diiv.id == slot.getSlotElementId()){ googletag.pubads().refresh([slot]); } }); } else { googletag.cmd.push(function() { ad_id_count++; let ad_id="site-ad-"+ad_id_count; ad_diiv.setAttribute("id", ad_id); ad_diiv.classList.add("proc"); googletag.defineSlot(`/21901267728/${ad_modifier}`, [ [468, 60], [728, 90], [300, 600], /* [970, 250],*/ [300, 250] ], ad_id).defineSizeMapping(streamMapping).addService(googletag.pubads()); googletag.display(ad_id); }); } } }); }); window.REBELMOUSE_ACTIVE_TASKS_QUEUE.push(function(){ var threshold=600; REBELMOUSE_STDLIB.onElementInViewport({ selector: ".ad-place-holder-post-module:not(.processed)", isMatchingNode(node) { return node.classList.contains('ad-place-holder-post-module'); },threshold, onIntersect(entry) { let ad_diiv=entry.target; console.log("iin view ad div onElementInViewport"); if (ad_diiv.dataset.googleQueryId){ console.log("it has ad unit already") googletag .pubads() .getSlots() .forEach(function(slot) { if(ad_diiv.id == slot.getSlotElementId()){ googletag.pubads().refresh([slot]); } }); } else { googletag.cmd.push(function() { ad_id_count++; let ad_id = "site-ad-" + ad_id_count; let ad_diiv = document.querySelector(".ad-place-holder-post-module:not(.proc)"); ad_diiv.setAttribute("id", ad_id); ad_diiv.classList.add("proc"); googletag.defineSlot(`/21901267728/${ad_modifier}`, [300, 250], ad_id).addService(googletag.pubads()); googletag.display(ad_id); }); } } }); }); window.REBELMOUSE_ACTIVE_TASKS_QUEUE.push(function(){ var stickySahreContainer = document.querySelector(".post-partial .widget__body ~ .widget__body"); if(document.querySelector(".default-layout-post")) return; if(stickySahreContainer){ //var offsetElement=stickySahreContainer.querySelector(".body"); var offsetElement=document.querySelector(".body"); var stickyShareElement=document.querySelector(".post-partial .widget__shares"); var stickySharerHeight= stickyShareElement.clientHeight; var leftoffsetValue = stickySahreContainer; var topValueToCheck= 138;//topbar and share position from top var bottomValuetoCheck= 296; var innerWidth=window.innerWidth; var leftShareOffsetValue=innerWidth > 900 ? (( offsetElement.getBoundingClientRect().left-80 )): 20; var setSharePosition = Ithrottle(function() { //console.log("top:"+ stickySahreContainer.getBoundingClientRect().top+"---- bottom:"+ stickySahreContainer.getBoundingClientRect().bottom ) if(offsetElement.getBoundingClientRect().top < topValueToCheck && stickySahreContainer.getBoundingClientRect().bottom > bottomValuetoCheck) { stickyShareElement.style.position="fixed"; stickyShareElement.style.top= topValueToCheck+"px"; stickyShareElement.style.left= leftShareOffsetValue +"px";
} else if(offsetElement.getBoundingClientRect().top < topValueToCheck && stickySahreContainer.getBoundingClientRect().bottom < bottomValuetoCheck) { stickyShareElement.style.position="absolute"; stickyShareElement.style.top= "auto"; stickyShareElement.style.bottom= "0"; stickyShareElement.style.left= ""; } else { stickyShareElement.removeAttribute("style") } }, 100); if(window.innerWidth > 768){ window.addEventListener("scroll", setSharePosition); window.addEventListener("resize" ,function(){ leftShareOffsetValue =window.innerWidth > 900 ? (( offsetElement.getBoundingClientRect().left-80 )): 20; }) } }
});
Credit: Source link