> ## Documentation Index
> Fetch the complete documentation index at: /help/llms.txt
> Use this file to discover all available pages before exploring further.

# Stripe

> Stop sales follow-ups when a contact pays: Stripe's checkout.session.completed webhook resumes a waiting contact, matched by email.

> [!NOTE]
>
> **Pro plan.** Stripe works through listeners (**Wait for webhook**), which are part of Pro and Agency (and the free trial). Anything you already have keeps working on every plan. See [Plans and billing](/help/account/billing.md).

Send a Stripe payment link in a LinkedIn message. A **Wait for webhook** step waits for Stripe's `checkout.session.completed` event, matched on the email the contact paid with. Paid: the sales follow-ups are skipped and a welcome message goes out. Not paid: a reminder.

> [!NOTE]
>
> **How it connects:** Stripe's [webhooks](https://docs.stripe.com/webhooks) and the [Checkout Session object](https://docs.stripe.com/api/checkout/sessions/object). No Stripe key is stored in Kerux. The payload below comes from Stripe's docs; check it with **Listen for test event**.

## Before you start

* **Stripe:** any account can add webhook destinations.
* **A payment link** (or Checkout page) that asks for the customer's email.
* **An email on the contact:** the match uses it. A contact without one goes to **Home > Tasks** when the payment arrives, for you to assign.

## 1. Add the waiting step

After the message with the payment link, add **Wait for webhook**:

* **One shared URL + a match rule**: match `data.object.customer_details.email` to `{{email}}`.
* Limit: 7 days.
* Click **Listen for test event** and copy the URL.

## 2. Add the webhook in Stripe

In Stripe, open **Workbench > Webhooks**, add a destination with the Kerux URL and pick the event `checkout.session.completed`. Send a test event (or make a test payment) so Kerux shows a sample.

The event's shape (from Stripe's docs, trimmed):

```json theme={null}
{
  "type": "checkout.session.completed",
  "data": {
    "object": {
      "id": "cs_test_a1b2c3",
      "amount_total": 4900,
      "currency": "usd",
      "customer_details": { "email": "maria@acme.com", "name": "Maria Lopez" },
      "payment_status": "paid"
    }
  }
}
```

In later steps: `{{steps.<step>.payload.data.object.amount_total}}` (in cents) and `{{steps.<step>.payload.data.object.payment_status}}`.

## 3. Branch

* **received**: skip the sales steps and send a welcome message (or **Send to another campaign** for onboarding).
* **timed out**: one friendly reminder, then notify the owner.

Kerux uses the event only to choose which message a contact gets. For anything that moves money, check the payment in Stripe. Keep the URL private.

## Test with one contact

Use Stripe's test mode: put your own email on a test contact, run **Test on one contact** from the **Builder**, and pay the test link with that email. The contact's journey shows the delivery and the branch.

## Common errors

> [accordion] The payment arrives but no contact continues
>
> The email paid with doesn't match a waiting contact. It goes to **Home > Tasks** for you to assign; nobody continues by mistake.

> [accordion] Stripe shows failed deliveries
>
> The URL was copied incompletely or the step was deleted. Copy it again from the step.

> [accordion] Other Stripe events arrive
>
> Only `checkout.session.completed` is needed. Remove other events from the destination; unmatched ones are stored, not acted on.

Related: [Webhook steps](/help/integrations/webhook-steps.md), [PandaDoc](/help/integration-guides/pandadoc.md), [Zapier](/help/integration-guides/zapier.md).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.