River
Y CombinatorBacked by Y Combinator

Sales & PartnershipsFree

Account Upsell Opportunity Analysis Brief

Usage read at team level rather than account level, with the queue of people waiting turned into weeks and into their own costs.

Start here

River returns a document and a sheet. The document is the expansion case: which team is constrained, since when, what the constraint is costing them in their own numbers, and what to ask for. The sheet ranks every account by expansion readiness with the specific trigger named on each row, so a rep can work the list without reading twelve documents first. Seats nobody has logged into are netted off before any figure is proposed.

The unit of analysis is the team rather than the account. An account at 72 percent utilization looks unremarkable and can still hold one team that has sat at its ceiling for six months. The roll-up is an average across budget holders, and an average hides the single budget holder with a problem. Every rate here is computed per team and per cost centre, with the account figure printed beside it so the distance between the two is visible.

Written for the account manager preparing a quarterly review, the customer success lead building an expansion list, and the founder wondering why net revenue retention is flat while usage looks healthy. Run it well before the renewal window rather than inside it, since a constraint six months old is a case and the same constraint found at renewal is a negotiation. The risk side of the same account is the renewal risk brief, and the meeting this lands in is the QBR pack.

Why seat utilization is the wrong trigger

Utilization tells you a resource is full and stops there. A team at 100 percent with two people waiting and a team at 100 percent with twenty-three are the same number on the dashboard. Queueing theory closes that gap with one identity, L equals lambda times W, published by John Little in 1961. Divide the people waiting by the rate access is actually granted and you have how long the next person waits. A percentage cannot be checked against anything. A wait in days can.

The other half of the question is what they already own. Federal software policy separates three quantities that vendors habitually collapse into one, requiring an inventory of all licenses purchased, deployed, and in use. A seat assigned to somebody who has not signed in since spring is purchased and deployed and not in use. Ask for thirty-four while seventeen sit dormant and their own IT will find them, usually mid-procurement. Raising them yourself first is a different conversation entirely.

Caldermere Logistics, sixty seats, 71.7 percent of them in use, renewal seven months away. Nothing triggers. Field service has been at fourteen of fourteen for 192 days, twenty-three people are waiting, and seats are granted at 1.49 a week, so the next person to ask waits 108 days. Requests have fallen from 7.2 a week to 3.1, which reads as cooling demand and is people learning not to ask. Real unmet demand is 107, not the visible 23.

How it works

  1. Cut by team

    Utilization per team and cost centre, with the account roll-up printed next to each one.

  2. Date the ceiling

    Find the day the constraint started binding, since how old it is carries most of the argument.

  3. Measure the queue

    People waiting divided by the rate access is actually granted, which gives the wait in days.

  4. Net off the dormant

    Subtract seats nobody has used in the window, separating reclaimable ones from politically untouchable ones.

What you get

  • Utilization computed per team and per cost centre, with the account roll-up printed beside it
  • The queue converted into how long the next person actually waits for access
  • A falling request rate under a binding ceiling flagged as suppression rather than as cooling
  • Dormant seats netted off before any number is proposed, split by whether they are reclaimable
  • The cost of the workaround priced in the customer's own figures, every input attributed
  • Accounts ranked by expansion readiness with the specific trigger named on every row

Common questions

We already trigger on 80 percent seat utilization.

Then the worked account never reaches your list. It sits at 71.7 percent while two of its six teams are at 100 and have been for six months. The threshold is not too high or too low, it is being applied to a number that averages across budget holders who do not share a budget. Trigger thresholds get tested the same way in the churn post mortem.

Requests are falling. Is that not the opposite of demand?

Only if access was available. Under a ceiling that has not moved in 192 days, a request rate dropping from 7.2 a week to 3.1 is people learning the answer. The brief has to argue that rather than assert it, so it looks for corroboration such as open roles on the customer's own careers page.

Why net off dormant seats? That is revenue we already have.

It is revenue you keep either way, and naming it first is what protects it. Seventeen unused licenses on a sixty-seat account will be found during procurement review, and being the party who raised them beforehand is a different conversation from being the party who hoped nobody looked.

We have no access-request data. Can this still run?

Yes, with a weaker queue estimate. Shared logins, exports into spreadsheets, and support tickets mentioning access all stand in for a formal queue. The brief says which evidence it used and how confident that makes the wait figure, rather than presenting a soft estimate as a hard one.

Should we not just raise this at the renewal?

A constraint six months old is a case, and the same constraint raised at renewal is a negotiating chip the customer will read as one. Bringing it early separates the expansion from the renewal price, which is the whole reason it works. The renewal itself is the risk brief, and once they open with a number it is the renewal negotiation pack.

Whose numbers go into the cost of the workaround?

Theirs, every one, with the person who gave it named beside it. Ticket volume from their operations manager, rekeying minutes from a coordinator, the loaded hourly rate from their finance team. A vendor benchmark in that column is what gets the whole case dismissed. Modelling it out is the business case.

What if the blocked team has no budget of its own?

Then the case has to be written for whoever does, and the brief says who that is rather than leaving it to the rep. A constrained team without budget is an internal argument you are supplying ammunition for, which changes the document rather than cancelling it. The map is the champion map.

Account Upsell Opportunity Analysis Brief

Fill in the form and your workspace opens with the work already underway.