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.
| Field | Type | Required | Default | Constraints | Example |
|---|---|---|---|---|---|
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). | array | No | ["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. | string | No | — | 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.
| Field | Type | Example |
|---|---|---|
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. | string | evt_1Ox2mB2eZvKYlo2CvQ0Tn9aE |
type The event name, e.g. payment_intent.succeeded. Branch on this when the trigger subscribes to more than one. | string | payment_intent.succeeded |
created When Stripe created the event, epoch seconds. | number | 1717070400 |
created_at The same instant as an ISO-8601 UTC string, for nodes that want a date. | string | 2024-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. | boolean | false |
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. | string | pi_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.