Stable product id. Also the channel-id namespace prefix ("<key>:<rawId>").
Setup/status row title (e.g. "Gmail").
Short summary shown under the label on the setup/status row.
Icon URL rendered on the row.
Matches an OptionalScopeGroup.id in this connector's scopes.
OptionalchannelPer-product override of Connector.channelNoun — what this product's channels represent (e.g. Gmail's are "labels", Google Calendar's are "calendars"). Needed because a combined connector's products often have different channel vocabularies, so one connector-level noun can't describe all of them. Falls back to "channel"/"channels" when omitted.
Per-instance product metadata for combined (multi-product) connectors — one ordinary
Connectorthat bundles several user-facing products (e.g. the combined Google connector covering Mail, Calendar, Tasks, and Contacts) under a single OAuth grant and one charge.The app's combined-connection setup/status UX renders one row per entry. Each product maps to exactly one optional scope group:
scopeGroupIdMUST equal an OptionalScopeGroup.id declared in the connector's ScopeConfigoptionalgroups, so the API can derive per-product enablement (granted | scope-missing | no-channels | locally-off) from the connection's granted scopes plus its enabled channels.Plain (single-product) connectors leave Connector.products undefined; the API then omits the
products/productStatusfields and the app falls back to the standard per-connector flow.