Docs / Getting started

Getting started

From zero to a build card in your Teams channel in about five minutes. Install the app, pick where notifications land, create a subscription, and paste one URL into your CI/CD platform. That's the whole loop.

The mental model

Your CI/CD platform sends a webhook to a private ingest URL we give you. We normalize it into a rich Adaptive Card and deliver it to the destination on your subscription — a Teams channel, a person's DM, or an incoming-webhook URL. One subscription = one pipeline → one place.

What you'll need

  • A Microsoft Teams account, and a Teams admin to approve the app for your org (a one-time consent).
  • A CI/CD, GitOps, or observability tool you can add a webhook to — GitHub Actions, GitLab, Jenkins, Azure DevOps, Bitbucket, CircleCI, Buildkite, Argo CD, TeamCity, Datadog, or anything that can POST JSON.
  • Two minutes of that platform's admin's time to paste in a URL.

Step 1 · Install the app in Teams

1

Open Teams → Apps → search Per My Last WebhookAdd. (Or use the install link on our homepage.)

The first person from your organization to add it triggers a one-time admin consent — your Teams admin approves the app for the tenant. After that, anyone in your org can use it.

Tip

Not an admin? Add the app anyway — Teams will prompt your admin to approve it, or you can send them the consent link the app shows you.

Step 2 · Choose where cards go

Every subscription delivers to exactly one destination. Pick the one that fits:

Teams channel

Add the bot to a channel and cards post there. Supports in-place updates (one card that goes red → green) and incident collapsing. Best for team visibility.

Direct message PRO

The bot DMs a person — perfect for the on-call owner. The person adds the app once, then appears in the picker.

Incoming webhook

Paste a Teams Workflows / Power Automate incoming-webhook URL. No bot install needed. Simple, one-directional.

To post in a channel

In the channel, open … → Manage channel → Connectors/Apps (or @mention the bot) to add Per My Last Webhook. Once it's in the channel it shows up in the subscription form's channel picker. For a DM destination, the person just needs to open a 1:1 chat with the bot once.

Step 3 · Create your first subscription

1

Open the app's Subscriptions tab → New subscription.

2

Give it a name, pick your platform, and choose the destination from Step 2.

3

Save. You'll get an ingest URL with a secret key baked in — it looks like:

https://api.permylastwebhook.com/api/ingest/<org>/<sub>/github?key=<secret>
Copy it now

The key is shown once. Copy the full URL immediately. Lost it? Use Rotate key on the subscription to mint a fresh one (and update your platform).

Step 4 · Connect your platform

Paste that ingest URL into your platform's webhook settings. Jump to yours:

GitHub Actions

  1. Repo → Settings → Webhooks → Add webhook.
  2. Payload URL: your ingest URL. Content type: application/json.
  3. Events: Let me select individual events → check Workflow runs only.
  4. Add webhook. Prefer org-wide? Set it at Org → Settings → Webhooks instead.

GitLab

  1. Project (or Group) → Settings → Webhooks.
  2. URL: your ingest URL. Triggers: Pipeline events and Deployment events.
  3. Keep SSL verification on → Add webhook.

Jenkins

  1. Install the Notification Plugin (Manage Plugins).
  2. Job → Configure → Job Notifications → Add Endpoint.
  3. Format JSON, Protocol HTTP, Event Job Finalized, URL your ingest URL. Save.

Azure DevOps

  1. Project → Project Settings → Service Hooks → New Subscription → Web Hooks.
  2. Trigger: Run state changed (YAML) or Build completed (classic).
  3. URL: your ingest URL. Optionally filter by pipeline/branch/state. Save.

Bitbucket Pipelines

  1. Repo → Repository settings → Webhooks → Add webhook.
  2. URL: your ingest URL. Triggers → Build: Commit status created and updated.

CircleCI

  1. Project → Project Settings → Webhooks.
  2. Webhook URL: your ingest URL. Events: workflow-completed (recommended).

Buildkite

  1. Organization settings → Notification services → Add Webhook.
  2. Webhook URL: your ingest URL. Pick the build events you want delivered.

Argo CD

  1. Create the subscription with platform Argo CD and copy the ingest URL.
  2. In Argo CD's argocd-notifications-cm, add a webhook service pointing at that URL plus a template that POSTs the app's sync/health status.
  3. Subscribe your Applications to a trigger (e.g. on-deploy). Full config + template in the platform reference.

TeamCity

  1. Create the subscription with platform TeamCity and copy the ingest URL.
  2. Add a webhook to the build config (native Webhooks feature or the tcWebHooks plugin) with a JSON template posting the build name, number, result, branch, and commit. Template in the platform reference.

Datadog

  1. Create the subscription with platform Datadog and copy the ingest URL.
  2. Datadog → Integrations → Webhooks → add the URL with a JSON payload (title, alert status, link), then reference @webhook-<name> in your monitor. Payload in the platform reference.

Grafana

  1. Create the subscription with platform Grafana and copy the ingest URL.
  2. Grafana → Alerting → Contact points → add a Webhook contact point with that URL (no template needed), then attach it to a notification policy. Reference.

Drone CI

  1. Create the subscription with platform Drone and copy the ingest URL.
  2. Add a Drone webhook (global or per-repo) pointing at that URL — the payload is normalized automatically. Reference.

Sentry

  1. Create the subscription with platform Sentry and copy the ingest URL.
  2. Sentry → Alerts → create an alert rule with a webhook action posting title + level + project to that URL. Reference.

PagerDuty

  1. Create the subscription with platform PagerDuty and copy the ingest URL.
  2. PagerDuty → Integrations → Generic Webhooks (v3) → point a new webhook at that URL and subscribe to incident events. Reference.

Prometheus Alertmanager

  1. Create the subscription with platform Alertmanager and copy the ingest URL.
  2. Add a webhook_configs receiver with url = that URL and route alerts to it (no template). Reference.

Octopus Deploy

  1. Create the subscription with platform Octopus and copy the ingest URL.
  2. Octopus → Configuration → Subscriptions → add a deployment-event subscription posting project/environment/release/state to that URL. Reference.

Anything else (generic)

Any tool that can POST JSON works via the generic platform. Create the subscription with a small field mapping (which JSON paths map to title / status / link), then point the tool's webhook at your ingest URL. Datadog monitors, custom scripts, home-grown CI — all fair game.

Advanced · webhook signing

GitHub, GitLab, CircleCI and Buildkite can sign payloads with a shared secret for an extra integrity check. It's optional — the secret key in your ingest URL already authenticates every call. See the platform reference for the signing setup.

Step 5 · Fire a test card

Don't want to wait for a real build? On the subscription, click Test — it sends a synthetic card straight through your delivery path so you can confirm the wiring. Then trigger a real pipeline run and watch the card land, live.

Nothing showed up?

Jump to Troubleshooting — 90% of the time it's the channel not having the bot, a filter hiding the event, or a webhook pointed at the wrong URL.

Next steps

Routing PRO

Send prod failures to #prod-alerts and everything else to #ci — by branch, environment, or status.

Incident mode PRO

Collapse a flapping pipeline's repeated failures into one card that updates in place, then resolves.

On-call DMs PRO

DM the owner the moment their deploy breaks, instead of hoping they see the channel.

Quiet hours & dedupe PRO

Mute overnight, and suppress the same failure firing on a loop.

Approvals PRO

Gate a deploy behind an approve/reject card right in Teams, with an audit trail.

Status filters

Only care about failures? Filter to just the statuses you want — on any plan.

Troubleshooting

The card never arrived

  • Channel destination: is the bot actually in that channel? Re-add it, then re-pick it on the subscription.
  • Status filter: a filter or quiet-hours window may be dropping the event by design. Loosen it and re-test.
  • Wrong URL / key: confirm the platform's webhook uses the exact ingest URL. Rotated the key? Update the platform.
  • Platform event type: we accept specific events (e.g. GitHub Workflow runs only). Sending others returns an error.

Can't sign in / "not installed" / access denied

Open the app's Diagnostics tab and click Run checks. It walks the exact sign-in gate — token validity → tenant consent → your admin role — and tells you which step failed and how to fix it (with the matching AADSTS code for consent/redirect issues).

"This person hasn't added the app" on a DM subscription

DMs need the recipient to have opened a 1:1 chat with the bot once (that's how Teams lets a bot message them). Ask them to search for the app in Teams and say "hi" — they'll then appear in the DM picker.

Still stuck?

Email hello@permylastwebhook.com with your org name and what you tried — we'll get you unblocked.

▣ Start PER MY LAST WEBHOOK C:\DOCS\GETTING-STARTED Status: 200 OK