@php $maxDaily = max(1, (int) ($daily->max('visits') ?? 0)); $maxHourly = max(1, (int) ($hourly->max('visits') ?? 0)); $labelEvery = max(1, (int) ceil(max(1, $daily->count()) / 12)); $peakDay = $daily->sortByDesc('visits')->first(); $peakHour = $hourly->sortByDesc('visits')->first(); $chartWidth = max(760, $daily->count() * 34); $chartTicks = collect([1, .75, .5, .25, 0]) ->map(fn (float|int $ratio): int => (int) round($maxDaily * $ratio)); $hourlyTicks = collect([1, .75, .5, .25, 0]) ->map(fn (float|int $ratio): int => (int) round($maxHourly * $ratio)); $campaignName = $this->campaign !== '' ? $this->campaign : '(sem nome)'; $sourceName = $this->source !== '' ? $this->source : 'direto'; $mediumName = $this->medium !== '' ? $this->medium : 'sem meio'; $visitsPerVisitor = $visitors > 0 ? round($visits / $visitors, 1) : 0; $performance['visitors'] = $visitors; $breakdownSections = [ ['IDs da campanha', 'Identificadores utm_id recebidos nas URLs', $campaignIds, '#526f9d'], ['Top keywords', 'Termos associados aos acessos', $terms, '#2eaa74'], ['Dispositivo', 'Distribuicao por tipo de aparelho', $devices, '#607168'], ['Sistema', 'Sistemas operacionais mais usados', $oses, '#526f9d'], ['Browser', 'Navegadores usados pelos visitantes', $browsers, '#277f76'], ['Landing pages', 'Paginas de entrada da campanha', $landings, '#8c6949'], ]; @endphp @include('filament.pages.partials.analytics-dashboard-styles')
Voltar para campanhas
Desempenho individual

{{ $campaignName }}

Fonte {{ $sourceName }} Meio {{ $mediumName }} @if ($campaignIds->isNotEmpty()) ID {{ $campaignIds->pluck('label')->take(2)->join(', ') }} @endif
Visitas
{{ number_format($visits) }}
Acessos atribuidos a esta campanha
Unicas
{{ number_format($uniques) }}
{{ $uniqueRate }}% do volume registrado
Visitantes
{{ number_format($visitors) }}
{{ $visitsPerVisitor }} visitas em media por visitante
Taxa unica
{{ $uniqueRate }}%
Proporcao de primeiras visitas
@include('filament.pages.partials.campaign-funnel', [ 'funnelId' => 'campaign-detail-funnel', 'funnelTitle' => 'Da aquisição à receita', 'funnelSubtitle' => 'Último toque atribuído a esta campanha dentro do período selecionado.', ])

Evolucao diaria

Comparativo de visitas totais e unicas com escala fixa ao longo do periodo.

@if ($peakDay && $peakDay['visits'] > 0)
Pico do periodo {{ number_format($peakDay['visits']) }} em {{ $peakDay['label'] }}
@else Sem atividade no periodo @endif
Visitas Unicas
@forelse ($daily as $day) @php $visitHeight = $day['visits'] > 0 ? max(3, round($day['visits'] / $maxDaily * 100, 2)) : 0; $uniqueHeight = $day['uniques'] > 0 ? max(3, round($day['uniques'] / $maxDaily * 100, 2)) : 0; @endphp
{{ $day['label'] }} {{ number_format($day['visits']) }} visitas · {{ number_format($day['uniques']) }} unicas
@empty
Sem visitas no periodo.
@endforelse
@if ($daily->isNotEmpty()) @endif
UTM content

Variações de conteúdo

Cada valor distinto de utm_content é exibido separadamente dentro desta campanha.

{{ number_format($contentVariants->total()) }} {{ $contentVariants->total() === 1 ? 'variação' : 'variações' }}
@forelse ($contentVariants as $variant) @php $share = $visits > 0 ? round(((int) $variant->visits / $visits) * 100, 1) : 0; @endphp @empty @endforelse
Valor de utm_content Visitas Únicas Participação
{{ $variant->label }}
{{ number_format((int) $variant->visits) }} {{ number_format((int) $variant->uniques) }} {{ number_format($share, 1) }}%
Nenhuma variação de conteúdo registrada
As visitas desta campanha não enviaram o parâmetro utm_content no período selecionado.
@if ($contentVariants->hasPages())
{{ $contentVariants->onEachSide(1)->links() }}
@endif
@foreach ($breakdownSections as [$title, $subtitle, $items, $color]) @php $maxItems = max(1, (int) ($items->max('visits') ?? 0)); @endphp

{{ $title }}

{{ $subtitle }}

@forelse ($items as $item) @php $width = max(2, round(((int) $item->visits / $maxItems) * 100)); @endphp
{{ $item->label }} {{ number_format((int) $item->visits) }} · {{ number_format((int) $item->uniques) }} unicas
@empty
Sem dados para este recorte.
@endforelse
@endforeach

Top cidades

Locais que mais responderam a esta campanha.

@php $maxCities = max(1, (int) ($cities->max('visits') ?? 0)); @endphp
@forelse ($cities as $city) @php $width = max(2, round(((int) $city->visits / $maxCities) * 100)); @endphp
{{ $city->label }} {{ $city->region }} {{ number_format((int) $city->visits) }}
@empty
Sem dados geograficos.
@endforelse

Visitas por hora

Faixas do dia com maior resposta dos visitantes.

@if ($peakHour && $peakHour['visits'] > 0) Pico {{ $peakHour['label'] }} · {{ number_format($peakHour['visits']) }} @endif
@foreach ($hourly as $hour) @php $height = $hour['visits'] > 0 ? max(4, round($hour['visits'] / $maxHourly * 100, 2)) : 0; @endphp
{{ $hour['label'] }} {{ number_format($hour['visits']) }} visitas
@endforeach

Ultimas visitas

Detalhes recentes de atribuição, contexto técnico e localização sem expor o endereço IP.

{{ number_format($recentVisits->count()) }} registros
@forelse ($recentVisits as $visit) @empty @endforelse
Quando Visitor ID campanha Conteudo Termo URL registrada Click ID Disp. Local Status
{{ $visit->visited_at?->format('m/d H:i:s') }} {{ substr($visit->visitor_id, 0, 8) }} {{ $visit->utm_id !== '' ? $visit->utm_id : '-' }} {{ $visit->utm_content !== '' ? $visit->utm_content : '-' }} {{ $visit->utm_term !== '' ? $visit->utm_term : '-' }} {{ $visit->landing_url !== '' ? $visit->landing_url : '-' }} @if ($visit->gclid !== '') Google · {{ \Illuminate\Support\Str::limit($visit->gclid, 22) }} @elseif ($visit->fbclid !== '') Meta · {{ \Illuminate\Support\Str::limit($visit->fbclid, 22) }} @else - @endif {{ $visit->device }} {{ trim($visit->city.' '.$visit->region) ?: '-' }} $visit->is_unique, 'is-repeat' => ! $visit->is_unique])> {{ $visit->is_unique ? 'Unico' : 'Repete' }}
Sem visitas no período selecionado.