Introducing the Indexer Score

Which Indexer Should I Delegate To?

Introducing the Indexer Score by Graphtronauts

As Graphtronauts, one of the most frequently asked questions from our vast community of delegators in The Graph ecosystem is:

“Which Indexer should I delegate to?”
What should I look for? Reliability? APR? Customer support?

Well, we truly believe that as web3 is evolving into a new era—one that will bring more crypto adoption—the most important metric is to support Indexers who do the real work for The Graph Network.

:backhand_index_pointing_right: If The Graph is powering web3, it’s thanks to Indexers—the backbone of the network—providing indexing and search capabilities to thousands of dapps across 90+ blockchains.


:light_bulb: Welcome to the Indexer Score

We’ve created a brand-new metric you can now explore directly in our dashboard:

:link: Access the Indexer Score Dashboard
:blue_book: Read the Full Documentation


:books: Documentation

:straight_ruler: Thresholds Used

  • Small Indexer: < 1,000,000 GRT allocated
  • Medium Indexer: ≥ 1,000,000 and < 20,000,000 GRT
  • Large Indexer: ≥ 20,000,000 GRT
  • Underserving Subgraphs Threshold: 10 subgraphs

:chart_increasing: How the Indexer Score is Calculated

The Indexer Score is a weighted combination of two critical performance metrics:

  • AER (Allocation Efficiency Ratio)Weight: 70%
  • QFR (Query Fee Ratio)Weight: 30%

This blended metric evaluates an indexer’s overall performance by balancing allocation efficiency and query fee generation.

The final score is adjusted to a uniform scale where 1 = best and 10 = worst.


:triangular_ruler: How AER is Calculated

Formula:
AER = Total GRT Allocated / (Number of Allocations × Avg GRT per Allocation)

:double_exclamation_mark: A lower AER reflects more efficient allocation; a higher AER suggests over-concentration.

Average allocation targets per subgraph:

  • Small Indexers: 5,000 GRT
  • Medium Indexers: 10,000 GRT
  • Large Indexers: 20,000 GRT

:straight_ruler: AER Normalization:

Normalized AER = 1 + 9 × (min(AER, 500) / 500)

  • AER = 0 → Score = 1 (best)
  • AER ≥ 500 → Score = 10 (worst)
  • Example: AER = 23.788 → Normalized ≈ 1.43

:magnifying_glass_tilted_left: How QFR is Calculated

Formula:
QFR = Query Fees Generated / Total GRT Allocated

:double_exclamation_mark: A higher QFR indicates better performance.

:straight_ruler: QFR Normalization:

Normalized QFR = 10 - 9 × (min(QFR, 1.0) / 1.0)

  • QFR = 1 → Score = 10 (best)
  • QFR = 0 → Score = 1 (worst)
  • Example: QFR = 0.002856 → Normalized ≈ 9.97

:abacus: Final Indexer Score

To combine AER and QFR into a unified score:

Example Calculations:

  • Best Case: AER = 0, QFR = 1 → Final = 1.0
  • Worst Case: AER = 500, QFR = 0 → Final = 10.0
  • Mixed Case: AER = 23.788, QFR = 0.002856 → Final ≈ 1.31

This ensures that both efficient allocation and strong query performance drive the score closer to 1.

:warning: :red_circle: Underserving Penalty

Indexers serving fewer than 10 subgraphs are considered underserving and receive a penalty to their final Indexer Score.

The penalty is calculated as:

Penalty = 2.0 × (10 - number_of_subgraphs) / 10

The final score is capped at 10.

Examples:

  • An indexer with 1 subgraph receives a penalty of 1.8
  • An indexer with 5 subgraphs receives a penalty of 1.0

This rule encourages indexers to support a broader and more diverse set of subgraphs, which strengthens the health, resilience, and decentralization of The Graph Network.


:sports_medal: Performance Flags

Each indexer is assigned a flag based on its final Indexer Score:

  • :green_circle: Excellent (1.0 – 1.25)
  • :yellow_circle: Fair (1.26 – 2.5)
  • :red_circle: Poor (2.51 – 10.0)

These flags help delegators instantly identify high performers vs those needing optimization.


:person_raising_hand: Feedback Needed and Conclusion

We consider this an open and evolving framework, and we’d love feedback from Indexers, Delegators, and community members on a few key design decisions:

1. Thresholds

  • Are the allocation ranges for Small, Medium, and Large Indexers appropriate?
  • Is the current Underserving Subgraphs Threshold of 10 subgraphs sufficient to flag underperformance?
    • Should it scale with indexer size?
    • Should it account for subgraph activity or diversity?

2. Score Weighting

  • Should AER continue to be weighted at 70% and QFR at 30%?
  • Would a different balance better reflect the actual value indexers bring to the network?

Your input is essential to fine-tune this scoring model and ensure it aligns with what truly matters for The Graph’s sustainability and growth.


:blue_book: Read the Full Documentation

We built this tool to help delegators go beyond chasing APR and support the indexers powering The Graph network and we’re committed to making this tool as useful and fair as possible for the entire ecosystem.

We’d love to hear your feedback!

Together, let’s make the network stronger, more transparent, and more effective!

The Graphtronauts Core Team :man_astronaut:

6 Likes

To make the Indexer Score Methodology easier to understand and share, we’ve also created a downloadable PDF document that outlines the full scoring model — including formulas, thresholds, normalization logic, and penalty rules.

:page_facing_up: Download the PDF:
Indexer Score Documentation

You can also find this document directly linked from the live dashboard for convenient access:

:link: The dashboard is live here:
graphtools.pro/indexers

Let us know if you have feedback or questions.
Thanks so much for your support :folded_hands:

1 Like

AER = Total GRT Allocated / (Number of Allocations × Avg GRT per Allocation)

Can you clarify what Avg GRT per Allocation means. Because it seems to me that there should always be 1 because Number of Allocation * Avg GRT per Allocation is always equal to Total GRT Allocated.

1 Like

Sure, and thanks for your question.
Avg GRT per Allocation is a threshold we use that is tied with the indexer size:

These are the used thresholds:

For example, for small indexers, we assume an ideal average allocation of 5,000 GRT per subgraph. So let’s say an indexer has:
Total GRT allocated: 800,000 GRT
Number of open allocations: 50

The AER (Allocation Efficiency Ratio) would be calculated as:

AER: 800,000 / (50 x 5,000) = 3.2

We’ve also prepared a concise whitepaper explaining the full scoring methodology. You can download it here:
:page_facing_up: Indexer Score Documentation

1 Like

Ah, I see. Missed it the first time I read it. Thank you for the clarification.

1 Like

Happy to help :slight_smile:

Any further questions, just ask!

:loudspeaker: Indexer Score Dashboard v1.0.5 Released!

We’re excited to announce the latest update to the Indexer Score Dashboard – a community tool that helps assess and compare the performance of indexers across The Graph Network.

:rocket: What’s New in v1.0.5

:white_check_mark: Upgrade Indexer Excluded

The Upgrade Indexer is now excluded from the dashboard view by default.

:bullseye: Filter Indexers by Performance

We’ve added a powerful new feature: Filter by Performance.
With one click, you can now filter indexers based on their performance category:

  • :green_circle: Excellent – Indexers scoring 1.00 to 1.25
  • :yellow_circle: Fair – Indexers scoring 1.26 to 2.50
  • :red_circle: Poor – Indexers scoring above 2.50

This makes it easier than ever to identify top performers and those needing optimization.


:bar_chart: About the Indexer Score

The Indexer Score is a composite metric based on:

  • Allocation Efficiency Ratio (AER) – How effectively an indexer spreads stake across subgraphs.
  • Query Fee Ratio (QFR) – How much query revenue is generated per GRT allocated.

Scores are normalized and combined into a final indexer score between 1 (best) and 10 (worst). Underserving indexers receive a penalty to ensure fair representation of their contribution to the network.


:magnifying_glass_tilted_left: Try It Out

:backhand_index_pointing_right: View the latest dashboard

:page_facing_up: Download the PDF documentation


Feedback and suggestions are always welcome! :folded_hands:

Where I’m wrong:

  • QFR = 1 → Score = 10 - 9 x 1 = 1
  • QFR = 0 → Score = 10 - 9 x 0 = 10

And why do you need to divide by 1.0? It doesn’t affect anything.

The division is not pointless — it’s there for scaling and flexibility.

:wrench: Why divide by cap?
You’re right that dividing by 1 doesn’t change the result — right now.

But the point of writing it as (QFR / cap) is to allow the formula to adapt if the scoring cap ever changes.

For example, if we wanted to cap QFR at 0.5 instead of 1.0:

QFR = 0.25  
→ capped_value = min(0.25, 0.5)  
→ capped_value / 0.5 = 0.5  
→ norm_value = 10 - 9 * 0.5 = 5.5

That wouldn’t work if we didn’t include the division.

:straight_ruler: TL;DR

• cap is there to normalize QFRs into a 0–1 scale.

• Higher QFRs still yield better scores (closer to 10).

• The division by cap isn’t redundant — it’s there to make the formula reusable, adjustable, and future-proof.

If this is a parameter that can be changed in the future, then it is probably worth specifying it as a variable in the general formula and explain that it is a max cap, and just specify that now this parameter is 1. Then it will not be necessary to change the formula every time in the future, but only this parameter.

Also could you please explain how you get Score = 10 with QFR = 1 and Score = 1 with QFR = 0?

• QFR = 1 → Score = 10 (i.e., full efficiency)

• QFR = 0 → Score = 1 (i.e., no useful query activity)

This is to be in line with AER that is also from 1 to 10.
So we ‘move’ QFR from 0 to 1 into a 1 to 10 to preserve the full 1–10 range.

  • When QFR = 0, the score is 1 (minimal contribution)
  • When QFR = 1, the score is 10 (max contribution)

Then in the next step we invert QFR to make sure it has the same logic of AER and they can be combined to provide the final Indexer Score.

:green_circle::yellow_circle::red_circle: Indexer Score Dashboard Has a New Home! :house_with_garden:

Hey everyone,
We’re excited to announce that the Indexer Score dashboard has moved to its new and permanent home:

:backhand_index_pointing_right: www.indexerscore.com

The new site brings:

  • :high_voltage: Faster load times
  • :globe_with_meridians: A cleaner, dedicated URL
  • :bar_chart: The same powerful insights into indexer performance

Whether you’re an indexer, delegator, or curious community member, this is your go-to destination for tracking activity across The Graph — and for discovering which indexers genuinely care about the health and growth of the network :man_astronaut:

Feel free to bookmark it, share it, and let us know what you’d love to see next.

Onwards!
Graphtronauts Team

P.S. No worries if you bookmarked the old link — it will automatically redirect to the new home.