Where to next?
Everything you need to run a day's slips, start to finish.
Today
Loading…
System & maintenance
Health
A quick look at the moving parts you can't otherwise see from the regular pages — cloud connection, offline sync, and the service worker.
Backup
Everything the site keeps track of — every day's matches, results, schedule times, chat IDs, and logo list — in one file, in case anything ever needs to be restored.
Logo Library
Upload once, reuse across every group and every day.
Daily runbook — how the day runs and what to do when an alert arrives
The day (everything after step 3 is automatic)
- Matches (morning): fetch fixtures, tick a channel chip on each match. Fix any 🚩 team with + (connect or add with logo & Arabic name). Auto-share puts them into Predictions within 10 min.
- Predictions: check picks/odds per channel; the pre-flight checklist must be clean (no missing logos or Arabic names).
- Generate → Queue: All-groups generate creates and schedules the slips. Once queued, a channel's matches are locked (the 5-min guard restores them if anything drifts).
- Results are evaluated every 3 min from kick-off; wins are celebrated, losers deleted, remaining slips forwarded, partial reveals and tomorrow's teasers posted — no visit needed. Results → Post… shows exactly what would be sent if you ever want to force it.
- 22:30 UTC: the daily digest arrives in the alert chat. 03:00 backup, 03:30 pruning of data older than 30 days.
When an alert arrives
| ⚠️ untranslated team name | Logo Library → pencil icon → add the Arabic name. The post goes out on the next run. |
| ⚠️ invalid odd / missing odds | Predictions → fix the odd for that channel → Save. Retries automatically. |
| 🛡️ guard restored matches | Nothing to do; check Results shows the right picks. Backup path is in the alert. |
| ⚠️ discarded stored results | The matches changed after results were recorded. Open Results for that date and confirm nothing wrong was celebrated. |
| ⛔ API budget reached | Checks pause until 00:00 UTC. Raise api_daily_cap in Settings only if your API-Football plan allows it. |
| ⚠️ partial reveal failed | Results → the reveal posts itself when you open the date (fallback path). |
| ⚠️ function crashed | Home → Health panel shows which one; the error text is in the alert. Runs again on the next cron tick. |
Source of truth:
daily_match_rows and match_result_rows tables (JSON files are projections). Secrets live in Supabase Vault. Full details: ARCHITECTURE.md in the source repo.Add one logo
Pick a country, pick a team, upload its badge - no zip, no typing.
Your logo library
Loading...
Loading library...
Queue
Delete a message that's already gone out to a Telegram channel, or cancel a slip before it posts.
Deletes from Telegram
Delete Posted Messages
Slips already posted to a Telegram channel for this date. Deleting requires a small Edge Function on your Supabase project — see the setup note if it isn't there yet.
Loading...
Removes from the queue
Cancel Queued Slips
Slips already queued for this date that haven't posted yet — cancel one to remove it from the queue before it goes out.
Loading...
Matches
Every match happening on a given day, across every league and cup worldwide, grouped by competition — pick a date and fetch what's actually scheduled.
Find matches
Pick a date — already fetched before, it shows instantly with no new request. Otherwise, hit Fetch matches to pull it.
Fixtures
Nothing fetched yet.
Predictions
Each group below has its own set of matches, sized exactly to what it needs. Fill in the groups you're running today, add another list if you have a second batch for the same group, then hit Save under that group. Once saved, hit Generate under that group, then Send to Telegram.
Results
For Extra *, Pro *, and VIP * — record what actually happened in each match, then hit Update to save it and see which generated slip won.
Select what actually happened below. Save only stores it; Post shows exactly what will be sent before anything goes to Telegram.
Ads
Pick a template, fill in the teams and text for each page, and download images ready to post.
League News Carousel
2 pages · Arabic
أخبار الدوريات
League News Carousel — Neon
2 pages · Arabic · same inputs, new look
TikTok Join Ad
1 page · 9:16 · TikTok safe zones · auto-fill
Bet
Pick a real, already-won Pro */VIP * slip that's already been posted to Telegram -- nothing here is free-typed. Shows the real accumulator summary plus every real match as its own full card, one under the other in one combined design.
Card slot
Pick a real winning slip that's already been sent.
Preview
iPhone 17 Pro Max
9:41
Bet details
Popular
Favorites
History
Menu
Settings
App-wide configuration, in one place. Everything here applies to every account and every device.
Posting & channels
Post teasers now
Builds the Pro * and VIP * teasers for the selected date from the saved matches and posts them immediately (instead of waiting for the automatic 30-minute schedule after results complete).
Telegram channels
The chat ID each slip channel posts to. Used whenever slips are queued from Predictions. A channel with no ID is skipped when sending.
Failure alerts
A private chat the sending job messages when a scheduled post actually fails — so it shows up here instead of only being visible if someone happens to check Home. Leave blank to turn this off. A dead bot token can't message anywhere, including here — Home's Health panel is still what catches that specific case.
Wins showcase
When a slip wins on Results, that channel's own fixed working message gets its photo and caption replaced with the winning slip, then gets forwarded to the showcase group below. The real public channels' own posts are never touched. Each channel needs its own working group and message, set up once (see the developer notes for how) — leave a channel's row blank to turn celebrations off for just that channel.
Manual actions
Real, irreversible actions
Manual result actions
Posts, deletes, and bans real users the instant you click them. Collapsed by default since Update already runs all of this automatically; open this only to run one step alone by hand.
Captions & wording
Caption editor
Edit the wording used in posts directly — no code changes needed. Changes take effect on the next post; anything already sent is unaffected. Premium-emoji posts (win celebrations, Left On, Pro * teaser) only expose their "Odd" label here — the emoji rows around it are tied to a purchased Telegram sticker pack and aren't safely editable as text. VIP *'s teaser is fully fixed the same way, with no editable text at all.
Daily posts (regular & "*" channels)
Premium-emoji posts
Account
Auto sign-out
Sign everyone out automatically after a period with no activity — applies to every account, including admins.
Where the rest lives
A few things are deliberately kept next to where they're used, rather than here: each list's Telegram post time is set inline on Predictions as part of entering the day's matches, and the ad background, header and button text are edited on the Ads page while composing an ad. Accounts and page permissions are under Admin.
Shortcuts
Common wording and thresholds you can change yourself here, without needing a code change.
Join / promo button
The inline button on teaser and win-celebration posts.
Partial results reveal button
Shown on the mid-day \u201cget the remaining matches\u201d post that goes out automatically once half a VIP */Pro * slip's results are in. Uses the same link as the join button above.
Wallet names
Shown throughout the Revenue page — wallets, splits, and history.
Thresholds
Revenue
Manually-logged income — nothing here is calculated from slips or subscriber counts, it's only what you enter.
Add an entry
Dashboard
At a glance: what's in each wallet right now, and what a split would do.
Available to withdraw / split
0.00 USD
Activity log
Who did what — every entry added or deleted, every split and transfer, kept even after the entry itself is gone.
Wallets
Every income or expense entry picks one of these four. Each wallet keeps its own running balance.
Transfer between wallets
Move money from one wallet to another — doesn't count as income or an expense, just moves the balance. Useful for consolidating before a split.
Split with your partner
Always 50/50 of everyone's FINAL balance — adds up every wallet, and whoever's currently ahead or behind gets evened out as part of the same split, not just handed an equal top-up. Never automatic, only when you click.
Split history
The full picture of each split — which wallets fed it, and where each person started.
Withdrawal history
Just the payouts — how much each of you has actually taken out, and when.
Entries
Admin
Control who can sign in and which pages each account is allowed to edit — everyone signed in can view every page, editing is what's restricted. Auto sign-out timing and Telegram channel IDs now live under Settings.
Add a user
Everyone can view every page — pages this account can also edit
Existing users
Loading…
90M Extra *
Select 2 matches. Each produces 2 separate single-match slips (4 images total).
Preview
90M VIP *
Select 4 matches - one pick + odd each, the true opposite is generated automatically. Produces all 16 combinations.
00.00
Preview
90M Pro *
Select 3 matches - one pick + odd each, the true opposite is generated automatically. Produces all 8 combinations.
00.00
Preview
90M VIP
Select 3 matches - combined into one slip.
00.00
Preview
90M Pro
Select 2 matches - combined into one slip.
00.00
Preview
90M Extra
Select 1 match.
Preview