thru

From flow.* to payment.flow.*

The webhook filter flow.* is now a 400. Replace it with payment.flow.*. No event delivery changes, because flow.* never matched anything.

Changed2026-09-21
EffortMinutes. One string, in one place.

Do you need this?

Only if something you own writes a webhook subscription whose eventTypes contains the literal string flow.*. That is: provisioning code, a Terraform-ish setup script, a seed fixture, or a saved endpoint you are about to edit in the console.

bash
grep -rn '"flow\.\*"\|flow\.\*' --include='*.ts' --include='*.js' --include='*.json' .

No hits → nothing to do.

The change

diff
  await fetch('https://api.thru.la/v1/webhooks', {
    method: 'POST',
    headers: { 'x-api-key': process.env.THRU_API_KEY, 'content-type': 'application/json' },
    body: JSON.stringify({
      url: 'https://example.com/hooks/thru',
-     eventTypes: ['payment.*', 'flow.*'],
+     eventTypes: ['payment.*', 'payment.flow.*'],
    }),
  });

Note that payment.* already covers payment.flow.step, payment.flow.approved and payment.flow.rejected, because filters match by literal prefix. If you subscribe to payment.* you can simply drop the entry rather than replacing it.

What you will see

Before 2026-09-21After
POST /v1/webhooks with flow.*200, endpoint saved400, unknown filter
Events delivered to that endpointnone, evernone — nothing changed

The filter was accepted on write and could never match on delivery: the flow family's event types are payment.flow.*, and matching is a literal prefix test. So an endpoint filtered on flow.* was already inert. This migration is about the write failing loudly instead of the delivery failing silently.

If you had an endpoint saved with flow.*

Open it in the console (Developers → Webhooks), replace the entry, and save. If you edit it through the API, send the full eventTypes list you want — including the corrected entry — or the update will be rejected for the stale one.

Unchanged

checkout.* and facilitator.* are still valid, and were deliberately not narrowed to checkout.session.* / facilitator.payment.*. If you use either, do nothing.