I built this for a client who was raising every Stripe invoice by hand.
Their process was: open Stripe, retype the client name, email and phone from monday.com, add each line item one at a time, send the invoice, paste the payment link back onto the board, then check Stripe every few days to see whether it had cleared. All the data needed was already on the board. It was just being copied across manually every single time.
Now they set one status column to Yes and the rest happens on its own.
I split it into two scenarios.
Scenario 1: from board to sent invoice
monday.com → Watch Events (instant trigger)
Fires on a column change, with a filter right after it so only items where Generate Invoice = Yes continue. Editing a phone number never raises an invoice by accident.
monday.com → Get an Item
Mapped with 1. Event: Pulse ID. Two settings do the heavy lifting:
- Show Parent Item: Yes — the parent holds the client record (name, email, phone)
- Show Subitems: Yes — the sub items hold the line items
One call gives me the whole billing context in a single bundle.
Stripe → Search Customers, then a Router
I search Stripe by the parent item’s email before creating anything. The router then splits:
- Customer doesn’t exist →
Stripe: Create a Customer, mapped from2.parent_item: name,2.parent_item...email,2.parent_item...phone - Customer exists → skip creation, reuse the Stripe ID
I added this after seeing what happens without it. Every invoice spawns a duplicate customer and the billing history splits across records.
There’s a third route as a guard rail. If the item has no email, it posts an update on the monday.com item saying exactly what’s missing, rather than failing quietly somewhere the user never looks.
JSON → Parse JSON → Stripe: Create an Invoice Item → Array aggregator
This is the part I spent the most time on. The sub item carries Item 1, Item 2 and so on. Parse JSON turns those columns into a collection, Create an Invoice Item iterates over it, and the Array aggregator collapses the bundles back down to one before the invoice is created.
Leave the aggregator out and you get one invoice per line item instead of one invoice with several lines.
Stripe → Create an Invoice
- Customer ID: from whichever route ran
- Collection Method: Send Invoice
- Due Date:
ifempty(2...date; addDays(now; 7))
That ifempty() handles the most common real-world case, which is somebody leaving the due date column blank. Board date if it exists, seven days out if it doesn’t.
Stripe → Finalize a Draft Invoice
Finalizing issues it and emails the client, so nobody has to press send.
monday.com → Update Column Values + Create an Update
Writes back to the same row:
- Stripe Invoice Link →
Hosted Invoice URL, display text “Invoice URL” - Stripe invoice ID into a text column (scenario 2 needs this)
- Status moves to Sent
The update posts into the item’s activity log, so there’s a record of when the invoice went out and to which address.
Scenario 2: payment sync
Three modules, and it closes the loop.
Stripe → Watch Events, filtered to the invoice paid event
↓
monday.com → Search Items in the Board by Column Values, searching the stored invoice ID column against 1. Object: Id
↓
monday.com → Update Column Values, setting Invoice Paid to Paid via Index
This is the whole reason scenario 1 stores the Stripe invoice ID on the board. It’s the join key.
What caught me out while building
Parent vs sub item mapping. I mapped the client email from the sub item first and kept getting empty values. The client lives on the parent, the money lives on the sub items.
Aggregator placement. If Create an Invoice sits inside the iteration instead of after the aggregator, every line gets its own invoice. Easy to miss if you only ever test with one line item, which I did at first.
Search before create. Cleaning up duplicate Stripe customers later is far more painful than adding the search step up front.
Error paths have to be visible. A scenario that fails silently gets abandoned. Posting the failure onto the monday.com item means the person who triggered it knows what to fix without opening Make.
What you need to build it
- monday.com account with a board that supports sub items
- Stripe account with API key access
- A Make account to connect the two
Happy to go deeper on any part of the mapping if you’re building something similar.

