Reject reason

A reject reason says why a lead was not accepted. It turns a failed lead into information you can act on.

Always set one

If no reason is defined, the lead falls into Error. Error means something broke, and it should stay that way. A lead the advertiser deliberately turned down is not a broken lead, and mixing the two makes both useless in reporting.

So map a reason for every rejection path in your integration. If the advertiser gives you nothing to work with, fall back to a general one such as Unspecified. Any reason is better than none.

Keep the names short

Reasons are aggregated in reports by name. Every distinct string becomes its own row.

That means Not Eligible is a useful line in a report, while We are not interested in this lead at the moment is a line that will never group with anything and will never tell you anything. Keep reasons to one or two words, in English, and reuse the same wording everywhere.

How to set it

The reason is stored in the {reason} parameter. There are two ways to write into it.

Modify node. One node handles all your reasons, because you can define several conditions inside it. This is the recommended approach, otherwise you end up with twenty Set nodes and twenty connections just to cover the advertiser’s rejection responses.

Example, mapping one advertiser response to a standard reason:

  • Title: Reject reason
  • Field: {reason}
  • Source: parsedBody.status (the field in the advertiser’s response)
  • Operator: Equals
  • Value: This lead does not meet our criteria
  • Modification: Set
  • Output: Not Eligible

Add another section inside the same node for each further reason.

Set node. Also possible, and it writes into {reason} the same way. But you need a separate Set node for every reason, each reached by its own connection with a condition. Use it only when that reason needs its own branch in the flow anyway.

What the run reports

Every run ends in one of these, and the log tells you which. Three of them are not rejections at all, and knowing them apart is what stops you from hunting a bug that is not there.

  • TIMED OUT : something ran out of time, either the node, the whole run, or the pingtree. See Limits and timeouts.
  • BREAKER : a Breaker stopped a loop that had repeated as often as it was allowed to.
  • DEAD END : the flow reached a node and no connection leading out of it matched, so it simply stopped. Nothing was written and no End node was reached.
  • The reason from a failed End node : the flow finished properly and the value of {reason} is reported. This is the only one that is a real rejection, and it is empty when you did not set a reason.

Dead End is the one to watch. It is the most common way an integration reports errors it does not really have, and it happens for a simple reason: most scenarios are built for the path where everything works. The advertiser then answers with something nobody planned for, no condition matches it, and the run stops mid-flow.

The fix is not clever conditions, it is coverage. Go through the advertiser’s documentation, find every response they say they can return, and give each one a connection that leads somewhere. Anything you cannot enumerate goes down a catch-all branch, matched with a negative pattern against the responses you do know, ending in a failed End node with Unspecified as the reason.

That way a lead you did not anticipate still arrives as a rejection you can read, instead of as an error you have to investigate.

Standard reasons

You can invent your own, but stick to this list wherever it fits. Shared names are what make reporting comparable across advertisers.

At submit, when the lead is sent to the advertiser:

  • Cap : the advertiser’s daily or monthly limit is used up
  • Outside Hours : outside the advertiser’s accepted hours
  • Product Mismatch : the data does not fit the product, such as amount, term, type, region or segment

At submit or by postback, since the advertiser may find these out immediately or later:

  • Duplicate : the same application or order already exists at the advertiser
  • Existing Customer : already a customer, or in arrears with the advertiser
  • Not Eligible : fails a condition you could not check in advance
  • Unspecified : the advertiser rejected the lead and gave no reason
  • Fraud : suspected fraud or a false identity
  • Blacklist : the person is on the advertiser’s blocklist
  • Invalid Traffic : bots, cookie stuffing, self-referrals, incentivised traffic
  • Test : a test lead or order, not billed
  • Age : outside the product’s age range
  • Verification Failed : invalid document, unfinished BankID, missing paperwork
  • Poor Credit : bad history, low score, negative record in a credit register
  • Low Income : income below the threshold, or an unacceptable income type
  • Too Much Debt : debt and repayments too high relative to income
  • Insolvency : insolvency is in progress or has been filed
  • Debt Collection : enforcement or debt collection against the person
  • No Bank Account : no bank account, or it cannot be verified
  • Out of Stock : the goods are unavailable and the order cannot be fulfilled
  • Not Available : the service is not available at that location, such as coverage or connection
  • Contract Locked : tied to the current supplier, outside the notice period

By postback only, once the advertiser has worked with the lead:

  • Uncontactable : could not be reached, contact details do not work
  • Cancelled by Customer : the person refused the offer or cancelled the order
  • Cancelled by Advertiser : the advertiser cancelled it, technically, manually or commercially
  • Expired : the offer was never opened and it expired
  • Withdrawn : withdrawn after the contract, such as goods returned or contract cancelled
  • Payment Failed : payment declined, card refused, proforma invoice unpaid
  • Not Delivered : not delivered, not collected, the address does not exist
  • Chargeback : payment reversed by the bank, which is a fraud signal rather than a withdrawal

Your own reasons

If nothing on the list fits, create your own. Two rules: keep it short, and write it exactly the same way every time. A typo makes a second row in the report that looks like a second reason.

Insights that
helps you grow

  • Release notes 2026/08/14
    This was a big one. We went through roughly 200 pages of our knowledge base and rewrote the whole thing. Clearer structure, consistent terminology, and…
  • Release notes 2026/07/31
    What’s new in PalDock? A lot of this month went into things you won’t see directly – query optimisation, indexing, and general tuning under the…
  • Free Affiliate tracking software
    Many companies (inlcuding YOU) search for free affiliate tracking software because they want to launch an affiliate program without committing to expensive monthly fees. The…