Pick a plan, then build.
You won't be charged until you publish your page. Build first, pay when you're ready.
Not sure? Pick Starter — you can upgrade anytime in seconds.
Your live link-in-bio page URL. Share this everywhere.
Design your page.
Every change reflects in the live preview instantly. Hit Publish when ready.
Choose how your link buttons look on the page.
Add social proof quotes from fans, brands, or collaborators. Shown as styled pull-quote cards on your page.
Add a subscribe widget to your page. Collect emails from fans directly on your link page.
Step 2 — Tap ⬆ Upload to pick a photo from your phone or computer
Step 3 — Paste the link to the original post (Instagram, TikTok, etc.)
Step 4 — Repeat up to 6 times
1. Open your video on YouTube → copy the URL from the address bar
2. Paste it in the Video URL field below
3. For the thumbnail: your YouTube video ID is the part after
?v= in the URLThumbnail URL:
img.youtube.com/vi/YOUR_ID/hqdefault.jpg
1. Paste your video link in the Video URL field
2. For the thumbnail: tap ⬆ Upload to upload a screenshot of your video
Add any card you want — Buy Me a Coffee, Merch, Patreon, Donations, Throne, Discord, collabs, booking links, anything.
Sell presets, eBooks, templates, courses, exclusive content — anything digital. Add a product image, price, and link to your checkout.
Add a Spotify or SoundCloud player to your page. Visitors tap play — full playback with Spotify, no account needed for SoundCloud.
🔊 SoundCloud — plays fully for everyone, no account needed. Great for ambient/background music, beats, or independent releases.
⚠ Autoplay notice: Browsers block music from playing automatically when someone first visits a page — this is a browser security rule that cannot be overridden. Your visitors will see the player and need to tap Play themselves. We recommend telling your fans in your bio or links that you have music on your page so they know to press play.
Add emoji or symbols to the bottom of your page. Separate each symbol with a space.
Choose your plan.
7-day money-back guarantee. Cancel anytime. No contracts.
7-day money-back guarantee. If you're not satisfied within 7 days of your first payment, you can request a full refund directly through your billing portal — no questions asked. This applies to your first charge only.
Cancel anytime. Cancel directly from this page — no emails, no support tickets. You keep full access to all features until the end of your current billing period. No partial refunds are issued for unused time after the 7-day window.
Renewals. Monthly subscriptions renew automatically on your billing date. You'll receive an email reminder before each renewal. Cancel before your renewal date to avoid being charged for the next period.
Fully self-serve. Cancellations and refund requests are handled automatically through our Stripe billing portal — no email required. Click Manage / Cancel below, select your action in the portal, and Stripe processes it instantly. Refunds are returned to your original payment method within 5–10 business days.
Your studio.
All clients.
| Client | Niche | Plan | Status | Page URL | Actions |
|---|---|---|---|---|---|
| Loading clients… | |||||
New intakes.
Clients who have submitted intake forms and are awaiting their page build.
| Name | Niche | Package | Add-Ons | Deposit | Submitted | Actions |
|---|---|---|---|---|---|---|
@velvet_noir |
Niche A | Standard — $275 | Analytics, Music | ✓ $137.50 | 2h ago | |
LuxLynx.co |
Niche B | Premium — $500 | Analytics, Store, Media Kit | ⏳ Awaiting | Yesterday |
Configure your studio.
Enables one-click photo uploads for your clients inside the page builder. Free account — 25GB storage.
-- USERS TABLE (extends Supabase auth.users)
create table public.profiles (
id uuid references auth.users on delete cascade primary key,
name text,
role text default 'client', -- 'client' or 'admin'
plan text default 'free', -- 'free', 'starter', 'creator', 'premium'
username text unique,
created_at timestamptz default now()
);
-- PAGE DATA TABLE
create table public.pages (
id uuid default gen_random_uuid() primary key,
user_id uuid references public.profiles on delete cascade,
page_data jsonb default '{}'::jsonb,
published boolean default false,
page_url text,
created_at timestamptz default now(),
updated_at timestamptz default now()
);
-- Enable Row Level Security
alter table public.profiles enable row level security;
alter table public.pages enable row level security;
-- Policies: users can only see/edit their own data
create policy "Users can view own profile"
on public.profiles for select using (auth.uid() = id);
create policy "Users can update own profile"
on public.profiles for update using (auth.uid() = id);
create policy "Users can view own pages"
on public.pages for select using (auth.uid() = user_id);
create policy "Users can update own pages"
on public.pages for all using (auth.uid() = user_id);
-- Admins can see everything
create policy "Admins see all profiles"
on public.profiles for all using (
exists (select 1 from public.profiles where id = auth.uid() and role = 'admin')
);
create policy "Admins see all pages"
on public.pages for all using (
exists (select 1 from public.profiles where id = auth.uid() and role = 'admin')
);
-- Auto-create profile on signup
create or replace function public.handle_new_user()
returns trigger as $$
begin
insert into public.profiles (id, name, role)
values (new.id, new.raw_user_meta_data->>'name', coalesce(new.raw_user_meta_data->>'role','client'));
return new;
end;
$$ language plpgsql security definer;
create trigger on_auth_user_created
after insert on auth.users
for each row execute procedure public.handle_new_user();