{
  "license": "CC BY 4.0",
  "licenseUrl": "https://creativecommons.org/licenses/by/4.0/",
  "recipe": {
    "slug": "webhook-latency-and-duplicates",
    "title": "Measure Webhook Latency and Duplicate Rate",
    "testedWith": "Apache DataFusion 45.2.0",
    "lastReviewed": "2026-07-27"
  },
  "contract": {
    "tableName": "webhook_deliveries",
    "schema": [
      {
        "name": "timestamp_utc",
        "type": "Timestamp",
        "description": "Processing completion time."
      },
      {
        "name": "provider",
        "type": "Utf8",
        "description": "Webhook provider."
      },
      {
        "name": "event_type",
        "type": "Utf8",
        "description": "Provider event category."
      },
      {
        "name": "idempotency_outcome",
        "type": "Utf8",
        "description": "new_event or duplicate."
      },
      {
        "name": "status",
        "type": "Utf8",
        "description": "success or failed."
      },
      {
        "name": "latency_ms",
        "type": "Float64",
        "description": "Processing duration."
      }
    ]
  },
  "query": "SELECT\n  provider,\n  event_type,\n  COUNT(*) AS deliveries,\n  SUM(CASE WHEN idempotency_outcome = 'duplicate' THEN 1 ELSE 0 END) AS duplicates,\n  SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) AS failures,\n  100.0 * SUM(CASE WHEN idempotency_outcome = 'duplicate' THEN 1 ELSE 0 END)\n    / NULLIF(COUNT(*), 0) AS duplicate_rate_pct,\n  approx_percentile_cont(latency_ms, 0.95) AS p95_latency_ms\nFROM webhook_deliveries\nWHERE timestamp_utc >= now() - INTERVAL '7 days'\nGROUP BY provider, event_type\nORDER BY duplicate_rate_pct DESC, failures DESC;",
  "fixtureKind": "schema-example",
  "inputRows": [
    {
      "timestamp_utc": "2026-07-28T10:00:00Z",
      "provider": "provider_example_1",
      "event_type": "event_type_example_1",
      "idempotency_outcome": "success",
      "status": "success",
      "latency_ms": 184
    },
    {
      "timestamp_utc": "2026-07-28T11:00:00Z",
      "provider": "provider_example_2",
      "event_type": "event_type_example_2",
      "idempotency_outcome": "failed",
      "status": "failed",
      "latency_ms": 926
    },
    {
      "timestamp_utc": "2026-07-28T12:00:00Z",
      "provider": "provider_example_3",
      "event_type": "event_type_example_3",
      "idempotency_outcome": "success",
      "status": "success",
      "latency_ms": 312
    }
  ],
  "illustrativeInputRows": [
    {
      "timestamp_utc": "2026-07-28T10:00:00Z",
      "provider": "provider_example_1",
      "event_type": "event_type_example_1",
      "idempotency_outcome": "success",
      "status": "success",
      "latency_ms": 184
    },
    {
      "timestamp_utc": "2026-07-28T11:00:00Z",
      "provider": "provider_example_2",
      "event_type": "event_type_example_2",
      "idempotency_outcome": "failed",
      "status": "failed",
      "latency_ms": 926
    },
    {
      "timestamp_utc": "2026-07-28T12:00:00Z",
      "provider": "provider_example_3",
      "event_type": "event_type_example_3",
      "idempotency_outcome": "success",
      "status": "success",
      "latency_ms": 312
    }
  ],
  "expectedOutput": {
    "columns": [
      "provider",
      "event_type",
      "deliveries",
      "duplicates",
      "failures",
      "duplicate_rate_pct",
      "p95_latency_ms"
    ],
    "rows": [
      {
        "provider": "stripe",
        "event_type": "invoice.payment_failed",
        "deliveries": 480,
        "duplicates": 34,
        "failures": 9,
        "duplicate_rate_pct": 7.08,
        "p95_latency_ms": 1180
      },
      {
        "provider": "github",
        "event_type": "push",
        "deliveries": 2940,
        "duplicates": 42,
        "failures": 3,
        "duplicate_rate_pct": 1.43,
        "p95_latency_ms": 420
      }
    ]
  },
  "notes": [
    "The compact input rows demonstrate field names and JSON types; they are not claimed to generate the displayed aggregate by themselves.",
    "The expected output is deterministic synthetic review data for the documented output shape.",
    "Adapt time windows, thresholds, identities, and business definitions before operational use."
  ]
}