Sending Feedback to LeadConduit

Alex Wolfe
Alex Wolfe
  • Updated

Feedback tells LeadConduit what happened to a lead after it was delivered. The CRM integration articles call the same feature disposition feedback. There are two types of feedback:

  • Conversion: the lead progressed to a lifecycle stage in your system, such as an appointment being set or a sale closing.
  • Return: you are giving the lead back, usually because it was not contactable or not a real prospect.

Salesforce and LeadPerfection have a built-in feedback integration that sends feedback for you. Any other system that can send a web request can report feedback with the instructions on this page, including software your own team builds.

Feedback must be turned on before recipients can send it: see Enabling a Recipient to Send Conversion Feedback to LeadConduit.

How It Works

Make an HTTP POST request to:

https://app.leadconduit.com/feedback?event_id={event_id}

Replace {event_id} with the event ID that was delivered along with the lead data. Every delivery step in a flow generates its own event ID each time it sends a lead, and that ID is what identifies the delivery your feedback refers to. It is not the lead ID: feedback sent with a lead ID is rejected. You only receive the event ID if the delivery step maps the Event ID field to your system, which is part of enabling feedback. Lead Feedback Overview explains why your system of record should store it with the rest of the lead data.

The event ID also authorizes the request, so no API key or other authentication is needed. Treat event IDs as private for the same reason.

If your system cannot send a request body, you can send the same fields as query parameters on a GET request to the same URL. Everything else on this page applies to both forms.

Request Fields

  • type (required): either conversion or return. If it is missing or has any other value, LeadConduit answers 400 with outcome: error and the reason in the body.
  • reason (optional): for a conversion, the name of the lifecycle stage the lead reached (for example Appointment Set or Sale Closed); for a return, why the lead is being returned (for example Wrong number). A conversion without a reason is stored, but it never appears in a stage column on the Connections Report, so for conversions you should always send one.
  • occurred_at (optional): when the status actually changed in your system, as an ISO 8601 timestamp (2026-05-30T08:00:00Z or 2026-05-30T08:00:00-05:00). Without it, LeadConduit uses the time it received the feedback, which is fine for real-time senders and wrong for anything batched or polled. A timestamp without a timezone is read as UTC, and a date without a time as midnight UTC. A value that cannot be parsed is ignored and the feedback falls back to the receipt time.

Any other fields you include are stored on the feedback event as well, and the step’s feedback rules can use them.

Request and Response Formats

You may send the body in one of three formats. Include the Content-Type header so LeadConduit knows which one you chose:

  • JSON: Content-Type: application/json
  • XML: Content-Type: text/xml or Content-Type: application/xml
  • Form encoding: Content-Type: application/x-www-form-urlencoded

LeadConduit replies with JSON or XML. Choose the response format with the Accept header (application/json or text/xml); without it, LeadConduit defaults to JSON.

What You Can Send for a Lead

Conversions follow the lead through its lifecycle, so you send one conversion event each time the lead reaches a new stage, with the stage name as the reason. A lead that goes from Contacted to Appointment Set to Sale Closed produces three conversion events. Sending the same stage twice for the same delivery is harmless: the stage is counted once on the Connections Report, and the most recent occurred_at (or receipt time) becomes its lifecycle date.

A return closes the lead. Once LeadConduit accepts a return, it rejects every later feedback on that delivery, conversions included, with the reason lead was already returned. A return can still follow earlier conversions.

If a flow delivered the lead to more than one recipient, each delivery has its own event ID and each recipient sends its own feedback.

Reading the Response

A 201 Created means LeadConduit processed the submission. It does not mean the feedback was accepted, so always check the outcome field in the body:

  • success: the feedback was accepted and recorded.
  • failure: the feedback was rejected. The reason says why: the step’s feedback rules did not pass (for example a return sent after the maximum lead age the buyer allows), or the lead was already returned.
  • error: something went wrong while processing the feedback, and reason has the detail.

Other status codes mean the request never got that far:

Status Meaning
400 type is missing or not one of conversion and return (the body carries outcome: error and the reason), or the body could not be parsed as the format named in Content-Type.
403 Feedback has not been enabled on the delivery step that sent this lead.
404 No event exists for this ID, or the event is more than 90 days old and has been deleted.
406 The Accept header asks for a format LeadConduit cannot produce, or Content-Type names an unsupported format.
409 Feedback is configured on the delivery step but currently switched off.
413 The request body is larger than 10 MB.
415 The request has a body but no Content-Type header.
422 The event_id is not a valid ID, is a lead ID, or refers to an event that is not a delivery event.

Example: curl POST with JSON response

Request

curl -X POST "https://app.leadconduit.com/feedback?event_id=5af4b98aa8065fa3a79bf4b3" \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -d 'type=conversion&reason=Appointment Set&occurred_at=2026-05-30T08:00:00Z'

Response

HTTP/1.1 201 Created
Header: Content-Type: application/json; charset=utf-8
Body:
{
    "lead": {
        "first_name": "Joe",
        "id": "5bb3890e9000974b35a55133",
        "last_name": "Blow"
    },
    "outcome": "success"
}

Example: form POST with JSON response

Request

Method: POST
URL: https://app.leadconduit.com/feedback?event_id=5af4b98aa8065fa3a79bf4b3
Header: Content-Type: application/x-www-form-urlencoded
Header: Accept: application/json
Body:
type=return&reason=Wrong+number

Response

HTTP/1.1 201 Created
Header: Content-Type: application/json
Body:
{
    "lead": {
        "email": "joe.blow@example.com",
        "first_name": "Joe",
        "id": "57913b9911c754b2cb643cf3",
        "last_name": "Blow",
        "phone_1": "5125551212"
    },
    "outcome": "success",
    "reason": null
}

Example: JSON feedback with JSON response

Request

Method: POST
URL: https://app.leadconduit.com/feedback?event_id=5af4b98aa8065fa3a79bf4b3
Header: Content-Type: application/json
Header: Accept: application/json
Body:
{
    "type": "conversion",
    "reason": "Sale Closed",
    "occurred_at": "2026-06-02T15:45:00-05:00"
}

Response

HTTP/1.1 201 Created
Header: Content-Type: application/json
Body:
{
    "outcome": "success",
    "reason": null,
    "lead": {
        "id": "57913b9911c754b2cb643cf3",
        "email": "joe.blow@example.com",
        "first_name": "Joe",
        "last_name": "Blow",
        "phone_1": "5125551212"
    }
}

Example: XML feedback with XML response

Request

Method: POST
URL: https://app.leadconduit.com/feedback?event_id=5af4b98aa8065fa3a79bf4b3
Header: Content-Type: text/xml
Header: Accept: text/xml
Body:
<?xml version="1.0"?>
<feedback>
  <type>return</type>
  <reason>Wrong number</reason>
</feedback>

Response

HTTP/1.1 201 Created
Header: Content-Type: text/xml
Body:
<?xml version="1.0"?>
<result>
  <outcome>success</outcome>
  <reason/>
  <lead>
    <id>57913b9911c754b2cb643cf3</id>
    <first_name>Joe</first_name>
    <last_name>Blow</last_name>
    <email>joe.blow@example.com</email>
    <phone_1>5125551212</phone_1>
  </lead>
</result>

Example: rejected feedback

This is what a conversion sent after the lead was already returned looks like. The status is still 201; the rejection is in the body.

HTTP/1.1 201 Created
Header: Content-Type: application/json
Body:
{
    "outcome": "failure",
    "reason": "lead was already returned",
    "lead": {
        "id": "57913b9911c754b2cb643cf3",
        "email": "joe.blow@example.com",
        "first_name": "Joe",
        "last_name": "Blow",
        "phone_1": "5125551212"
    }
}

Conversion Feedback and the Connections Report

For conversion feedback, the reason value names the lifecycle stage the lead reached, and each distinct stage name becomes its own conversion column on the Connections Report shared between connected partners. A few rules follow from that:

  • Stage names are matched exactly, so Appointment Set, appointment set, and Appointment Set are three different columns. Agree on a short, fixed list of stage names and send them identically every time.
  • Only accepted conversions from the last 90 days create columns, so a brand-new stage shows up after its first accepted event.
  • Reports stop adding columns past 25 distinct stage names. Keep the list small.
  • The lifecycle date shown for a stage is the occurred_at you sent, or the receipt time if you did not send one.

For the request and response schemas, the Feedback section of the LeadConduit API reference on the developer portal has the full details.

Was this article helpful?

0 out of 0 found this helpful

Comments

0 comments

Please sign in to leave a comment.