Checking access…
Overview
LIVE
→
Showing: All time
Active Creators
-
Live Templates
-
Downloads
-
Total Created Accounts
-
Paying Users
-
GROWTH
-
CHURN
-
Live Templates over time
Quick Actions
System Status
Checking services…
Template Queue
or →
Fixes dances that show "No Original Song".
🎶
No pending creator templates.
This tab also includes custom admin-uploaded videos (the Upload template tab drops them here for review).
🔍
No pending videos. Run the scraper to find new dances.
✅
Nothing waiting to publish right now.
🎉
No templates published yet.
🗑️
No rejected templates. Anything you reject, hide or delete lands here and can be restored.
Loading…
Loading…
Creators
Joined between →
Creator Category Source ↕ Templates ↕ # Posts ↕ Revenue ↕ # Referred Users ↕ Credits ↕ Status
Loading creators…
Users
Joined between →
View
User ↕ Login / Platform ↕ Source ↕ Email ↕ Phone / TikTok ↕ Location ↕ Joined ↕ Last active ↕ Generations ↕ Plan ↕ Credits ↕ Status ↕ Device IP ↕
Loading users…
Generations
Generation analytics
Unaccounted Assets
The reconciliation state has not been read yet
This card fills in as soon as the server answers. If it never does, the button below still works.
What this screen is. We ask Cloudinary to list every file it is storing for us, then ask our own records to explain each one: a generation, a template, an upload log, a creator's avatar. Whatever is left over: the files nothing we store mentions: is listed here.

Being listed does not mean a file is broken, unused, or bad. It means only that we cannot say what it is for. Most of these are ordinary photos and videos whose paperwork went missing: the mobile app uploads selfies straight from the phone to Cloudinary, so the server never saw that request and no record of it could ever have existed. Some are from before we kept records at all. Some belong to a different product that shares this Cloudinary account, and those are marked and cannot be deleted from here.

Each row carries our best explanation, labelled Known cause, Likely cause or Guess: a guess is only a guess, and is never worth chasing as if it were a finding. If you are looking for one specific file, use Look it up below: a file that is healthy is absent from this list, and absent looks exactly like missing.
Uploaded between →
Reconciling against Cloudinary…
Creator Categories
ℹ️ Changing a creator's category updates their revenue share immediately (not retroactive to previous months).
Category Monthly Posts Min New Paid Users Min Referrals Referral % Referral Period Payout per Generation Creators
Loading categories…
Payout Rules & Queue
Global Payout Rules
Loading payout requests…
Pending Payouts
Total due: $0.00
Loading payouts…
Traffic Source
LIVE
→
-
attributed visitors
Platform
Find a video by its code every SnapDance video carries an invisible 8-character code; paste it to see whose video it is
Daily visitors
SEO & LLM
-
Verified backlinks
-
-
Brand mentions
-
-
Referring domains
-
unique registrable domains
Placements by channel
-
-
Google organic clicks
-
-
AI citation rate
-
-
Verified placements per batch, and AI citation rate
Verified backlinks Verified mentions AI citation rate
AI visibility
10 benchmark prompts × 4 models, re-run weekly.
Google organic traffic & conversions
Placements by channel
Batches
Select a batch
PlacementLandingStatusSessionsPaid
×
-
Placement - · -
Live URL
-
Outbound link
-
Verification
-
Anchor text
-
Attribution
-
Event Planners
Planner Company Phone Events Status Last seen
Loading planners…
Event Catalog
Loading catalog…
Event Settings & Content
Business settings
Loading settings…
Landing page & email content
Loading content…
Events Data Migration
ℹ️ The import only reads the legacy events JSON files and only adds what is missing in the database - it never deletes or modifies the JSON files, and re-running it is safe. A dry run touches nothing.
Last completed run
Loading…
Needs review
Loading…
User Access Management
Loading admin users…
System Settings
Feature Flags
Google OAuth Login
Apple OAuth Login
TikTok OAuth Login
Creator Signups
New User Registrations
Solo-only Creator Imports
Mobile Cloudinary Preview
Scraper (hashtag discovery)
AI assistant (support tickets)
Financial Overview
Loading…
Gross Revenue
-
total collected
Total Costs
-
all categories
Net Revenue
-
gross − costs
Margin
-
net ÷ gross
Loading…
Affiliate Program
Loading…
Promo Codes
A code can be redeemed once per account. Editing a code's credit value only affects redemptions made after the change: past redemptions keep the amount they were granted. Codes are paused rather than deleted so their usage history is never lost.
Loading…
Messages
One thread per user. Sends and replies also push to the user's devices and land in the in-app Inbox. Broadcast campaigns (Announce / push-all) appear in every user's Inbox automatically and are not listed here.
Select a thread, or use "Message" on a user in Users → Investigate.
Support
Every ticket was opened from /help or the app. The assistant answers first; only the user decides whether that landed, and a ticket they escalate sits at the top of this list. Replying here also lands in the user's in-app Inbox when their ticket is tied to an account.
Pick a ticket on the left.
Deletion Requests
Every request here was filed from /account-deletion, /content-deletion or the app. Nothing happens automatically. A request cannot be executed while it is still inside its cancellation window, and the requester can withdraw it up to that moment. Free accounts keep their published gallery dances by default after the account goes; for a paying account the choice is yours. Every switch below is independent, and each starts on the rule so the ordinary case is one click.
Loading…
Name Changes
Every row is a creator asking to rename a dance that is already live. The dance keeps the name it has until you approve the change. A refusal needs a reason: the creator is shown it, so "no" on its own is what sends them to support instead of back with a better name.
Loading…
Promotions
A creator asks to spend part of their earned cash balance (royalties plus affiliate, never credits) to have one dance placed higher on the Dances grid. Nothing is charged until you approve. Approving debits the amount once and starts the run window; declining an active promotion refunds the full amount that was charged, and can only do so once. Declining a pending request costs the creator nothing, because nothing was taken. Give a reason when you decline: the creator reads it word for word on their dashboard. Placement is capped at 4 dances at a time and they never occupy the first card of the grid, so the newest-first ordering still means something. Amounts, slots and run length live at System Settings, Credits.
Loading…
Rewards
Confirming a claim grants credits to the creator's earned bucket and is audit-logged. The two reward types are priced independently, editable at System Settings, Credits tab: TikTok post = 300 credits, store review = 300 credits (0 disables new store-review grants without breaking the claim/deny workflow). A confirmed claim can never grant twice. For store reviews, check the store listing first: reviews cannot be verified by API. One store-review claim per account, ever, regardless of which store or device it was filed from. Every TikTok post files a claim automatically; the follower floor is a SIGNAL (below-floor claims are badged) and the decision is the admin's. Floor set in System Settings, App & Web Configs. The inbox flow posts through the creator's own TikTok token, so the post always lands on the account they authed with.
Loading…
Pending Confirmations
TikTok posts and review claims waiting for a human check. Open the verification link before confirming a claim in the queue.
Loading…
Referral Chains
Referrer, then everyone who joined through their link, with template and first-qualifying-generation progress per invitee.
Loading…
Award History
Loading…
What users shared on social media
Every dance a user posted to their own TikTok account, and what happened next. We post as a DRAFT to the user's TikTok inbox (the app holds the upload permission, not the publish one), so a post only becomes public when the user finishes posting it themselves. Engagement is counted 7 days after the post and only for videos TikTok gave us a public id for. Where that is blank the reason is shown; a blank is never the same thing as zero.
Loading...
Data & Safety
Store health, volume space, off-volume backups, whole-deployment export/import and creator recovery. Anything that can change or delete data runs as a DRY RUN first and then needs a typed confirmation that spells out what changes: no single click on this screen destroys anything.
Store health
Loading…
A store marked lost is a one-way trap: writes are refused to protect what is still on disk, so no .bak is ever written and every backup taken after the damage records the file as unreadable. It cannot recover on its own: repair it here.
Loading…
Railway volume usage
Loading…
Loading…
Reclaim space
Deletes pipeline scratch, staged media whose durable copy is in Cloudinary, scraped downloads no store references any more, decided scrapes (downloads already approved or rejected, with durable copies on Cloudinary), and expired import artifacts. Lowering the import artifact age shortens the window in which an import can still be rolled back.
Off-volume backups
Loading…
Loading…
Export everything
A gzipped tar of every store, restorable here or on another deployment.
This restores state, not assets
Durable media lives in Cloudinary and is referenced by URL from inside the stores. Selfies, scraped video and audio on the volume are scratch and are not in the archive: it does not survive losing the Cloudinary account.
Loading preview…
Import an archive
Import replaces whole files: it never merges
Each store in scope is replaced in its entirety. A real apply also signs everyone out (sessions are not in a default export). The file it replaces is kept as a .preimport- snapshot for 7 days, which is the whole rollback window.
Step 1
Validate: writes nothing
Step 2
Dry run the apply
Step 3
Apply for real
Import history
Loading…
Loading…
Creator integrity
Loading…
Cross-references every store that names a creator id against creators.json. An id other stores still reference but the creator store no longer has is proof of loss, not a fresh install.
Loading…
Rebuild lost creators
Reads RevenueCat, Stripe and Firebase: this one is not automatic.
Rebuilds missing creators under their original ids so the stores referencing them line up again. It never overwrites a creator that exists. A row rebuilt with no email cannot reconnect anyone: sign-in matches on email: so Undo exists to drop reconstructed rows that carry nothing.
Click “Build plan”: it calls external APIs and can take a minute.
Billing & Activity
From To
Kling $/gen Music $/gen
Showing: All time
Loading billing data…
Group by:

ℹ️ Creator payout = per-run $ × template runs in app. Live run counts require app backend integration.

Start Scrape

Run the scraper with today's hashtags + keywords

Scraper enabled

Videos · Min likes (default 10K)

Add Manual URL

Paste a TikTok, Instagram or YouTube dance URL to add it directly

Manage Hashtags

Add hashtags for future scraping runs

Creator Payout Settings

Set how much creators earn per template run