ACV vs ARR: The ACV Metric Explained With SQL

· 9 MIN

TL;DR: The ACV metric (annual contract value) is the recurring value of one customer contract divided by its length in years, with one-time fees left out. ARR (annual recurring revenue) is the whole company's recurring revenue right now, annualized. Use ACV to size and compare deals; use ARR to measure the size and growth of the business.

The ACV metric answers "how much is a typical contract worth per year?" Take the contract's total value, remove one-time items such as onboarding or setup fees, and divide by the term in years: a 4-year, $40,000 subscription has an ACV of $10,000 (Wall Street Prep). ARR answers a different question: "how much recurring revenue does the company run at today?" It is usually MRR x 12, summed across every active customer (Wall Street Prep, ARR). The two match for a simple one-year contract and drift apart for ramped multi-year deals, monthly plans and contracts with fees. Below, the same four contracts are computed both ways, followed by the SQL to calculate each from a contracts table.

ACV is a per-contract number, ARR is a company-wide number at a point in time
FIG 01 — ACV sizes a deal; ARR sizes the business.

ACV vs ARR at a glance

CriterionACV (annual contract value)ARR (annual recurring revenue)
What it measuresAverage yearly value of one contractCompany-wide recurring revenue, annualized
UnitPer contract (or average across new contracts)One total for the business
FormulaRecurring contract value / term in yearsMRR x 12, or sum of active annualized subscriptions
One-time feesExcludedExcluded
Ramped multi-year dealsAveraged across all yearsOnly the year currently in effect
Month-to-month plansOften excluded (no contract term)Included
Time viewFixed at signingChanges every day with churn and expansion
Main usersSales, sales ops, pricingFounders, finance, investors
AnswersIs our deal size growing? Which segment is worth chasing?How big is the business and how fast is it growing?

Neither metric is defined by GAAP. Recognized revenue under ASC 606 (FASB) is a separate accounting number, so ACV and ARR are operating metrics each company has to define and apply consistently.

What is the ACV metric? Definition and formula

ACV is the annualized recurring value of a single customer contract. The formula is:

ACV = (Total contract value - one-time fees) / contract term in years

Wall Street Prep calls the numerator "normalized TCV": total contract value with one-time fees removed. Total contract value (TCV) itself is the full commitment, recurring plus one-time, so TCV = (MRR x term in months) + one-time fees (Wall Street Prep, TCV).

Teams report ACV two ways:

Ben Murray (The SaaS CFO) points out that ACV is also expanded as "average contract value", and that companies define it differently. Write your definition down: which contracts, which fees, new business only or renewals too.

VIDEO · TCV vs ACV vs ARR | SaaS Metrics School | The SaaS CFO (The SaaS CFO)

How is ACV different from ARR?

ACV describes a contract; ARR describes the company. ACV is frozen at signing and averages a contract over its whole term. ARR is a snapshot of what is billing right now, so it moves every time a customer upgrades, downgrades, churns or comes back. Wall Street Prep lists six ARR movements: new, expansion, renewal, churned, contraction and reactivation ARR. ACV has none of those; a new contract gets a new ACV.

The cleanest way to see the gap is one set of contracts computed both ways.

One contract set, computed both ways

Four customers, all active today, which is in year one of every contract:

CustomerContractRecurring valueOne-time feesTCVACVARR today
Acme1 year, $12,000/yr$12,000$3,000 onboarding$15,000$12,000$12,000
Birch3 years, $30,000/yr$90,000$6,000 setup$96,000$30,000$30,000
CedarMonthly plan, $500/mon/anonen/aexcluded$6,000
Delta3 years ramped: $20k, $30k, $40k$90,000none$90,000$30,000$20,000
The same four contracts produce an average ACV of 24,000 and a total ARR of 68,000
FIG 02 — Delta's ramp makes its ACV 10,000 higher than its current ARR.

What the table shows:

Do one-time fees count in ACV?

No. Onboarding, setup, implementation, training and other professional services are excluded from ACV, because ACV is meant to describe recurring value. Wall Street Prep defines ACV as "excluding any one-time fees", and the same exclusion applies to ARR. One-time fees belong in TCV and in recognized revenue. If you sell a lot of services, track them as a separate services bookings number so they don't inflate deal size.

Multi-year contracts: how ramps and partial years change ACV

To calculate ACV for a multi-year contract, divide its recurring value by the number of years. A 3-year contract worth $90,000 in subscription fees has an ACV of $30,000, whether it is billed flat ($30k each year) or ramped ($20k, $30k, $40k). Two variations to decide on and document:

Postgres queries for both metrics

The queries below assume PostgreSQL and two tables. Each contract line is either recurring (one row per billing period) or one-time.

-- contracts: one row per signed contract
CREATE TABLE contracts (
  id           serial PRIMARY KEY,
  customer     text NOT NULL,
  signed_at    date NOT NULL,
  term_months  int  NOT NULL          -- 1 for month-to-month plans
);

-- contract_lines: what the customer pays and when
CREATE TABLE contract_lines (
  contract_id   int REFERENCES contracts(id),
  kind          text CHECK (kind IN ('recurring', 'one_time')),
  amount        numeric(12,2) NOT NULL,
  period_start  date,
  period_end    date                   -- exclusive
);

ACV per contract and average ACV. The FILTER (WHERE l.kind = 'recurring') clause drops one-time lines, term_months >= 12 drops month-to-month plans, and dividing by term_months / 12.0 turns the term into years:

WITH per_contract AS (
  SELECT c.id,
         c.customer,
         c.signed_at,
         SUM(l.amount)                                        AS tcv,
         SUM(l.amount) FILTER (WHERE l.kind = 'recurring')
           / (c.term_months / 12.0)                           AS acv
  FROM contracts c
  JOIN contract_lines l ON l.contract_id = c.id
  WHERE c.term_months >= 12
  GROUP BY c.id, c.customer, c.signed_at, c.term_months
)
SELECT customer, tcv, ROUND(acv, 2) AS acv
FROM per_contract
ORDER BY acv DESC;

-- average ACV of new contracts signed per quarter
SELECT date_trunc('quarter', signed_at) AS quarter,
       ROUND(AVG(acv), 2)              AS avg_acv,
       COUNT(*)                        AS contracts
FROM per_contract
GROUP BY 1
ORDER BY 1;

Note the second query reuses the per_contract CTE, so run it in the same statement (replace the first SELECT with it).

ARR today (every recurring line whose period covers today, annualized by its own length):

SELECT ROUND(SUM(
         l.amount * 12.0 /
         ((EXTRACT(YEAR  FROM age(l.period_end, l.period_start)) * 12)
         + EXTRACT(MONTH FROM age(l.period_end, l.period_start)))
       ), 2) AS arr
FROM contract_lines l
WHERE l.kind = 'recurring'
  AND l.period_start <= CURRENT_DATE
  AND l.period_end   >  CURRENT_DATE;

Here age(period_end, period_start) returns the period length as an interval, so a monthly line is multiplied by 12 and a yearly line by 1. On the example set, Cedar's current month line ($500 over 1 month) adds $6,000, and Delta's year-one line ($20,000 over 12 months) adds $20,000, giving $68,000. If you keep subscriptions in a billing tool such as Stripe instead, the same logic applies to its subscription items: annualize each active item's price by its billing interval. Our ARR guide and MRR guide cover those edge cases, and the ARR waterfall walkthrough shows how to split ARR changes into new, expansion and churn.

Choose ACV if / choose ARR if

Use ACV when you need to:

Use ARR when you need to:

Most B2B SaaS teams track both: ARR as the headline, average ACV of new business as a sales health metric. The full set of related numbers is in our SaaS metrics glossary.

Keeping ACV and ARR consistent across teams

The failure mode is not the formula, it is two teams running different versions of it. Sales pulls ACV from the CRM with fees included; finance computes ARR from billing; the board deck mixes them. Put both definitions in one place, run them against the same tables, and show the query next to the number. AI for Database connects to Postgres, MySQL, Stripe-synced tables and other sources, answers questions like "average ACV of new contracts by quarter" in plain English with the SQL shown, and keeps the result on a self-refreshing dashboard. Try AI for Database free at aifordatabase.com.

Frequently Asked Questions

What does ACV stand for?

In SaaS, ACV stands for annual contract value, also written as average contract value when it refers to the mean across contracts. In retail and consumer goods, ACV means All Commodity Volume, a distribution metric that has nothing to do with contracts.

Is ACV the same as ARR for annual contracts?

For a single one-year contract with no one-time fees, the contract's ACV equals its contribution to ARR. They diverge as soon as there are fees, ramped multi-year pricing, monthly customers or mid-term changes.

Is ACV the same as TCV?

No. TCV is the total value of the contract over its whole term, including one-time fees. ACV is the recurring part divided by the number of years. A 4-year, $40,000 contract has a TCV of $40,000 and an ACV of $10,000.

Should renewals count in average ACV?

Decide and document it. Most teams report average ACV for new business only, because renewals mix pricing history into the number. Track renewal and expansion value separately, as ARR movements.

What is a good ACV?

There is no universal benchmark; ACV depends on the segment you sell to. What matters is the trend and whether your sales motion fits it: low ACV deals need self-serve or high-volume sales, high ACV deals can carry a longer sales cycle and a field team.

Ready to try AI for Database?

Query your database in plain English. No SQL required. Start free today.