Skip to content

[pull] main from TryGhost:main - #1447

Merged
pull[bot] merged 6 commits into
code:mainfrom
TryGhost:main
Aug 26, 2026
Merged

[pull] main from TryGhost:main#1447
pull[bot] merged 6 commits into
code:mainfrom
TryGhost:main

Conversation

@pull

@pull pull Bot commented Aug 26, 2026

Copy link
Copy Markdown

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 : )

kevinansfield and others added 6 commits August 26, 2026 18:00
no issue

Email-delivered gifts already know the intended recipient address, so
the customized redemption flow can use it as an editable prefill instead
of asking the recipient to enter it again.

- Added nullable recipient email to the shared GET and POST redemption DTO
- Read delivery details through GiftDelivery without changing the Gift model
- Prefilled only the customized Portal redemption page
- Updated the bearer-link domain contract and regression coverage
no erf

Moved various admin UI tests from e2e into the admin acceptance tier.
closes [ONC-1965](https://linear.app/ghost/issue/ONC-1965/email-analytics-prevent-a-shared-cursor-from-skipping-capped-sending)

During custom sending-domain warming, the custom and fallback Mailgun domains share one analytics cursor. A domain with newer events could advance it even when the other domain stopped at its event limit, leaving unprocessed pages behind on the capped domain.

Use the earliest cursor from any capped domain. Domains that reach the end no longer hold the cursor back, and Mailgun request order, filters, pagination, and per-domain limits stay unchanged.

Co-authored-by: Steve Larson <9larsons@gmail.com>
A publisher can now say what a tier's checkout asks for beyond the
payment, and where each answer is kept. The answer to where is a
binding: it names the source that collects, the source's own word for
the thing, and the field the value lands in. Everything that writes into
a member's custom fields goes through one, so what writes into a field
is a single join rather than a different one per writer.

Where a value lands and whether it is being collected are one row,
because holding them apart in two tables let them disagree, with no
composite foreign key or check constraint able to stop it: a tier could
ask for something with nowhere to put it, or go on receiving what a
publisher had turned off. The row is the collecting. There is one and
the source writes through it, or there is none and it does not.

Where each value lands is stated by the request rather than worked out
on the publisher's behalf. A field the site already keeps under that key
has to be active and hold the kind of thing the port supplies; a key it
does not keep yet is made into a field, listed under the name the port
carries. Anything else is refused, because a checkout quietly collecting
into somewhere other than the field a publisher named is worse than one
that says it cannot.

Nothing sends any of this to a payment processor yet, and every route
that changes it is behind the members custom fields flag.

ref https://linear.app/ghost/issue/BER-3872
ref https://linear.app/ghost/issue/NY-1550

This is a development only change that should have no user impact.

_Note: this PR depends on [this
PR](TryGhost/TrafficAnalytics#859) in the
Traffic Analytics repository._

## Summary

When developing features that touch both Ghost and the Traffic
Analytics service, it can be useful to run your local version of both
services locally. Currently, `pnpm dev:analytics` runs Ghost against the
latest published version of the Traffic Analytics service, but running
against your own locally running instance of the service was not
possible out of the box — this makes it as simple as running `pnpm
dev:analytics:local` in Ghost, and `yarn dev:ghost` in Traffic Analytics
@pull pull Bot locked and limited conversation to collaborators Aug 26, 2026
@pull pull Bot added the ⤵️ pull label Aug 26, 2026
@pull
pull Bot merged commit e239f71 into code:main Aug 26, 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.

5 participants