What’s happening here is that Cloudflare or Prerender is accidentally stripping or blocking Bubble’s token verification. When a user clicks that link, Bubble needs to instantly read the ?reset=… token from the URL to validate the session. If Cloudflare strips the query parameters or Prerender serves a cached static version of the page instead of letting Bubble’s backend initialize, the verification fails and throws that generic error.
Since you’ve already unlinked the custom domain inside Bubble settings, you just need to tell Cloudflare and Prerender to step aside for that specific URL.
Here is how to tweak your setup:
1. Tell Prerender to ignore the reset page
Prerender is meant for bots, but it can sometimes interfere with regular user routes if the user-agent check isn’t perfect. You need to make sure the /reset_pw page bypasses it entirely.
Open your Cloudflare Worker script (where your Prerender logic lives).
Add a quick condition at the top to completely ignore the reset route and pass it straight to Bubble:
if (url.pathname.includes(‘/reset_pw’)) {
return fetch(request);
}
2. Create a Cloudflare Cache Rule
Cloudflare might be trying to cache the page shell aggressively.
Go to your Cloudflare dashboard and head to Caching > Cache Rules (or Page Rules).
Create a rule where the URL path contains /reset_pw.
Set the action to Bypass Cache.
(Optional) If you use Rocket Loader, disable it for this specific path as well, as it can delay Bubble’s core scripts from reading the URL parameters fast enough.
3. Check your Query String settings
In Cloudflare under Caching > Configuration, look at your Caching Level. Make sure it’s set to Standard. If it’s set to “Ignore Query String”, Cloudflare will literally chop off the ?reset=000… part before passing the request to Bubble, which guarantees the token will never reach your app.
Once you ensure Cloudflare passes the URL and parameters raw and untouched to Bubble for that single route, your custom domain links will start working perfectly