How to Post New Stripe Subscriptions to a Monday Revenue Board

Build a Spojit workflow that runs on a schedule, lists your active Stripe subscriptions, and creates or updates an item on a Monday.com board so your team can track recurring revenue at a glance.

What This Integration Does

Recurring revenue lives inside Stripe, but the people who plan around it (finance, sales, customer success) usually work in Monday.com. Copying subscription numbers across by hand is slow and goes stale within a day. This workflow keeps a Monday board in sync automatically: each active Stripe subscription becomes an item on a revenue board, with its plan, amount, status, and customer captured in columns. Because the workflow re-runs on a fixed schedule, the board stays current without anyone touching Stripe.

A Schedule trigger fires the run on a Unix cron expression and timezone you choose. On each run the workflow calls the Stripe connector to list active subscriptions, loops over them, and for each one looks up the board to decide whether to create a new item or update an existing one. The board is the durable state the workflow leaves behind; the run itself holds no memory between executions. Because every item is matched on a stable key (the Stripe subscription ID), re-running is safe and idempotent: existing items are updated in place rather than duplicated, so running hourly or daily never produces double rows.

Prerequisites

  • A Stripe connection in Spojit. Add it under Connections → Add connection using a restricted API key with read access to subscriptions, customers, and products.
  • A Monday.com connection in Spojit, authorized for the workspace and board you want to write to.
  • A Monday board with columns ready to receive the data: for example a text or number column for the monthly amount, a status column for the subscription state, a text column for the customer, and a text column to hold the Stripe subscription ID (used as the match key).
  • The Monday boardId and the column IDs for those columns. You can read them with the get-board tool described in Step 4, or copy them from the board's column settings in Monday.

Step 1: Add a Schedule trigger

Open the Workflow Designer and add a Trigger node, then set its type to Schedule. A Schedule trigger uses a 5-field Unix cron expression plus an IANA timezone. To refresh the board every morning at 7am Sydney time, set the expression to 0 7 * * * and the timezone to Australia/Sydney. A single trigger can hold multiple schedules if you want both a weekday-morning and an end-of-day refresh. The trigger output is { scheduledAt }, the timestamp of the fire, which you can reference downstream as {{ scheduledAt }}.

Step 2: List active Stripe subscriptions

Add a Connector node in Direct mode, choose the Stripe connector, and select the list-subscriptions tool. Set status to active so only live subscriptions reach the board, and set limit to 100 (the maximum per call). Bind the result to a variable such as subs. Direct mode is the right choice here because the call is deterministic and spends no AI credits. The tool returns a Stripe list; the subscription objects are available under the data array of {{ subs }}, each carrying the subscription id, status, customer, and plan/price details.

Step 3: Loop over each subscription

Add a Loop node in ForEach mode and point it at the subscription list from the previous step, for example {{ subs.data }}. Each pass exposes the current subscription as a loop variable (for example {{ subscription }}). Everything in Steps 4 through 6 lives inside the loop body so it runs once per subscription. If you expect more than 100 active subscriptions, see the Tips section on paging with starting_after.

Step 4: Find a matching item on the Monday board

Inside the loop, add a Connector node in Direct mode using the Monday.com connector and the list-items tool. Pass your boardId so you can search the existing rows for one whose Stripe subscription ID column already equals {{ subscription.id }}. Bind the result to existing. (If you have not yet captured the board's column IDs, run the get-board tool once with your boardId to read the board structure and note the IDs of your amount, status, customer, and subscription-ID columns.) Follow with a Transform node that scans {{ existing }} for an item whose subscription-ID column matches the current subscription, and outputs the matched item ID (or an empty value when there is no match) as matchedItemId.

Step 5: Branch on whether the item already exists

Add a Condition node that checks whether {{ matchedItemId }} is empty. The false branch (an item was found) leads to an update; the true branch (no match) leads to a create. This keeps the workflow idempotent so repeated runs refresh existing rows rather than duplicating them.

Step 6: Create or update the Monday item

On the create branch, add a Connector node in Direct mode with the Monday.com connector and the create-item tool. Set boardId, give name a readable label such as the customer name or plan, and pass columnValues as an object keyed by your column IDs. For example:

{
  "text_subscription_id": "{{ subscription.id }}",
  "status": "{{ subscription.status }}",
  "numbers_mrr": "{{ subscription.plan.amount }}",
  "text_customer": "{{ subscription.customer }}"
}

On the update branch, add a Connector node in Direct mode with the update-item tool. Set boardId and itemId to {{ matchedItemId }}, and pass the same columnValues object so the amount and status stay current. Replace the keys above with your real column IDs from Step 4. Stripe amounts are in the smallest currency unit (cents), so if you want dollars on the board, divide using a Connector node with the built-in math connector before writing the value.

Tips

  • Use the Transform node to build the columnValues object once and reuse it on both the create and update branches, so the two paths never drift apart.
  • To enrich items with a real plan name or customer email, add a Stripe list-products or get-customer call before Step 6 and merge those fields into columnValues.
  • If you want a Monday update note instead of overwriting a column, add a create-update call to post a comment such as the new amount onto the item.
  • Pick a schedule cadence that matches how fast revenue figures need to be fresh: daily is plenty for most boards, and a lighter cadence keeps you well clear of Stripe and Monday rate limits.

Common Pitfalls

  • More than 100 subscriptions. list-subscriptions returns at most 100 per call. If you have more, page by capturing the last subscription id and passing it as starting_after on a follow-up call, or wrap Step 2 in a Loop that keeps fetching until the returned list is no longer flagged as having more.
  • Wrong column IDs. Monday's columnValues are keyed by column ID, not the column title you see in the UI. Read the real IDs with get-board first; a mistyped key is silently ignored and the cell stays blank.
  • Amounts off by 100x. Stripe reports amounts in cents. Convert before writing, or your revenue board will read 100 times too high.
  • Status drift. A subscription can move to past_due or canceled between runs. Because Step 2 filters to active, those rows stop being refreshed; if you want the board to reflect churn, also run the workflow with status set to all and write the status into the board so cancelled rows are visibly marked rather than left stale.

Testing

Before turning the schedule loose, validate on a small scope. Temporarily set the Stripe limit to a low number such as 3, then run the workflow once with the Run button so you do not have to wait for the cron to fire. Open the execution in the run history and confirm the Stripe step returned subscriptions, the loop iterated, and the Monday board gained the expected items. Run it a second time and verify the same subscriptions update in place rather than duplicating, which proves the match logic in Steps 4 and 5 works. Once the board looks right, restore the real limit and let the Schedule trigger take over. If anything fails, ask Miraxa, the intelligent layer across your automation, "Why did my last run fail?" and it will read the run and point you at the failing step.

Learn More

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