Skip to content

[pull] main from TryGhost:main#1121

Merged
pull[bot] merged 7 commits intocode:mainfrom
TryGhost:main
May 6, 2026
Merged

[pull] main from TryGhost:main#1121
pull[bot] merged 7 commits intocode:mainfrom
TryGhost:main

Conversation

@pull
Copy link
Copy Markdown

@pull pull Bot commented May 6, 2026

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

mike182uk and others added 7 commits May 6, 2026 11:27
ref https://linear.app/ghost/issue/BER-3529

- the social media preview rendered at `/gift/:token` (title,
description, noscript fallback) was hardcoded English, leaving
non-English sites with mismatched OG metadata when gift links are shared
- wrapped user-facing strings with `t()` and added 5 new keys to the
ghost namespace
- duration label uses the established `1 X` / `{n} Xs` two-key split
(matching `portal.json`) rather than appending `s` to a bare unit, since
plural rules and word order vary by locale
- initialised i18n in the controller test before requiring the
controller so the destructured `t` import resolves to the live `i18next`
instance
ref #27396

 - staff users have had Threads, Bluesky, Mastodon, TikTok, YouTube,
    Instagram and LinkedIn since 5.117; publication handles for the same
    networks were missing, so themes using `{{@site.linkedin}}` or
    `{{social_url type="threads"}}` had nothing to render
 - the two social input surfaces (publication settings, staff modal)
    carried parallel per-platform branches for URL conversion and
    validation; putting them behind a shared SOCIAL_PLATFORM_CONFIGS
    table means adding the next network is a config entry, not
    coordinated edits across three files
 - LinkedIn's display value was drifting between blur and reload: a
    regional URL like https://uk.linkedin.com/in/foo would persist on
    screen after blur but flip on reload because the stored handle
    drops the regional prefix; routing post-blur display through
    toStoredValue → toDisplayValue closes the gap for all platforms
 - a capability gate hides the new fields when none of the new keys
    are in the settings response, so the admin can deploy before or
    after the backend without silently losing user input to the API's
    unknown-key filter
no issue

## Summary

- aborts the Ember `setup.done` transition before handing off to the
React onboarding hash route
- updates onboarding E2E coverage to exercise the production-shaped
`firstStart=true` root redirect
- allows onboarding step navigation assertions to tolerate query params
before the hash

## Root cause

The hosted setup flow enters Admin at `#/?firstStart=true...`, then
Ember redirects through `setup.done` to start onboarding. The route set
`window.location.hash` for the React onboarding screen, but allowed the
original Ember transition to finish. That could leave the app settled on
the empty `#/setup/done` route instead of rendering onboarding.
…#27703)

ref https://linear.app/tryghost/issue/BER-3611/

- when a gift member upgraded to a paid subscription, the gift was being
marked as consumed which counted as a cancellation in the Paid
subscriptions chart, even though the member had actually converted to a
paying customer (not churned)
- distinguish upgrades from natural gift endings by comparing
`consumed_at` to `consumes_at`: the cron-driven natural-end path only
fires once `consumes_at` has passed, so `consumed_at >= consumes_at`,
whereas the upgrade path consumes the gift mid-period
- this prevents the chart from showing misleading cancellations for
members who upgraded, which understated retention
…27660)

ref https://linear.app/ghost/issue/ONC-1658/

When a customer clicks a newsletter reply-to verification email in a
browser that isn't signed in to admin, the link silently no-ops — they
have to click it a second time for the address to actually save. Two
customers hit this in the past few weeks (ONC-1618, ONC-1642).

The signin-redirect flow added in #27316 stores the original URL in
`sessionStorage` and replays it via `router.transitionTo(redirectUrl)`
after auth. But `react-fallback` is a wildcard route with no
controller-declared `queryParams`, so Ember strips
`?verifyEmail=<token>` on the replay. The verify-on-mount `useEffect` in
`newsletters.tsx` then short-circuits because the token is missing.
ref https://linear.app/ghost/issue/BER-3600/design-iteration

- Redesigned the gift selection screen with an inline accordion tier
picker.
- Refreshed the gift card and right-side panel design across the
selection, confirmation, redemption, and magic link pages.
closes https://linear.app/ghost/issue/BER-3613

Hide the "Billing info & receipts" section in Portal's account home page
for gift members.

Gift members do not have a card on file or an active Stripe
subscription, so the section's "Update" button (which calls
`manageBilling`) led to a dead end. Complimentary members were already
excluded for the same reason — gift members were an oversight.
@pull pull Bot locked and limited conversation to collaborators May 6, 2026
@pull pull Bot added the ⤵️ pull label May 6, 2026
@pull pull Bot merged commit b2e7082 into code:main May 6, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants