Upgrade to 1.0.98

Concerns: pushword/newsletter

Campaign site metadata

External campaign catalogue integrations: optionally supply hosts: ['example.org'] on each CampaignIndexItem; omitted hosts display as unknown. Set newsletter.catalogue_default_host only to select an initial site. Reset still shows all sites. See the contract.

First-name placeholders

%firstName% and %firstName|fallback% now resolve in newsletter content. Sites already using these strings literally: adjust that text. To personalize, map a string into customProperties.firstName; missing values use the authored fallback or an empty string. No schema update is required.

Newsletter preparation and sending

Run php bin/console doctrine:schema:update --force for planning fields, sender profiles, saved issues and reusable blocks. Campaign integrations: Send (admin/API/CLI) now honors a future scheduledAt; clear it for immediate sending. Cancelling keeps the date as a draft plan. Update custom admin actions that offered Schedule to use Send. See editorial planning.

Newsletter preflight and reusable blocks

Campaign API clients: handle HTTP 422 and its issues on send/schedule. Checks include audience, subject, body, links, sender and blocks at the requested date. A blocked campaign returns to draft and needs explicit Send after correction. See preflight and extension hooks.

Sites using the personal email layout: it now preserves marketing unsubscribe links/headers and the postal address. Use the explicit transactional flag only for service messages. Update custom personal.email.html.twig overrides to render unsubscribeUrl and postalAddress. Campaign delivery fields are now read-only after authorization; cancel scheduling before editing.