Troubleshooting
Start with the user-visible signal, then follow the delivery path. You should rarely need raw Azure logs.
Check these first
| Surface | What it answers |
|---|---|
| Subscriptions → Last delivery | Did the latest real or test delivery succeed? A red result includes the reason. |
Bot: @bot subscriptions | Shows the same delivery health inside Teams. |
| Diagnostics → Run checks | Which SSO stage failed: token, tenant installation, or admin role? |
| Audit log | Who changed or deleted configuration, and when? |
GET /api/health | Is the backend process reachable? |
GET /api/ready | Are required configuration and Cosmos ready? |
Installation or sign-in
The Setup page is blank
- Open
https://tdckbprod-flex-prod.azurewebsites.net/api/health. - If it fails, the backend or network is unavailable; this is not an SSO problem.
- If it succeeds, reload Teams and try the web client to separate desktop cache from service availability.
“This app hasn't been set up for your organization”
A tenant admin has not completed the one-time consent flow. Follow Admin consent, then sign out and back in.
Sign-in loops or access denied
Open Diagnostics from the admin navigation and run checks. A valid token is not enough: the tenant must be installed and the user must hold Connector.Admin.
A card never arrived
- Click Test. This bypasses filters and tests the actual destination.
- Read Last delivery. Red means the request reached us and delivery failed; “no events yet” means no accepted event reached that subscription.
- Check the sender. Open GitHub Recent Deliveries, GitLab webhook history, or the equivalent platform log.
- Check intentional suppression. Status filters, pipeline allowlists, quiet hours, failure-after-success, dedupe, and incident mode can all suppress a new card.
| Sender response | Meaning | Fix |
|---|---|---|
| 400 | Wrong platform or invalid payload | Use the subscription's exact ingest URL and the event type in Platform reference. |
| 401 | Missing, invalid, or rotated key | Rotate the key and replace the sender's URL. |
| 404 | Subscription missing | Recreate it and update the sender. |
| 429 | Tenant rate limit | Honor Retry-After; reduce or batch the burst. |
| 502 | Teams delivery failed after retries | Check destination membership/URL and Microsoft service health. |
Destination-specific failures
Bot channel: 403 or “not part of conversation”
The app was removed or is not installed in that channel. Add it to the channel, reselect the channel, and Test again.
Incoming webhook fails
The Teams Workflows URL was deleted, expired, or belongs to another workflow. Recreate the workflow and paste the new URL into the subscription. The URL is write-only and will not be displayed later.
DM delivery fails
The recipient must have opened or messaged the app so the bot has a valid 1:1 conversation reference. Ask them to open the app, then reselect them.
Incident card stopped updating
If somebody deleted the card, the next event should create a replacement. If it does not, inspect Last delivery for a Bot Framework error and verify the bot remains in the channel.
API update failures
PUT returns 428
GET the subscription and send its exact response ETag as If-Match. Wildcard * is rejected.
PUT returns 412
Another user changed the subscription. GET the latest state, reconcile your desired configuration, and retry. Do not blindly replay the stale body: PUT clears omitted optional fields.
Platform change returns 400
Platform is part of the ingest URL and cannot change in place. Create a new subscription and update the sender.
Monitoring says degraded
- Call
/api/ready. A 503 indicates a service dependency problem. - Call authenticated
/api/monitoring/statusand identify failing subscriptions. - Correlate their timestamps with deployments, sender retries, and Microsoft service health.
- For self-hosted systems, inspect Application Insights requests, dependencies, and exceptions.
Before contacting support
Include the approximate UTC time, platform, subscription name, HTTP status, and a screenshot of Last delivery or Diagnostics. Never send ingest URLs, API keys, webhook URLs, tokens, raw authorization headers, or full payloads containing secrets.
Email hello@permylastwebhook.com. Security reports go to security@permylastwebhook.com.