Skip to content

Mapping a raw payload (Shopify, Stripe, anything)

Point a third-party webhook straight at a trigger: say where the rows live in their JSON and which path feeds each of your columns — and irrelevant events cost nothing.

In this article (4)

Shopify, Stripe and friends send their own JSON shape and will not rename anything for you. Rather than standing up a translation layer, tell the trigger how to read theirs.

The two things to fill in

Open Advanced: map a raw payload on the trigger:

  1. Where the rows live — a path into their body, e.g. line_items. Each entry there becomes one item in your run. Leave it blank when the whole body is a single item.
  2. Which path feeds each of your columns — e.g. product_name ← title, product_image ← image.src. Prefix a value with = to pin a constant for a column (source ← =shopify).

So a Shopify order with two line items becomes one run with two items, each carrying that line's own title and image.

What the paths can do

  • Dot paths into nested objects and [n] for array positions: customer.address.city, variants[0].sku.
  • Nothing is evaluated — there is no expression language, no code, and inherited or prototype keys are refused. It reads data, it does not run it.
  • A missing path simply omits that column rather than inventing a value.
  • A list of plain values collapses into one pipe-joined cell, so an image[] column splits them exactly as a CSV import would.

An unmatched payload is a free no-op

If the mapping produces zero rows, the call returns 200 {"ignored": true} before anything is claimed: no run, no charge, no hourly-cap burn. That is what makes it safe to point a chatty webhook at a trigger and only act on the events you care about.

The editor checks the mapping before it lets you save

A map pointing at a column your flow does not have used to save happily and then run on empty fields — the sender's keys are left alone on purpose, so nothing complained. That mistake is now caught where it is free to fix:

  • The panel lists your flow's actual columns; click one to drop it into a row.
  • A column that is not one of them is flagged as you type (with a "did you mean…?" when it is only a typo), and the save is refused — a trigger is a standing licence to spend, so an unusable mapping never gets stored.
  • Rename that column in the Builder later and the trigger keeps its old map, so the Triggers dialog shows a warning on it: until you fix it, a delivery starts a run with empty inputs.

The live endpoint stays deliberately forgiving — extra keys in a third-party payload are ignored rather than rejected, because 400ing a live webhook only earns you a retry storm. Strictness belongs at the save, where a human is watching and nothing has been charged.

Still worth doing once: after saving, fire one real call from the sender and check Recent deliveries and the run's Data tab. One test event costs one item; a mis-mapped batch costs the batch.