Adspirer

Arbitrage Funnel v1

Default 4-stage arbitrage funnel: click -> lead -> registration -> purchase. Stops ads when spend reaches percentage-of-payout thresholds without the next funnel event firing, or when cost-per-event exceeds its target. Rule 9 (low funnel conversion) is disabled by default and can be enabled via overrides for specific campaigns.

system

Targets

cpc
payout * 2 / 100
cpl
payout * 10 / 100
cpp
payout * 80 / 100
cpr
payout * 20 / 100

Spend thresholds

no_regs
payout * 20 / 100
no_leads
payout * 10 / 100
no_clicks
payout * 2 / 100
no_purchases
payout * 70 / 100

Tracked events

click
lead
registration
purchase

Stop conditions (9)

rule_1_no_clicks
click

Spent 2% of payout without any clicks

{
  "all": [
    "spend >= spend_thresholds.no_clicks",
    "clicks == 0"
  ]
}
rule_2_expensive_cpc_no_leads
click
lead

CPC above 2% of payout with zero leads

{
  "all": [
    "clicks > 0",
    "cpc > targets.cpc",
    "leads == 0"
  ]
}
rule_3_no_leads_after_spend
click
lead

Spent 10% of payout with clicks but zero leads

{
  "all": [
    "spend >= spend_thresholds.no_leads",
    "clicks > 0",
    "leads == 0"
  ]
}
rule_4_cpl_above_target
lead

Cost per lead above 10% of payout

{
  "all": [
    "leads > 0",
    "cpl > targets.cpl"
  ]
}
rule_5_no_regs_after_spend
click
registration

Spent 20% of payout with clicks but zero registrations

{
  "all": [
    "spend >= spend_thresholds.no_regs",
    "clicks > 0",
    "registrations == 0"
  ]
}
rule_6_cpr_above_target
registration

Cost per registration above 20% of payout

{
  "all": [
    "registrations > 0",
    "cpr > targets.cpr"
  ]
}
rule_7_no_purchases_after_spend
click
purchase

Spent 70% of payout with clicks but zero purchases

{
  "all": [
    "spend >= spend_thresholds.no_purchases",
    "clicks > 0",
    "purchases == 0"
  ]
}
rule_8_cpp_above_target
purchase

Cost per purchase above 80% of payout

{
  "all": [
    "purchases > 0",
    "cpp > targets.cpp"
  ]
}
rule_9_low_funnel_conversion
disabled
registration
purchase

5+ cheap registrations but zero purchases - low funnel quality

{
  "all": [
    "registrations >= 5",
    "purchases == 0",
    "cpr <= targets.cpr"
  ]
}

Raw JSON

{
  "kind": "arbitrage_funnel_v1",
  "name": "Arbitrage Funnel v1",
  "targets": {
    "cpc": "payout * 2 / 100",
    "cpl": "payout * 10 / 100",
    "cpp": "payout * 80 / 100",
    "cpr": "payout * 20 / 100"
  },
  "description": "Default 4-stage arbitrage funnel: click -> lead -> registration -> purchase. Stops ads when spend reaches percentage-of-payout thresholds without the next funnel event firing, or when cost-per-event exceeds its target. Rule 9 (low funnel conversion) is disabled by default and can be enabled via overrides for specific campaigns.",
  "action_on_stop": "pause_ad",
  "tracked_events": [
    "click",
    "lead",
    "registration",
    "purchase"
  ],
  "stop_conditions": [
    {
      "id": "rule_1_no_clicks",
      "when": {
        "all": [
          "spend >= spend_thresholds.no_clicks",
          "clicks == 0"
        ]
      },
      "reason": "Spent 2% of payout without any clicks",
      "enabled": true,
      "required_events": [
        "click"
      ]
    },
    {
      "id": "rule_2_expensive_cpc_no_leads",
      "when": {
        "all": [
          "clicks > 0",
          "cpc > targets.cpc",
          "leads == 0"
        ]
      },
      "reason": "CPC above 2% of payout with zero leads",
      "enabled": true,
      "required_events": [
        "click",
        "lead"
      ]
    },
    {
      "id": "rule_3_no_leads_after_spend",
      "when": {
        "all": [
          "spend >= spend_thresholds.no_leads",
          "clicks > 0",
          "leads == 0"
        ]
      },
      "reason": "Spent 10% of payout with clicks but zero leads",
      "enabled": true,
      "required_events": [
        "click",
        "lead"
      ]
    },
    {
      "id": "rule_4_cpl_above_target",
      "when": {
        "all": [
          "leads > 0",
          "cpl > targets.cpl"
        ]
      },
      "reason": "Cost per lead above 10% of payout",
      "enabled": true,
      "required_events": [
        "lead"
      ]
    },
    {
      "id": "rule_5_no_regs_after_spend",
      "when": {
        "all": [
          "spend >= spend_thresholds.no_regs",
          "clicks > 0",
          "registrations == 0"
        ]
      },
      "reason": "Spent 20% of payout with clicks but zero registrations",
      "enabled": true,
      "required_events": [
        "click",
        "registration"
      ]
    },
    {
      "id": "rule_6_cpr_above_target",
      "when": {
        "all": [
          "registrations > 0",
          "cpr > targets.cpr"
        ]
      },
      "reason": "Cost per registration above 20% of payout",
      "enabled": true,
      "required_events": [
        "registration"
      ]
    },
    {
      "id": "rule_7_no_purchases_after_spend",
      "when": {
        "all": [
          "spend >= spend_thresholds.no_purchases",
          "clicks > 0",
          "purchases == 0"
        ]
      },
      "reason": "Spent 70% of payout with clicks but zero purchases",
      "enabled": true,
      "required_events": [
        "click",
        "purchase"
      ]
    },
    {
      "id": "rule_8_cpp_above_target",
      "when": {
        "all": [
          "purchases > 0",
          "cpp > targets.cpp"
        ]
      },
      "reason": "Cost per purchase above 80% of payout",
      "enabled": true,
      "required_events": [
        "purchase"
      ]
    },
    {
      "id": "rule_9_low_funnel_conversion",
      "when": {
        "all": [
          "registrations >= 5",
          "purchases == 0",
          "cpr <= targets.cpr"
        ]
      },
      "reason": "5+ cheap registrations but zero purchases - low funnel quality",
      "enabled": false,
      "required_events": [
        "registration",
        "purchase"
      ]
    }
  ],
  "spend_thresholds": {
    "no_regs": "payout * 20 / 100",
    "no_leads": "payout * 10 / 100",
    "no_clicks": "payout * 2 / 100",
    "no_purchases": "payout * 70 / 100"
  },
  "payout_resolution": {
    "sources": [
      "ad.name",
      "ad_set.name",
      "campaign.name"
    ],
    "patterns": [
      "(?<![-\\d.])(\\d+(?:\\.\\d+)?)\\s*\\$",
      "\\$\\s*(\\d+(?:\\.\\d+)?)",
      "(?i)(?:payout|cpa|ставка|rate)[:=\\s]+(\\d+(?:\\.\\d+)?)",
      "(?i)(?<![-\\d.])(\\d+(?:\\.\\d+)?)\\s+(?:payout|cpa|ставка|rate)"
    ]
  }
}