Hooktopus

Payments

Stripe → BigQuery → dbt.
Five minutes from signup.

All 300+ event types from one URL, into one BigQuery table, with one dbt staging model. Hooky generates a typed stg_stripe.sql from the events you've already received, and pings you when Stripe changes the shape.

Shape

300+ event types, deeply nested objects, occasional new fields.

Common events

charge.succeeded · invoice.paid · customer.subscription.created · payment_intent.succeeded

stripe.payload.json
{
  "id": "evt_3Pkx9aL",
  "type": "charge.succeeded",
  "created": 1715812844,
  "data": {
    "object": {
      "id": "ch_3Pkx9aL",
      "amount": 12999,
      "currency": "usd",
      "customer": "cus_abc"
    }
  }
}

The output

Here's the dbt model Hooky generates for Stripe.

stg_stripe.sql
select
  json_value(payload, '$.id')                                     as id,
  json_value(payload, '$.type')                                   as event_type,
  cast(json_value(payload, '$.created') as int64)                 as created_unix,
  json_value(payload, '$.data.object.id')                         as object_id,
  safe_cast(json_value(payload, '$.data.object.amount') as int64) as amount_cents,
  json_value(payload, '$.data.object.currency')                   as currency,
  json_value(payload, '$.data.object.customer')                   as customer_id,
  payload                                                         as raw_payload
from {{ source('hooktopus', 'events') }}
where endpoint_name = 'stripe'

Yes, you can hand-edit it. Yes, regenerate is non-destructive: it produces a diff, doesn't auto-merge. Yes, every column has raw_payload as the escape hatch.

The hard part

Stripe events change without warning.

Stripe adds new fields to charge.succeeded multiple times a year. Drift alerts catch them in the first hour, and Regenerate gives you a clean diff you can ship through your normal dbt review process.

What you get

Everything you need for Stripe in production.

Signature verification, handled

We use Hookdeck for ingress signature checks. Stripe's scheme works out of the box — paste your signing secret, done.

Drift alerts via Slack + email

New field? Type change? Field disappearing? You hear about it within the hour, with a sample event and a regenerate link.

Replay from R2 archive

Bad BQ window? Re-write any time range from R2 with one click. Stripe retries don't disappear.

Native JSON type, no string-of-JSON

Apostrophes, emojis, special chars in Stripe payloads survive intact. Query with JSON_VALUE, get clean strings.

Partitioned + clustered table

PARTITION BY DATE(received_at) CLUSTER BY endpoint_name so even a chatty Stripe firehose stays cheap to query.

Never blocking writes

Events archive to R2 before the destination write. Stripe sees a 202, you never lose an event during a BQ blip.

Catch Stripe today

Your stripe table, ready before lunch.

Free under 10k events/month. Add the URL to Stripe, run dbt, ship a chart.