Sites offering plans through more than one connector (for example card payments and bank debit) now get a chooser step in the subscribe flow (#3616769: Add a connector chooser to the subscribe flow when multiple connectors provide plans). Single-connector sites see no change: with zero or one connector offering visible plans, subscribing redirects exactly as before.
The chooser
A connector is available when it has at least one enabled plan marked to show — so a site can withdraw a rail from acquisition (hide its plans) while keeping the connector installed to service existing subscriptions. When two or more connectors are available and the visitor has no subscription, /subscription-manager/subscribe renders a chooser (theme hook subscription_manager_connector_chooser, template overridable) instead of redirecting. Choosing follows the same route with ?connector=ID; invalid or unavailable values are ignored. Existing subscribers are always routed to their subscription's stored connector.
Steering configuration
A new chooser_connectors settings sequence (a tabledrag table on the settings form) holds one entry per connector: display order, plus optional label and description overrides that fall back to the plugin definition's title and description. Descriptions may contain restricted HTML (rendered through admin XSS filtering: links, emphasis and lists survive, scripts are stripped). The first row is the recommended connector, badged in the chooser.
default_connector is removed
The default_connector setting is gone; the default is now the first entry of chooser_connectors whose plugin is installed, with the single-installed-connector inference kept for empty config. SubscriptionManagerService::getDefaultConnector() keeps its signature and behavior contract, so code calling it needs no changes. Update 10019 seeds the sequence from the site's previous default_connector value: nobody's default changes. Sites managing config in code should replace default_connector: example_id with:
chooser_connectors:
- id: example_id
label: ''
description: ''
API: multi-connector response shape
/subscription-manager/api/subscribe-url is unchanged for existing subscribers and single-connector sites. When multiple connectors are available and the user has no subscription, it returns:
{
"subscribe_url": null,
"connectors": [
{
"id": "gocardless",
"label": "Pay by bank debit",
"description": "…",
"subscribe_url": "…/subscription-manager/api/subscribe-url?connector=gocardless",
"recommended": true
},
…
]
}
Candidates arrive in configured order with resolved (overridden-or-fallback) copy; each candidate's subscribe_url points back to the endpoint with the choice, which then returns the single-URL shape — remote checkout sessions are only created once the visitor has chosen. Front ends should treat a response with subscribe_url: null and a connectors list as "render a chooser".