How to Add New Stripe Customers to a Klaviyo Welcome List

Build a Spojit workflow where a Stripe webhook creates or updates a Klaviyo profile for every new paying customer and adds them to a welcome list that powers an onboarding flow.

What This Integration Does

When someone pays you through Stripe, that customer should land in your marketing platform within seconds, ready to receive a welcome sequence. This workflow listens for Stripe customer events, makes sure each person exists as a Klaviyo profile with up-to-date details, and then adds them to a dedicated welcome list. A Klaviyo flow watching that list does the rest: the new customer starts receiving your onboarding emails without anyone copying data by hand.

The workflow is triggered by an HTTP POST from Stripe to a Spojit Webhook trigger. Stripe sends the customer payload, Spojit verifies it, looks the person up in Klaviyo, creates or updates the profile, and adds them to the list. Because the create-profile and add-profiles-to-list steps are idempotent on the customer's email, re-running the same event (Stripe retries deliveries, and you may replay events during testing) leaves Klaviyo in the same state rather than producing duplicates. A Human approval node is included as an optional gate so a marketer can confirm before a profile is added to the welcome list when the run looks unusual.

Prerequisites

  • A Stripe connection in Spojit (API key) so the workflow can read customer details. See the Stripe connector article.
  • A Klaviyo connection in Spojit (private API key with profile and list scopes). See the Klaviyo connector article.
  • A signing connection for the Webhook trigger (scheme Stripe or Custom) to verify the incoming HMAC signature. See setting up a webhook connection.
  • An existing Klaviyo list to act as your welcome list, with its list ID copied from Klaviyo. A Klaviyo flow should already be set to trigger when a profile is added to that list.
  • The email address of an approver in your workspace if you want to use the optional Human approval step.

Step 1: Add the Webhook trigger

On a new workflow, set the Trigger node to type Webhook. Choose your Stripe (or Custom) signing connection so Spojit verifies the HMAC signature on every delivery. Save the workflow to reveal the unique webhook URL, then copy it. In your Stripe dashboard, add a webhook endpoint pointing at that URL and subscribe to the customer.created event (add customer.updated too if you want profile changes to flow through). The trigger output is the parsed JSON body, available downstream as {{ input }}. For a Stripe customer.created event, the customer object lives under {{ input.data.object }}, including {{ input.data.object.email }}, {{ input.data.object.name }}, and {{ input.data.object.id }}.

Step 2: Confirm the Stripe customer details

Stripe's webhook payload usually carries everything you need, but the embedded object can be sparse on customer.updated events. To be safe, add a Connector node in Direct mode for the Stripe connector and pick the get-customer tool. Map its customer ID input to {{ input.data.object.id }}. The response gives you a reliable email, name, and any address fields. Store the result in an output variable such as customer so later steps can reference {{ customer.email }} and {{ customer.name }}. If you are confident the webhook body is always complete, you can skip this step and read directly from {{ input.data.object }}.

Step 3: Reshape the data for Klaviyo

Add a Transform node to assemble the exact profile shape Klaviyo expects. Split the Stripe name into first and last names and pass through the email and Stripe ID so you can store it as a custom property. A small structured transform produces an object like this:

{
  "email": "{{ customer.email }}",
  "first_name": "{{ customer.name }}",
  "properties": {
    "stripe_customer_id": "{{ customer.id }}",
    "source": "Stripe"
  }
}

Store the result in a variable such as profile. Keeping this mapping in one place makes the Klaviyo steps below easy to read and easy to change later.

Step 4: Create or update the Klaviyo profile

Add a Connector node in Direct mode for the Klaviyo connector and select the create-profile tool. Map its email input to {{ profile.email }}, set the first name from {{ profile.first_name }}, and pass your custom properties from {{ profile.properties }}. Klaviyo treats the email as the unique key, so an existing person is matched rather than duplicated. If you want to be explicit about refreshing details on returning customers, follow with a second Connector node using the Klaviyo update-profile tool keyed on the same email. Save the profile result to a variable such as klaviyoProfile so you can reference the profile ID in the next step.

Step 5: Optional approval before adding to the welcome list

If a marketer should sign off before a new contact enters the onboarding sequence (for example, high-value or B2B signups), add a Human node here. Set a clear Label like Approve welcome-list add and a Message that uses variables, such as Add {{ profile.email }} (Stripe {{ customer.id }}) to the welcome list?. Add one Approval slot with a User, Role, or Team atom, set Urgency to Normal, and optionally enable Email approvers so they are notified. Leave the timeout blank for no expiry, or set one in minutes. Approvers respond in the Approvals inbox at /approvals. On approval the run continues; a rejection or timeout halts the workflow, so the contact is not added. Wire the approved path into Step 6. If you want every customer added without review, simply omit this node.

Step 6: Add the profile to the welcome list

Add a final Connector node in Direct mode for the Klaviyo connector and select the add-profiles-to-list tool. Set the list ID input to your welcome list ID (a literal value copied from Klaviyo), and pass the profile in the tool's profiles input, referencing either {{ profile.email }} or the profile ID returned in {{ klaviyoProfile }}. Adding a profile that is already on the list is a no-op, which keeps Stripe retries safe. Once the profile lands on the welcome list, your Klaviyo flow that triggers on list membership begins sending the onboarding emails. To confirm delivery, you can optionally add a Send Email node that emails your team a short summary using {{ profile.email }}.

Tips

  • Use Direct mode for every Klaviyo and Stripe call here. The actions are predictable single-tool calls, so you avoid AI credit cost and get deterministic behavior.
  • Store your welcome list ID once in a Transform output or workflow variable so you only have to update it in one place if the list changes.
  • If you later want richer segmentation, send purchase totals as profile properties and let Klaviyo flows branch on them. See syncing purchase data to Klaviyo.
  • Ask Miraxa, the intelligent layer across your automation, to scaffold this for you with a prompt like "Add a Klaviyo Connector node in Direct mode using add-profiles-to-list and connect it after the approval node", then fine-tune fields in the properties panel.

Common Pitfalls

  • Forgetting to select a signing connection on the Webhook trigger means unverified requests. Always pair the Stripe endpoint with a Stripe or Custom signing scheme so Spojit can validate the HMAC signature.
  • Subscribing to too many Stripe events floods the workflow. Limit the endpoint to customer.created (and optionally customer.updated) rather than all events.
  • Mismatched email casing can look like duplicates. Klaviyo keys on email, so normalize to lowercase in the Transform step if your sources are inconsistent.
  • Remember that a rejected or timed-out Human approval halts the run; there is no "on reject" branch. If a customer is not added, check the Approvals history before assuming the workflow failed.

Testing

Before pointing live traffic at this workflow, create a test customer in Stripe (or use Stripe's test mode) so a single customer.created event is delivered to your Spojit webhook URL. Watch the execution in your run history: confirm the Stripe get-customer result, the Transform output, the Klaviyo create-profile response, and the final add-profiles-to-list call. Open Klaviyo and verify the profile exists on the welcome list and that the onboarding flow has queued. Re-deliver the same event from Stripe to confirm no duplicate profile or list entry is created. Once a single customer flows cleanly end to end, enable the workflow for production traffic.

Learn More

Did this answer your question? Thanks for the feedback There was a problem submitting your feedback. Please try again later.