How to Sync New Stripe Customers into Monday as CRM Contacts

Build a Spojit workflow that catches every new Stripe customer the moment it is created, confirms the full record, maps it onto a Monday board as a CRM contact, and pings the account owner in Slack.

What This Integration Does

When your sales or billing team signs up a new customer in Stripe, that record usually has to be re-keyed by hand into your CRM. This workflow removes that step. It listens for the Stripe customer.created event, pulls the complete customer record back from Stripe, and creates a matching contact row on a Monday board so your pipeline always reflects who just started paying. A short Slack heads-up tells the account owner the contact is ready to work. This is the customer-object-to-CRM-contact sync: it is about people, not subscriptions or invoices, so a single new contact row appears per Stripe customer.

The run model is event-driven. A Webhook trigger receives an HTTP POST from Stripe each time a customer is created, verifies it against a Stripe-scheme signing connection, and returns 202 with an executionId. A Connector node in Direct mode then fetches the authoritative record from Stripe, a Transform node reshapes it into Monday column values, a Condition node guards against rows you do not want, and a create-item call writes the contact. Because Stripe can resend the same event, the workflow keys on the Stripe event id to stay idempotent so re-runs do not create duplicate Monday rows. The workflow leaves one new contact on the board and posts one Slack message per genuinely new customer.

Prerequisites

  • A Stripe connection (API key) so the workflow can call get-customer. See the Stripe connector guide.
  • A Webhook signing connection set to the Stripe scheme, holding the signing secret Stripe shows when you add the webhook endpoint. See Setting Up a Webhook Connection.
  • A Monday.com connection with access to the board you will use as your contacts CRM. See the Monday.com connector guide.
  • A Slack connection that can post to the account owner's channel. See the Slack connector guide.
  • The Monday boardId and the column IDs for Email, Phone, Company, and Stripe Customer ID on that board (open the board, add the columns, and note each column's ID).

Step 1: Receive the Stripe event with a Webhook trigger

Add a Trigger node and set Trigger Type to Webhook. Attach the signing connection you created with the Stripe scheme so Spojit verifies the Stripe signature header on every request and rejects anything unsigned or tampered. Copy the workflow's webhook URL, then in your Stripe dashboard add a webhook endpoint pointing at it and subscribe it to the customer.created event. Turn on event-id dedup so Stripe replays of the same delivery are ignored. The trigger output is the parsed JSON event body, available downstream as {{ input }}, with the new customer id at {{ input.data.object.id }} (a value like cus_123).

Step 2: Confirm the full record with a Stripe Direct-mode call

Add a Connector node on the Stripe connector in Direct mode and pick the get-customer tool. Direct mode is deterministic and spends no AI credits, which is what you want for a single predictable lookup. Map its id field to {{ input.data.object.id }}. The webhook payload is a snapshot from the instant of creation; calling get-customer returns the authoritative record (in case fields were filled in or corrected right after sign-up). Bind the result to a variable such as customer so later steps read {{ customer.email }}, {{ customer.name }}, {{ customer.phone }}, and {{ customer.metadata }}.

Step 3: Skip records you do not want with a Condition node

Add a Condition node so you only create contacts worth tracking. A common rule is to require an email: branch on whether {{ customer.email }} is non-empty. You can also use the event id as a guard for idempotency by routing only fresh events down the true branch. Send the true branch onward to the Transform step; leave the false branch unconnected so the run ends quietly for test customers, blank records, or replays. Keeping this filter early means you never write half-empty rows onto the board.

Step 4: Map Stripe fields to Monday columns with a Transform node

Add a Transform node to reshape the Stripe customer into the exact columnValues object Monday expects, keyed by your board's column IDs. Produce an object whose keys are the column IDs you noted in the prerequisites and whose values are the Stripe fields. For example:

{
  "email_col_id": { "email": "{{ customer.email }}", "text": "{{ customer.email }}" },
  "phone_col_id": "{{ customer.phone }}",
  "company_col_id": "{{ customer.metadata.company }}",
  "stripe_id_col_id": "{{ customer.id }}"
}

Storing {{ customer.id }} in a dedicated Stripe Customer ID column is what lets you spot duplicates later and trace each Monday contact back to its Stripe record. Bind the output to a variable such as columns.

Step 5: Create the contact with a Monday create-item call

Add a Connector node on the Monday.com connector in Direct mode and pick the create-item tool. Set boardId to your contacts board, set name to {{ customer.name }} (or fall back to {{ customer.email }} when the name is blank), optionally set groupId to drop new contacts into a "New" group, and set columnValues to {{ columns }} from the Transform step. The tool returns the created item's id and name; bind the result to a variable such as mondayItem so the Slack message can reference it.

Step 6: Post a Slack heads-up to the account owner

Add a Connector node on the Slack connector in Direct mode and pick the send-message tool. Set the target channel and write a short message that names the new contact and links the systems together, for example:

New CRM contact created: {{ customer.name }} ({{ customer.email }})
Stripe customer {{ customer.id }} - Monday item {{ mondayItem.id }}

If you do not know the owner's channel id, you can first add a Connector node on Slack with lookup-user-by-email to resolve a user, then post to them. This keeps the human in the loop without slowing the sync down.

Tips

  • Add a Stripe Customer ID column on the Monday board and write {{ customer.id }} into it. Before creating, you can run list-items on Monday and a Condition node to skip the create when that id already exists, which guards against duplicates even across separate webhook deliveries.
  • Keep the lookup in Direct mode: a single get-customer call needs no AI judgment, so it stays fast and free of AI credits. Reserve Agent mode for steps that need reasoning.
  • You can build and refine this whole flow with Miraxa, the intelligent layer across your automation. Try a prompt like "Add a Condition node that checks if {{ customer.email }} is non-empty and connect the true branch to a Transform node".
  • For a higher-touch process, route the new contact through a Human node so an owner approves it before it lands on the board.

Common Pitfalls

  • Skipping signature verification. Without a Stripe-scheme signing connection on the Webhook trigger, anyone who learns the URL can inject fake customers. Always attach the signing connection and store the secret Stripe gives you for the endpoint.
  • Trusting the webhook payload alone. The event body is a point-in-time snapshot. Re-fetch with get-customer so name, phone, and metadata reflect the current record.
  • Duplicate Monday rows from replays. Stripe retries deliveries. Enable event-id dedup on the trigger and key on {{ customer.id }} in a Stripe Customer ID column so a re-sent event does not create a second contact.
  • Wrong Monday column shape. Monday's columnValues is keyed by column ID, not column title, and some column types (like Email) expect an object such as { "email": "...", "text": "..." }. Mismatched keys are silently ignored, leaving blank cells.

Testing

Create a test customer in Stripe (or use Stripe's test mode) so a single customer.created event fires at your webhook URL. Open the workflow's execution history in Spojit and confirm the trigger returned 202, the get-customer step returned the record, the Condition node took the true branch, and the Transform produced an object keyed by your real column IDs. Check that exactly one new contact appears on the Monday board with the email, phone, and Stripe Customer ID populated, and that the Slack message arrived once. Re-send the same Stripe event to prove dedup and the duplicate guard prevent a second row before you switch the workflow on for live traffic.

Learn More

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