movetowhop
v0.2.0
Published
Move a creator business to Whop from Kajabi, Skool, Circle, Stan, Teachable, Patreon and more, from your terminal or your AI agent: plans, fee comparisons, local member-file conversion, and the build on Whop with your own key (hidden first, resumable). Me
Maintainers
Readme
movetowhop
Move a creator business to Whop from Kajabi, Skool, Circle, SamCart, Stan, Teachable, Thinkific, Patreon, Podia, Mighty Networks, Gumroad, LaunchPass, ClickFunnels, Kartra, Memberful, Systeme.io, LearnWorlds, Hotmart or InviteMember, from your terminal or your AI agent. Every command has --json.
npx movetowhop@0 --help
npx [email protected] --help # or pin an exact version instead of floating on @0- Your member files stay on your computer.
convert,import,linksandinvitesrun locally with MoveToWhop's own parsers. Member lists are written to files only you can read (mode 600), and the output shows counts, never member rows. - Your Whop key stays on your computer.
applybuilds on Whop straight from this machine with your own Whop API key, sent only toapi.whop.com. MoveToWhop's servers never see it. - Hidden first, and you approve what people see. New products, plans, courses and apps are created hidden. Anything a member or buyer would see (forum posts, making products visible) or that changes something already on your Whop waits until you approve it in your own terminal. An AI agent can't approve it for you.
- Resumable. Each run keeps a run file (mode 600). Run the same command again to carry on. What an earlier run made is reused, not copied.
- No dependencies. Node 18.17 or newer (
export --cdpneeds Node 22).
MoveToWhop is independent and not affiliated with Whop, Inc. It may earn a Whop referral fee when you create a Whop through its links.
Your Whop API key
apply and migrate need a key for the business you're moving into. Create it in Whop: Dashboard → Developer → API keys → Create. Name it "MoveToWhop migration (delete after)". Choose a custom permission set with exactly these permissions:
company:basic:read access_pass:basic:read access_pass:create access_pass:update plan:basic:read plan:create plan:update
experience:create experience:attach experience:update courses:read courses:update forum:read forum:post:create
forum:moderate chat:read chat:message:create chat:moderateGive it an expiry a week out if Whop offers one. Then, in your own terminal (never in a chat with an AI):
export WHOP_API_KEY=… # for this shell only
npx movetowhop@0 whop key set # or store it in your keychain (asked with the input hidden)
npx movetowhop@0 whop status # checks the key: its business and the permissions it can readWhere the CLI looks, in order: --api-key-env NAME, --api-key-file PATH (refused unless only you can read it), WHOP_API_KEY, ~/.config/movetowhop/whop-key, your OS keychain, then a hidden prompt. There's no --api-key option, because a key on the command line ends up in your shell history and in agent transcripts.
Your AI agent can read anything your shell can. Use a key scoped to this move and delete it in Whop when you're done (npx movetowhop@0 whop key delete removes the stored copy). No Whop business yet? Create one at https://whop.com/start/?code=MIGRATE, then make the key there.
A full migration
movetowhop plan <platform>shows the steps, andmovetowhop sync <your public link> --out inventory.jsonreads your public store or community page (products, prices, course outlines).- Export your members on your old platform (the plan lists the clicks), then
movetowhop convert <export.csv>. It writes<export>.whop.csv(one row per member, with the trial that lines up their first Whop charge with their old renewal date, and a claim-link placeholder) and<export>.inventory.json(products, prices and hidden "existing members" claim plans). Check the prices. - If you used MoveToWhop's browser harness or extension:
movetowhop import movetowhop-inventory-….json --members movetowhop-members-….csvreads both files instead. movetowhop apply inventory.json --account biz_… --dry-runshows what it will build. Then run it without--dry-runand type your business name to confirm.applybuilds it with MoveToWhop's own engine and your own key, or build it in the free wizard with your Whop sign-in instead: openhttps://movetowhop.com/migrate?from=<platform>&link=<your store or community link>, check what Sync found, drop the same member export (it stays in your browser) and press Move to Whop. Both reuse the products, courses, apps and lessons an earlier run made. Whop's MCP server (https://mcp.whop.com/mcp) and the Whop CLI cover products, plans and promo codes only. They can't create apps, courses, chapters, lessons or forum posts, so keep them for edits after the move.movetowhop links <export>.whop.csv --state <run file>fills each member's claim link, andmovetowhop invites <export>.claim.csv --template a|b --business "<name>"writes the invite list and the email to mail-merge. Templateais for subscriptions in your own Stripe account, which move with Whop Migrations (https://whop.com/dashboard/<biz_id>/settings/stripe-migrations/). Templatebis for members who re-join through their claim link.- Check the new products on Whop and make them visible there. Send the invites with the announcement templates, and keep your old platform running until paying members have moved.
Or let the CLI walk you through all of it:
npx movetowhop@0 migrate https://your-site.mykajabi.com --members members.csvCommands
movetowhop platforms [kajabi] # what moves from each platform, and how subscribers move
movetowhop plan skool --members 800 # step-by-step migration plan (markdown)
movetowhop fees --from kajabi --plan Growth --revenue 10000 --price 49
movetowhop sync https://acme.mykajabi.com --out inventory.json
movetowhop convert members.csv # → members.whop.csv + members.inventory.json (local, mode 600)
movetowhop import movetowhop-inventory-skool-2026-10-14.json --members movetowhop-members-skool-2026-10-14.csv
movetowhop outline curriculum.txt # chapters and lessons; YouTube/Loom become embeds (local)
movetowhop apply members.inventory.json --account biz_XXXX [--dry-run] [--json]
movetowhop migrate <link> [--members <file>] [--json]
movetowhop links members.whop.csv --state members.run.json
movetowhop invites members.claim.csv --template b --business "Acme"
movetowhop website https://acme.com --account biz_XXXX
movetowhop whop status | whop key set | whop key delete
movetowhop export kajabi --cdp --i-own-this-account --user-data-dir ~/.movetowhop-export-profile
movetowhop setup [claude-code cursor codex …] [--dry-run]
movetowhop prompt --client claude --platform kajabi
movetowhop up --from skool --url https://www.skool.com/acme
movetowhop mcp [--stdio]
movetowhop payloads inventory.json --account biz_XXXX # the raw Whop API requests, for review
movetowhop guides search "export skool members" | guides get /compare/whop-vs-kajabi | facts feesGlobal options: --json, --base-url <url> (default https://movetowhop.com, or MOVETOWHOP_BASE_URL).
For AI agents
- Ask first, then confirm with a code.
apply --jsonandmigrate --jsonprint NDJSON events and stop at every checkpoint only the creator can clear, with what to show them and the exact command to resume, e.g.{"event":"needs","needs":"confirm","summary":…,"confirm":"1c57582d","resume":"npx movetowhop@0 apply … --confirm 1c57582d"}. Show the creator the summary and run the resume command only after they say yes in the chat.--yesdoes the same, and is only for after that yes. - You can't approve what people see. Steps a member or buyer would see stop with
"needs":"approval". The creator approves them by running the printed command in their own terminal, where it asks them to type the business name. - Never ask for the key in the chat. If there's none, you get
"needs":"whop_key"with the steps for the creator to follow in their own terminal. - Member files stay files. Pass paths, and never read member CSVs into the chat.
- One step to connect:
npx movetowhop@0 setupdetects Claude Code, Claude Desktop, Cursor, Codex, VS Code, Gemini CLI and Windsurf. It shows every change and asks first. It writes user-level config only (never.mcp.jsonor another project file), never a key, and installs the MoveToWhop skill for Claude Code and Codex. - Local MCP server:
npx movetowhop@0 mcp --stdioserves MoveToWhop's tools plusapply_migration,fill_claim_links,build_invitesandexport_with_browser, which run on the creator's computer. It reads the key from the shell,~/.config/movetowhop/whop-keyor the keychain, never from a client's config. A config that namesWHOP_API_KEYis refused. Member-visible steps ask the creator through the client's own approval form (MCP elicitation) or in their terminal. - Browser harness:
movetowhop harness <platform>prints a snippet for your evaluate tool. It downloads the harness fromhttps://movetowhop.com/harness/and runs it only if its SHA-256 matches the hash pinned in this package (lib/harness-pins.json, also athttps://cdn.jsdelivr.net/npm/movetowhop@0/lib/harness-pins.json). Ask the creator before you run it in their signed-in tab. - Remote MCP server:
https://movetowhop.com/mcp. REST + OpenAPI:https://movetowhop.com/api/agent,https://movetowhop.com/openapi.json. Agent Skill:https://movetowhop.com/skills/movetowhop/SKILL.md. Docs: https://movetowhop.com/agents.
Development
lib/core.mjs is generated from the MoveToWhop repo (node scripts/build-agent-files.mjs, also run on npm pack/npm publish), and lib/harness-pins.json by node scripts/publish-harness.mjs. Don't edit either by hand. The skill pack is copied into skills/ at pack time.
Publishing: the owner runs npm publish in cli/ from their own npm account, with 2FA required for writes.
