← Marketplace ranking

{{ $car->vehicle }}

{{ $car->dealer->trading_name }} · Platform-only ranking details

PLATFORM PLACEMENTS

Promote this listing

Up to {{ count(config('ranking.promotion.slots')) }} reserved opportunities per {{ config('ranking.promotion.window') }} Recommended results, at positions {{ implode(', ', config('ranking.promotion.slots')) }} when organic matches are available. Search filters, quality, availability and dealer diversity still apply. Explicit price, year and newest sorts keep their order.

{{ $promotion && $promotion->enabled && \Illuminate\Support\Carbon::parse($promotion->ends_at)->isFuture() ? 'Active promotion' : 'Not promoted' }}
@csrf

Starts immediately; maximum 90 days. Active promotions are labelled publicly. Reserved placement requires {{ config('ranking.promotion.quality_min') * 100 }}% listing quality and {{ config('ranking.promotion.confidence_min') * 100 }}% availability confidence; promotion cannot make private stock public. Existing results remain stable until a new search or Discover more.

Eligibility & availability

@forelse($reasons as $reason)

• {{ $reason }}

@empty

Eligible for public discovery.

@endforelse
First public publication: {{ $car->first_published_at ?: 'Not published' }}
Availability confirmed: {{ $car->availability_confirmed_at ?: 'Never' }}
Dealer reminder: {{ $signal?->notice_at ?: 'Not due / not reviewed' }}
Email accepted by transport: {{ $signal?->email_sent_at ?: 'Not sent' }}
Reminder issue: {{ $signal?->notification_error ?: 'None recorded' }}
Current quality: {{ $signal ? number_format($signal->quality*100,1).'%' : 'Pending refresh' }}
Active boost: {{ $signal && $signal->boost_until && \Illuminate\Support\Carbon::parse($signal->boost_until)->isFuture() ? number_format($signal->boost*100,1).' points until '.$signal->boost_until : 'None' }}

Last result-set score

@if($snapshot)

{{ $snapshot->ranked_at }} · {{ $snapshot->allocation ?: 'Not yet displayed' }} allocation · New pool: {{ $snapshot->new_pool ? 'yes':'no' }} · Older pool: {{ $snapshot->older_pool ? 'yes':'no' }}

@foreach(config('ranking.weights') as $name=>$weight)@endforeach
SignalValue / 100Weight
{{ ucfirst($name) }}{{ number_format($snapshot->$name*100,2) }}{{ number_format($weight/max(.0001,array_sum(config('ranking.weights')))*100) }}%

Boost in this snapshot: +{{ number_format($snapshot->boost*100,2) }} points.

Total: {{ number_format($snapshot->score*100,2) }} / 100

Context: {{ $snapshot->filters }}. This is a frozen, context-specific score; it is not a universal vehicle rating.

@else

No result-set snapshot yet. The next eligible discovery visit will compute one.

@endif

Recent activity · {{ config('ranking.recent_days') }} days

@foreach((array)$stats as $name=>$count)

{{ ucfirst(str_replace('_',' ',$name)) }} {{ number_format($count) }}

@endforeach

Viewable impressions only. Aggregates refresh every 15 minutes. A buyer contributes at most one interest credit per {{ config('ranking.recent_days') }}-day window; individual event types remain separate.

Refresh history & cooldowns

Current cooldown: {{ $cooldownUntil && $cooldownUntil->isFuture() ? 'until '.$cooldownUntil : 'none' }}

{{ config('ranking.refresh.cooldown_days') }}-day cooldown; at most {{ config('ranking.refresh.max_in_90_days') }} boosts in 90 days; {{ config('ranking.refresh.boost_days') }}-day duration.

@forelse($changes as $change)
{{ ucwords(str_replace('_',' ',$change->reason)) }} · {{ $change->reason === 'manual_promotion' ? 'Promotion change' : ($change->awarded ? 'Boost awarded' : 'No boost') }} · {{ $change->created_at }}
{{ json_encode(json_decode($change->details),JSON_PRETTY_PRINT) }}
@empty

No meaningful refresh decisions recorded.

@endforelse