Hooktopus

Docs

Schema drift alerts.

When a webhook payload changes shape, you find out before it breaks your dashboard. Here's exactly what we detect, how we aggregate, and where the alert lands.

Three change classes

  • New field. A JSON path we've never seen before appears. Example: data.object.payment_method_details.card.iin shows up in Stripe charge events.
  • Type change. A field we've always seen as one type now appears as another. Example: amount used to be int64; now we're seeing strings.
  • Field disappearing. A path that was present in ≥99% of events over the last 30 days now appears in <50% of the last 24h. Useful for catching deprecated fields.

Aggregation window

To avoid noise from a single weird event, drift findings buffer for 1 hour and require at least 10 events with the change before firing. Both thresholds are tunable at the workspace level via /w/[slug]/alerts-config.

The 1-hour / 10-event default is deliberately conservative. If you're getting flooded with alerts during a known source migration, bump the event threshold up to 100. If you want faster feedback during development, drop the window to 15 minutes and the threshold to 3.

Delivery channels

Slack

Hooktopus posts to an incoming webhook URL you provide. Create one at your-workspace.slack.com/marketplace → "Incoming Webhooks". Paste the URL into/w/[slug]/alerts-config. Test from the same page with the "Send test" button.

example Slack payload
{
  "blocks": [
    {
      "type": "header",
      "text": { "type": "plain_text", "text": "🆕 New field in stripe.charge.succeeded" }
    },
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "*Field:* `data.object.payment_method_details.card.iin`\n*Seen in:* 92% of last hour\n*Sample:* \"424242\""
      }
    },
    {
      "type": "actions",
      "elements": [
        { "type": "button", "text": { "type": "plain_text", "text": "Regenerate stg_stripe" }, "url": "https://app.hooktopus.io/..." }
      ]
    }
  ]
}

Email

Recipients live in /w/[slug]/alerts-config. Default is the workspace owner. Add team members (comma-separated). Per-event emails are sent immediately when an alert fires; a daily digest summarizing the last 24h is delivered at 8 AM in the workspace's timezone.

Dashboard timeline

Every change is also recorded in schema_changes and surfaced at /w/[slug]/schema-changes — grouped by day, with sample event IDs, before/after snippets, and a one-click "Regenerate dbt" link.

The heartbeat alert

Separate from schema drift: if an endpoint hasn't received an event in N hours, you get an email. Default is 24h. Useful for catching upstream auth issues where your source stopped sending altogether.

What you can't currently turn on

  • Per-field severity (treat new card.iin as low-pri but type change on amount as page-worthy) — coming in v1.3.
  • Custom Slack channel routing by endpoint — coming in v1.2.
  • Webhook destinations (post alerts to PagerDuty / Opsgenie) — request via support if you need it sooner.