How to Route Inbound Buyer Leads into Klaviyo and Monday with AI Scoring
Capture a buyer enquiry over a Webhook, let an Agent-mode Connector node score and segment it into clean fields, then nurture the contact in Klaviyo and route the hot leads to a Monday board for agent follow-up.
What This Integration Does
Real-estate buyer enquiries arrive in messy free text: a budget buried in a sentence, a vague timeline, a suburb mentioned in passing. This Spojit workflow turns each raw enquiry into a structured, scored lead the moment it lands. An Agent-mode Connector node reads the message, extracts budget, timeline, and target area, assigns a score, and decides whether the buyer is hot enough for an agent to call today or belongs in a longer nurture drip. Marketing keeps every lead warm in Klaviyo; sales only gets pinged for the enquiries worth a phone call.
The workflow runs on a Webhook trigger: your website form, landing page, or property portal posts the enquiry as JSON, and Spojit returns 202 with an executionId right away. From there an Agent-mode Connector node produces a structured result, a Klaviyo create-profile call upserts the contact, add-profiles-to-list adds them to a nurture list, and a Condition node splits hot leads into a Monday.com create-item follow-up task. Each enquiry runs independently, so re-posting the same form submission simply creates another run; Klaviyo matches on email so the profile is updated rather than duplicated.
Prerequisites
- A Klaviyo connection (API key) added under Connections, with the ID of the audience list you nurture buyers in (find it with the
list-liststool or in Klaviyo). - A Monday.com connection, plus the
boardIdof your buyer follow-up board and the column IDs you want to populate (use theget-boardtool to read them). - A Webhook signing connection so the trigger can verify inbound posts. See setting up a webhook connection.
- The form or portal that sends enquiries to Spojit, able to POST JSON and (ideally) sign the request.
Step 1: Receive the enquiry with a Webhook trigger
Add a Trigger node and set its type to Webhook. Attach your webhook signing connection (scheme Custom works for most form providers; use Spojit if you control the sender). Copy the generated URL into your form or portal so each submission POSTs the enquiry body. Spojit parses the JSON and exposes it as {{ input }}. Design your form to send fields like this:
{
"name": "Priya Shah",
"email": "priya@example.com",
"phone": "+61 400 111 222",
"message": "Looking for a 3-bed house in Marrickville, budget around 1.2m, hoping to buy in the next month."
}
If a field is missing or buyers type everything into one box, that is fine: the next step reads the free text in {{ input.message }}.
Step 2: Score and segment the lead in Agent mode
Add a Connector node and switch it to Agent mode. Agent mode lets the agent reason over the enquiry instead of you mapping a single tool. In the prompt, pass the enquiry and ask for a scored, segmented result:
Read this buyer enquiry and extract the buyer's budget, purchase
timeline, and target area. Score the lead from 0 to 100 based on how
ready they are to buy and how complete the enquiry is. Choose a
segment of "hot", "warm", or "cold".
Enquiry:
Name: {{ input.name }}
Message: {{ input.message }}
Open Response Schema on the node and define the JSON shape so the output is reliable to branch on. Setting a Response Schema forces the agent to return exactly these fields:
{
"type": "object",
"properties": {
"score": { "type": "integer", "minimum": 0, "maximum": 100 },
"segment": { "type": "string", "enum": ["hot", "warm", "cold"] },
"budget": { "type": "string" },
"timeline": { "type": "string" },
"area": { "type": "string" }
},
"required": ["score", "segment"]
}
Name the node output something like scored so later steps read {{ scored.score }}, {{ scored.segment }}, {{ scored.area }}, and so on. For a deeper look at this technique, see using structured output for reliable AI data extraction.
Step 3: Create or update the Klaviyo profile
Add a Connector node on the klaviyo connector in Direct mode and pick the create-profile tool. Klaviyo upserts on email, so an existing buyer is updated rather than duplicated. Map the attributes field to carry both the contact details and the scoring result as custom properties:
{
"email": "{{ input.email }}",
"phone_number": "{{ input.phone }}",
"first_name": "{{ input.name }}",
"properties": {
"lead_score": {{ scored.score }},
"lead_segment": "{{ scored.segment }}",
"budget": "{{ scored.budget }}",
"timeline": "{{ scored.timeline }}",
"target_area": "{{ scored.area }}"
}
}
The tool returns the new or matched profile. Name the output profile so you can pass {{ profile.data.id }} to the next step.
Step 4: Add the buyer to a nurture list
Add another Connector node on the klaviyo connector in Direct mode and pick add-profiles-to-list. Set listId to your buyer nurture list ID, and pass the profile you just created into profileIds as a single-element array:
{
"listId": "ABc123",
"profileIds": ["{{ profile.data.id }}"]
}
This puts every buyer, hot or cold, into your Klaviyo flows so the marketing drip starts immediately. Hot leads get the agent touch in the next steps on top of the drip. For a fuller treatment of the marketing side, see auto-segmenting customers using AI and Klaviyo.
Step 5: Route hot leads with a Condition node
Add a Condition node and test the score from Step 2. Set the condition to check whether {{ scored.score }} is greater than or equal to 70 (or compare {{ scored.segment }} equals hot if you prefer the agent's label). The true branch handles agent follow-up; the false branch simply ends, since those buyers are already in the Klaviyo drip from Step 4. For the comparison options, see using Condition nodes.
Step 6: Create a Monday follow-up task for hot leads
On the true branch, add a Connector node on the monday connector in Direct mode and pick create-item. Set boardId to your buyer follow-up board and build a clear item name, then map your board's column IDs in columnValues:
{
"boardId": "1234567890",
"name": "Hot lead: {{ input.name }} ({{ scored.area }})",
"columnValues": {
"email_col": { "email": "{{ input.email }}", "text": "{{ input.email }}" },
"phone_col": "{{ input.phone }}",
"score_col": "{{ scored.score }}",
"budget_col": "{{ scored.budget }}",
"timeline_col": "{{ scored.timeline }}"
}
}
Replace the placeholder column IDs (email_col, score_col, and so on) with the real IDs from your board. Optionally add a Send Email node after this to ping the on-duty agent, templating the recipient and including {{ scored.budget }} and {{ scored.area }} in the body.
Tips
- Keep the Response Schema tight. Using
enumonsegmentand a boundedintegeronscorestops the agent inventing values and makes the Condition node deterministic. - Store the score and segment as Klaviyo
propertiesso your marketing team can build flows and segments on them without re-running the workflow. - Read your Monday column IDs once with
get-boardand keep them in a note. Column IDs are stable but rarely match the visible column titles. - Ask Miraxa, the intelligent layer across your automation, to scaffold this for you: "Build a workflow with a Webhook trigger, an Agent-mode Connector node with a Response Schema that scores a buyer lead, a Klaviyo create-profile node, and a Condition that routes a score over 70 to a Monday create-item node." Then fine-tune each node in the properties panel.
Common Pitfalls
- Webhook replays: if your form retries on a slow response, you may get duplicate runs. Klaviyo upserts on email so the profile stays clean, but a duplicate Monday item can appear. Turn on event-id deduplication on the trigger or guard the
create-itemstep. - Number vs string in templates: write
{{ scored.score }}without quotes where the field expects a number (the Klaviyolead_scoreproperty), and with quotes where a string is expected. Mixing these is the most common cause of a rejected payload. - Wrong list ID:
add-profiles-to-listneeds the list ID, not its name. Confirm it withlist-listsbefore going live. - Agent variability on sparse enquiries: if the buyer wrote two words, the agent has little to score. Decide whether a near-empty enquiry should default to
cold, and say so in the prompt.
Testing
Before pointing your live form at the workflow, test on a small scope. Post a single sample enquiry to the Webhook URL with a clearly hot message (a firm budget and a one-month timeline) and confirm in the execution history that the agent returned a high score, the Klaviyo profile was created with the scoring properties, and a Monday item appeared on the board. Then post a vague, low-intent enquiry and confirm it lands in Klaviyo but does NOT create a Monday item: that proves the Condition branch is routing correctly. Once both paths behave, connect your real form. Review runs in the execution log as described in understanding execution logs.