Integrations
Console connects the account. This is what each product does with it.
Connections
One ConnectionCard each. Status, health and expiry are resolved into a single verdict — reading any one field alone puts a green badge on a connection that stopped working.
WordPress · steigerwald-news.de
Connected and working.
Data is stored in eu-central-1.
posts:writemedia:write
WordPress · archive.steigerwald-news.de
Connected and working.
posts:readposts:write— not granted
Reconnect in Console to grant this scope. Scopes are granted at the provider, so nothing here can add them.
GitHub · acme-gmbh
Updates from the provider are not arriving. Data may be out of date.
repo:readrepo:write
Webhooks: 7 delivered, 1 retrying, 2 dead-lettered — updates from the provider may be missing.
Stripe · acct_1QxAcme
Access was revoked at the provider. Reconnect to restore it.
Data is stored in us-east-1.
charges:read
Slack · acme.slack.com
This connection expires in 6 days. Reconnect before then.
chat:write
A gated surface
Publishing needs a WordPress connection with posts:write, shared with LD3. The panel below is the real §13 resolver's answer.
Publishing is available. The connection is healthy and carries every required scope.
No product writes its own “connect WordPress first” panel — an unusable connection becomes missing_connection, which every gated surface already knows how to render.
Connection picker
An unusable connection is listed and disabled, never hidden — a customer who cannot see that the one they expected is broken has no way to fix it.
Connections that cannot be used are shown but not selectable, so a connection you expected to find is never simply missing.
Binding allowed. LD3 may publish through this connection.
A provider with no connection at all
ConnectionRequiredState distinguishes 'never connected' from 'connected and broken' — one 'connect this' message for both sends someone to set up a connection they already have.
Cloudflare is not connected
Managing DNS zones needs a Cloudflare connection. Connections are made in Console, where the credentials stay.
Connect CloudflareWebhook delivery
A retry is not a failure — retrying usually works. A dead letter is: an event was dropped, and anything derived from it is wrong in a way no refresh fixes.
2 of 10 recent updates were dropped. Some data may be out of date.
Duplicate event ids: evt_d1. Surfaced rather than silently collapsed — a provider redelivering the same id usually means our acknowledgement is not reaching it.
Deliveries are failing badly enough that data from this provider may be out of date.
| Received | Event | State | Attempts |
|---|---|---|---|
| 8/3/2026, 10:00:00 AM | evt_2 | delivered | 1 |
| 8/3/2026, 10:00:00 AM | evt_5 | delivered | 1 |
| 8/2/2026, 9:00:00 PM | evt_d1 | dead_letter | 8 |
| 8/2/2026, 8:00:00 PM | evt_d1 | dead_letter | 8 |
| 8/2/2026, 7:00:00 PM | evt_r | retrying | 3 |
| 8/2/2026, 10:00:00 AM | evt_1 | delivered | 1 |
| 8/2/2026, 10:00:00 AM | evt_4 | delivered | 1 |
| 8/1/2026, 10:00:00 AM | evt_0 | delivered | 1 |
| 8/1/2026, 10:00:00 AM | evt_3 | delivered | 1 |
| 8/1/2026, 10:00:00 AM | evt_6 | delivered | 1 |
Secret containment
SoT §26.2 — secrets are never returned to the frontend.
`assertNoSecrets` walks the payload for credential-shaped keys — refresh_token, clientSecret, apiKey and friends. That turns a backend promise into something a test can fail on: a regression that started including a token would be caught here rather than in a breach report.