A big day.
Casino Offers: Switched to the Mobile Endpoint
Sometime between May 4 and May 8, Royal Caribbean's web casino-offers endpoint (/api/casino/casino-offers/v2) started returning fleet-wide 404s -- a single, terse {"code":"NOT_FOUND"} for every account. Every active offer in our database had last_seen_at frozen at May 4 because no sync had received fresh data since.
We've switched the scraper to the iOS app's mobile endpoint (api.rccl.com/.../mobile/v1/loyalty/casino/offers), which is now our source of truth for casino offers. A few things changed in the rebuild:
- The mobile feed moves the comp/gty/gobo signal from per-sailing booleans up to an offer-level
offerType.code/name. Without honoring that, every fresh sailing row was being inserted with comp/gobo all false and the "for Two" / "for One+1" phrasing was just bare room type ("INTERIOR" instead of "INTERIOR for Two"). That's restored -- you'll see "for Two", "for One, plus discounted guest", "for Two + $50 Free Play" again on offers where they apply. is_gty("Guaranteed cabin" -- where RC picks the specific cabin within the category at their discretion) is left false on this initial pass because the mobile feed doesn't expose the per-sailing override the same way the web API did. (We figured out the right path later in the week.)- Dollars-Off amounts now derive from offer-level
tradeInValue, and we capture the full raw response on each offer row so future normalization changes can be backfilled without re-scraping.
"New Offer" Bursts After the Outage
Because every account had been frozen since May 4, the first successful sync per account after the switch is going to diff fresh data against the May-4 state and flag a chunk of codes as "new" -- some of which weren't actually new during the outage window, they were just invisible to us.
The new-offers email shows a one-time explanation banner at the top when it detects an account is coming back from outage (the previous three sync runs all reported offers_found=0). Banner makes explicit that only casino-offer detection was paused -- sailing prices, package prices, and the rest of account sync kept running normally throughout. The heuristic is self-limiting: once a successful sync records a non-zero count, the banner stops firing.
Points Over Time
New Points Over Time tab on /casino, sitting between My Offers and Offer Value. It's an ECharts time-axis line chart of your Club Royale points balance across all your linked accounts, with a stock-style range slider for zooming. Deep-linkable at /casino#points.
If your accounts don't have points history yet, the tab shows an empty state -- new entries fill in automatically as sync runs.
Manage Accounts Button
Top of /casino now has a Manage Accounts button right next to Sync My Accounts, linking to /cruise-accounts. No more scrolling to the bottom collapsible to add or remove a linked account.
Self-Service Account Delete
A new Danger Zone section at the bottom of your settings page lets you delete your own account. Confirmation requires your current password plus typing a specific phrase, so it's hard to do by accident.
When you delete:
- Linked cruise accounts stop syncing immediately. We won't sit on RC's auth endpoint hammering your credentials.
- Any pending emails to you are dropped at dispatch -- nothing further leaves our system.
- Login is rejected with an explicit error message.
- SMS notifications stop.
- Your name and email are filtered out of any other users' notification recipient lists.
It's a soft-delete on the database side (so admin can audit or restore if you wrote in by accident), but every layer that could otherwise reach out to you honors the delete.
Club Royale ID on Cruise Accounts
Your Club Royale ID is now shown on /cruise-accounts (under your Loyalty ID), and as a small subtitle under your friend's email on their profile page. The data was already being captured during sync, just hadn't been surfaced on these two pages.