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

# Analytics

> How Goat LP counts PnL, APR and fees, where the data comes from, how fresh it is, and what each badge means.

<Frame>
  <img src="https://mintcdn.com/cashmerelabs/VaU9JZozZKsaMUY5/images/goat-lp/cover-analytics.png?fit=max&auto=format&n=VaU9JZozZKsaMUY5&q=85&s=78a31ae335a54b96492ce049579dc664" alt="Analytics cover: a dashboard card with PnL vs holding, APR, fees and gas tiles and a position-versus-holding chart, tagged Illustration · sample positions, with the pixel goat." noZoom width="1600" height="640" data-path="images/goat-lp/cover-analytics.png" />
</Frame>

<Callout type="warning">
  Goat LP is experimental. Use small amounts.
</Callout>

Goat LP analytics are free and read-only. They cover every Uniswap v3 and v4 pool, position and wallet on
Robinhood Chain. Analytics describe the past: no figure is a promise of future returns.

## How PnL is counted

```
PnL vs HODL = value + fees − HODL − gas
Pool PnL    = fees + divergence
APR         = PnL ÷ base × 365 ÷ active days
```

| Term | Meaning |
| - | - |
| **Fees earned** | Swap fees collected, plus those still uncollected in the position |
| **Divergence** | Position value minus the value of the deposited tokens, held. Also called impermanent loss |
| **Pool PnL** | Fees plus divergence: what the pool itself did for you |
| **Gas** | Network fees for every transaction on the position, including keeper runs Cashmere paid for |
| **Rewards** | Incentives such as Merkl programs, counted when claimable, never mixed into fees |
| **PnL** | All of the above, against the reference you pick: **HODL**, **USD** or **ETH** |

* A position is one NFT. Its PnL runs from the mint to now, whoever holds it.
* Compounding does not move PnL by itself: re-added fees stay in fees earned.
* A range move closes one NFT and opens another. Goat LP links the two when both happen in one transaction
  with the same owner, and sums their results.
* A closed position shows its realised PnL. APR and fee APR show "—" once nothing is invested.

## APR and fee APR

| Figure | What it counts |
| - | - |
| **APR** | PnL ÷ base × 365 ÷ active days. Fees and price, after gas |
| **Fee APR** | Fees only |
| **Pool fee APR** | The pool's fees over the selected window, spread over all of its liquidity |
| **Past fee APR (last 24 h)** (create panel) | The last 24 hours of pool fees × your share × 365 ÷ your deposit. Past fees, not a forecast. Zero while out of range |

Your APR differs from the pool's because it counts only your own fees over your own deposit.

## Where the data comes from

| Data | Source |
| - | - |
| Pools, positions, transactions | Goat LP's own index of Robinhood Chain |
| USD prices | Chainlink where a feed exists, otherwise pools with a verified price. Unverified prices are marked |
| Uncollected fees on open v4 positions | Read from the chain on every load |
| Rewards | Merkl |
| Token logos | CoinGecko |

## Freshness

| Status | Index delay |
| - | - |
| **Live** | 60 seconds or less |
| **Behind** | Up to 10 minutes |
| **Stale** | More than 10 minutes; a banner says so |

Pages refresh every 15 seconds, and straight away after you send a transaction.

## Badges

<AccordionGroup>
  <Accordion title="Pool badges">
    | Badge | Meaning |
    | - | - |
    | **Swap tax x%** | A hook keeps this share of every swap. It is not a fee to liquidity providers |
    | **Hook** | The pool runs a hook. Neutral if Goat LP reviewed it, a warning if not |
    | **LPs earn no fees** | The pool pays liquidity providers no swap fees |
    | **Not the original** | Same ticker as a listed token but a different contract. Check the address |
    | **Price stale** | A token could not be priced against a trusted pool right now |
    | **TVL capped to balance** | TVL was lowered to what the pool actually holds |
  </Accordion>

  <Accordion title="Position badges">
    | Badge | Meaning |
    | - | - |
    | **price from pool** | A USD figure uses a pool's own price. PnL and APR are indicative |
    | **no price backing**, **price above ceiling**, **fees unavailable** | Not a measurement; the number is withheld or marked |
    | **unreviewed hook** | A v4 pool with a hook outside the reviewed set. Hidden by default |
    | **burned owner** | Owned by the burn address; its fees can never be collected |
    | **Skewed by gas costs** | Gas is 20% or more of the position's PnL |
    | **Not meaningful** | A launch deposit valued at today's price. PnL and APR show "—" |
  </Accordion>

  <Accordion title="Fee collection labels">
    | Label | Meaning |
    | - | - |
    | **Not payable right now** | This token cannot be paid out right now. Try again later |
    | **Cannot be collected** | With the reason, for example the token refuses transfers from this pool |
    | **Not yet checked** | New token, pool or hook. Simulate before collecting or withdrawing |
    | **Withdrawal blocked** / **Locked until** | The pool's hook does not allow removing liquidity, or not before the date shown |
    | **Uncollectable fees** | Part of the fees cannot be collected; they are left out of fees and fee APR |
  </Accordion>
</AccordionGroup>

<Callout type="info">
  When Goat LP cannot stand behind a number, it shows "—" with the reason instead. The in-app **How we count
  PnL** page works through these rules on live example positions.
</Callout>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.