How to Track Campaign Performance in Monday.com
Create a campaign tracking board in Monday.com with automated data updates.
What This Integration Does
Most marketing teams already live in Monday.com - it is where briefs, owners, and timelines sit. Performance data, on the other hand, is scattered across Klaviyo dashboards and your store admin. This workflow closes that gap. Once a day it pulls campaign metrics from Klaviyo and revenue figures from your store, then updates the matching Monday.com item so the team sees real performance next to the brief.
The flow runs on a schedule. For each campaign on the Monday board it does two parallel lookups (Klaviyo for engagement, store for revenue), reshapes the numbers, and writes them back to Monday's column values. Items are matched by the campaign id stored in a Monday text column, so renaming a campaign on Monday will not break the link.
Prerequisites
- A Monday.com connection with read and write access to the campaigns board.
- A Klaviyo connection with campaign read access.
- A Shopify or WooCommerce connection for revenue attribution.
- A Monday board with text column
klaviyo_campaign_idon every item, plus number columns foropens,clicks,open_rate,click_rate,orders,revenue.
Step 1: Daily Schedule Trigger
Add a Trigger node set to Schedule. Daily at 08:00 lines up nicely with the European morning standup. The trigger payload is just a timestamp; everything else comes from the connectors.
Step 2: Read Campaign Items from Monday
Add a Connector node on monday with the list-items tool, pointing at the campaigns board. You only need items where klaviyo_campaign_id is populated, so filter the result in a follow-up Transform step.
Step 3: Loop and Fan Out Lookups in Parallel
Wrap a Loop around each Monday item. Inside the loop add a Parallel node with two branches:
- Branch A: Connector on klaviyo using
list-campaignsfiltered by the campaign id, to pull opens, clicks, send count, and revenue if Klaviyo is tracking it. - Branch B: Connector on shopify using
list-ordersfiltered by the UTM source / campaign tag, to pull authoritative revenue and order count from the store.
Running these in parallel cuts each item's processing time roughly in half.
Step 4: Transform - Reshape into Monday Column Values
Add a Transform node that takes both branch outputs and produces a single object matching the Monday columns:
{
"opens": klaviyo.opens,
"clicks": klaviyo.clicks,
"open_rate": klaviyo.opens / klaviyo.delivered,
"click_rate": klaviyo.clicks / klaviyo.delivered,
"orders": shopifyOrders.length,
"revenue": sumOf(shopifyOrders, "totalPrice")
}
Round rates to two decimals so Monday displays them cleanly.
Step 5: Update the Monday Item
Add a Connector node on monday using update-item. Pass:
item_id:{{ item.id }}board_id: the campaigns board idcolumn_values: the transformed object from the previous step
The connector returns the updated item id so you can confirm the write went through.
Step 6: Post a Daily Summary Update
After the loop finishes, add a Connector node on monday using create-update. Post a one-line summary to the top of the board: total opens, total clicks, total revenue across all active campaigns. This is what the team sees in their Monday notifications each morning.
Tips
- Only refresh campaigns sent in the last 30 days - older items are historical and do not need daily refreshes.
- If you have a "status" column on Monday, skip items in
DraftorCancelledto save API calls. - Add a
last_synced_attext column so the team can see when the numbers were last refreshed.
Common Pitfalls
- Attribution mismatches - Klaviyo's reported revenue and Shopify's revenue rarely agree exactly. Pick one as the source of truth (usually the store) and label the column accordingly.
- Monday rate limits - the GraphQL API has per-minute and per-day quotas. If you have hundreds of campaign items, throttle the loop or break it into chunks.
- Stale ids - if a campaign is deleted in Klaviyo but the Monday item still has its id, the lookup will fail. Catch the error and skip rather than letting the whole run break.
Testing
Pick one Monday item, run the workflow manually, and confirm the column values match what you see in Klaviyo and your store admin. Then enable the schedule.