// ngrok troubleshooting

ngrok URL keeps changing — how to keep one stable URL on the free plan

On ngrok's free plan, the public subdomain rotates every restart. Webhook providers and OAuth callbacks break each time. Here's how to handle it without paying for a static domain.

What it means

ngrok generates a fresh random subdomain on each free-plan session. Stripe / GitHub / Auth0 only let you set one webhook URL at a time, so each restart breaks the integration.

Common causes

  • Free plan policy — paid plans get reserved subdomains.
  • Workaround attempts (passing --subdomain) require a paid plan.

How to fix it on ngrok

  1. 1. Upgrade to ngrok Pro to claim a reserved subdomain.

  2. 2. Or update the webhook URL on every dev session

    Tedious; some providers (Stripe) can be scripted via API to update on each ngrok start.

// the same workflow on lrok

lrok's free plan includes one reserved subdomain that lives forever. Reserve it once and ship it as a Stripe / GitHub webhook URL that survives every restart.

  1. 1. Reserve a name

    $ lrok reserve mysite
  2. 2. Tunnel with --hint

    $ lrok http 3000 --hint mysite
  3. 3. URL is permanent

    https://mysite.lrok.io is yours until you release it — across days, restarts, machines.

More ngrok issues