@extends('nexus.layouts.app') @section('page-title', 'Search Visibility') @section('sys-mode', 'SEO') @section('head') @endsection @section('content') @php $meta = $report['meta']; $cards = $report['cards']; // one directional movement list instead of two ragged columns $moves = array_merge($report['movers']['up'] ?? [], $report['movers']['down'] ?? []); $seen = []; $moves = array_values(array_filter($moves, function ($m) use (&$seen) { if (isset($seen[$m['query']])) { return false; } $seen[$m['query']] = true; return abs($m['move']) >= 0.5; })); usort($moves, fn ($a, $b) => abs($b['move']) <=> abs($a['move'])); $moves = array_slice($moves, 0, 8); // lower is better for average position, so invert its delta colour $deltaClass = function ($card) { $d = $card['delta']; $dir = $card['good'] === 'down' ? ($d['dir'] === 'up' ? 'down' : ($d['dir'] === 'down' ? 'up' : 'flat')) : $d['dir']; return $dir === 'up' ? 'chip-live' : ($dir === 'down' ? 'chip-error' : 'chip-pending'); }; $verdictChip = function ($pos) { if ($pos <= 3) { return 'chip-active'; } if ($pos <= 10) { return 'chip-completed'; } if ($pos <= 20) { return 'chip-warning'; } return 'chip-pending'; }; @endphp {{-- ═══════════════ HEADER ═══════════════ --}} @if(session('nexus_ok'))
OK{{ session('nexus_ok') }}
@endif @if(session('nexus_err'))
ERR{{ session('nexus_err') }}
@endif {{-- ═══════════════ 1. PLAIN ENGLISH ═══════════════ --}}
In Plain English {{ $meta['range_label'] }} · data through {{ $meta['end'] }} · sync {{ $meta['sync_status'] }}
@forelse($report['headline'] as $line)

{{ $line }}

@empty

No Search Console data has been synced yet.

@endforelse
{{-- ═══════════════ 2. THE FOUR NUMBERS ═══════════════ --}}
The Four Numbers · Last {{ $meta['days'] }} Days
@foreach($cards as $c)
{{ $c['label'] }}
{{ $c['value'] }}
{{ $c['delta']['text'] }}
{{ $c['plain'] }}
@endforeach
{{-- ═══════════════ 3. TREND ═══════════════ --}}
Last 90 Days · Visitors vs Times Shown
Grey climbing while orange stays flat means people see GEAS in Google and do not click.
{{-- ═══════════════ 4. BANDS + COUNTRIES ═══════════════ --}}
Are We Climbing?
Every search term GEAS ranks for, by where it sits. Complete weeks only. Dark shrinking is the goal.
{{ $report['buckets']['verdict'] ?? '' }}
Where The Visitors Are
Many impressions with almost no visitors means the wrong kind of search.
@forelse($report['countries']['rows'] as $c) @empty @endforelse
Country Visitors Share Shown Spot
@if($c['flag']) @endif {{ $c['name'] }} {{ number_format($c['clicks']) }} {{ $c['share'] }}% {{ number_format($c['impressions']) }} {{ $c['position'] }}
No country data available
{{-- ═══════════════ 5. TERMS + PAGES ═══════════════ --}}
What People Searched To Find GEAS
@forelse(array_slice($report['topQueries'], 0, 10) as $i => $q) @empty @endforelse
Search Term Visits Shown Spot Where
{{ str_pad($i + 1, 2, '0', STR_PAD_LEFT) }} {{ $q['query'] }} {{ number_format($q['clicks']) }} {{ number_format($q['impressions']) }} {{ $q['position'] }} {{ $q['verdict'] }}
No query data available
Which Pages Google Sends People To
@forelse(array_slice($report['topPages'], 0, 10) as $i => $p) @empty @endforelse
Page Visits Shown CTR
{{ str_pad($i + 1, 2, '0', STR_PAD_LEFT) }} {{ $p['path'] }} {{ number_format($p['clicks']) }} {{ number_format($p['impressions']) }} {{ $p['ctr'] }}%
No page data available
{{-- ═══════════════ 6. BRAND + DEVICE ═══════════════ --}}
Did They Already Know Us?
{{ $report['branded']['plain'] }}
{{ $report['branded']['branded_pct'] }}%
Knew The Name
Phone Or Computer
Where the {{ number_format($report['devices']['total']) }} Google visitors came from.
{{ number_format($report['devices']['total']) }}
Total Visitors
{{-- ═══════════════ 7. MOVERS + UNDERPERFORMERS ═══════════════ --}}
Biggest Movements
Terms that climbed or fell against the previous {{ $days }} days.
@forelse($moves as $m) @empty @endforelse
Search Term Movement Spot
{{ $m['query'] }} {{ $m['move'] > 0 ? '▲' : '▼' }} {{ number_format(abs($m['move']), 1) }} {{ $m['from'] }} → {{ $m['to'] }}
No movement data available
Ranking Well But Not Getting Clicked
High enough in Google, people scroll past. Usually the title, not the ranking.
@forelse(array_slice($report['underperformers'], 0, 8) as $u) @empty @endforelse
Page Spot Gets Should Lost
{{ $u['path'] }} {{ $u['position'] }} {{ $u['actual'] }}% {{ $u['expected'] }}% {{ $u['lost'] }}
Every page earns roughly what its position deserves
{{-- ═══════════════ 7b. BLOG PERFORMANCE ═══════════════ --}}
Blog Performance {{ number_format($report['blog']['clicks']) }} visitors · {{ $report['blog']['share'] }}% of all Google traffic
{{ $report['blog']['plain'] }}
@forelse($report['blog']['posts'] as $i => $b) @empty @endforelse
Post Search Term Carrying It Visitors Shown Click Rate Spot
{{ str_pad($i + 1, 2, '0', STR_PAD_LEFT) }} {{ $b['slug'] }} @if($b['legacy']) OLD URL @endif {{ $b['top_query'] }} {{ number_format($b['clicks']) }} {{ number_format($b['impressions']) }} {{ $b['ctr'] }}% {{ $b['position'] }}
No blog posts picking up search traffic yet
{{-- ═══════════════ 8. ACTION LIST ═══════════════ --}}
Almost On Page One {{ count($report['striking']) }} {{ Str::plural('term', count($report['striking'])) }} · fastest available wins
These already get shown to plenty of people but sit just below page one. Improving the page behind each is the quickest way to add visitors.
@forelse($report['striking'] as $i => $s) @empty @endforelse
Search Term Page To Edit Times Shown Spot To Page 1 Closeness
{{ str_pad($i + 1, 2, '0', STR_PAD_LEFT) }} {{ $s['query'] }} {{ $s['page'] }} {{ number_format($s['impressions']) }} {{ $s['position'] }} {{ $s['gap'] > 0 ? $s['gap'] : '—' }}
Nothing currently sitting just outside page one
@endsection @section('scripts') @endsection