Documentation
Everything needed to receive leads, filter them, pace them, feed outcomes back, and read your own numbers, in one document. Start with the contents below or use your browser find function.
Contents
11 sections. Every link below is an anchor into this page, so nothing here opens an empty article.
How to read this page
Four conventions hold across every section below.
- Examples are illustrative. Field names and shapes are real. The people, numbers, and identifiers in them are fabricated.
- Credentials are issued, not self-served. A delivery endpoint receives consumer contact data and a consent record, so it is opened by a person. See how onboarding runs.
- Numbers are E.164 and times are UTC. Send and expect
+14045550143and2026-09-18T14:19:46Zeverywhere. See formats and conventions. - Pricing is quoted, not published. Rates depend on the vertical, the program, the filters, and committed volume. See pricing.
Adjacent references
Three places that answer questions this document deliberately does not repeat.
Delivery API reference
The full lead field tables, headers, response codes, retry schedule, signature verification, the event catalog, rate limits, and the error format.
Open the referenceIntegrations
How dialers, CRMs, agency management systems, lead platforms, warehouses, and analytics tools connect, protocol by protocol.
See integrationsSystem status
Current state of every component from campaign delivery to the API, the maintenance window policy, and what to send when you report a problem.
Check statusGetting started
What a program includes, how onboarding runs, and the shortest path from a conversation to a lead ringing on a desk.
What a program includes
A program is one vertical, one set of filters, one delivery path, and one pacing configuration. You can run several at once, and most buyers do: a Medicare program during the annual enrollment period alongside a final expense program that runs all year. Each program has its own caps, its own filters, and its own reporting, so one can be paused without touching the other.
Everything else comes with it rather than as a tier: pre-delivery filters, consent capture and storage, delivery into your stack, disposition feedback, credits under written criteria, reporting, and a named contact. There is no platform fee and no monthly minimum to start. Pricing is quoted per lead by vertical and varies with the program, the filters you apply, and the volume you commit to; see the pricing page.
How onboarding runs
Onboarding is a conversation rather than a signup form, because a lead program has to match the licenses, the staffing, and the hours you actually have. We ask for four things: the vertical and program you want, the states and counties your agents are appointed in, the daily volume your floor can genuinely work, and where the leads should land.
You leave with a program identifier, delivery credentials for the path you chose, an agreed field mapping, and a test plan. Credentials are issued by a person, not generated from a self-serve page, because a delivery endpoint receives consumer contact data and consent records. See the API reference for what the credentials are and how they are scoped.
Choosing a vertical and a program
Three verticals, and the right one is usually decided by what your agents can already place rather than by what looks interesting. Medicare splits into Advantage, Part D, and Medicare Supplement, and into calendar programs: the annual enrollment period, the Medicare Advantage open enrollment period, year-round special enrollment, and age-in or turning-65 demand. Each of those is a different prospect and a different opening line.
Life insurance splits into term and permanent, with the coverage amount the prospect asked about captured at the form. Final expense captures burial coverage intent with the monthly budget the prospect had in mind, which is the field that decides whether the agent builds to budget or guesses.
A practical rule. Start with the vertical where you already have a script your agents believe in. A new vertical and a new lead source at the same time gives you two variables and no way to read the result.
Test leads before the first live lead
Every integration is proven with test traffic first. We send sample records through the exact path your live leads will take, carrying the same field names, the same formats, and the same headers, with a flag on the envelope marking them as tests. You confirm they land in the right queue, with the right fields populated, assigned to the right campaign or user.
Test leads are not billed and do not count against a cap. Run them again any time you change something on your side: a CRM field rename, a new routing rule, or a rebuilt endpoint. A five-minute test is cheaper than a morning of leads landing in a table nobody reads.
Go-live checklist
- Test leads arrive at your endpoint and return a 2xx within the response window.
- Every field you care about is mapped and populated, including the consent fields.
- The lead id is stored on your record, because it is the key for every later conversation about that lead.
- Your delivery window matches the hours your agents are actually on the phone.
- Your daily cap matches what the floor can work today, not what you hope to staff.
- Licensing geography is loaded and current, down to the county where it matters.
- Your own disqualifiers are in place, so you are not billed for leads you would never work.
- Someone owns the first dial, and you know how you will measure the time to it. See outcome reporting.
- A disposition path back to us exists, even if it starts as a daily file. See disposition feedback.
Lead record fields
What arrives with every lead, what is vertical-specific, and the formats to expect so your parser is never guessing.
The shape of a lead record
Every lead is one JSON object with five groups of fields: the envelope that identifies the lead and the program, contact and identity, the vertical-specific answers, the consent record, and source and attribution. The envelope and the consent record are identical across all three verticals. Only the vertical block changes.
Here is a complete final expense record, with the fields in the order they arrive.
{
"lead_id": "lead_01K5R7TQ3M9B",
"program_id": "prog_fex_core",
"vertical": "final_expense",
"test": false,
"created_at": "2026-09-18T14:19:46Z",
"delivered_at": "2026-09-18T14:19:52Z",
"contact": {
"first_name": "Marjorie",
"last_name": "Alvarado",
"phone": "+14045550143",
"phone_type": "mobile",
"email": "m.alvarado@example.com",
"address_line1": "1487 Peachtree Walk NE",
"city": "Atlanta",
"state": "GA",
"postal_code": "30309",
"county": "Fulton",
"date_of_birth": "1957-04-02",
"age": 69,
"gender": "female",
"time_zone": "America/New_York"
},
"final_expense": {
"coverage_reason": "burial_and_final_costs",
"monthly_budget": "50_to_75",
"existing_coverage": false,
"tobacco": false,
"health_flags": ["none_reported"],
"beneficiary_intent": "adult_children"
},
"consent": {
"captured_at": "2026-09-18T14:19:44Z",
"ip_address": "198.51.100.37",
"page_url": "https://example-offer.solvedmarket.ing/fex/quote",
"disclosure_id": "disc_fex_2026_03",
"disclosure_text": "By clicking Get My Quote I agree ...",
"user_agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 18_2 ...)",
"form_duration_seconds": 74
},
"source": {
"channel": "paid_social",
"campaign_ref": "fex-ga-q3",
"device": "mobile",
"landing_page_ref": "fex-quote-b"
}
}
Contact and identity fields
The contact block is the same in every vertical. Name, phone, phone type, email, postal address including county, date of birth, derived age, gender where the prospect gave it, and the time zone derived from the address. County is included because licensing and plan availability are frequently county-level rather than state-level, and an agent who cannot write in that county should never see the record.
Time zone matters more than people expect. It is the field that keeps a dialer from calling a prospect in Oregon at 6:30 in the morning Pacific because the floor opens at 9:30 Eastern. If your system derives its own time zone, compare it against ours during testing rather than after a complaint.
Vertical-specific fields
Each vertical carries one nested object named for it. medicare carries the plan interest, whether the prospect is currently enrolled, the enrollment period that makes them eligible to move, the effective date they are aiming at, and whether they are turning 65 and when. life carries the product interest, the coverage amount asked about, the term length where one was named, tobacco use, and the reason they are shopping. final_expense carries the coverage reason, the monthly budget band, existing coverage, tobacco, health flags, and beneficiary intent.
Budget and coverage amount arrive as bands rather than free text, because a band is something a prospect can answer honestly and an agent can plan around. The band values are fixed strings, listed in your onboarding packet, so you can map them to your own product tiers once rather than parsing them on every lead.
Consent fields
Consent is captured at the form and travels with the lead. The record carries the timestamp of the agreement, the IP address it came from, the full URL of the page, an identifier for the exact disclosure version shown, the disclosure text itself, the user agent, and how long the prospect spent on the form.
The disclosure_id is the field to store. It points at an exact, versioned block of language, so a question two years from now about what a particular prospect actually agreed to is answered by looking up a version rather than reconstructing a template. Ask for the stored record for any lead id and we produce it; see compliance for how the trail is kept.
Keep the consent block. Storing the lead and discarding the consent fields is the most common mistake a buyer makes with this payload. Your own record of what you received is worth having independently of ours.
Source and attribution fields
The source block describes where the demand came from: the channel, a campaign reference, the device, and a landing page reference. It is deliberately coarse. It tells you enough to see that one creative concept converts better on your desk than another, without handing over the media buying detail that makes the program work.
Use it in your own reporting. If one campaign_ref consistently produces better contact rates on your floor, tell us, and we can weight the program toward it. That feedback loop is the reason the field is on the payload at all.
Formats and conventions
- Timestamps are RFC 3339 in UTC, always with the trailing Z.
- Phone numbers are E.164, so
+14045550143rather than404-555-0143. - States are two-letter USPS codes. Counties are spelled out without the word county.
- Enumerated values are lowercase with underscores, and the full set for each field is in your onboarding packet.
- Booleans are real JSON booleans, never the strings true and false.
- Absent optional fields are omitted rather than sent as null or an empty string.
- New fields are added over time and are not removed without notice, so parse defensively and ignore keys you do not recognize.
Delivery via HTTP post
The default path into any CRM that can accept a request. One post per lead, sent on submission, with a response contract you control.
How HTTP post delivery works
When a prospect submits a form and the record clears every filter, we post it to the HTTPS endpoint you named. One lead, one post, sent within seconds of the submission rather than collected into a nightly batch. Your endpoint answers with a status code that tells us whether you took it.
That is the whole mechanism. There is nothing to install, no agent to run, and no polling loop. If your CRM can expose a URL that accepts a JSON body, it can receive leads; see integrations for the shapes this usually takes.
The request we make
A POST with a JSON body, a content type of application/json, and headers that identify the delivery and let you verify it came from us. The full header and field reference is on the API reference. A live delivery looks like this.
POST /webhooks/solved-marketing HTTP/1.1
Host: crm.example-agency.com
Content-Type: application/json
User-Agent: SolvedMarketing-Delivery/1
X-Solvedmarketing-Lead-Id: lead_01K5R7TQ3M9B
X-Solvedmarketing-Delivery: dlv_01K5R7TQ4F2C
X-Solvedmarketing-Attempt: 1
X-Solvedmarketing-Timestamp: 1789056000
X-Solvedmarketing-Signature: v1=6b41f0c8d2a7e93b5c...
Authorization: Bearer BUYER_TOKEN_FROM_ONBOARDING
{
"lead_id": "lead_01K5R7TQ3M9B",
"program_id": "prog_med_aep",
"vertical": "medicare",
"test": false,
"created_at": "2026-09-18T14:19:46Z",
"contact": {
"first_name": "Raymond",
"last_name": "Whitfield",
"phone": "+13135550118",
"state": "MI",
"county": "Wayne",
"postal_code": "48226",
"date_of_birth": "1959-11-08",
"time_zone": "America/Detroit"
},
"medicare": {
"plan_interest": "advantage",
"currently_enrolled": true,
"enrollment_period": "aep",
"turning_65": false
},
"consent": {
"captured_at": "2026-09-18T14:19:44Z",
"ip_address": "203.0.113.54",
"disclosure_id": "disc_med_2026_07"
}
}
Field mapping
Two ways to do this, and the right one depends on who owns the endpoint. If you control the code behind the URL, take our field names as they are and map them on your side; that keeps the contract stable and means a new field we add is available to you the day it ships.
If the endpoint belongs to a system you cannot change, give us your field names and we post to them, including flattening the nested objects into the dotted or underscored names your system expects. The mapping is agreed at onboarding and proven with test leads before the first live record.
Either way, store lead_id somewhere you can search. It is the key for credits, for consent record requests, for disposition feedback, and for every conversation about a specific lead.
The response contract
Answer with a 200 or a 201 and we treat the lead as delivered. Answer with any other status, or fail to answer inside the response window, and the delivery is treated as failed and enters the retry schedule. A 409 is the one exception: return it when you already hold that lead_id and we record the lead as delivered without retrying.
Answer fast, then do the work. An endpoint that runs enrichment, scoring, and a round trip to a third-party service before replying will time out, be retried while it is still working, and process the same lead twice. Accept the body, return 200, and finish the work out of band. The status codes we act on are listed in full under expected responses.
Retries and failed deliveries
Failed deliveries are retried on a backoff schedule. Retries carry the same lead_id and an incrementing X-Solvedmarketing-Attempt header, so a consumer that keys on the lead id can tell a retry from a new lead without guessing.
If a lead cannot be delivered after the full schedule, it is held rather than discarded, and you are not billed for it. We tell you when a program is failing to deliver rather than letting it quietly stop, because an endpoint that has been returning 500s since Tuesday is a worse problem than any individual lead.
Testing your endpoint
- Confirm the endpoint is reachable over TLS from the public internet, with a complete certificate chain including intermediates.
- Post a sample body from your own machine first, so you know the endpoint works before the network is a variable.
- Ask us for test leads and watch them arrive in the destination queue, not just in a log.
- Deliberately return a 500 for one test and confirm you see the retry arrive with a higher attempt number.
- Post the same test lead id twice and confirm your system does not create two records.
- Check that the consent fields survived your mapping. They are the ones most often dropped.
Delivery via webhook
The same payload inside a signed event envelope, for buyers who want lifecycle events rather than only the lead itself.
When to choose webhooks over a plain post
A plain HTTP post delivers the lead and nothing else. The webhook path delivers the lead inside an event envelope and then keeps talking to you: acceptance, rejection, credits, and disposition acknowledgements all arrive as further events on the same endpoint. Choose it when your system wants a stream of state changes rather than a single handoff.
Both paths carry the identical lead object. Nothing about the data is different; only the envelope around it and the events that follow. You can also register more than one endpoint and subscribe each to different events, which is the clean way to separate an operations consumer from a reporting consumer.
The event envelope
Every delivery is a POST with a JSON body. The envelope is identical across event types: an event id, a type, a creation timestamp, the program, and a data object whose shape depends on the type. For lead.delivered, the data object is the lead record described in the shape of a lead record.
The event catalog and a full envelope example are on the API reference. Parse defensively: keys are added over time, and an unfamiliar key is not an error.
Signature verification
Each delivery carries an X-Solvedmarketing-Signature header holding a version marker and an HMAC over the timestamp header and the raw request body, keyed with the signing secret issued at onboarding. Compute the same HMAC over the bytes you received and compare in constant time.
Verify against the raw body, before any JSON parsing or re-serialization, because reordering a key changes the bytes and breaks the comparison. Reject deliveries whose timestamp falls outside a tolerance window so a captured request cannot be replayed at you later. Worked steps are under verifying a signature.
Retries, ordering, and idempotency
Delivery is at least once. Non-2xx responses and timeouts are retried with backoff, which means a consumer must be idempotent: key on the event id, or on the lead id for lead events, and discard anything you have already processed.
Ordering is not guaranteed. A lead.accepted acknowledgement can be processed on our side before your own store has finished writing the lead.delivered event. Reconcile on the identifiers and the timestamps inside the payload rather than on arrival order.
Debugging deliveries
Start with reachability and TLS. A certificate a browser accepts because it has cached an intermediate will still fail a server-side client, and this is the single most common cause of an endpoint that works in testing and not in production.
Then look at your own access log for the status code and the response time. Nearly every missing-event report comes down to one of three things: a firewall rule, an endpoint answering slower than the delivery timeout, or a signature check running against a re-serialized body instead of the raw bytes.
AgentTech Dialer integration
Native delivery into a dialer campaign, because the sister company that built the dialer is the one delivering the leads.
Why this path is different
AgentTech Dialer and Solved Marketing are both part of Solved Ventures, so delivery into a dialer campaign is a native path rather than an integration project. There is no endpoint to build, no field mapping to agree, and no signature to verify. You name the campaign, we put leads in it, and agents start dialing.
The practical effect is on the clock. The gap between a form submission and a ringing phone is the largest single lever on contact rate, and removing an integration hop removes seconds from it. See speed to dial for why that matters more than it sounds.
Mapping programs to campaigns
One Solved Marketing program maps to one AgentTech campaign. Keep them one to one rather than pooling several programs into a single campaign, because a pooled campaign makes it impossible to read which program is actually producing conversations.
Lead fields arrive on the record the agent sees, so the opening line can reference what the prospect actually asked about rather than a generic script. The lead id travels with the record, which is what lets a disposition find its way back to the right lead.
Dispositions come back automatically
On this path the feedback loop closes itself. Call outcomes recorded in the dialer flow back to us against the originating lead id without anyone exporting a file, which means program tuning starts from real outcomes in the first week rather than the first quarter.
If you deliver into AgentTech but manage outcomes somewhere else, tell us, and we will treat the other system as the source of truth instead. Two conflicting disposition sources is worse than one imperfect one. See disposition feedback.
Calling windows and pacing
Dialer calling windows and our delivery windows are separate controls and both apply. Delivery pacing decides when a lead enters the campaign; the dialer decides when it is legal and sensible to dial. Set them deliberately, because a lead delivered at the edge of a calling window will sit until the next morning and arrive at the agent stale.
The prospect time zone on the lead record is what both should key on, not the time zone of your office. See contact and identity fields.
Solved Enroll integration
Native delivery into a client record, so the fact-find starts from what the prospect already told us rather than from a blank form.
How Enroll delivery works
Leads land as a client record in Solved Enroll with the contact block and the vertical answers already populated. The agent opens a record that knows the prospect is 69, lives in Fulton County, is pricing burial coverage, and had a monthly budget in mind, instead of asking all of that again on a call the prospect did not schedule.
Like the dialer path, this is native rather than an integration, because both companies sit inside Solved Ventures. Nothing on your side has to be built.
What gets pre-populated
The full contact block, the vertical-specific answers, and the source reference. Consent fields are attached to the record rather than shown in the quoting flow, since they are evidence rather than fact-find input.
Fields the prospect did not answer are left empty rather than filled with a default. An empty field is a question the agent should ask; a defaulted field is a wrong answer nobody will question.
From lead to quote
Because the record arrives populated, the first call can start at the recommendation rather than at data entry. That is the whole argument for this path: the prospect answered these questions once already, and asking again spends the goodwill you need for the close.
Outcomes recorded against the client record flow back as dispositions on the originating lead id, the same way they do from the dialer.
Availability
Solved Enroll is in private beta, with a public rollout planned for 2027. Delivery into Enroll is available to buyers already in the beta. If you are not, the AgentTech Dialer, HTTP post, and webhook paths are all generally available today.
Nothing about the lead record changes when Enroll becomes generally available. A program delivering by HTTP post today can add or switch to the Enroll path later without a new field mapping.
Filters and disqualifiers
Everything that runs between a form submission and a delivery. A lead that fails one of these is never sent and never billed.
What runs before delivery
Five checks, in order: phone validation, duplicate suppression, licensing geography, age and product fit, and your own disqualifiers. They run before the post goes out, not after, because a lead you have to dispute is a lead your agents have already spent time on.
Filters are settings rather than policy. If one is too tight for your desk, or not tight enough, it is a conversation and a change rather than a contract amendment.
Phone validation
The phone number is checked for line type and reachability before the record is sent, and the result arrives on the payload as phone_type. A number that does not resolve to a reachable line is not delivered.
Line type is useful downstream too. A landline and a mobile deserve different dial cadences and different expectations about when someone will answer, and a dialer that treats them identically wastes attempts on both.
Duplicate suppression
Duplicates are suppressed across programs and across time, not just within a single campaign. The same person filling out two different offers in the same week is one lead, not two, and a prospect you already bought does not come back to you later wearing a different program name.
This is a different thing from exclusivity, and both apply. Exclusivity means the record is never sold to a second buyer. Duplicate suppression means you are not sold the same person twice. See the exclusivity policy.
Licensing geography
Leads are filtered to the states, and where it matters the counties, your agents are actually appointed in. Keeping that list current is the one piece of housekeeping worth doing on your side, because an out-of-date licensing map is the most common cause of a lead that looks wrong on arrival.
Medicare plan availability is frequently county-level, so a state-level filter is not enough for a Medicare Advantage program. County is on every record for exactly this reason.
Age and product fit
A 52-year-old asking about Medicare is not a Medicare lead and is not billed as one. Age and product fit rules are per program: a turning-65 program has a tight age band, a special enrollment program has a wider one, and a final expense program cares more about the budget band and health flags than about the exact birth year.
Fit rules are the filters most worth revisiting after a month of real dispositions, because your own outcome data is better evidence than any assumption we started with.
Your own disqualifiers
Add the rules your desk has learned the hard way and stop paying for leads you would never work. Common ones: exclude a state your best agent just let lapse, exclude a budget band your carriers cannot serve, exclude prospects already holding coverage when your pitch is a first policy, exclude a county where your appointment is pending.
Send them as plain sentences. We turn them into rules and confirm the logic back to you before anything changes, because a disqualifier that means something slightly different from what you intended quietly removes volume you wanted.
Caps, pacing, and scheduling
Volume should match what your floor can work today. These are the controls that make that true rather than aspirational.
Daily and hourly caps
A daily cap is a hard ceiling on how many leads a program delivers in a day. An hourly cap smooths the shape of that day so a desk is not handed its whole allocation between 11 and noon. Both are adjustable without a contract change, usually the same day you ask.
Set the daily cap from agent hours rather than from ambition. A useful starting point is the number of leads one agent can dial properly in a shift multiplied by the agents who will actually be on the phone, then take some off for the first week while the process settles.
Delivery windows and dayparting
Delivery windows decide when leads arrive, in your floor hours. A lead delivered twenty minutes before the floor closes is a lead that gets dialed tomorrow, by which point it has aged past the window where speed helps you.
If you run split shifts or a weekend desk, say so, and the window follows the staffing rather than a default business day. If you cannot staff a window, closing it is better than letting leads land in it.
Ramping a new program
Start small, prove the economics on your own numbers, then scale. A program that starts at full volume gives you a large sample of an unproven process, which is an expensive way to learn that the routing rule was wrong.
A workable ramp: run a small daily cap for a week while you confirm delivery, mapping, and time to first dial, raise it once dispositions are flowing, and raise it again only when your own cost per acquisition holds at the higher volume. Volume that damages your close rate is not progress.
Pausing and resuming
Pause without penalty, for any reason. Short staffing, a training day, a holiday week, or a backlog of callbacks are all better handled by pausing than by letting leads pile up unworked. Tell us and delivery stops; tell us again and it resumes.
Unworked leads are worse than no leads, because they land in your reporting as poor performance and in the prospect experience as a form they filled out and never heard back about.
Seasonal capacity and AEP
Medicare demand is shaped by the calendar, and the annual enrollment period is the sharpest peak in the year. Capacity for it is reserved in advance rather than scrambled for in October, so tell us your intended volume before the season rather than during it.
Plan the staffing at the same time. The constraint during AEP is almost never how many leads exist; it is how many conversations your licensed agents can physically have in the hours the prospects answer the phone.
Disposition feedback
The part most lead vendors never close. Send outcomes back and the filters tighten on your traffic specifically.
Why feedback changes the program
Without outcomes, a lead program is tuned on proxies: form completion, field quality, and complaints. With outcomes, it is tuned on what actually happened when your agents called. Those two produce different programs, and the second one is the one you want.
This is also the honest self-interest argument. Our sister companies sell on these leads, so a program that produces contacts rather than records is our problem too. Feedback is how that gets measured rather than asserted.
The disposition set
Keep it small enough that agents use it consistently. The set we work from is: contacted, not contacted after the full dial cadence, wrong number, not interested, appointment set, application started, application submitted, policy issued, and do not call. A timestamp and an attempt count alongside each one is worth more than a finer taxonomy nobody applies the same way twice.
If your CRM already has its own set, send yours and we map it once. Changing an agent workflow to match a vendor taxonomy is a bad trade.
How to send dispositions
Three ways, in order of preference. Natively, if you deliver into AgentTech Dialer or Solved Enroll, in which case it is automatic. Over the API, by posting outcomes against the lead id; see posting dispositions. Or as a scheduled file, if that is genuinely all your stack can do.
A daily file beats nothing by a wide margin. Do not let the perfect integration stop the feedback loop from existing.
What we do with them
Dispositions feed filter tuning, source weighting, and program comparison on your traffic specifically rather than in aggregate across all buyers. If one channel produces records that reliably do not answer your phones, we can weight away from it for your program without waiting for it to show up as a complaint.
They also change how credits are handled. A pattern of one outcome on one program is evidence about the program, which is a more useful thing to fix than the individual records. See pattern review.
Credits and disputes
Written criteria, decided before you buy rather than negotiated after. The goal is fixing the program, not winning arguments about records.
What qualifies for a credit
The criteria are written into your program agreement before the first lead is delivered, so nothing here is a judgment call made after the fact. The categories are the ones you would expect: a phone number that is not reachable, a record whose contact details are plainly invalid, a lead delivered outside the geography or age band your program specifies, a duplicate of a lead you were already delivered, and a record where the prospect says they never made the request.
Writing them down in advance is the point. A vendor who will not put credit criteria in writing before you buy is telling you something about how the conversation will go afterward.
How to submit one
Send the lead id, the category, and one sentence of detail, inside the submission window stated in your agreement. The window exists because the evidence decays: a phone number that was reachable on Tuesday and disconnected three weeks later is a different fact from a number that was never reachable.
Submit in batches if that is easier than one at a time. What slows a review down is a missing lead id, not the number of leads in the list.
How a review is decided
We check the submission against what we hold: the delivery log, the validation result recorded before delivery, the consent record, and the duplicate history. Most reviews are decided from that alone and are answered quickly.
Where the record and your experience disagree, we will tell you what we hold rather than just returning a decision. Sometimes the answer is that the filter was working and the fit rule is wrong for your desk, which is a program change rather than a credit.
Pattern review
One disputed lead is noise. Ten of the same kind on one program in one week is a signal, and signals get the program changed. That usually means tightening a filter, reweighting a source, or adjusting a fit rule, and it is worth far more to you than the credits.
We would rather tighten a filter than argue about a record. If a category of dispute keeps recurring after a change, the honest answer may be that the program is not right for your desk, and we will say so.
What a credit does not cover
A credit covers a record that did not meet the criteria you bought. It does not cover a prospect who answered and was not interested, a prospect nobody called for two days, or a conversion rate below what you hoped for. Those are real problems, but they are program problems and staffing problems, and crediting records does not fix either.
If contact rate is the issue, start by measuring your own time to first dial before anything else. See speed to dial.
Reporting and exports
You should be able to compute your own cost per acquisition without asking us for a spreadsheet.
Delivery reporting
Every lead, when it was sent, which program it came from, how many attempts the delivery took, and what your endpoint answered. This is the record that settles a question about whether a lead was delivered, and it is available over the API as well as in your reporting view; see delivery reports.
Reconcile it against your own inbound log once during onboarding and once a month afterward. Silent mapping drift on your side is invisible until you compare counts.
Outcome reporting
Once dispositions are flowing, reporting can show contact rate, appointment rate, and issued policies by program and by day. The number worth instrumenting first is not any of those; it is the time between delivered_at and your first dial attempt, because it moves all of them.
Measure that distribution rather than its average. An average of four minutes made of half the leads at thirty seconds and half at eight minutes is two different programs sharing a report.
Comparing programs
Compare programs on cost per acquisition, never on cost per lead. A program with a higher price per record and a better contact rate can be the cheaper program by a wide margin, and the only way to see that is to carry the outcome all the way to an issued policy.
Hold the other variables still while you compare. Same agents, same script, same hours, same cadence. Changing the lead source and the pitch in the same week produces a result you cannot attribute.
Exports
Pull the raw records into your own warehouse rather than living inside a reporting view you do not control. Records can be queried over the API by date range and program, or delivered as a scheduled export to an endpoint you name.
Load on the delivery window rather than on the file timestamp, so a late arriving record lands in the period its lead actually belongs to and your month-over-month arithmetic stays correct.
Computing your own cost per acquisition
Take the leads delivered in a period for one program, subtract anything credited, multiply by your program rate, and divide by the policies issued from that cohort. Attribute to the cohort the lead belongs to rather than to the month the policy issued, or a good cohort with a long sales cycle will look like a bad one.
Then look at the same number a quarter later including persistency. A cheaper acquisition that does not stay on the books is not cheaper, and it is the arithmetic that separates a lead source that works from one that only looks like it does.
FAQs
Documentation questions
Why is all of the documentation on one page?
Because a lead program is one system, and splitting it into dozens of article pages hides the connections rather than clarifying them. Everything is here, the contents at the top jumps to any section, and your browser find function works across the whole document.
Are the values in the examples real?
The shapes are real and the field names are real. The people, phone numbers, addresses, and identifiers in the examples are fabricated for the documentation. Your program identifier, your credentials, and the full set of enumerated values for each field come from onboarding.
Do I need a developer to receive leads?
Not if you deliver into AgentTech Dialer or Solved Enroll, which are native paths with nothing to build. For HTTP post or webhook delivery into your own CRM you need someone who can expose an HTTPS endpoint and read a JSON body, which for most agencies is either an existing CRM feature or an afternoon of work.
Can I change filters, caps, or delivery after we are live?
Yes, and most buyers do within the first month. Caps and delivery windows usually change the same day you ask. Filter and disqualifier changes are confirmed back to you in writing before they take effect, because a rule that means something slightly different from what you intended quietly removes volume you wanted.
What is the one field I should be sure to store?
The lead id. It is the key for credit submissions, consent record requests, disposition feedback, and every support conversation about a specific lead. A buyer who stored the phone number but not the lead id makes every one of those conversations slower.
Something here is wrong or missing. Who do I tell?
Email contact@solvedmarket.ing. Documentation corrections go to the same people who run the programs, so a wrong field name gets fixed by someone who can check it.
Something else? Contact us
Ready to wire up delivery?
Onboarding agrees the field mapping and sends test leads through your endpoint before a dollar moves.