DocsBuyersPay Per Conversion (CPA)

Pay Per Conversion (CPA)

Step-by-step setup for billing a destination only when a lead converts instead of at delivery. Build a cost per retainer, cost per signed case, or cost per sale campaign end to end: set the payout, deliver at $0, and let the destination confirm the conversion from the Partner Portal or their CRM.

Last updated:

Most lead sales are billed at delivery: the destination (the buyer who pays you) gets the lead, and they owe you for it right then. Pay Per Conversion flips that. The lead is delivered at $0 and you get paid only if it turns into something real. In legal campaigns that is a signed retainer, so people call it cost per retainer or CPR. It works the same way for a booked install, a bound policy, or a closed sale.

This guide builds one end to end. The example throughout is a law firm paying per signed retainer, because that is the most common version, but nothing in the setup is specific to legal.


Before you start

Three things to have ready. None of them take long.

  • What you get paid per conversion. One number per destination, for example $2,500 per signed retainer. If it changes by state, have that list ready too.
  • How the destination wants leads delivered. A webhook URL, an email address, or a Google Sheet.
  • How they will tell you a deal closed. This is the one people skip, and it is the one that decides whether you ever get paid. Decide now whether they will use the Partner Portal or post back from their CRM.

A per-conversion lead is worth $0 until somebody confirms it converted. If nobody can report conversions, your revenue stays at $0 no matter how many deals close. Do not skip Step 6.


How the money flows

StageLead statusYour revenue
Lead comes inNew$0
Delivered to the firmAccepted, marked Per Conversion$0, payout locked on the lead
Firm works the leadAccepted$0, still unconfirmed
Firm confirms the retainerAccepted, ConvertedYour cost per retainer
Deal falls throughAccepted, Not Qualified$0, reversed automatically

Step 1: Create the campaign

  • Go to Campaigns and click Create Campaign.
  • Pick Leads as the unit. Per-conversion billing is a leads feature. Calls are billed on connection and duration instead, so a calls campaign cannot bill per retainer.
  • Pick Direct Post for routing unless you already know you need ping post.
  • Name it something you will recognize in reports, for example "MVA Cases".

One campaign can hold every firm you sell to. Each firm becomes its own destination with its own price, so you do not need a separate campaign per firm.


Step 2: Set your lead fields

Open the campaign and go to the Fields tab. These are the fields every lead carries: first name, last name, phone, email, plus whatever your vertical needs, for example state, incident date, or whether the person was at fault.

Add every field the firm asks for, and every field you want to price on later. If you plan to charge a different rate per state in Step 3, you need a state field here. Full detail in Field Mapping.


Step 3: Add the firm and set the retainer price

This is the step that makes it pay-per-conversion. On the campaign Overview tab, find the routing table and click Add Destination.

  • Pick or create the destination, for example the law firm's name.
  • In the Payout section, set Payout Type to Per Conversion (CPA).
  • The price field is now labeled Payout Per Conversion. Enter your cost per retainer, for example 2500.
  • Set caps if the firm can only take so many leads a day or month. Caps control volume, not money, so a delivered-but-unconverted lead still counts against them.
  • Save.

Payout Type is set per destination, not per campaign. The same campaign can have one firm paying $50 a lead at delivery and another paying $2,500 per retainer, and both compete for the same leads through your normal routing rules.


Step 4: Set up delivery

Still in the destination's settings, choose how the lead reaches the firm: a webhook (they give you a URL), email, or a Google Sheet. Pick the fields to send. Delivery works exactly the same as it does for a per-lead destination, and the destination is not active until a delivery method is set. See Delivery Methods.

If the firm's system replies with something like {"status":"rejected"} on a 200, turn on response parsing so a rejection is not recorded as an accepted lead. Otherwise any 200 counts as accepted.


Step 5: Connect your lead source

Back on the routing table, click Add Source. A source is where the leads come from: your own ad account, a funnel, a vendor, or an API partner.

  • Your own ads with a Meta lead form: go to Settings then Integrations then Meta Lead Forms, and map the form to this campaign and source. Check the form version in Ads Manager matches the one you map, since running ads often point at a newer version of the form.
  • A vendor posting to you: open the source's menu and choose API Specs to get the endpoint and API key to send them.
  • A Lead Distro AI funnel: point the funnel at this campaign.
  • Set what the lead costs you in the source's settings, so your profit per case is real.

Step 6: Give the firm a way to confirm a retainer

Do not skip this. Until one of these is in place, nothing can ever convert and every lead sits at $0 forever. Pick whichever fits the firm.

Option A: the Partner Portal (easiest)

  • Go to Buyers, open the firm, and find the Partner Portal card.
  • Click Enable Portal and invite their contact by email.
  • They log in, see their leads, and set a lead to Converted when the retainer is signed. They can backdate it to the day the deal actually closed so your reporting matches theirs.

Option B: their CRM posts back (best once volume picks up)

  • On the campaign Overview tab, open the destination's menu and choose Outcome Webhook.
  • Generate the secret. You get a shareable setup link you can send straight to their developer, so nobody needs a login to your dashboard.
  • Their case management system posts one request when a retainer is signed. One URL covers every campaign you run with that firm.
curl -X POST https://www.leaddistro.ai/api/webhooks/buyer-outcome \
  -H "Content-Type: application/json" \
  -H "X-Buyer-Secret: your_destination_webhook_secret" \
  -d '{
    "lead_id": "<lead-uuid-from-the-original-delivery>",
    "outcome": "converted",
    "conversion_revenue": 2500,
    "lead_value": 40000,
    "note": "Retainer signed",
    "idempotency_key": "crm-event-12345"
  }'
FieldWhat it is
outcomeconverted when the deal is real, not_qualified when they reviewed it and passed. Leave it out entirely to send revenue or a note without changing the outcome.
lead_idThe lead's ID from the original delivery. If their system never stored it, they can match on phone or email plus campaign_id instead, or on a custom field like a click ID.
conversion_revenueOptional. What you get paid for this deal. Send it when the amount varies case by case, and it overrides the fixed payout on file. Leave it out to use the price you set in Step 3.
lead_valueOptional. What the deal is worth to them, for example the case value. Stored for reporting only. It never affects what you get paid.
idempotency_keyOptional but recommended. Stops a CRM retry from being counted twice.

conversion_revenue is your money. lead_value is theirs. Mixing the two up is the most common setup mistake, and it quietly inflates your revenue reporting.

Option C: you mark it yourself

Open the lead and set the outcome to Converted. Fine for a handful of deals a month, and a useful backstop when a firm forgets. Do not use bulk edit for this, see the last section.


Step 7: Test it, then go live

  • On the campaign page click Send Test Lead. It runs the full pipeline but costs $0 and is excluded from your reports.
  • Confirm the firm received it, and that the lead shows Accepted with a Per Conversion badge and the right amount.
  • Mark that test lead Converted and check the revenue appears where you expect it. If you set up the CRM postback, have them fire one real request instead.
  • Set the destination to Active and turn your traffic on.

A different price per state

If the firm pays $2,500 in Florida and $3,250 in Georgia, do not create two destinations. In the destination's Payout section, turn on Conditional Pricing and add one rule per state. The right amount is worked out from the lead's data and locked onto the lead the moment it is delivered.

Because the payout is locked at delivery, raising your price later never re-prices leads already sitting in the firm's pipeline. They convert at the price that was in effect the day they were delivered, so a price change cannot rewrite your past reporting.


If a deal falls through

Change the outcome back to Pending or Not Qualified and the revenue backs out automatically. The lead goes back to being worth $0 and your reports update. Returns still work the same way they always have, including your return window, so a converted lead can also be returned later. See Lead Returns.


Reporting only, when another system already delivers

If your CRM or automation platform is already delivering leads to the firm and you only want Lead Distro AI for tracking and profit reporting, set the source to Tracking Only instead of setting up delivery in Step 4. Open the source's settings, turn on Tracking Only, and pick which destination the leads are credited to.

  • Leads are recorded and credited to that destination, but never delivered anywhere, so nothing gets double-sent.
  • They land at $0 and revenue arrives later exactly as in Step 6.
  • There is no locked payout on these leads, so each postback should include conversion_revenue with the amount.
  • Caps, filters, and the return flow do not apply, because nothing is being delivered. Move to full delivery when you are ready for those.

Things to know before you go live

  • Conversions record revenue, they do not charge a card. A confirmed conversion updates your revenue and your reports. It does not debit a prepaid wallet, so per-conversion money is still invoiced and collected outside the app.
  • Do not mark conversions with bulk edit. Changing the outcome on many leads at once writes the outcome without running the billing steps, so no revenue is recorded. Mark them one at a time, or let the firm report them.
  • Nothing expires on its own. A lead stays open until somebody reports on it. There is no timer that converts or closes a lead automatically, so if a firm goes quiet you need to chase them.
  • Recording the handoff call? Keep any calls campaign priced at $0. Calls are billed on connection and duration, not on a later outcome, so pricing the transfer call as well bills the same case twice. Let calls do recording and attribution, and let this campaign do the money. See Warm Transfer.

Frequently Asked Questions

How do I set up a campaign that pays per signed retainer?
Create a Leads campaign, add the law firm as a destination, and in the destination's Payout section set Payout Type to Per Conversion (CPA) with your cost per retainer as the payout. Set a delivery method, connect your lead source, then give the firm a way to confirm retainers: either enable their Partner Portal or generate their Outcome Webhook so their case management system can post back. Send a test lead, mark it converted to confirm the revenue lands, then go live.
What if the retainer price is different in each state?
In the destination's Payout section turn on Conditional Pricing and add a rule per state, for example Florida $2,500 and Georgia $3,250. Do not create a separate destination per state. The rate is worked out from the lead's data and locked onto the lead when it is delivered, so a later price change never re-prices leads already in the pipeline.
Why is my revenue still $0 when retainers are being signed?
Almost always because nobody can report the conversions yet. A per-conversion lead is worth $0 until it is marked Converted. Check that each destination has either the Partner Portal enabled or an Outcome Webhook secret generated, and that whoever signs the retainer knows to report it. This is Step 6 of the setup.
What happens if a case falls through after it was marked converted?
Change the outcome from Converted back to Pending or Not Qualified. The revenue is reversed automatically and the lead returns to $0, and your reports update. If the firm wants the lead formally returned instead, the normal returns process still applies, including your return window.
Can I have per-lead and per-conversion destinations in the same campaign?
Yes. Payout Type is set per destination, not per campaign. One destination can pay $50 at delivery while another pays $2,500 on conversion, and both compete for the same leads through your normal routing rules.
Does marking a lead converted charge the destination automatically?
No. Confirming a conversion records the revenue on the lead and updates your reporting, but it does not debit a prepaid wallet or run a card. Per-conversion amounts are invoiced and collected outside the app today.
How does a destination tell Lead Distro AI that a deal closed?
Three ways. They mark it Converted in the Partner Portal, optionally backdating it to the real close date. Their CRM posts to https://www.leaddistro.ai/api/webhooks/buyer-outcome with their webhook secret in the X-Buyer-Secret header. Or you mark it yourself on the lead. Each destination has a shareable setup page you can send to their developer so they never need a login.
What is the difference between conversion_revenue and lead_value?
conversion_revenue is what you get paid for that conversion, and it sets the lead's revenue, overriding the fixed payout on file. lead_value is what the deal is worth to the destination, for example the value of the case, and it is stored for reporting only. It never affects billing.
Can I bill per conversion on a calls campaign?
No. Calls are billed on connection and duration, and billing is finalized when the call ends, so there is no per-conversion mode on the calls side. If a call centre signs the retainer and warm-transfers the caller to the firm, run the money through a leads campaign like this one and keep the calls campaign at $0 so it only does recording and attribution.

If you have any questions, send us an email at support@leaddistro.ai