🔍 Enter your business name & town to find your report
0) {
selectedDescription = $wire.searchResults[0].description;
pendingPlaceId = $wire.searchResults[0].place_id;
showDropdown = false;
if ($refs.checkButton && !loading) {
$refs.checkButton.click();
}
}
"
@blur="setTimeout(() => showDropdown = false, 150)" />
@if (!empty($searchResults))
@foreach ($searchResults as $result)
{{ $result['description'] }}
@endforeach
@elseif(strlen($search) > 3)
No results found. Try a different search term.
@endif
loading = false);
}
"
class="mt-2 w-full bg-blue-700 text-white font-bold py-3 rounded-lg hover:bg-blue-600 transition flex items-center justify-center relative"
:disabled="!pendingPlaceId || loading">
Checking...
Search My Business
Watch 50-second explanation
@if ($insight)
@if (config('top3-lead-labels.show_on_public_surfaces', true) && ($this->top3FunnelStage !== '' || $this->top3EngagementLabel !== ''))
@if ($this->top3FunnelStage !== '')
Funnel : {{ $this->top3FunnelStage }}
@endif
@if ($this->top3EngagementLabel !== '')
Engagement : {{ $this->top3EngagementLabel }}
@endif
@endif
@php
$business = $insight;
$keywordsWithSnapshot = $business->keywords->filter(fn($kw) => $kw->latestSnapshot);
$premiumKeywords = (clone $keywordsWithSnapshot)->filter(fn($kw) => $kw->premium)->sortByDesc(fn($kw) => (float)($kw->latestSnapshot->traffic_value ?? 0))->values();
$topKeywords = (clone $keywordsWithSnapshot)->sortByDesc(fn($kw) => $kw->premium)->take(4)->values();
// Example premium keywords table: load all 4 premium keywords from DB so table always shows up to 4 rows
$premium4 = \App\Models\Keyword::where('business_insight_id', $business->id)
->where('premium', true)
->with('latestSnapshot')
->orderBy('id')
->limit(4)
->get();
$townStr = (string)($business->town ?? '');
$regionStr = (string)($business->region ?? '');
$localKws = collect();
$regionalKws = collect();
foreach ($premium4 as $kw) {
$tv = (float)($kw->latestSnapshot?->traffic_value ?? 0);
$hasTown = $townStr !== '' && stripos((string)$kw->keyword, $townStr) !== false;
$hasRegion = $regionStr !== '' && stripos((string)$kw->keyword, $regionStr) !== false;
if ($hasTown && !$hasRegion) {
$localKws->push((object)['kw' => $kw, 'tv' => $tv]);
} elseif ($hasRegion) {
$regionalKws->push((object)['kw' => $kw, 'tv' => $tv]);
} elseif ($hasTown) {
$localKws->push((object)['kw' => $kw, 'tv' => $tv]);
}
}
$townValueFromKeywords = (int) round($localKws->sum(fn($o) => $o->tv));
$regionValueFromKeywords = (int) round($regionalKws->sum(fn($o) => $o->tv));
if ($townValueFromKeywords === 0 && $regionValueFromKeywords === 0) {
$townValue = 690;
$regionValue = (int) round(690 * 1.33);
} else {
$townValue = $townValueFromKeywords > 0 ? $townValueFromKeywords : 690;
$regionValue = $regionValueFromKeywords > 0 ? $regionValueFromKeywords : (int) round(690 * 1.33);
}
$totalCardValue = $townValue + $regionValue;
// Tone down surfaced values for this landing design.
$displayScale = 0.4;
$displayTotalCardValue = (int) round($totalCardValue * $displayScale);
$localScale = $townValueFromKeywords > 0 ? $townValue / $townValueFromKeywords : 1.0;
$regionScale = $regionValueFromKeywords > 0 ? $regionValue / $regionValueFromKeywords : 1.0;
$localKeywordValues = $localKws->map(fn($o) => ['keyword' => $o->kw->keyword, 'value' => (int) round($o->tv * $localScale)])->values();
$regionalKeywordValues = $regionalKws->map(fn($o) => ['keyword' => $o->kw->keyword, 'value' => (int) round($o->tv * $regionScale)])->values();
$sum4TrafficValue = $premium4->sum(fn($kw) => (float)($kw->latestSnapshot?->traffic_value ?? 0));
$scaleFactor = $sum4TrafficValue > 0 ? $totalCardValue / $sum4TrafficValue : 1.0;
$examplePremiumKeywords = $premium4->map(function ($keyword) use ($scaleFactor) {
$snap = $keyword->latestSnapshot;
$ms = $snap ? (int)($snap->monthly_searches ?? 0) : 0;
$cpc = $snap ? (float)($snap->cpc ?? 0) : 0.0;
$tv = $snap ? (float)($snap->traffic_value ?? 0) : 0.0;
return [
'keyword' => $keyword->keyword,
'searches' => (int) round($ms * $scaleFactor),
'cpc' => $cpc,
'value' => (int) round($tv * $scaleFactor),
];
})->values();
// Build top 3 from first keyword that has results; if fewer than 3, add from next keywords
$top3 = collect();
$seenPlaceIds = [];
foreach ($business->keywords as $kw) {
if ($top3->count() >= 3) break;
if (!$kw->results || $kw->results->isEmpty()) continue;
foreach ($kw->results->take(3) as $r) {
if ($top3->count() >= 3) break;
$pid = $r->place_id ?? null;
if ($pid && in_array($pid, $seenPlaceIds, true)) continue;
if ($pid) $seenPlaceIds[] = $pid;
$top3->push($r);
}
}
$firstWithResults = $business->keywords->first(fn($k) => $k->results && $k->results->isNotEmpty());
// Position: from first premium keyword snapshot, or from competitors (top 3) if we're in the list
$positionNumber = null;
$firstPremiumPos = $premiumKeywords->first();
if ($firstPremiumPos && $firstPremiumPos->latestSnapshot && is_numeric($firstPremiumPos->latestSnapshot->position)) {
$positionNumber = (int) $firstPremiumPos->latestSnapshot->position;
}
if ($positionNumber === null && $firstWithResults) {
$ourResult = $firstWithResults->results->first(fn($r) => ($r->place_id ?? null) === $business->place_id);
if ($ourResult && is_numeric($ourResult->position)) {
$positionNumber = (int) $ourResult->position;
}
}
$latestReview = $business->reviewSnapshots()->orderByDesc('snapshot_date')->first();
$rating = $latestReview !== null ? (float) $latestReview->average_rating : null;
$unsubscribeEmail = $email ?? $business->email ?? '';
$unsubscribeUrl = url('unsubscribe?email=' . urlencode($unsubscribeEmail) . '&source=top3search');
// --- UI stats derived values (matches your reference layout) ---
$top3Share = 0.7;
$top3Percent = (int) round($top3Share * 100); // 70
$positionIsTop3 = $positionNumber !== null && $positionNumber <= 3;
// Use the 4 premium keywords as the basis for "search volume" estimates; fall back to reference numbers.
$sum4MonthlySearches = (int) round($premium4->sum(fn ($kw) => (int) ($kw->latestSnapshot?->monthly_searches ?? 0)));
$totalSearches = $sum4MonthlySearches > 0 ? $sum4MonthlySearches : 3300;
$top3Searches = (int) round($totalSearches * $top3Share);
$restSearches = max(0, $totalSearches - $top3Searches);
// When in Top 3, show "you are visible" share; otherwise show missed share.
$yourSharePercent = $positionIsTop3 ? $top3Percent : (100 - $top3Percent);
// Keep consistent with dashboard popup (static realistic Google pagination cap).
$competitorsEstimate = 400;
$highlightKeyword = $business->keywords->first()?->keyword ?? ($business->name ?? 'your business');
// Popup: count keywords where this business is currently in the Top 3.
$placeIdStr = (string) ($business->place_id ?? '');
$keywordsInTop3 = $business->keywords
->filter(function ($kw) use ($placeIdStr) {
if (!($kw->premium ?? false)) return false;
$results = collect($kw->results ?? []);
if ($results->isEmpty()) return false;
return $results->contains(function ($r) use ($placeIdStr) {
$pid = (string) ($r->place_id ?? '');
$pos = $r->position ?? null;
return $pid === $placeIdStr && is_numeric($pos) && (int) $pos <= 3;
});
})
->count();
@endphp
{{-- Business name, address; right: star rating + position on Google Maps --}}
{{ $business->name }}
{{ $business->address }}
{{ $rating !== null ? number_format($rating, 1) : '—' }}
Position {{ $positionNumber !== null ? '#' . $positionNumber : '20+' }}
{{-- Post-search nudge (from reference lander) --}}
Fewer than 2% of businesses reach the Top 3 — but the rewards can be significant.
Check if I qualify
{{-- Estimated missed free value + where customers are going --}}
Where Your Customers Are Going
Top 3 (Google Map Pack)
~{{ $top3Percent }}%
~{{ number_format($top3Searches) }} of {{ number_format($totalSearches) }} searches go to the Top 3
Local competitors
{{ number_format($competitorsEstimate) }}
Very high competition
Your Position
#{{ $positionNumber !== null ? $positionNumber : '20+' }}
{{ $positionIsTop3 ? 'Visible to buyers' : 'Invisible to buyers' }}
~{{ number_format($top3Searches) }} {{ $positionIsTop3 ? 'see you' : 'never see you' }}
If a customer searches
{{ $highlightKeyword }}
and chooses from the Top 3... what’s that worth?
🔥 High-Value Searches You’re Missing
Keyword
Searches
Est. CPC
Est. Value
@forelse ($examplePremiumKeywords as $row)
{{ $row['keyword'] }}
High-value search
{{ number_format($row['searches']) }}
£{{ number_format($row['cpc'], 2) }}
£{{ number_format((float)$row['value'] * $displayScale, 0) }}
@empty
No premium keywords yet.
@endforelse
{{-- Example Top-3 Rankings Carousel (design-only, no logic change) --}}
Example Google Maps Top 3 Ranking
Click any example to check the live Google search result.
200+ more examples available on request
{{-- Hidden trigger kept for deep-link flows (e.g. ?openPosition=1) --}}
See My New Position
{{-- CTA modal flow (matches provided HTML behavior) --}}
Close
Checking your Maps visibility...
Analysing your position and local search opportunity
{{ $keywordsInTop3 }} KEYWORDS
Current keywords in the top 3
No card • No contract • 3-day free test
See Where Your Business Could Be in 3 Days
Most customers choose from the first 3 results
Top 3 (Google Map Pack)
1. {{ $business->name }}
Your New Position
⭐ {{ $rating !== null ? number_format($rating, 1) : '4.6' }}
#1
@php
$modalCompetitors = $top3
->filter(fn($c) => (string)($c->place_id ?? '') !== (string)$business->place_id)
->values()
->take(2);
@endphp
@foreach($modalCompetitors as $i => $competitor)
{{ $i + 2 }}. {{ $competitor->name ?? ('Competitor ' . ($i + 1)) }}
⭐ {{ isset($competitor->rating) && $competitor->rating ? number_format((float)$competitor->rating, 1) : '4.5' }}
#{{ $i + 2 }}
@endforeach
Nothing to Loose Try it for Free
Only one business per location
Try it for free
Free 3-day Top 3 test • No card required
You approve all changes before anything goes live
Full report with your new positions in 3 days
£99/month Cancel anytime
{{-- Bottom CTA block (copy/wording from reference lander) --}}
Exclusively one business per location
{{ number_format($competitorsEstimate) }} businesses competing in your area — including national brands and corporates.
Check if I qualify for Top 3
No card required · Takes 60 seconds · Cancel anytime
1,200+ businesses ranked
Results within 3 days
1 business per area only
If you'd rather not receive the report,
click here .
{{-- CTA: Qualification gate + Demo signup (keep existing flow for email capture) --}}
Contact Support
@else
{{-- Skeleton: match new results layout --}}
Estimated missed free value (equivalent paid ads traffic cost)
High-Value Searches You're Missing
@for ($i = 0; $i < 4; $i++)
@endfor
@for ($i = 0; $i < 3; $i++)
@endfor
@endif
{{-- Same video modal as CTA (qualification-gate): Watch 50 sec --}}