| Role | Can do | Can't do |
|---|---|---|
| admin | Everything — incl. thresholds, brands, team accounts, restore | — |
| editor | All daily campaign work: add/edit/delete entries, imports, actions, brand assignment | Change thresholds, manage brands or team |
| viewer | See every dashboard, chart and campaign; export CSV | Change anything (edit buttons are hidden) |
KPI cards — totals for the current date range and filters. Monetary cards show USD with the RM equivalent beside it. "Total NRs via Ref. Code" counts only registrations attributed to our campaigns; the small % shows how much of the brands' total traffic we drove.
Filters — chips for Ad Network, Brand, and Format sit under the header. They narrow everything: KPIs, charts, and the log. Reset Filters in the Campaign Log header clears the lot.
Charts — Daily Spend & ROAS (bars + line with the Scale/Kill threshold lines), CPR & CPA by brand, daily FTDs, CTR by campaign (green = above target), network split, CPM trend. The ⤢ button enlarges any chart.
Attribution by Brand — one card per brand: campaigns linked, running vs stopped, and how much of the brand's NR/FTD our ads drove.
🏆 Best Performing Campaigns — ranked by total NR or FTD (toggle at the top-right of the card).
One row per campaign, summarising its whole lifetime (within the date range). Click the row to expand daily entries. The coloured stripe on the left = the action currently taken. An amber dot means the AI disagrees with the action taken — the ⚠ Mismatches button filters to only those.
Per-campaign buttons: campaign name opens its ad creative · + quick-adds a day entry · ✕ deletes the whole campaign · the brand badge ▾ assigns/changes the brand (important after CSV imports!). On expanded day rows: ✎ Edit and ✕ Delete per day.
Status vs Action vs AI Rec: Status = is the campaign live or stopped. Action = what we actually did (click it to change: Pending / Scale / Monitor / Kill / Banned). AI Rec = what the engine advises. Score = 0–100 health. Trend = direction vs its own history (↑ improving, ↓ declining).
1 · NR & FTD Entry page (sidebar) — the daily back-office numbers. Pick the brand, enter the brand's total NR/FTD for the day, then per referral code the attributed NR / FTD / deposit value in RM — USD is converted automatically at the configured rate.
2 · Quick-add in the log — the + on a campaign row adds a day of ad-side numbers (spend, impressions, reach, clicks…). CPM/CTR/CPR/CPA compute themselves.
3 · ⬆️ Import CSV — for Meta Ads Manager exports. In Ads Manager: Reports → Export table data → set Breakdown by Day → CSV. Drop the file in; columns are auto-detected and previewed before anything is saved. Rows with the same date+campaign update rather than duplicate.
| Metric | Meaning | Good looks like |
|---|---|---|
| NR | New registrations | volume, cheaply |
| FTD | First-time deposits — the money event | more = better |
| CR | FTD ÷ NR — how many registrants deposit | higher % |
| CPR | Spend ÷ NR — cost per registration | ≤ $5 |
| CPA | Spend ÷ FTD — cost per depositor | ≤ $12 |
| ROAS | Deposit value ÷ spend | ≥ 3.5× |
| TDV | Total deposit value (entered in RM, shown in USD) | — |
| CTR | Clicks ÷ impressions | ≥ 3% |
| CPM | Cost per 1,000 impressions | < $40 |
| Freq. | Impressions ÷ reach — ad fatigue signal | < 3.5× |
| L→NR% | Leads that became registrations (Leads format) | ≥ 12% |
White Labels — one card per brand: today's numbers, attribution, campaign counts, manual vs webhook data mode.
Ad Creative — store the image/video + caption used per campaign, so "which ad was CodeAds013 again?" has an answer. Beta caveat: media files currently live only in your own browser — captions and data sync, the image files themselves don't yet.
Team (admin) — add/remove accounts, change roles, reset passwords.
⚙️ Settings (admin) — scoring thresholds & weights, FX rate, backups, server sync, maintenance mode.
There is no save button. Every change writes to the shared database immediately — the green ● Server badge in the header confirms it. Everyone sees the same data; a page refresh pulls the latest.
If the badge shows ○ Offline (or you see a red "sync failed" toast), your change was kept locally in that browser but didn't reach the server — screenshot it and post in the group, then retry the change once the badge is green again.