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
Is SnapDance getting found on Google and recommended by AI assistants?
G
Google clicks
-
People who found SnapDance on Google
AI citation rate
-
-
Live backlinks
-
Other websites linking to snapdance.app
Brand mentions
-
Sites that name SnapDance without a link

Which AI assistants mention SnapDance

See the questions
Share of each AI's answers that named SnapDance (US and Canada, failed calls left out). Runs on the 1st of every month.

Blogs

Articles on snapdance.app and whether Google has picked them up
-
published
-
sent to Google
-
indexed by Google
-
need attention
Loading...
Articles written by the automation (0 drafts)
Drafts wait here for you. Preview one, then Publish: it goes live at snapdance.app/guides/ at once and appears in the list above, ready to submit to Google.
Loading...

What needs attention

Loading...
Company profiles checklist
What lets an AI assistant resolve "SnapDance" into a thing it can cite, rather than a word it has seen. Mostly one-time setup, not a weekly job.
Loading...
Event directories checklist
Where an event planner looks for someone like us. One-time listings, made by hand: none of these has an API, and a robot filling in a vendor signup form is how we lost dev.to. Copy the tagged link into the listing, or the clicks land in Direct and no row ever shows them.
Loading...
Automation historyShow full history
Placements per batch: claimed vs verified
A claimed placement is one a batch created. It only counts once the verifier has refetched it and found our link live. Grey far above green means placements are being made but not surviving verification.
Verified Claimed, not yet verified
Placements by channel
Batches
Select a batch
PlacementLandingStatusSessionsPaid
Pages the chatbots trust
The pages the AI answers leaned on, ranked by how often they were cited.
Content briefs
One per benchmark question. Click a row for the full brief.
Google organic traffic & conversions
×
-
Placement - · -
Live URL
-
Outbound link
-
Verification
-
Anchor text
-
Attribution
-
Campaign links
Build tagged links for an email campaign. Everything here is checked against the live Traffic Source vocabulary before you send it.
Only these are counted. A source off this list lands in no row at all.
Names this email program, the way video_ready_email does.
Keep it identical across every email in the run, or the cohort splits in reporting.
The breakdown shows the top 20 of these per source, so keep the list to the sends you want to compare.
Your links
Social Channels
Manage and monitor your automated content across all platforms.
Reels
One video, posted to YouTube, TikTok, Instagram and Facebook.
Loading...
Pinterest
Blog content turned into Pinterest pins.
PinLandingStatusWhen
Outreach
SMS + ringless voicemail campaigns against an uploaded contact list. See docs/outreach-sms-voicemail.md
Venue demos
CompanyVideoDemo URLVisitsPlays CompletionsRateCTA clicksLast activity
Loading...
Cruise lines
one link per person. These pages track visits only, not plays.
Cruise linePeopleVisitsOpened byLast activity
Loading...
Event Planners
Planner Company Phone Events Status Last seen
Loading planners…
Stations
Events
Event When Planner Generations Videos Performance Paid
Loading events…
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…
Model Lab (temporary)

Admin-only test bench for cheaper alternatives to our Kling v2.6 motion control: Viggle character swap, Wan 2.2 Animate Replace and a video face swap. Nothing here reaches users, spends user credits or appears in any user list. Runs spend real provider money up to the daily cap (modelLabDailyCapCents). See docs/model-lab.md.

Loading the Model Lab...
Workspace

Every tool and account SnapDance is connected to, with the login that opens it. Logins only: passwords, keys and 2FA live in each console and in Railway variables, never here. To add a service, see docs/workspace-hub.md.

Loading workspace...
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…
Referral Partners
Programme settings
The partner payout minimum is separate from the creator payout threshold (System Settings). The attribution window and recurring period default to what the affiliate programme already did: a 90-day referral link and 3 months of repeat payments after the first.

Payout requests
Refunds waiting for a decision
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.
Helper chats
The latest typed chats and voice calls with the website helper (events, birthday, order and Stations pages), newest first, with what they cost. Messages visitors ask the helper to pass on to the team are in All forms as "Website helper".
All forms
Every form a visitor sends, on any page or in the app: contact and quote forms, Help, deletion requests, Stations sign-ups (finished and unfinished), guest contact details. Source is where the person first came from. Existing user means the email or phone belongs to an account (they were signed out); New means no account has it.
Select rows to act on several at once.
Loading…
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. Decided claims can be archived (hidden here, kept on the Archive screen) or deleted outright; deleting a granted claim never takes its credits back.
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…
Rewards Archive
Claims hidden from the main Rewards queue. Nothing here was deleted; Unarchive returns a claim to the main queue exactly as it was. Delete still removes a row outright and never claws back credits a granted claim already paid out.
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