File: /home/storage/5/78/dd/wicomm2/public_html/clientes/lookai/ga4_fetch.php
<?php
require __DIR__ . '/vendor/autoload.php';
use Google\Analytics\Data\V1beta\BetaAnalyticsDataClient;
use Google\Analytics\Data\V1beta\DateRange;
use Google\Analytics\Data\V1beta\Dimension;
use Google\Analytics\Data\V1beta\Metric;
use Google\Analytics\Data\V1beta\FilterExpression;
use Google\Analytics\Data\V1beta\Filter;
use Google\Analytics\Data\V1beta\Filter\StringFilter;
use Google\Analytics\Data\V1beta\FilterExpressionList;
$cfg = require __DIR__ . '/config.php';
date_default_timezone_set('America/Sao_Paulo');
$client = new BetaAnalyticsDataClient(['credentials' => $cfg['ga4']['credentials']]);
$dateRange = new DateRange([
'start_date' => date('Y-m-01'),
'end_date' => date('Y-m-d')
]);
$respDaily = $client->runReport([
'property' => "properties/{$cfg['ga4']['property_id']}",
'dateRanges' => [$dateRange],
'dimensions' => [new Dimension(['name' => 'date'])],
'metrics' => [
new Metric(['name' => 'sessions']),
new Metric(['name' => 'engagedSessions']),
new Metric(['name' => 'totalUsers']),
new Metric(['name' => 'newUsers']),
new Metric(['name' => 'bounceRate']),
new Metric(['name' => 'averageSessionDuration']),
new Metric(['name' => 'addToCarts']),
new Metric(['name' => 'checkouts']),
new Metric(['name' => 'ecommercePurchases']),
new Metric(['name' => 'totalRevenue'])
]
]);
// Mapear métricas por nome para garantir alinhamento correto
$metricHeaders = [];
foreach ($respDaily->getMetricHeaders() as $idx => $mh) {
$metricHeaders[$mh->getName()] = $idx;
}
$mv = function($mValues, $name) use ($metricHeaders) {
return isset($metricHeaders[$name]) ? (float) $mValues[$metricHeaders[$name]]->getValue() : 0.0;
};
$daily = [];
foreach ($respDaily->getRows() as $row) {
$d = $row->getDimensionValues();
$m = $row->getMetricValues();
$date = $d[0]->getValue();
if (preg_match('/^\d{8}$/', $date)) {
$date = substr($date, 0, 4) . '-' . substr($date, 4, 2) . '-' . substr($date, 6, 2);
}
$daily[] = [
'date' => $date,
'sessions' => $mv($m, 'sessions'),
'users' => $mv($m, 'totalUsers'),
'new_users' => $mv($m, 'newUsers'),
'bounce_rate' => $mv($m, 'bounceRate'),
'avg_session_duration_sec' => $mv($m, 'averageSessionDuration'),
'add_to_carts' => $mv($m, 'addToCarts'),
'checkouts' => $mv($m, 'checkouts'),
'transactions' => $mv($m, 'ecommercePurchases'),
'revenue' => $mv($m, 'totalRevenue')
];
}
// 2) Produtos (top itens por receita)
$respItems = $client->runReport([
'property' => "properties/{$cfg['ga4']['property_id']}",
'dateRanges' => [$dateRange],
'dimensions' => [new Dimension(['name' => 'itemName'])],
'metrics' => [
new Metric(['name' => 'itemRevenue']),
new Metric(['name' => 'itemsPurchased'])
],
'limit' => 5000
]);
$items = [];
foreach ($respItems->getRows() as $row) {
$d = $row->getDimensionValues();
$m = $row->getMetricValues();
$name = $d[0]->getValue() ?: '(sem nome)';
$items[] = [
'item_name' => $name,
'item_revenue' => (float) $m[0]->getValue(),
'items_purchased' => (float) $m[1]->getValue()
];
}
// 2b) Eventos globais de funil (view_item, add_to_cart etc.)
$respItemEvents = $client->runReport([
'property' => "properties/{$cfg['ga4']['property_id']}",
'dateRanges' => [$dateRange],
'dimensions' => [new Dimension(['name' => 'eventName'])],
'metrics' => [new Metric(['name' => 'eventCount'])],
'dimensionFilter' => $filterExpression
]);
$itemEvents = [];
foreach ($respItemEvents->getRows() as $row) {
$dims = $row->getDimensionValues();
$metrics = $row->getMetricValues();
$event = $dims[0]->getValue();
$count = (float) $metrics[0]->getValue();
$itemEvents[$event] = $count;
}
$respChannels = $client->runReport([
'property' => "properties/{$cfg['ga4']['property_id']}",
'dateRanges' => [$dateRange],
'dimensions' => [new Dimension(['name' => 'sessionDefaultChannelGroup'])],
'metrics' => [
new Metric(['name' => 'sessions']),
new Metric(['name' => 'totalRevenue']),
new Metric(['name' => 'ecommercePurchases'])
],
'limit' => 50
]);
$channels = [];
foreach ($respChannels->getRows() as $row) {
$d = $row->getDimensionValues();
$m = $row->getMetricValues();
$channels[] = [
'channel' => $d[0]->getValue(),
'sessions' => (float) $m[0]->getValue(),
'revenue' => (float) $m[1]->getValue(),
'transactions' => (float) $m[2]->getValue()
];
}
$eventNames = [
'view_item',
'add_to_cart',
'begin_checkout',
'add_profile_info',
'add_shipping_info',
'add_payment_info',
'purchase'
];
$expressions = [];
foreach ($eventNames as $ev) {
$expressions[] = new FilterExpression([
'filter' => new Filter([
'field_name' => 'eventName',
'string_filter' => new StringFilter(['value' => $ev])
])
]);
}
$filterExpression = new FilterExpression([
'or_group' => new FilterExpressionList(['expressions' => $expressions])
]);
$respFunnel = $client->runReport([
'property' => "properties/{$cfg['ga4']['property_id']}",
'dateRanges' => [$dateRange],
'dimensions' => [new Dimension(['name' => 'eventName'])],
'metrics' => [new Metric(['name' => 'eventCount'])],
'dimensionFilter' => $filterExpression
]);
$funnelEvents = [];
foreach ($respFunnel->getRows() as $row) {
$d = $row->getDimensionValues();
$m = $row->getMetricValues();
$event = $d[0]->getValue();
$funnelEvents[] = [
'event_name' => $event,
'count' => (float) $m[0]->getValue()
];
}
$out = [
'generated_at' => date('c'),
'daily' => $daily,
'items' => $items,
'channels' => $channels,
'funnel_events' => $funnelEvents
];
if (!is_dir(dirname($cfg['data']['json_path']))) {
mkdir(dirname($cfg['data']['json_path']), 0775, true);
}
file_put_contents($cfg['data']['json_path'], json_encode($out, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
echo "✅ GA4 atualizado: " . count($daily) . " dias, " . count($items) . " itens, " . count($channels) . " canais, " . count($funnelEvents) . " eventos de funil\n";