Change record status: 
Introduced in branch: 
1.0.x
Introduced in version: 
1.0.0-beta6
Description: 

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".

Impacts: 
Site builders, administrators, editors
Module developers