Hooktopus

E-commerce

Shopify → BigQuery → dbt.
Five minutes from signup.

Land every order, customer, and product event in BigQuery with the line_items array preserved as JSON. Hooky generates a typed stg_shopify.sql from the events you've already received, and pings you when Shopify changes the shape.

Shape

Heavy nested objects (orders, line items, customer info), webhook spam at scale, frequent breaking field renames.

Common events

orders/create · orders/paid · customers/create · products/update · inventory_levels/update

shopify.payload.json
{
  "id": 4501239876,
  "order_number": 1042,
  "email": "kyle@example.com",
  "total_price": "129.99",
  "currency": "USD",
  "line_items": [
    {
      "id": 11899004,
      "title": "Coral Tee — Medium",
      "quantity": 1,
      "price": "29.99"
    }
  ]
}

The output

Here's the dbt model Hooky generates for Shopify.

stg_shopify.sql
select
  cast(json_value(payload, '$.id') as int64)              as id,
  cast(json_value(payload, '$.order_number') as int64)    as order_number,
  json_value(payload, '$.email')                          as email,
  safe_cast(json_value(payload, '$.total_price') as numeric) as total_price,
  json_value(payload, '$.currency')                       as currency,
  json_query(payload, '$.line_items')                     as line_items_json,
  payload                                                 as raw_payload
from {{ source('hooktopus', 'events') }}
where endpoint_name = 'shopify'

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

Shopify renames fields between API versions.

When you upgrade your Shopify API version, payloads change shape silently. Hooky alerts on type changes too — not just new fields — so you catch the rename before it nulls out your revenue dashboard.

What you get

Everything you need for Shopify in production.

Signature verification, handled

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

Native JSON type, no string-of-JSON

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

Never blocking writes

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

Catch Shopify today

Your shopify table, ready before lunch.

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