Skip to content

Prod Clerk cutover: follow-up cleanup and verification #257

@ChesterSchendel

Description

@ChesterSchendel

Context

Tonight (2026-05-28) we cut runladder.com production over from dev Clerk (pk_test_) to prod Clerk (pk_live_, clerk.runladder.com). The cutover itself works (Google branding confirmed, prod webhook wired, provisioning service account in place — user_3ENqFcFXNNjstCfR5SCiMX2fWhV), but the prod Clerk database starts empty. Everything that lived on dev Clerk — users, orgs, memberships, tokens — does not exist on prod.

This issue tracks the cleanup and verification work needed to fully stand up prod. Items marked blocking should be done before the client demo (~7-10 days out).

Checklist

Internal Drawbackwards org

  • Blocking. Re-create the internal Drawbackwards org on prod cleanly (the dev version was cobbled together via the Comps feature). Provision via /admin/clients so it uses the service account createdBy pattern.
  • Set the org's internal: true metadata so the dashboard suppresses the "Complimentary Team" plan strip (see isInternalOrg in src/lib/orgs.ts). Without this, internal members will see the comp-team framing meant for external clients.
  • Re-invite all Drawbackwards team members (Ward, Chester, Michael, Jordan, Sara, Sean) with appropriate org:admin / org:member roles. Each one needs to create a fresh prod Clerk account when they accept.

Figma Plugin (drawbackwards/ai-design-assistant)

  • Blocking. Verify the plugin works end-to-end against prod Clerk. Plugin tokens are issued via POST /api/plugin/issue-token (Clerk session required) and verified via POST /api/plugin/verify-token. Existing plugin tokens issued under dev Clerk userIds are orphaned — anyone using the plugin needs to re-auth.
  • Confirm /api/plugin/analyze and /api/plugin/persist-score work against prod.
  • Test the in-plugin auth flow: log in to prod runladder.com, generate token, paste into Figma plugin, score a frame.
  • Update the plugin marketplace listing if anything changed (probably nothing — same endpoints).

Claude Skill (Ladder for Claude)

  • Blocking. Verify the Skill works end-to-end against prod Clerk. Skill tokens issued via POST /api/skill/token (Clerk session required). Same story as plugin: existing tokens orphaned.
  • Confirm /api/skill/score works against prod.
  • Re-issue Ward's skill token from his new prod account so his Claude.ai install keeps working.

Stripe

  • Blocking. Audit Stripe customer / subscription records. Stripe customer IDs are linked to Clerk userIds in our system. Any paid subscription created during the dev Clerk period is now orphaned (the new prod userIds won't match the Stripe customer records).
  • Decide policy: re-link manually for the small number of paid users we have, or accept resub for everyone.
  • Verify Stripe is in live mode in prod env vars (not test mode). This is the analog to the Clerk dev/prod split — same audit. See related dev-environments task Stand up a Dev, Stage, and Prod Environment #249.

Webhooks

  • Confirm the prod Clerk webhook is firing on the right events. Hit it manually with a test event from the Clerk dashboard if available.
  • Confirm organizationMembership.created actually flips new members to tier: team end-to-end on prod (the tier flip path is what makes invited designers see the Team UI).
  • Audit any unprocessed dev Clerk webhook events — they're gone, but check if anything was mid-flight.

Admin / role gating

  • Verify ADMIN_EMAILS env var is set in Vercel Production scope and contains the right Drawbackwards email addresses. The env var is not Clerk-tied, but the gate runs the lookup against the Clerk session, so it needs to match the email on each user's new prod account.
  • Confirm /admin/* access works for Ward + Chester after they create their new prod accounts.

Beta codes / Comps

  • Beta codes live in Redis (separate from Clerk), so they survive the cutover. Verify the codes list at /admin/beta-codes still resolves correctly.
  • Re-issue any active comp subscriptions that were attached to dev Clerk userIds (likely zero outside the Drawbackwards org).

Site password gate

  • Confirm SITE_PASSWORD still works on prod (it's environment-scoped but not Clerk-tied).
  • Verify the bypass-for-signed-in-users logic (/hq/decisions entry) still works after the Clerk swap.

In-flight dev invitations

  • Any org invitations sent via dev Clerk before tonight's cutover are now broken — they point at the dev Clerk Accounts portal, which can't sign users into prod runladder.com. Tell anyone with a pending invite to ask for a fresh one.

Other surfaces (lower priority)

  • Ladder API + MCP — roadmap, not built yet. No cutover impact today. See /hq/journeys API/MCP section.
  • Ladder Pulse — runs in a separate codebase (ladder-beta), not affected by this cutover.

Closing tasks

Notes

This list is comprehensive but every item is small. Bulk of the work is the Drawbackwards org re-setup and the plugin/Skill verification. Stripe audit is the riskiest because money is involved — do that one carefully.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Claude SkillTasks for Ladder Claude SkillFigmaTasks for Ladder Figma PluginRun WebTasks for Ladder web analysisenhancementNew feature or request

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions