Bahn: Spread · Junction 2026

Seeker: a pricing and dispatch model for car transport

A car-transport dispatcher for one simulated week in Finland. It prices about 1,000 dealer requests against a hidden competitor, then pays freelance drivers to move every car it wins. Everything it does follows from one estimate: the fee at which a driver takes this car in time.

18,738EUR mean weekly margin on 96 fresh server weeks
95.8%mean on time on those weeks. The line to stay ranked is 90%
95 / 96weeks ranked. The one that missed was at 89.2% on time
87,241ranking round 15 Nov 08:18, 5 weeks, all ranked, on time 96.0 to 99.3%

Overview

We are a middleman. A dealer pays us a price to move a car, and we pay a freelance driver a fee to do it. The score is what is left over, and it only counts if at least 90% of the cars arrive on time.

40krevenue from dealers− 24kdriver fees− 0.8klate refunds≈ 15kweekly margin

Rough sizes from early practice weeks. Seeker's weeks average 18.7k. Driver fees are the largest lever: 0.1 × the typical fee across all gigs is about 2.5k a week.

The difficulty is that almost everything that decides the outcome is hidden. The model is easiest to understand as five estimates of hidden things, each feeding one decision.

Hidden from us
How the model estimates it
Decision it drives
The competitor's price for this request. The dealer buys from whoever is cheaper.
A table fitted on 22M past quotes, plus this week's level learned live from our own wins and losses (week, weekday, lane).
The price we quote.
The fee a driver accepts, and how long it takes one to book.
The booking model: chance of a booking per hour, given the gig, the clock and the fee. A planner searches it for the cheapest schedule.
Which delivery options we sell, and the opening fee and raises of every gig.
What an order really costs once raises, drops, failed visits and refunds are counted.
Trees fitted on 156k finished orders.
The cost side of the price choice.
How scarce drivers are right now, in this town, for this deadline day.
Counts of our open orders per nearby driver and per deadline day, and a fixed cost per driver-hour.
Higher prices where drivers run out, instead of declining.
Whether the competitor is down around this pickup today.
A probability over "no outage" and "outage around town c" for 30 towns, from today's answers.
Pricing against the dearer backup supplier.

One request, start to finish

  1. A dealer asks for a price. The request names the lane, the car, up to three deadline options and sometimes a free-text note.
  2. We work out what a driver would cost. For each option the planner finds the cheapest fee schedule and the chance that someone books in time. Options that are too risky are dropped, risky ones are sold dearer.
  3. We pick the price with the best expected profit. A higher price earns more per car but wins less often. The balance point depends on where the competitor sits this week, which the model has been learning from every earlier answer.
  4. The dealer answers. Won or lost is the only feedback we get, and it updates the competitor estimate either way.
  5. A won car goes to the driver board. If another open car of ours makes a sensible chain, both are offered to one driver. Otherwise it is posted alone, starting at a low fee that rises on a schedule.
  6. The fee climbs until a driver books. Slowly at first, faster as the last possible pickup time approaches, and back down once the car is late anyway.
  7. The car is delivered. On time builds the dealer's trust in us, which raises the price that dealer accepts next time. Late halves it and costs a refund.

System diagram

Two loops share one set of offline-fitted tables. The top loop sells: a request comes in, quote() answers, the dealer's choice teaches learn() the competitor's price this week. The bottom loop delivers: a won car is posted to the driver board, alone or paired, with a fee schedule from fees().

SELLING LOOP · about 1,000 requests a week, Mon 08:00 to Fri 18:00 Price request lane A → B, the carup to 3 deadline optionsdealer's note Prepare typical fee ← lane tablenote → ready time,deadline, site hours quote() 1 drop options a driver won't book2 cost = realized-cost trees + plan3 win chance vs the competitor4 best markup, less capacity cost5 price per option, 10% profit gate no option left → decline (10 × list) Dealer chooses us, or the competitor(a dearer backup ifthe competitor is down) Won / lost the only feedback;the competitor's priceis never shown learn() price filter: week, weekday, lane levelsoutage belief: none, or around 1 of 30 towns ← sends back: competitor level, outage share FITTED OFFLINE ON PRACTICE WEEKS, LOOKED UP LIVE Booking model160 random-fee weeks→ quote, fees, pair Realized-cost trees156k won orders→ quote Competitor price22M quotes→ quote, learn Typical-fee table899 lanes→ prepare Region maptowns within 80 km→ learn DELIVERY LOOP · about 430 orders a week if won Order won price and deadlineare now fixed;only fees remain pair() open single within 40 km?6 h slack, drive ≤ 12 h→ one gig for two cars unbooked after 3 h → split fees() plan: opening fee + 4 hourly raisesramp to 1.45 in the last 10 hwarning: 1.30, +0.15 per 30 minlate: back to 0.83, +0.2 per 6 h all × the gig's typical fee Driver board drivers view, book, dropabout 200 a weekcarry our gigs Delivered on time: full pricelate: refundnever: price lost Engine reacts deadline warning, drop, expiry, failed visit, order change → reprice, split, repost Score margin, if ≥ 90% on time dealer trust:+1 on time,halved if late

Blue boxes are the four functions in algo.ts (416 lines, every decision), with their steps listed inside. Dashed lines are table lookups, and each table names the functions that read it. The engine (core/engine.ts) does the mechanics and calls the four. The numbered sections below give the formulas behind each box.

Main ideas

The design choices that matter most. Each is covered in detail in the numbered sections below.

One booking model behind every decision

The model estimates the fee at which a driver takes a car in time. Which options we sell, the price we quote, the fee schedule and the pairing of cars all read it from the same booking model, so the parts cannot disagree.

Competitor price learned from wins and losses

The competitor's price is never shown; we only learn whether we won. A small filter turns every answer into an estimate of this week's price level, per weekday and per lane, and the next quote already uses it.

worth +419 ± 101 and +303 ± 83 EUR a week

Competitor outage estimated as a probability

Once a week the competitor goes down in one region. The model holds a probability over 31 possibilities (none, or around each of 30 towns) and prices against a blend of the competitor and its dearer backup.

worth +430 ± 144 EUR a week

Realized cost in the price choice

The planned driver fee explained 6% of what an order ended up costing. Trees fitted on 156,000 finished orders explain 27%, and using them in the price choice was one of the largest gains.

worth +644 ± 106 EUR a week

Driver capacity priced into every quote

About 200 drivers carry everything, so driver time has a price inside every quote: 4 EUR per driver-hour. A full town or a full deadline day costs the dealer 25% more instead of getting a no.

worth +600 to +800 EUR a week

Limits on the fee schedule

The booking model shows that paying above 1.4 × the typical fee buys no extra bookings, so the ramp stops at 1.45. Once a car is late whatever we pay, the fee drops back to 0.83 instead of climbing.

fee floor and late fee: +530 ± 116 EUR a week

Testing method

Each rule was kept only if it earned margin on fresh server weeks with the same seeds, usually 48 to 96 of them. Ideas that did not pass were removed.

Code structure

Every decision lives in one 416-line file with four functions, and every tunable value in one table. The engine can be restarted in the middle of the final and resumes from the server's state and its own saved learning.

1. The booking model and the fee planner

A logistic model answers one question: what is the chance that a driver books this gig within the next hour, at this fee? It was fitted on 160 weeks played with random fees. It comes first because both the prices (section 2) and the driver fees (section 4) are built on it.

\[ p_{\text{book}}(t, r) \;=\; \sigma\Big( -9.33 \;+\; \underbrace{\textstyle\sum_j \beta_j\,x_j(t)}_{\text{gig and clock}} \;+\; \underbrace{5.20\,r \;-\; 3.25\,\max(0,\,r-1) \;-\; 2.91\,\max(0,\,r-1.4)}_{\text{fee } r \text{ as a multiple of the typical fee}} \Big) \]
Fee term of the logit, by fee multiple r

Slope 5.2 up to the typical fee, 1.95 from 1.0 to 1.4, then −0.97: in the model, paying above 1.4 × typical buys no extra bookings. This is why the early ramp stops at 1.45.

Other weights (logit units)

Reading the bars: a gig is easier to book in the morning, as a two-car gig, and when its typical fee is large. It is harder at a private pickup address, late in the evening, on Sunday, for premium cars (experienced drivers only), with long drives, and the longer it has already sat on the board.

The fee planner

For a gig posted now with \(H\) hours to its last pickup time (at most 72), the planner tries every opening fee from 0.706 to 1.6 in steps of 0.05 and every hourly raise in {0, 0.05, 0.1, 0.2}, and walks the hours:

\[ r_k = \text{open} + \text{raise}\cdot\min(k,\,4), \qquad p_k = \sigma\big(z_k + b + f(r_k)\big), \qquad U_0 = 1,\;\; U_{k+1} = U_k\,(1-p_k) \]
\[ \text{expected cost} \;=\; \sum_{k=0}^{H-1} U_k\,p_k\,r_k \;+\; U_H \times 4 \qquad\quad \text{chance booked in time} \;=\; 1-U_H \]

\(z_k\) is the gig-and-clock part of the logit in hour \(k\), \(f\) the fee term above, and 4 × typical is what a gig without a driver is counted as (lateCost). The cheapest (open, raise) pair wins. Raises stop after 4 steps.

The booking shift. \(b\) = bookShift = 0.2 is added to the logit, but only when planning fee schedules. In quote() the planner runs with \(b = 0\). The booking model is a little too pessimistic about how fast drivers book, so the schedules can open lower, while which options are sold and at what price stays the same. Alone this was worth about +300 a week with orders unchanged.

2. Prices: quote()

Each request offers up to three delivery options (same day, next day, within 3 days). The model decides which options to sell, picks one markup for the whole request, then adjusts each option's price.

Step 1. Which options are sellable

For every option the fee planner (section 1) returns the cheapest schedule, its expected cost, and the chance a driver books before the last pickup time. The last pickup time is the deadline minus the drive, moved by anything the dealer's note says (car ready later, deliver earlier, real site hours).

  • Does the last pickup time leave at least 3 h after the car is ready?
    • nodrop the option
    • yesIs the last pickup time still ahead of now?
      • nodrop the option
      • yesChance a driver books in time (planner)?
        • < 0.82drop the option
        • 0.82 to 0.95sell as a hard option, price × 1.20
        • ≥ 0.95sell at the normal price
  • No option left? Decline. The engine then sends a quote at 10 × list instead of staying silent: losing is free, silence costs goodwill.

Step 2. What the car will cost

The planner's expected fee is a weak predictor of what an order really ends up costing (held-out R² 0.06). Gradient-boosted trees fitted on 156,312 won orders predict the realized cost from 38 quote-time inputs (R² 0.27): fees with raises, refunds, failed visits, undelivered cars. Seeker over-weights the trees.

\[ \text{cost}_o \;=\; (1-w)\cdot \text{planFee}_o \;+\; w\cdot \widehat{c}_{\text{trees}}(x_o)\cdot \text{typical} \qquad w = \texttt{costW} = 1.25 \]

With w = 1.25 this is 1.25 × trees − 0.25 × plan: it pushes past the trees, away from the plan. typical is the lane-table typical fee, not the dealer's noisy number.

Step 3. The chance to win at a price

The competitor's price is never shown. The model keeps a running estimate of its log price for this request, \(\mu\), as a fixed part from the offline table plus this week's learned levels:

\[ \mu \;=\; \underbrace{c + \beta_1\ln(1+0.01\,\text{trust}) + \beta_2\tfrac{\text{drive}}{600} + \text{lane}_{ab} + \text{pick}_a + \text{del}_b + \text{hour}_h + \text{dealer}_d - 0.0098\,\text{lates}}_{g\ \text{(price.json; } c = 0.327 \Rightarrow 1.39\times\text{list on average)}} \;+\; \underbrace{x_{\text{week}} + x_{\text{weekday}} + x_{\text{lane}}}_{\text{learned this week}} \]
\[ P(\text{win}\mid m) \;=\; \sigma\!\left(\frac{\mu - \ln m}{s}\right), \qquad s=\sqrt{\,0.1^2 + 0.37\,v\,}, \qquad \sigma(z)=\frac{1}{1+e^{-z}} \]

m is our price as a multiple of list. v is the filter's own variance for this request, so early in the week (large doubt) the curve is flatter. With s = 0.1, a 1% higher price costs about 10% of the win odds.

Between 08:00 and 18:00 the model also carries a belief that the competitor is down around this pickup today (share \(q\)), where dealers buy from a backup about 1.2 × dearer. The win chance becomes a mixture:

\[ P(\text{win}\mid m) \;=\; (1-q)\,\sigma\!\left(\frac{\mu-\ln m}{s}\right) \;+\; q\,\sigma\!\left(\frac{\mu+\ln 1.2-\ln m}{s}\right) \]

Step 4. One markup for the request

\[ m^{*} \;=\; \underset{m\,\in\,[\,1.28+\Delta,\;2.00+\Delta\,],\ \text{step } 0.01}{\arg\max}\;\; P(\text{win}\mid m)\,\Big(m\cdot\overline{\text{list}} \;-\; \overline{\text{cost}} \;-\; \underbrace{4\,\text{EUR}\times(\text{drive hours}+1)}_{\text{capacity cost}}\Big) \]

Bars mean the average over the sellable options. The capacity cost is a shadow price on driver time: drivers are the bottleneck, so a car that holds a driver longer must earn more. It is subtracted in the choice only, never paid.

The search window slides by \(\Delta\), the sum of these shifts (all in multiples of list):

ConditionShift ΔWhy
Pickup town full: our undelivered orders from it ≥ 3 × drivers living within 30 km+0.25Ration drivers by price instead of declining
Round trip: an open one-car gig of ours delivers within 40 km of this pickup and starts within 40 km of this delivery−0.05The driver needs no trip home
Outage belief at this pickup (share q)+0.30 × qThe dealer's other choice is the dearer backup
Cheap week or cheap day: learned level x_week + x_weekday below 0level, at most −0.20A fixed floor would lose whole days in a price war

Step 5. The price of each option

\[ \text{price}_o \;=\; \text{list}_o \times \big(m^{*} + d_o\big) \times \begin{cases}1.25 & \text{deadline day full}\\ 1 & \text{otherwise}\end{cases} \times \begin{cases}1.20 & \text{hard option}\\ 1 & \text{otherwise}\end{cases} \]
\[ d_o = \begin{cases} -0.03 & \text{due next Monday or later}\\ +0.08 & \text{due Friday}\\ 0 & \text{otherwise}\end{cases} \qquad\quad \text{quote option } o \iff \text{price}_o \ge 1.10\times\text{cost}_o \]

A deadline day (Mon to Fri) is full when our orders due that day reach 0.10 × the week's driver roster. Friday holds 40% of the lates, Monday deadlines have slack. If no option clears the 10% profit gate, the request is declined.

3. Learning during the week: learn()

Section 2 uses two quantities that change during the week: the competitor's price level and the chance of an outage. Both are updated after every answer.

The price filter

The competitor sits 26% to 54% above list, at a different level every week, with a weekday swing and a level per lane inside the week. The state \(x\) holds one number for the week, five for the weekdays and one per lane (pickup × delivery town, single cars, created when first asked). Every won or lost quote is one logistic observation; the update is a one-step Kalman-style correction.

\[ \hat p = \sigma\!\left(\frac{g + h^{\top}x - \ln m}{0.1}\right), \qquad w=\hat p\,(1-\hat p), \qquad a = \frac{P\,h}{0.1}, \qquad k = \frac{w}{1 + w\,h^{\top}a/0.1} \]
\[ P \;\leftarrow\; P - k\,a\,a^{\top}, \qquad\quad x \;\leftarrow\; x + \frac{P\,h}{0.1}\,\big(\text{won} - \hat p\big) \]

\(h\) marks which levels this request touches. \(P\) starts diagonal with prior SDs in log price: week 0.05, weekday 0.14, lane 0.06. Winning more than expected raises the levels, and the next quotes go out dearer. Dealer and town levels exist in the code but have prior 0 (tested, no gain).

The outage belief

Once a week the competitor is down in one region (a town and everything within 80 km) for a working day. The model holds a probability over 31 hypotheses: no outage today, or an outage around each of the 30 towns.

\[ \text{prior}(\text{outage today}) = \min\!\Big(0.6,\ \frac{1}{5-\text{day}}\Big)\ \text{if not seen yet this week, split over towns by}\ \ 1 + \#\{\text{our requests near town } c\} \]
\[ \text{post}(c) \;\propto\; \text{prior}(c)\prod_{\text{today's answers } i} \begin{cases} \ell_i(\mu_i + \ln 1.2) & \text{pickup}_i \text{ within 80 km of } c\\ \ell_i(\mu_i) & \text{otherwise}\end{cases} \qquad q(\text{place}) = \sum_{c\,:\,\text{place near } c}\text{post}(c) \]

\(\ell_i\) is the chance of the answer we actually got (won or lost) at the price we quoted, clipped to 0.08 to 0.92 so one answer cannot decide it. \(q\) feeds the mixture in step 3 and the +0.30 × q shift in step 4. The price filter reads each answer against the expected price there, so an outage does not drag the whole weekday level up. Once the belief passes 0.9 on a day, the outage counts as seen and its prior is 0 for the rest of the week.

4. Driver fees: fees()

When a gig is posted, the planner from section 1 sets its opening fee and hourly raises. Fixed rules take over as the last pickup time approaches.

The life of a fee schedule

Example: gig posted 30 h before its last pickup time, plan = open 0.81, raise 0.05

Fee as a multiple of the typical fee, while nobody has booked. The opening fee and raise in this example are illustrative; the other levels are the model's parameters. The warning schedule restarts at 1.30, which is under the ramp's top of 1.45.

  • Has a deadline warning come for this order? (from the world 3 h before the last pickup time, or from the engine's own timer 3 h before the last pickup the note allows)
    • noNormal schedule
      • Planned opening fee, then up to 4 hourly raises
      • If still open: hourly ramp to 1.45 × typical, starting 10 h before the last pickup time (or 1 h after the last raise) and ending 3 h before it
      • Posted Thursday or later: every fee × 0.95. Monday to Wednesday: × 1
    • yesHas the last pickup time passed?
      • noSteep schedule: 1.30, then +0.15 every 30 minutes, 4 times (to 1.90). A pair is split first.
      • yesLate anyway: back down to 0.832, then +0.2 every 6 hours (to 1.63). Paying more no longer buys an on-time delivery.

5. Two-car gigs: pair()

A driver who takes two cars in a chain pays one trip to the first pickup and one trip home, and the booking model gives two-car gigs a large bonus (+1.13 in the logit). When a one-car order is won, the engine checks every open, unbooked one-car gig of ours in both orders (new car first, new car second).

  • Can the new order be paired at all?
    • noif its note says no plates or manual gearbox, moves the pickup or deadline, or names real site hours. Post alone.
    • yesFor each candidate chain: total drive ≤ 12 h and no car past its last pickup time? (partner must not be urgent or previously split)
      • yesFirst delivery within 40 km of the second pickup?
        • yesAt least 6 h of slack before the tighter last pickup time?
          • yesCandidate. Score = −join km − 0.5 × km from the last delivery back to the first pickup. Best score wins.
  • If a pair is chosen: withdraw the partner's gig, post one two-car gig. Its schedule comes from the same planner with the opening fee capped at 0.9 × the sum of both typical fees, then ramps to at most 1.3.
  • Exit: unbooked after 3 h, dropped by its driver, or a deadline warning: the pair is split, each car gets its own gig and is never paired again.

6. The engine around the four functions

EventReaction
price_requestDenoise the typical fee. The dealer's typical fee carries about 13% noise that drivers mostly ignore. It is replaced by a lane-table prediction (899 lanes, with small terms for private addresses, premium, electric), unless the lane was seen fewer than 5 times. Then quote().
order_wonRead the note. A note that moves the pickup or deadline, or names site hours, makes the car go alone and sets the engine's own warning timer. Otherwise try a pair, else post alone. Premium cars go to experienced drivers only; a note about plates or manual gearbox sets the audience up front.
deadline_closeMark the order urgent, split its pair if any, reprice with the steep schedule. One minute after the last pickup time, reprice again with the late schedule.
gig_dropped / no_showA pair is split. A single gig stays as posted.
gig_expiredRepost: with the next day's slot when the note gives site hours, else without stop windows. An expired pair is split.
visit_failedRepost that car: later pickup if the car was not ready or the site was closed, manual-licence audience or transfer plates if that was the reason.
order_changedWithdraw the gig and post again with a fresh schedule.
deliveredDealer trust +1 if on time (up to 25), halved if late. Trust raises the price that dealer accepts.

The note reader is a regex reader in Finnish, Swedish and English, 97 to 99% right on ready time, deadline, plates and manual gearbox. 42.5% of won orders carry a note, and 70% of notes change nothing.

Design decisions and their measured effect

This table summarises the parts described in sections 1 to 6. Each was added in response to a specific problem seen in played weeks, and was kept only if it earned margin on fresh server weeks with the same seeds. The last column is what the part was worth in EUR a week, tested with and without it.

PartThe problem it solvedWhat it doesWorth
Knowing what a car costs
Denoised typical fee
typMinN
The dealer's "typical fee" carries about 13% random noise per request. Drivers mostly ignore it, so paying by it overpays half the gigs and underpays the rest.Replaces it with a per-lane average from 899 lanes.+200 to +400
Realized-cost trees
costW
The planner's expected fee barely predicted what an order ended up costing (R² 0.06). Raises, drops, failed visits and refunds were invisible when pricing.Trees predict the full final cost from what is known at quote time (R² 0.27). Cheap gigs turn out dearer per euro than the plan says.+644 ± 106
Hard options
minBookChance, hardChance, hardPrice
Some deadline options are unlikely to find a driver in time. Refusing them all loses sales, selling them all breaks the 90% on-time line.Three bands: refuse under 0.82, sell 20% dearer up to 0.95, normal above.not measured alone
Rationing drivers
Capacity cost and a lower floor
capLam, capConst, markupMin
With a high price floor, 43% of quotes sat on it, so the floor was choosing our orders. Drivers, not demand, are the limit: about 200 carry everything.A low floor of 1.28, and a charge of 4 EUR per driver-hour on each quote, so long drives must earn more to be worth a driver.+600 to +800
Full town or deadline day
capPerDriver, dueCapPer, fullPrice
Orders piled up in one town or on one deadline day and went late together. Friday-due orders held 40% of all lates.Past a load limit, prices rise 25% instead of declining. The few orders still won pay for the risk.keeps weeks ranked; day cap +190
Price by deadline day
dueMon, dueFri
Friday is the tight day, and Monday deadlines have slack because no new requests arrive over the weekend.Friday-due +8% of list, next-Monday-due −3%.+120 ± 63
Reading the competitor
Weekday price learning
pS, pWeek, pDay
The competitor sits 26% to 54% above list, different every week, and swings 12% between weekdays. One fixed price curve is wrong most days.A filter learns a week level and a level per weekday from every win and loss. The weekday prior has to be wide (SD 0.14 in log price) or the filter learns nothing.+419 ± 101
Lane level
pLane
Inside a week the competitor is consistently dear or cheap on a given lane, and 64% of requests come on a lane already asked that week.One more learned level per lane.+303 ± 83 (one of four sets negative)
Price floor follows the learned level
floorLvl
In a cheap week or on a price-war day the fixed floor priced us out for whole days.The floor drops with the learned level, by at most 0.20.+222 ± 58
Outage belief
outBayes, outageK, outage
In a live test final the competitor went down around Helsinki. Priced at the floor, we won 79% of 108 requests, far too cheap, and a simple yes/no flag also fired outside the region.A probability per region, with the win chance mixed between competitor and backup. The backup factor is 1.2 because stored quotes show wins hold up to 1.2 × and collapse by 1.3 ×.+430 ± 144
Paying drivers
Planned fee schedule
openMin, openMax, raiseMax, steps, lateCost
Flat fees lost at every level tried: cheap ones miss drivers, dear ones overpay. Only 38% of gigs book at the opening fee.Opens low and raises hourly, with the pair (open, raise) chosen per gig by expected cost.opening floor and late fee: +530 ± 116
Early ramp
rampTop, rampWindowH
A gig still unbooked the evening before its pickup day is 12.6% late, a booked one 2.3%. Raising at the last minute is too late.Climbs to 1.45 × over the last 10 hours, ending 3 hours before the last pickup. It stops at 1.45 because the booking model shows no gain past 1.4.not measured alone
Late fee
lateFee
Once the last pickup time has passed the order is late whatever we pay, yet the fee kept climbing.Drops back to 0.83 × and climbs slowly.part of the +530
Cheaper fees from Thursday
feeLate
In a test final, gigs posted on Thursday and Friday booked at 0.99 × typical against 0.87 on Monday: we overpaid late in the week.Planned fees × 0.95 from Thursday on.+168 ± 45
Booking shift
bookShift, bookQuote
The booking model is slightly too pessimistic about how fast drivers book. Correcting it everywhere sold more orders and cost ranked weeks.Corrects it in the fee schedules only, so fees open lower while sales stay the same.+320 ± 50
Details that prevent failures
Note reading
noteHours, pairFlags, hoursMinLeftH
Orders whose note gave real opening hours were 14 to 19% late, with 27 visits to closed sites per 100.Reads hours, ready times, plates and gearbox from the note and plans around them.+251 ± 94; failed visits 3.5 → 0.6 a week
Two-car gigs
pairKm, pairSlackH, pairCap, pairTop, pairHoldH
Every single-car gig pays a driver's empty trips. But a third of the pairs that nobody booked went late.Joins cars into a chain when the join is short and there is slack, and splits the pair after 3 hours unbooked.the 40 km and 3 h settings: +213 ± 70

Parameters

The values Seeker plays. Parameters that are switched off (fee tilt, price-war state, typical-fee floor) are left out.

NameValueMeaning
Which options to sell
minBookChance0.95Normal price only above this chance of a booking in time
hardChance0.82Below this the option is not sold
hardPrice0.20Price rise for a hard option
costW1.25Weight of the realized-cost trees against the plan fee
minProfit0.10Price must be at least 1.10 × cost
minSlackH3Hours the deadline must leave beyond the drive
capPerDriver3Town is full at this many open orders per nearby driver
dueCapPer0.10Deadline day is full at this × roster
fullPrice0.25Price rise for a full town or day
Price search
markupMin / markupMax1.28 / 2.00Search range, × list
capLam, capConst4, 1Capacity cost: EUR per driver-hour, extra hours per gig
pairBack0.05Round-trip price cut
dueMon / dueFri−0.03 / +0.08Price shift by deadline day
floorLvl1Floor follows the learned level when it is below average
outage, outageK0.30, 1.2Floor shift in an outage; backup price × competitor
outPriorMax0.6Largest prior for an outage today
Price filter
pS0.10Sharpness of the dealer's choice, log price
pWeek / pDay / pLane0.05 / 0.14 / 0.06Prior SD of the week, weekday and lane levels
Driver fees (× typical fee)
openMin / openMax0.706 / 1.6Range of the opening fee
raiseMax0.2Largest hourly raise
steps4Number of hourly raises
rampTop1.45Top of the early ramp
rampWindowH10Ramp starts this many hours before the last pickup time
steepOpen / steepStep1.3 / 0.15After a deadline warning
lateFee0.832After the last pickup time has passed
lateCost4Planner's cost of a gig with no driver
feeLate0.95Fee factor for gigs posted from Thursday on
bookShift0.2Booking logit shift, fee schedules only
Two-car gigs
pairKm40Largest join distance, km
pairSlackH6Slack needed before the tighter last pickup time
pairCap / pairTop0.9 / 1.3Opening cap and ramp top of a pair
pairHoldH3Unbooked pair is split after this many hours

Known limits

Sources: Bahn-Spread/kit-final/algo.ts, core/model.ts, core/cost.ts, core/engine.ts, core/data/*.json, research/KNOWLEDGE.md, research/LEDGER.md.