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-lists tool or in Klaviyo).
  • A Monday.com connection, plus the boardId of your buyer follow-up board and the column IDs you want to populate (use the get-board tool 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 enum on segment and a bounded integer on score stops the agent inventing values and makes the Condition node deterministic.
  • Store the score and segment as Klaviyo properties so your marketing team can build flows and segments on them without re-running the workflow.
  • Read your Monday column IDs once with get-board and 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-item step.
  • Number vs string in templates: write {{ scored.score }} without quotes where the field expects a number (the Klaviyo lead_score property), 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-list needs the list ID, not its name. Confirm it with list-lists before 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.

Learn More

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