{
 "name": "CX Playbook",
 "version": 1,
 "updated": "2026-10-20",
 "kept_by": "Tab (updated as we learn; check the date above)",
 "url": "https://botlot.sites.tab.bot/cx-playbook",
 "text_url": "https://botlot.sites.tab.bot/cx-playbook.txt",
 "json_url": "https://botlot.sites.tab.bot/cx-playbook.json",
 "how_bots_use_this": "Read this playbook first, then the courier's own 'My rules'. The courier's rules ALWAYS override the playbook. If they conflict, follow My rules and say so in one line.",
 "basis": {
  "summary": "About 2 weeks (6-20 Oct 2026) of ONE courier's Courier Exchange board searches, based near Gloucester (GL), SWB electric van.",
  "loads_logged": 5186,
  "loads_usable": 3297,
  "weekdays_with_data": 11,
  "quotes": {
   "won": 12,
   "lost": 48,
   "poster_cancelled": 20,
   "withdrawn": 11,
   "pending": 1
  },
  "caveat": "Every £ figure here is an ESTIMATE. CX hides what loads sold for, the log only holds loads that matched one courier's own searches (a biased sample), and 2 weeks is thin. Treat it as a starting point, not a price list."
 },
 "pricing": {
  "headline": "Wins came at a median of about £1.23 per loaded mile; losses at about £1.40 (estimate).",
  "won_median_per_loaded_mile": 1.23,
  "won_n": 11,
  "lost_median_per_loaded_mile": 1.4,
  "lost_n": 41,
  "win_rate": "About 1 in 5 decided quotes won (12 of 60).",
  "by_distance": [
   {
    "band": "under 40 mi",
    "won": "median ~£2.85/mi (n=2)",
    "lost": "median ~£3.02/mi (n=8)",
    "note": "Short jobs are priced by the job, not the mile; wins were £45-55."
   },
   {
    "band": "40-90 mi",
    "won": "median ~£1.24/mi (n=4)",
    "lost": "median ~£1.44/mi (n=12)"
   },
   {
    "band": "over 90 mi",
    "won": "median ~£1.22/mi (n=5)",
    "lost": "median ~£1.33/mi (n=21)"
   }
  ],
  "guidance": "On jobs over ~40 loaded miles, quoting around £1.20-1.30 per loaded mile has won; quotes above ~£1.35 mostly lost. Never go below the courier's own floor or minimum job price."
 },
 "speed": {
  "headline": "69% of loads were posted under 2 hours before collection (or after the collection time had already passed).",
  "median_lead_hours": 1.8,
  "busiest_posting_hours": "08:00-12:00 (peak 09:00-10:00)",
  "busiest_days": "Fri, Mon and Tue; Wed and Thu about half as busy",
  "guidance": "Speed beats planning: check the board often in working hours and quote fast. Slow quotes lose."
 },
 "backloads_into_home_area": {
  "headline": "151 backloads towards the home area (GL) were seen in 2 weeks.",
  "by_day": {
   "Mon": 49,
   "Tue": 19,
   "Wed": 20,
   "Thu": 17,
   "Fri": 45
  },
  "by_collection_time": {
   "before 09:00": 31,
   "09:00-12:00": 70,
   "12:00-15:00": 37,
   "15:00 or later": 13
  },
  "top_origins": "London (14), Bristol BS (9), Northampton NN (9), Oxford OX (9), Cardiff CF (8), Birmingham B (8)",
  "guidance": "Mondays and Fridays carry most backloads home. Nearly half collect between 9 and 12, so an early short job or a morning block can still catch one."
 },
 "pairs": {
  "headline": "On 8 of 11 weekdays, an out-job from near home had a same-day backload towards home that still met the home-by time.",
  "regions": [
   {
    "drop_region": "Birmingham & West Mids",
    "days": "6 of 11",
    "weekdays": "Mon-Fri",
    "round_trip_mi": 149,
    "est_pay": "£132-154",
    "charge_stop": "rarely (1 in 5)",
    "example": "Swindon SN5 → Birmingham B30 (09:00) + Cannock WS11 → Gloucester GL3 (11:45), home ~14:25"
   },
   {
    "drop_region": "East Mids & Northants",
    "days": "6 of 11",
    "weekdays": "Mon-Fri",
    "round_trip_mi": 203,
    "est_pay": "£155-192",
    "charge_stop": "always",
    "example": "Malvern WR14 → Leicester LE8 (10:30) + Northampton NN5 → GL (13:00), home ~15:40"
   },
   {
    "drop_region": "Oxford, Reading & Swindon",
    "days": "4 of 11",
    "weekdays": "Mon, Tue, Thu, Fri",
    "round_trip_mi": 166,
    "est_pay": "£140-170",
    "charge_stop": "often (3 in 5)",
    "example": "Droitwich WR9 → Watlington OX49 (10:05) + Didcot OX11 → GL (13:40), home ~15:50"
   },
   {
    "drop_region": "London & Heathrow",
    "days": "3 of 11",
    "weekdays": "Tue, Thu, Fri",
    "round_trip_mi": 231,
    "est_pay": "£224-280",
    "charge_stop": "always",
    "example": "Hereford HR2 → London SW18 (08:45) + London EC2R → GL (13:45), home ~17:40"
   },
   {
    "drop_region": "Bristol, Bath & S Wales",
    "days": "3 of 11",
    "weekdays": "Mon, Fri",
    "round_trip_mi": 153,
    "est_pay": "£133-155",
    "charge_stop": "rarely",
    "example": "Droitwich WR9 → Newport NP10 (09:10) + Winscombe BS25 → GL (12:30), home ~14:50"
   }
  ],
  "guidance": "Birmingham/West Mids is the best all-rounder (most days, short, rarely needs a charge). London pays most but lined up on only 3 days. When an out-job books, look straight away for a back from near the drop."
 },
 "regular_lanes": {
  "headline": "Some exact lanes repeat. Repeat posters can be worth asking for regular work direct.",
  "repeats": [
   "Witney OX29 → Gloucester GL2: seen 4 times (Mon, Tue, Fri), around 16:00, a regular backload",
   "Bridgwater TA5 → Bicester OX25: 6 days",
   "Bristol BS10 → Salisbury SP4: 4 days (Mon, Wed, Thu)",
   "Gloucester GL1 → Tewkesbury GL3: 3 days (Mon, Wed, Fri)"
  ],
  "near_home_lanes": [
   "GL → London: 12 loads on 7 days, ~100 mi",
   "Swindon SN → London: 12 loads on 5 days, ~87 mi",
   "GL → Birmingham B: 9 loads on 6 days, ~65 mi",
   "GL → Newport NP: 9 loads on 4 days, ~45 mi"
  ]
 },
 "scoring": {
  "headline": "Default score rules (1-5) for a load. Each courier's settings can change every threshold, and their settings win.",
  "skip_first": "Skip loads needing company ID, a driver app, printed paperwork, a tail-lift or a long-wheelbase van, or anything on the courier's own skip list.",
  "price_ladder": "Price per loaded mile at the suggested quote: £1.20-1.30 is the sweet spot (can score 5). £1.10-1.20 or £1.30-1.40 scores up to 4. Above £1.40 scores 3 at most: likely to lose. £1.00-1.10 scores 3. Below £1.00 scores 1-2. Jobs under 40 loaded miles are judged on the job price against the courier's minimum, not £/mi.",
  "why": "Wins clustered around £1.23 per loaded mile and losses around £1.40 (estimate, 52 decided quotes), so the best score sits where jobs are actually won, and pricier quotes are marked as likely to lose.",
  "levels": {
   "3": "Clears the £1.00 per loaded mile floor but marginal: priced above £1.40 (likely to lose), 45-day end-of-month terms, tight home-by, long empty legs, at the range limit or tight van dimensions. Ask the courier 'quote?'.",
   "4": "Price scores 4 or more, beats the fallback, terms up to 30 days, home by sign-out, poster feedback read and not poor.",
   "5": "Price in the sweet spot, clearly beats the courier's fallback work (e.g. a delivery-app block) after empty miles, payment terms up to 30 days (end of month OK), home by sign-out with 30+ min spare, within van range (or a charge stop priced in), poster feedback read and 95%+.",
   "1-2": "Doesn't qualify. Drop it silently."
  },
  "areas": "Final score = base score + Prefer-area bonus (0.5) − Avoid-area penalty (1, or the load is blocked if the courier chose that) − charge-stop penalty (0.5), never above a cap or 5. A load auto-quotes at level N only if its final score is N or more.",
  "caps": [
   "Poor poster feedback (under 90%, or late-payment comments) caps a load at 2.",
   "Unread feedback caps a load at 4.",
   "45-day end-of-month terms cap a load at 3.",
   "A price above £1.40 per loaded mile caps a load at 3 (likely to lose)."
  ],
  "defaults": {
   "sweet_lo": 1.2,
   "sweet_hi": 1.3,
   "s4_lo": 1.1,
   "lose_above": 1.4,
   "floor_3": 1,
   "short_job_mi": 40,
   "max_terms_days": 30,
   "poor_terms_days": 45,
   "home_spare_min": 30,
   "fb_good_pct": 95,
   "fb_poor_pct": 90,
   "fallback_4h": 74,
   "fallback_3_5h": 65,
   "prefer_bonus": 0.5,
   "avoid_penalty": 1,
   "charge_stop_penalty": 0.5
  },
  "fallback_note": "Example fallback values from one courier: a 4-hour Amazon Flex block ≈ £74, 3.5 hours ≈ £65."
 },
 "auto_quote": {
  "headline": "On CX a poster accepts a quote, so bots AUTO-QUOTE; the poster confirms the booking.",
  "rules": [
   "A master 'pause all auto-quotes' switch overrides every level: when it's on, nothing auto-quotes.",
   "Only auto-quote at the score levels the courier has ticked, up to their daily maximum.",
   "Quote at the suggested price, never below the courier's floor or minimum job price.",
   "Never auto-quote a load that clashes with an accepted booking, a Flex block or a day off. Overlapping PENDING quotes are fine.",
   "Log every quote (load, poster, price, score, AUTO or not) and its outcome.",
   "If two clashing quotes are both accepted: tell the courier at once, keep the better one and withdraw the other straight away with a short apology.",
   "Each bot can be switched off in the courier's settings; a bot that is off does nothing and sends nothing."
  ]
 },
 "changelog": [
  {
   "date": "2026-10-20",
   "change": "First version, seeded from the 20 Oct 2026 lanes report (6-20 Oct data) and the auto-quote trial rules. Score sweet spot moved to £1.20-1.30 per loaded mile; prices above £1.40 marked likely to lose. Added areas, range modes and the live win-rate-by-band table from the quote outcomes log."
  }
 ],
 "areas": {
  "headline": "Where the pairs and backloads were (from one courier based near Gloucester; set your own areas in your settings).",
  "prefer_out": "West Midlands (B, WS, WV, DY, CV), Oxford (OX), Swindon (SN), Bristol and South Wales (BS, NP, CF), London West and North-West (W, NW)",
  "prefer_backloads_home": "Gloucestershire (GL), Worcester (WR), Hereford (HR)",
  "avoid": "None yet. Common choices: central London congestion zone, ports with long waits."
 },
 "range_modes": "Each courier sets a range mode per weekday: Stay local (within a radius of home, default 40 mi), Free range (anywhere, home by sign-out), or Can overnight (may finish away; then look for next-morning jobs back towards home, within a max overnight cost). Every bot reads it before suggesting anything.",
 "energy": {
  "headline": "Keep the day inside one charge when you can; a public top-up costs ~4x home per mile (est.).",
  "example": "One courier's figures: home charging 18p/kWh ≈ 6.2p per mile, en route 77p/kWh ≈ 26.6p per mile, at 2.89 mi/kWh (from his van P&L). On a cheap overnight tariff (e.g. 7p/kWh ≈ 2.4p/mi) a public top-up costs ~11x home.",
  "method": "Energy for a job or day = miles covered by the charge you leave home with (up to your real range) at the home rate, plus only the miles that need a public charge stop at the en-route rate. Show est. energy £ and net £/loaded mile after energy on every suggested job; a job that forces a charge stop loses 0.5 score by default. Rates can auto-update from logged charging sessions (30-day kWh-weighted average once 3+ sessions are logged)."
 },
 "win_rate_by_band": {
  "source": "live quote outcomes log",
  "couriers": 1,
  "rows": [
   {
    "band": "under £1.10",
    "lo": 0,
    "hi": 1.1,
    "won": 2,
    "lost": 2,
    "n": 4,
    "win_rate": 50
   },
   {
    "band": "£1.10–1.20",
    "lo": 1.1,
    "hi": 1.2,
    "won": 2,
    "lost": 2,
    "n": 4,
    "win_rate": 50
   },
   {
    "band": "£1.20–1.30",
    "lo": 1.2,
    "hi": 1.3,
    "won": 3,
    "lost": 9,
    "n": 12,
    "win_rate": 25
   },
   {
    "band": "£1.30–1.40",
    "lo": 1.3,
    "hi": 1.4,
    "won": 1,
    "lost": 5,
    "n": 6,
    "win_rate": 17
   },
   {
    "band": "£1.40–1.60",
    "lo": 1.4,
    "hi": 1.6,
    "won": 1,
    "lost": 7,
    "n": 8,
    "win_rate": 13
   },
   {
    "band": "over £1.60",
    "lo": 1.6,
    "hi": null,
    "won": 0,
    "lost": 8,
    "n": 8,
    "win_rate": 0
   },
   {
    "band": "short jobs (under 40 mi)",
    "won": 2,
    "lost": 8,
    "n": 10,
    "win_rate": 20
   }
  ],
  "note": "Win rate = won / (won + lost) for quotes logged by couriers who share their anonymous counts. Jobs under 40 loaded miles are counted separately. Small samples: an estimate, not a promise."
 }
}