What's new and improved in IMS Fantasy.
🏁 The Basics
You run a fantasy team of 5 drivers — one per division (D0–D4) — plus a constructor, bought within your credit budget. Every real IMS round, your drivers earn the fantasy points they score in their division's race, and those points are your score for the round.
Your constructor earns its BOTT points from every driver racing for that team across all five divisions — so a strong constructor pick pays even when your drivers have a bad night.
⚡ Scoring — the fine print
Points land live. During a race weekend, results are imported division by division — your team's points tick up as each division comes in. The home page shows which divisions are already counted (the ✓ D0–D4 chips).
Off-division points don't score for your fantasy team — with one exception. If a driver races outside their own division as a general reserve outing, those points count for their constructor's BOTT total only, not your fantasy team. Their ELO still counts, though — the rating a driver gains or loses in a reserve outing carries into their global ELO, so a strong (or poor) reserve drive can still move their price up or down even though it earned you no points. The exception: if that reserve was standing in for a driver on your team who missed the race, they do score for you — see 🔄 Reserve drivers & tokens below.
Your team is snapshotted at lock. What you score with is the team you had when the round locked — transfers made afterwards count from the next round. The 📸 toggle on My Team lets you view last round's locked team and its points any time.
✅ Check-ins — is my driver racing?
See who's shown up. During a race weekend, drivers check in for their session. On My Team and the Market, a driver who's checked in for their own division's race gets a green ring around their photo and a green tick — so you can tell at a glance whether the drivers you own (or are eyeing) are actually racing.
Updates through the weekend. Check-in data refreshes automatically, so ticks appear as more drivers confirm. No tick just means they haven't checked in for their division yet — it isn't a guarantee they're out, but a checked-in driver is confirmed in.
Matching is by the driver's Discord account (falling back to their name), and only counts their own division's session — the race that actually scores for your fantasy team.
🚫 Race bans
Some drivers get banned. A driver serving a race ban is flagged on My Team and the Market with a red ring and cross over their photo, plus a 🚫 RACE BAN badge showing how many races are left on the ban.
Bans count down automatically. Each time a race is scored, one race comes off the ban. When it reaches zero the ban lifts on its own and the warning disappears — so a "🚫 RACE BAN · 2" means they're out for the next two rounds.
The badge is there to warn you before you pick or hold a banned driver. Weigh it up like any other risk when planning transfers.
👑 Captains
Your captain scores 2× points each round. Pick one on My Team before lock.
Things people miss: if you don't log in, your previous captain carries forward automatically — and if you've never picked one, the app auto-captains your best season scorer, so you're never without the bonus. Selling your captain removes their armband for the upcoming round, so pick a new one.
🃏 Chips
🚀 Triple Captain — one round only, your captain scores 3× instead of 2×.
🃏 Wildcard — unlimited free team changes for one round. Rebuild the whole squad without burning banked transfers.
😇 Guardian Angel — pick any extra driver (any division, even one you don't own) and their points are added to your total for that round — a sixth scorer.
Each chip is once per season. Choose your moment.
💰 Prices — how the market moves
Prices, dominance and ELO price moves all settle once per round — after the D4 results come in (the last division to be imported). Earlier divisions' points land live, but nobody's price or dominance moves until D4 closes the round. Four forces move what a driver costs:
1. Dominance — how crushing their performance was versus their own division, compared to their previous race. The price shift is $0.1M for every 5 points of dominance change: beat your last showing and your price climbs, fall off and it drops. Big swings in form move the most money.
2. ELO — every race nudges price by their rating change. Rises are tiered: drivers under $15M climb fastest at roughly $1M per 30 ELO, easing smoothly to $1M per 50 ELO near the $30M cap — bargains climb quick, superstars don't snowball. Falls always bite at the full $1M-per-30 rate at any price, so overpriced drivers correct fast. This includes ELO from reserve outings — a driver racing outside their own division still gains or loses global ELO there, and that still moves their price even though the outing scored no fantasy points.
3. Non-finish penalty 💥 — every DNF, DNS or DSQ costs price, and repeat offenders pay more: the season ladder runs -$0.5M for your first, another -$0.5M for the second, -$1M for the third, and -$2M for every one after that. Crash-happy (or steward-bothering) drivers become cheap for a reason. The count resets every season, so everyone starts each season with a clean slate — non-finishes have been counting since Texas, Round 1 of Season 7.
4. Demand 🔥 — when 3+ teams own a driver, buying them costs a bit extra on top (shown in purple in the market). It's a flat surcharge based purely on how popular they are, not a percentage of their price — so a cheap fan-favourite and an expensive one pay the same premium at the same ownership. It grows as more teams pile in (and a little faster once 4+ own them), and unlike the forces above it isn't permanent: it fades if owners sell up. Popular picks cost a touch more; contrarian picks stay clean.
Driver prices live between $5M and $30M; constructors can reach $35M. Constructors are priced against their own season average — beat it and they rise. Tap any driver or constructor for their full 📈 season price chart, including your own buys and sells marked on the timeline.
🔄 Transfers
You get 1 free transfer per round, banked up to 3. Team changes beyond your banked transfers aren't allowed — plan ahead or save your Wildcard.
Swaps settle at the net price difference: sell a $10M driver, sign a $12M one, and it costs $2M of budget. Downgrades put credits back in your pocket — profit from price rises is real money for future signings.
🔀 Promotions & demotions
When the league moves a driver up or down a division, the fantasy market reacts the moment the roster is synced:
If you own them — they're automatically removed from your team (they no longer fit that division's slot) and refunded, with a notification sent so you know it happened. Cheap drivers (under $10M) refund their exact price so you're made whole; pricier drivers refund 75% of their value. You're then free to re-sign them in their new division, or spend the refund elsewhere.
Their price carries over to the new division, but their ELO baseline resets to the new division's standard — so a promoted driver is suddenly measured against tougher company, and a demoted one against easier. Expect their price to move accordingly over the next rounds: promotions often become bargains-in-waiting or overpriced strugglers, and spotting which is half the game.
⚠ Note that pricier drivers refund 75% of their value — owning a $20M star through a division move gets you $15M back, a 25% haircut. So if rumours of a move are swirling, selling first can still be the smart play.
📣 Fan Zones
Pledge yourself to a constructor and every fantasy point you score counts toward their Fan Zone total (leaderboard → 📣 Fan Zones). You wear their badge and colours on the leaderboard.
The pledge is locked for the whole season — no switching, no leaving until the new season resets everyone. Only rounds from when you join count; no retroactive credit. Your profile shows your share of the zone's points and whether you're carrying the zone… or being carried.
🎖 Badges glossary
🏆 won their division at the last race · P pole position · ⏱ FL fastest lap · 🧹 SLAM pole + win + fastest lap in one weekend.
On the leaderboard: ★ a team's current captain · constructor logo chips show each player's Fan Zone · row colours are Fan Zone colours.
🔄 Reserve drivers & tokens
If a driver on your team doesn't race, a reserve can score for you. When one of your fantasy drivers misses their division's race, the driver who actually stood in for their seat that round (whoever raced that team's car in that division) scores the fantasy points in their place, for that race only. That stand-in can be a driver from another division, or a guest who isn't a regular on the grid — it just has to be whoever filled the seat.
You get 3 reserve tokens a season. Each time a reserve fills in for one of your drivers, it costs one token. Substitutions apply oldest race first. Once you're out of tokens, an absent driver is simply left as-is with no replacement. A reserve counts even if they scored 0 — they still took the seat, so it still uses a token.
The one person who can't be the reserve is the absent driver's own teammate — the other regular in that same team and division has their own seat, so they aren't a stand-in. Anyone else who drove the car is fair game.
You'll always know. When a reserve steps in, that driver's card on My Team glows teal with a 🔄 RESERVE IN ribbon and the reserve's face over the original — and the points shown (and counted in your total) are the reserve's. The 🔄 Reserve Drivers panel (below your constructor) shows your token count and every swap. If nobody filled the seat, your original driver just stays put.
The captain armband carries over too. If you captained a driver and a reserve steps in for them, the reserve scores with your captain multiplier — 2× (or 3× with Triple Captain). The bonus belongs to the slot you picked, so the stand-in inherits it.
🏆 Championships & your trophy cabinet
Division titles are awarded the moment they're mathematically won. On the Results standings, once a leader's points gap is bigger than everything their rivals could still score in the races left, they're crowned 👑 CHAMPION — and it shows up on IMS Live too.
Your own trophy cabinet (on My Team and your profile) fills up as you earn silverware, each trophy stamped with the season it was won:
🏁 Round wins — top the fantasy leaderboard for a race weekend (once results are final). 👑 Championships — finish 1st on the end-of-season leaderboard. 🥈🥉 Season podiums — finish top 3. ⭐ Fan Zone wins — be in the winning Fan Zone at season's end (the whole zone gets it, shown with the team's logo). 💎 Top value — end a season with the highest total team value.
📅 The weekend cycle
1. Race week opens — make transfers, set your captain, watch the countdown. 2. Teams lock at the deadline (your line-up is snapshotted). 3. The weekend goes 🔴 LIVE and points land across two race days: D0 & D1 are imported together on the first day, then D2, D3 & D4 together on the second — your team's points tick up as each batch comes in. 4. Once D4 lands and the round is complete, prices move and everything settles. 5. Once the previous round's verdicts are settled, editing reopens — you bank a fresh free transfer and the next countdown begins.
Miss a deadline? Your locked team races as-is, captain included — you always score.
A summary of your season so far.
All your transfers this season.
New to IMS Fantasy or want a refresher? Take the guided tour — or open ❓ in the nav for the full how-it-works guide.
Got an idea for the league? Post it here — others can reply and upvote.
Want a photo on your driver card? Submit your in-game name and a valid image URL below and the admin will review it.
Get notified when race results drop, transfers open, and more.
🤖 Android: Install the ntfy app, then subscribe to ims-fantasy-alerts
🌐 Web: Visit ntfy.sh/ims-fantasy-alerts
Watch the live stream directly here.
See who's online and jump into the server.
Click to sync Season 6 drivers from the live Google Sheet. This will replace all existing drivers.
Calculate what the average team would cost at different multipliers based on current fantasy points.
Fetch ELO from the FES sheet for a specific round and update all driver prices.
Sets every driver's baseline ELO to their division default (D1/E1: 1750, D2/E2: 1500, D3/E3: 1250).
One-time seed of current Season 6 constructor standings to set initial prices.
Sets all constructor seed points to 0. Use before simulating from round 1.
Clears each constructor's running season points total/race count (used for price shifts vs their own average) without touching their current price. The next race imported will become their new "first race," establishing a fresh baseline with no price change, then every race after that shifts price normally.
Upload the latest IMS Bible snapshot (.db file) and import race results directly. Driver ELOs and points are read automatically.
Load a DB file above first, then sync all Season 7 drivers with their current division, team and ELO into Firestore.
⚠ One-time reset: recalculates every driver's price from their current ELO using the new division baselines (D0:1800, D1:1650, D2:1500, D3:1350, D4:1250). After this, only dominance moves prices — running this again later will overwrite any dominance-based changes since.
🔄 One-time: set stored price to current ELO price. This gives every driver a sensible starting price based on their current ELO (the same calculation as before — $10M at baseline, $1M per 18 ELO points either side). From the NEXT race import onward, both dominance ($0.1M per 5 dominance points) and ELO change that race ($1M per 30 ELO points) will move price together, on top of this starting point.
🧹 Price cleanup: an earlier bug let dominance push some drivers' stored prices above the $${PRICE_CAP}M cap (the cap is now correctly applied going forward). This re-clamps any driver currently over/under the floor/cap back into range — doesn't touch anyone already within range.
🧹 Fix stale "what changed" display: an earlier bug meant any driver who had BOTH a dominance change and an ELO change in the same import only showed the dominance portion on Market (the actual stored price was correct — this is purely cosmetic). This recalculates lastPrice from the already-stored dominance/ELO changes, without touching price itself.
🔍 Inspect driver rows — see every DB row for a driver (optionally in one race): division, points, ELO, dominance, and how the app matched them. Use this to diagnose wrong ELO/dominance values.
Always visible, not just shown after an import — refreshes automatically once an import finishes. Shows each driver's current dominance and price, with their most recent race's changes in brackets.
Recomputes every constructor's points from the raw per-driver race data and lists anything that was DROPPED during team attribution (missing team record, constructor name mismatch, or negative points). Use this to find why a BOTT total doesn't match the sheet.
Enter points for each driver and constructor (blank = 0):
Select a race to update its points — useful if points come in after you've already moved on.
Grant or reset chips for a specific player.
This drives which season is treated as "current" throughout the app — past-season tabs on driver profiles, BOTT standings, and results all key off this. Set it to match whichever season is actually live right now.
Used to work out how many races are left for the 🏆 championship clinch/champion logic. Set this to the full calendar length so a title can be awarded once it's mathematically decided.
Wipe the reserve-driver system and start it fresh from the next round: past absences won't use anyone's tokens, and everyone's back to a full ${'3'} tokens going forward.
A driver priced at their division's baseline ELO sits at $10M, ±$1M per 18 ELO either side. NOTE: prices are stored values now — changing a baseline does NOT move prices by itself. It changes the anchor used the next time you run 🎬 Replay Season Pricing or the one-time ELO price reset.
Set upcoming race lock times. The countdown timer will count down to the next scheduled race.
While live, the home page shows the race as in progress instead of the next race countdown. Normally stamps itself automatically at team lock — use this to force it on (e.g. if the schedule entry was deleted) or end it early. It also ends automatically when you unlock editing or import D4 results.
Set each division's pole sitter for a race by driver name (must match roster name). Shows as a P badge on My Team and the Results page.
Computed pole-sitters from qualifying lap times (fastest lap per division). Review against what's saved, then apply. Requires running import_poles.py first to stage the quali data.
Pick a race to see computed poles.
Fills in captains for any team that has none set for a race — carrying forward their previous captain, or auto-assigning their best season scorer if they've never picked one. Never overwrites a captain a player chose themselves. Runs automatically on every import; use this to fix a race that's already been imported.
Re-takes a race's team snapshots from CURRENT team selections — use when a race's snapshot missed late signings (e.g. wildcard transfers made after the race doc was created). ⚠ Only safe while teams haven't changed since that race — i.e. during or right after its round.
When the same round got imported under two different names (e.g. "Spa Francorchamps" and "Spa"), you end up with two race docs. Pick the one to KEEP and the duplicate to DELETE. This removes the duplicate's race document only — it does not undo any price/ELO/DNF changes that import applied. ⚠ After deleting, re-run pricing if the duplicate double-counted (see note below).
Recomputes every driver's season non-finish count and DNF price penalties from the race documents that currently exist. Use this after deleting a duplicate race to clear phantom DNFs — real non-finishes are kept, stray ones (from the deleted import) are removed, and the price penalty is corrected (refunding any over-charge). Safe to run any time; it reconciles rather than double-applies.
For entries that aren't real drivers (bad rows, test entries, duplicates with no real counterpart). Strips their points, DNFs and team history from every race document — so constructor totals and standings correct themselves — then deletes the driver. Any fantasy team fielding them has the slot cleared. ⚠ Permanent. If they're a duplicate of a REAL driver, use Merge below instead so the points are kept.
When a driver changes division, they no longer fit their old slot in anyone's team. This finds every team holding them in a slot that doesn't match their current division, clears that slot, and refunds the owner (exact price under $10M, otherwise 75% of value) — then notifies players. Use it after a mid-season division move if the roster sync didn't already clean it up. Safe to re-run; teams already cleared are skipped.
For a driver who didn't actually race in a specific round/division but appeared in the import (bad row in the source data). Removes only that one result — their points, status and team entry for that division — and recomputes the constructor total for that race. Everything else about the driver is untouched.
Zeroes every team's fantasy points for one round on the leaderboard — use when a round awarded points nobody actually earned. Driver and constructor results, DNFs and race history are left untouched, so the Results page still shows what happened. Reversible: toggle it back on any time.
When one real driver was entered under two names (e.g. coldpalmer & HPjones), merge them. All of the duplicate's race results, points, DNFs, team history and fantasy-team ownership are reassigned to the driver you keep, then the duplicate is deleted. ⚠ Permanent — run a data backup first if you can. Prices/ELO aren't recombined; the kept driver's own price stands (re-import or replay if you need it recomputed).
Hides the ▲/▼ "up/down since last race" tags on every market row, driver blob, and driver/constructor profile. The biggest risers & fallers ticker stays visible either way. Use this after adjusting prices manually so players don't see swings that don't reflect race results.
Send a notification to all players subscribed to ntfy.sh/ims-fantasy-alerts.
Archive the current season before resetting. Archived seasons are viewable by all players under the Leaderboard page.
Stamp today's prices as the season's starting point. "Biggest riser" leaderboards measure gains from this baseline. Run once at season start (or now to start tracking).
Seed the "Most Bought" board from who's owned right now (each current owner = 1 buy). After this, buys increment automatically on every market signing or team edit. Run once.
Paste an image URL to update the banner on the home page.
Show a break week message on Edit Team instead of the countdown timer.
Add your Anthropic API key to enable AI-generated race previews on the Predictions page. Get one at console.anthropic.com
Archives all current races then clears them so round numbers start fresh. Keeps all teams, budgets, drivers and ELOs.
Deletes all teams and race results. Drivers/constructors stay.