On this page12 sections+
- 01Why one status field fails
- 02Separate four layers
- 03Use a small lifecycle vocabulary
- 04Keep attempt outcomes observable
- 05Use one primary reason for a terminal state
- 06Keep downstream events in a separate namespace
- 07Preserve source context without putting customer data in an affiliate report
- 08Working CSV event template
- 09Map operations to a network without losing detail
- 10Govern corrections and finalization
- 11Build the report from counts and denominators
- 12Use codes to choose the next review
Why one status field fails
Affiliate platforms commonly use commercial conversion states such as pending,
approved and declined. Those values are useful for attribution and payout logic,
but they do not tell an operator:
- whether the number rang;
- whether the intended customer was reached;
- whether another attempt is due;
- whether the customer denied submitting the order;
- whether an order was confirmed and then changed;
- whether fulfillment or a courier later reported a different event.
Keep the operating truth first. Map it to each receiving platform second.
1. Separate four layers
| Layer | Question | Example |
|---|---|---|
| Event | What happened at one point in time? | Attempt placed, customer reached, callback requested, order confirmed |
| Lifecycle status | Where is the lead now? | Accepted, calling, callback due, confirmed, closed no order, excluded |
| Reason code | Why did it enter this state? | Customer declined price, duplicate under rule, attempt plan exhausted |
| Downstream status | What did another responsible system report later? | Fulfillment accepted, dispatched, delivered, delivered and paid |
An attempt outcome is not automatically the current lead status. No answer at 10:00
can be followed by customer reached at 15:00. Preserve both events and derive the
current state.
Order updated and upsell accepted are events attached to the order. They should not
replace the lead's confirmed status.
2. Use a small lifecycle vocabulary
The exact labels may change by project. Their meanings must not.
| Machine code | Meaning | Interim or terminal | Required companion |
|---|---|---|---|
received |
The integration received a lead record | Interim | Source event ID and received time |
accepted |
The record passed contract-defined intake checks and entered the calling queue | Interim | Accepted-lead definition version |
calling |
At least one permitted attempt exists and the attempt path remains open | Interim | Latest attempt event |
callback_due |
The customer requested a permitted future contact time | Interim | Callback time/window |
confirmed |
The customer agreed all project-required order details | Terminal for the initial phone sale; later correction is possible | Confirmed-order definition and final order revision |
closed_no_order |
A qualifying conversation ended without a confirmed order | Terminal unless reopened under an agreed rule | One customer-decision reason |
closed_unreachable |
The permitted attempt path ended without a qualifying human connection | Terminal unless reopened under an agreed rule | Attempt-plan version and final contactability reason |
excluded |
The record did not enter or remain in the eligible calling cohort under an agreed intake rule | Terminal for that intake record | One exclusion reason |
Do not use approved as the internal definition unless the project explicitly maps it
to confirmed and records the definition version.
3. Keep attempt outcomes observable
These events describe a specific call, not a final judgment about the lead:
| Attempt outcome | Use when | Do not infer |
|---|---|---|
no_answer |
The call completed with ringing and no qualifying answer | Fraud, invalid number or terminal unreachable |
number_switched_off |
The telephony result indicates the device/number is switched off | Permanent invalidity |
number_unavailable |
The telephony result indicates the number is presently unavailable | Why it is unavailable |
voicemail_or_answering_machine |
A machine or voicemail answered | Human contact |
third_party_answer |
Someone other than the intended customer answered | Customer decision |
customer_reached |
The project-defined human-connection threshold was met | Confirmation |
call_ended_before_decision |
Contact occurred but the customer decision was not established | Decline |
callback_requested |
The customer requested another permitted contact time | A completed sale |
Define the qualifying human-connection threshold. A silent connection, a one-word
third-party answer or voicemail must not become three different interpretations of
reached across reports.
4. Use one primary reason for a terminal state
Intake exclusion reasons
| Machine code | Definition and evidence |
|---|---|
duplicate_under_rule |
Matches the documented deduplication key and time window; retain the permitted matched-record reference |
invalid_contact_data |
The required phone/contact field fails the project validation or is confirmed invalid |
missing_required_field |
A named required intake field is absent |
wrong_market_or_offer |
The submitted market or offer is outside the configured project |
test_record |
The record is explicitly identified as a project test |
contact_not_permitted |
The record cannot enter the agreed contact path under the client-supplied authority, suppression or project rule |
Closed no-order reasons
| Machine code | Definition and evidence |
|---|---|
customer_declined_offer |
The customer understood the offer and chose not to proceed; use an approved subreason only if needed |
price_not_accepted |
The customer declined after the final price and applicable fee were stated |
product_not_wanted |
The customer understood the product but did not want it |
customer_says_did_not_order |
The reached person states they did not submit the lead/order |
outside_delivery_area |
The address is outside the downstream service area supplied for the project |
required_order_detail_unavailable |
A project-required order field could not be established |
customer_canceled_before_handoff |
A previously confirmed customer canceled before the configured fulfillment handoff |
other_agreed_reason |
A temporary agreed exception pending taxonomy review; requires structured detail, not an unrestricted narrative |
Customer says they did not order is an observation, not automatic proof of publisher
fraud. Outside delivery area describes the current downstream coverage, not call
quality.
Closed unreachable reasons
| Machine code | Definition and evidence |
|---|---|
attempt_plan_no_answer |
All permitted attempts ended with no qualifying answer |
attempt_plan_switched_off |
The configured attempt path ended with the number switched off |
attempt_plan_unavailable |
The configured attempt path ended with the number unavailable |
attempt_plan_voicemail |
The configured attempt path ended without human contact after voicemail/machine outcomes |
mixed_no_contact_outcomes |
The path ended with more than one no-contact outcome and no more specific primary reason is accurate |
The attempt-plan version is part of the evidence. A lead called once and a lead called under the complete agreed plan must not share the same terminal reason without that context.
5. Keep downstream events in a separate namespace
When the client or responsible downstream system supplies them, events may include:
| Machine code | Minimum meaning | Owner/source |
|---|---|---|
fulfillment_accepted |
The downstream operation accepted the order under its current rules | Fulfillment/order system |
dispatched |
The responsible system recorded a shipment handoff | Fulfillment/courier |
delivery_exception |
A downstream event requires review or a permitted customer follow-up | Courier/fulfillment |
delivered |
The responsible system recorded completed delivery | Courier/fulfillment |
delivered_and_paid |
The responsible source recorded both delivery and payment | Courier/fulfillment/finance |
returned |
The downstream source recorded a return under its defined rule | Courier/fulfillment |
TheCall may receive those events to review later outcomes or perform an agreed customer call. It does not create, own or guarantee physical delivery or payment.
6. Preserve source context without putting customer data in an affiliate report
Keep stable non-customer identifiers:
- external lead ID;
- internal lead ID;
- offer ID;
- market;
- source ID;
- publisher/affiliate ID where applicable;
- subID or equivalent campaign slot;
- order ID after creation;
- event ID;
- definition/schema version.
Platform names vary. The
Awin glossary (opens in a new tab) uses advertiser,
publisher, transaction and server-to-server tracking language.
Everflow's identifier guidance (opens in a new tab)
distinguishes click/transaction and conversion event identifiers, while its
postback documentation (opens in a new tab)
shows source/sub parameters in platform-specific mappings.
Affise's postback documentation (opens in a new tab)
requires its own click identifier and supports commercial statuses such as approved,
pending, declined and hold. Map the project's fields to the platform actually in use;
do not assume sub1 means the same business dimension in every system.
Affiliate reporting normally does not need the customer's name, phone, address, call audio or free-text health information. Use pseudonymous IDs and a controlled evidence route for a permitted dispute review.
7. Working CSV event template
This template is intentionally an event ledger, not a single mutable lead row.
event_id,lead_id,external_lead_id,order_id,offer_id,market,source_id,publisher_id,sub_id,event_type,lifecycle_status,attempt_outcome,reason_code,order_revision,occurred_at,recorded_at,source_system,schema_version,correction_of_event_id,detail_code
Field rules
| Field | Rule |
|---|---|
event_id |
Globally unique identifier used for retry deduplication |
lead_id |
Stable calling-operation lead identifier |
external_lead_id |
Stable client/tracker identifier |
order_id |
Empty until an order exists; never reuse it for another order |
offer_id, market |
Required project-routing dimensions |
source_id, publisher_id, sub_id |
Preserve only supplied, permitted and contract-defined attribution dimensions |
event_type |
One observable event, such as lead_accepted, call_attempted, callback_requested, order_confirmed, order_updated or status_corrected |
lifecycle_status |
Resulting current state under the versioned transition rules |
attempt_outcome |
Populated only for a call-attempt event |
reason_code |
Required when the transition needs a reason; one primary code |
order_revision |
Increment when permitted order fields change |
occurred_at |
Time the business event happened, including offset or UTC |
recorded_at |
Time the source system stored the event |
source_system |
System responsible for the event |
schema_version |
Definition set applied to the event |
correction_of_event_id |
Original event ID when this event corrects it |
detail_code |
Approved structured detail only; no unrestricted sensitive narrative |
Synthetic status-exchange example
event_id,lead_id,external_lead_id,order_id,offer_id,market,source_id,publisher_id,sub_id,event_type,lifecycle_status,attempt_outcome,reason_code,order_revision,occurred_at,recorded_at,source_system,schema_version,correction_of_event_id,detail_code
evt_demo_001,lead_demo_001,ext_demo_001,,offer_demo,NG,paid_social,pub_demo,creative_a,lead_accepted,accepted,,,0,2026-07-31T08:00:00Z,2026-07-31T08:00:01Z,calling_crm,1.0,,
evt_demo_002,lead_demo_001,ext_demo_001,,offer_demo,NG,paid_social,pub_demo,creative_a,call_attempted,calling,no_answer,,0,2026-07-31T08:04:00Z,2026-07-31T08:04:02Z,dialer,1.0,,
evt_demo_003,lead_demo_001,ext_demo_001,,offer_demo,NG,paid_social,pub_demo,creative_a,call_attempted,calling,customer_reached,,0,2026-07-31T11:20:00Z,2026-07-31T11:20:02Z,dialer,1.0,,
evt_demo_004,lead_demo_001,ext_demo_001,,offer_demo,NG,paid_social,pub_demo,creative_a,callback_requested,callback_due,,,0,2026-07-31T11:20:03Z,2026-07-31T11:20:04Z,calling_crm,1.0,,callback_same_day
evt_demo_005,lead_demo_001,ext_demo_001,order_demo_001,offer_demo,NG,paid_social,pub_demo,creative_a,order_confirmed,confirmed,,,1,2026-07-31T15:10:00Z,2026-07-31T15:10:04Z,calling_crm,1.0,,
Synthetic IDs and values are used only to demonstrate the schema. They are not client records, TheCall performance data or a universal production taxonomy.
8. Map operations to a network without losing detail
Write a mapping table for the actual network:
| Operating state/event | Possible external commercial state | Mapping condition |
|---|---|---|
received, accepted, calling, callback_due |
pending |
Only if the network uses pending before its contract-defined event |
confirmed |
approved or an additional conversion event |
Only if confirmed order is the exact contracted approval event |
closed_no_order, closed_unreachable, excluded |
declined or no commercial conversion |
Per contract; retain the detailed reason internally |
delivered_and_paid |
Additional event or commercial finalization | Only when supplied by the responsible source and defined in the agreement |
| Correction | Reversal/replacement under platform rules | Must reference the original event and preserve the audit trail |
Do not send repeated attempts as repeated conversions. Do not reuse an event ID after changing its meaning. A retried webhook must be idempotent: the receiver recognizes the same event rather than creating a second commercial action.
9. Govern corrections and finalization
Before the first report or invoice, agree:
- which system owns each event;
- which timestamp creates the reporting cohort;
- how long interim states remain open;
- the downstream maturity window;
- the challenge/correction window;
- which evidence each role may inspect;
- who may correct an event;
- whether a correction reverses, replaces or supplements the commercial event;
- when the period becomes final;
- how later courier or payment updates are shown.
Never delete a disputed event and insert a cleaner row. Append a correction with a new
event ID, actor/source, time, reason and correction_of_event_id.
10. Build the report from counts and denominators
For each market, offer, source/publisher and subID slice, show:
- accepted leads;
- reached leads under the stated threshold;
- confirmed orders;
- closed no-order records by primary reason;
- closed unreachable records by terminal reason;
- excluded records by intake reason;
- provisional and mature downstream counts where supplied;
- correction count;
- definition/schema version.
Then calculate only named rates:
Contact rate = reached leads ÷ accepted leads
Confirmation rate = confirmed orders ÷ accepted leads
Contact-to-confirm rate = confirmed orders ÷ reached leads
Reason share = records with one reason ÷ records in that reason's parent state
Customer says they did not order should be divided by the relevant reached,
no-order cohort, rather than automatically by all submitted leads. No answer attempt counts
should not be compared with unique lead counts as if they were the same unit.
Read the complete denominator guide.
11. Use codes to choose the next review
| Signal | Review next | Guardrail |
|---|---|---|
customer_says_did_not_order rises for one source/subID |
Creative, landing-page representation, form behavior, duplicates and permitted call evidence | Do not label fraud from the code alone |
price_not_accepted rises across sources |
Ad, landing page, script, final price and fee consistency | Do not hide the price to preserve confirmation |
closed_unreachable rises market-wide |
Lead age, number format, calling windows, attempt spacing, telephony and system delay | Do not exceed the permitted contact path |
| Confirmed orders later decline downstream | Final recap, address fields, dispatch delay and downstream attempt evidence | Do not assume the call center owns the courier outcome |
| Corrections cluster around one code | Definition clarity, training, status UI and review evidence | Fix the rule before blaming the setter |
Next step
Apply the definitions to a real project.
Send the market, offer, lead flow and the operating decision behind your question. We will review fit and reply by email.