Event

trigger.stripe_event
TriggerBusiness appsconnection requiredruns in-engine

Registers a webhook endpoint in the tenant's Stripe account on publish and starts one run per delivered event, verified against Stripe's signature.

Start a run when Stripe emits an event (payment, invoice, subscription…).

Connection

Required
Yes — the node will not save without one
Auth type
API key
Providers
Stripe
Secret shape
the Stripe secret key (sk_…)
Resolved by
config.connection_id, else node.connection_id
Note
The key needs write access to webhook endpoints — a restricted key without it can read charges and still fail to publish. Publishing also needs MANTLE_APP_PUBLIC_BASE_URL set to an https URL Stripe can reach; Stripe refuses a livemode endpoint that is not https.

Configuration

2 fields, none required. A dotted path is a nested object and name[] an array of objects — the editor renders the same tree.

FieldTypeRequiredDefaultConstraintsExample
events
Stripe event names to subscribe to. Any valid name is accepted, not only the ones listed; "*" subscribes to every event (noisy — each one starts a run).
arrayNo["payment_intent.succeeded"]1–128 characters; array of string—
api_version
Pin the payload shape to one Stripe API version, e.g. 2024-06-20. Leave empty to use the account's default version.
stringNo—matches ^\d{4}-\d{2}-\d{2}(?:\.[a-z0-9_]+)?$—

Example configuration

Every value below is the contract’s own example or default — nothing invented.

{
  "events": [
    "payment_intent.succeeded"
  ]
}

Output

One shape.

stripe event

The flattened Stripe event. data_object's own keys vary by object_type, so the shape is open below the declared fields.

Extra keys beyond the ones listed can appear.

FieldTypeExample
id
Stripe's event id (evt_…). Also the idempotency key: every retry of a delivery carries this same id, so a redelivery joins the run it already started instead of starting a second. The ingress remembers a key for 24 hours, while Stripe retries for up to three days, so a retry that lands after that window can still start a fresh run.
stringevt_1Ox2mB2eZvKYlo2CvQ0Tn9aE
type
The event name, e.g. payment_intent.succeeded. Branch on this when the trigger subscribes to more than one.
stringpayment_intent.succeeded
created
When Stripe created the event, epoch seconds.
number1717070400
created_at
The same instant as an ISO-8601 UTC string, for nodes that want a date.
string2024-05-30T12:00:00Z
livemode
False for test-mode events. A test key only ever sends False; check it before anything that moves real money or mails a real customer.
booleanfalse
api_version
The Stripe API version the payload is shaped by.
string—
request_id
The API request that caused the event (req_…), or empty when Stripe raised it on its own (a subscription renewal, a payout).
string—
object_id
Id of the object the event is about — the PaymentIntent, Invoice, Subscription… Lifted out of data.object so the next node need not dig.
stringpi_3Ox2mB2eZvKYlo2C1kQ8sJ4d
object_type
That object's Stripe type, e.g. payment_intent.
string—
previous_attributes
On a *.updated event, only the keys that changed, with their OLD values. Empty on every other event type.
object—
data_object
Stripe's data.object — the whole resource the event is about. Its keys depend on object_type, which is why this shape is open.
object—
payload
The event envelope exactly as Stripe sent it, for anything the fields above do not lift out.
object—
{
  "api_version": "2024-06-20",
  "created": 1717070400,
  "created_at": "2024-05-30T12:00:00Z",
  "data_object": {
    "amount": 4200,
    "currency": "usd",
    "customer": "cus_QAbC1dEfGh2Ijk",
    "id": "pi_3Ox2mB2eZvKYlo2C1kQ8sJ4d",
    "object": "payment_intent",
    "receipt_email": "buyer@example.com",
    "status": "succeeded"
  },
  "id": "evt_1Ox2mB2eZvKYlo2CvQ0Tn9aE",
  "livemode": false,
  "object_id": "pi_3Ox2mB2eZvKYlo2C1kQ8sJ4d",
  "object_type": "payment_intent",
  "payload": {
    "id": "evt_1Ox2mB2eZvKYlo2CvQ0Tn9aE",
    "object": "event"
  },
  "previous_attributes": {},
  "request_id": "req_9Kc0Qm3sT1uW2x",
  "type": "payment_intent.succeeded"
}

Notes

  • Publishing creates the endpoint in Stripe; unpublishing, disabling or archiving deletes it. A workflow that is off is off at Stripe too.
  • Each delivery is verified against Stripe's signature over '{timestamp}.{body}' and refused outside a 5-minute window.
  • Test-mode and live-mode keys are separate accounts at Stripe: a test key registers an endpoint that only ever receives livemode=false events.
  • Stripe allows 16 webhook endpoints per account and this trigger creates one per published workflow, so a 17th publish is refused with Stripe's own message.

See Event run in a workflow.

In a technical demo we add the Stripe connection, drop the node on the canvas and let Workflow Health pre-flight it before the first real run.