Hooktopus

Developer platform

GitHub → BigQuery → dbt.
Five minutes from signup.

PR cycle time, deployment frequency, code review latency — all in BigQuery, no GitHub-specific tooling required. Hooky generates a typed stg_github.sql from the events you've already received, and pings you when GitHub changes the shape.

Shape

Deeply nested actor/repo/payload trio, 30+ event types, the firehose for DevEx analytics.

Common events

pull_request.opened · push · issues.closed · workflow_run.completed

github.payload.json
{
  "action": "opened",
  "pull_request": {
    "id": 1849283,
    "number": 12,
    "title": "Add dbt sources YAML",
    "user": { "login": "kylemalone" },
    "created_at": "2026-05-16T20:00:00Z"
  },
  "repository": { "full_name": "hooktopus/hooktopus" }
}

The output

Here's the dbt model Hooky generates for GitHub.

stg_github.sql
select
  json_value(payload, '$.action')                              as action,
  cast(json_value(payload, '$.pull_request.id') as int64)      as pr_id,
  cast(json_value(payload, '$.pull_request.number') as int64)  as pr_number,
  json_value(payload, '$.pull_request.title')                  as pr_title,
  json_value(payload, '$.pull_request.user.login')             as actor_login,
  json_value(payload, '$.repository.full_name')                as repo_full_name,
  payload                                                      as raw_payload
from {{ source('hooktopus', 'events') }}
where endpoint_name = 'github'

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

GitHub's payloads vary wildly by event type.

Every event type has a different shape. Hooky observes each one separately and gives you typed columns only where they apply — for the rest, raw_payload is your escape hatch.

What you get

Everything you need for GitHub in production.

Signature verification, handled

We use Hookdeck for ingress signature checks. GitHub'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. GitHub retries don't disappear.

Native JSON type, no string-of-JSON

Apostrophes, emojis, special chars in GitHub 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 GitHub firehose stays cheap to query.

Never blocking writes

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

Catch GitHub today

Your github table, ready before lunch.

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