Checkout success/cancel URLs and the customer-portal return URL were built
from NEXT_PUBLIC_APP_URL, so a user on a white-label host came back to the
canonical app, where they hold no session, and saw a foreign-branded login.
Both routes now resolve the request host through resolveRequestAppOrigin:
a registered white-label host stays on its brand, anything else falls back
to the canonical app. Return paths stay fixed literals.
Claude-Session: https://claude.ai/code/session_01DAGcgQDEAGmhGNSeMbgsn2
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>