> ## Documentation Index
> Fetch the complete documentation index at: https://docs.linegap.app/llms.txt
> Use this file to discover all available pages before exploring further.

# CLV Tracking

> Closing line value calculated for every settled bet using de-vigged probabilities, plus aggregate trends by sportsbook, prop type, and league.

**Closing Line Value (CLV)** is the percentage by which the line you bet at differed from the line at game time. Sustained positive CLV is the strongest predictor of long-term betting success — sharper than ROI in any short-term sample.

If you bet the over at -110 and the same prop closed at -130, you got a better number than the market settled at — that's positive CLV.

## How Line Gap calculates it

For each settled bet:

1. We look up the **closing line** for the same prop on the same book (captured by our closing-line cron, which runs every 10 minutes during the tipoff window).
2. Convert both the bet odds and the closing odds to **de-vigged probabilities** (so we're comparing fair-value to fair-value, not vig-inflated numbers).
3. CLV% = (fair\_close\_prob − bet\_implied\_prob) / bet\_implied\_prob × 100.

Positive = you beat the close. Negative = the market moved against your number.

## Where you'll see it

<CardGroup cols={2}>
  <Card title="Per-bet — /my-bets" icon="receipt">
    Every settled bet shows its CLV in the dedicated column, color-coded green/red. Hover the column header for the formal definition.
  </Card>

  <Card title="Aggregate — /bankroll/clv" icon="chart-line">
    The CLV Dashboard surfaces:

    * **Average CLV** across all settled bets
    * **Positive CLV rate** — % of bets that beat the close
    * **Best sportsbook** — book where you've gotten the best numbers
    * **Cumulative CLV trend** — running average over time
    * **By sportsbook / prop type / league** — drill-downs to find your strengths
  </Card>
</CardGroup>

## When it works

CLV requires a closing line snapshot, which requires our closing-line cron to have captured the relevant prop. Right now that means:

* **Bets placed after closing-line capture launched** (April 2026 onward)
* **In sports we capture closes for** (NBA, NFL, NHL, UFC, NCAAB, NCAAF — MLB excluded by default)
* **In games where someone tracked a bet or the Discord bot posted a pick** — closing-line capture is bets-driven to keep API costs predictable

Bets placed before then won't have CLV. Old rows show "—" rather than fake data.

## Why we say CLV is more important than ROI

In any short sample of bets, variance dominates. You can hit a hot streak on coin-flip lines and look profitable when you're not, or you can get unlucky on +EV plays and look like you're losing edge.

CLV cuts through that. If you consistently beat the close, your bets are systematically priced better than the market — and over enough volume, that *will* convert to profit. ROI is the lagging indicator; CLV is the leading one.

## Honest caveats

* **Same-book CLV.** We compare your bet's odds to the closing odds at the same book you bet at. The "true" CLV would compare against the sharpest available closing line (often Pinnacle / Circa) — a refinement we may add later.
* **Straight bets only.** Per-bet CLV currently populates for straight wagers. Parlays have well-defined CLV math but require a per-leg column we haven't built. Tracked as a future enhancement.
* **You need volume.** The CLV Dashboard waits for at least 5 settled CLV-tracked bets before showing trend charts (otherwise the data is too noisy to be useful).

## Coming soon

<CardGroup cols={2}>
  <Card title="Best-line closing comparison" icon="trophy">
    <span className="text-xs text-muted-foreground">Not on near-term roadmap</span>

    Compare your bet's odds to the BEST available closing line across all books, not just the book you bet at. More accurate measure of market-relative skill.
  </Card>

  <Card title="Per-leg parlay CLV" icon="layer-group">
    <span className="text-xs text-muted-foreground">Tracked as future enhancement</span>

    Surface CLV for each leg of a parlay individually, not just the overall ticket. Requires schema work first.
  </Card>
</CardGroup>
