Добавление Google Analytics в Next.js: пошаговая настройка и советы

Зачем добавлять Google Analytics
Google Analytics помогает понять поведение посетителей: какие страницы просматривают, откуда они приходят, какие устройства и интересы у аудитории. Это базовый инструмент для принятия решений о продукте, маркетинге и приоритизации улучшений.
Кратко: GA полезен для метрик посещаемости, воронок конверсии и понимания аудитории. Для SPA (Next.js) важно дополнительно отправлять события при смене маршрутов — иначе теги засчитают только первоначальную загрузку.
Что потребуется перед началом
- Аккаунт Google и доступ в Google Analytics (GA4).
- Проект Next.js (pages router или app router).
- Возможность редактировать глобальные компоненты/лейауты (pages/_app.js или app/layout.js).
Важное: measurement ID (формат G-XXXXXXX) — не секрет, но лучше хранить его в переменной окружения с префиксом NEXTPUBLIC для клиентского доступа.
Быстрая схема действий
- Создать ресурс (property) в Google Analytics и выбрать поток данных (Web).
- Скопировать Measurement ID (G-…).
- В Next.js подключить gtag скрипт в head через next/script.
- Реализовать отправку page_view при смене маршрутов.
- Протестировать и проверить в режиме отладки GA.
Настройка в Google Analytics (коротко)
- Перейдите в панель Google Analytics и создайте ресурс.
- В разделе “Потоки данных” добавьте веб-поток и укажите URL сайта.
- На странице потока откройте инструкции по тегированию и скопируйте Measurement ID.
Важно: Measurement ID предназначен для вставки в клиентский код. Он не раскрывает приватные данные аккаунта.
Пример: подключение в проекте на pages router (pages/_app.js)
Ниже — рабочий и упрощённый пример для классического pages/_app.js. Он использует next/script и регистрирует переходы маршрутов через useRouter.
- Создайте файл lib/gtag.js:
// lib/gtag.js
export const GA_MEASUREMENT_ID = process.env.NEXT_PUBLIC_GA_MEASUREMENT_ID || '';
export const pageview = (url) => {
if (!window.gtag) return;
window.gtag('config', GA_MEASUREMENT_ID, {
page_path: url,
});
};
export const event = ({ action, category, label, value }) => {
if (!window.gtag) return;
window.gtag('event', action, {
event_category: category,
event_label: label,
value,
});
};- Модифицируйте pages/_app.js:
// pages/_app.js
import '../styles/globals.css'
import Layout from '../components/Layout/Layout'
import Script from 'next/script'
import { useRouter } from 'next/router'
import { useEffect } from 'react'
import * as gtag from '../lib/gtag'
function MyApp({ Component, pageProps }) {
const router = useRouter()
useEffect(() => {
const handleRouteChange = (url) => {
gtag.pageview(url)
}
router.events.on('routeChangeComplete', handleRouteChange)
return () => {
router.events.off('routeChangeComplete', handleRouteChange)
}
}, [router.events])
return (
<>
>
)
}
export default MyAppПримечание: используйте NEXTPUBLIC префикс для переменных, которые должны быть доступны в браузере. Поместите переменную в .env.local:
NEXT_PUBLIC_GA_MEASUREMENT_ID=G-XXXXXXXСовместимость с App Router (app/)
В новых версиях Next.js (app directory) глобальные скрипты и логика могут находиться в app/layout.js. Пример вставки в layout:
// app/layout.js (упрощённо)
import Script from 'next/script'
export default function RootLayout({ children }) {
return (
{children}
)
}Для App Router потребуется ручной вызов pageview при навигации через хук usePathname + useEffect или через клиентские обработчики переходов.
Почему нужно вручную отслеживать переходы в SPA
Google tag отправляет page_view при инициализации скрипта. В SPA дальнейшие клиентские переходы не перезагружают страницу полностью — поэтому нужно вручную вызывать gtag(‘config’, …) или gtag(‘event’, ‘page_view’) при каждом изменении маршрута.
Важное: всегда проверяйте, что window и window.gtag доступны (вызовы только в браузере).
Тестирование и проверка
- Откройте панель Real-time в Google Analytics и переходите по сайту — если всё настроено, вы увидите активность.
- Используйте режим инкогнито, чтобы исключить кэш/фильтры.
- В консоли браузера выполните window.gtag и проверьте, что функция определена.
- Для отладки добавляйте временные console.log при вызове gtag.pageview(url).
Критерии приёмки:
- После установки скрипта initial page_view появляется в GA.
- При навигации по маршрутам SPA отображаются дополнительные page_view.
- Measurement ID совпадает с указанным в интерфейсе GA.
Типичные ошибки и как их исправить
Забыт префикс NEXT_PUBLIC — переменная undefined в браузере.
Решение: используйте NEXT_PUBLIC_GA_MEASUREMENT_ID.Вызов gtag до загрузки скрипта.
Решение: используйте стратегию afterInteractive и проверяйте наличие window.gtag.Неправильный формат функции pageview: забыли передать url.
Решение: реализуйте pageview(url) и используйте router.events.Дублирование просмотров из-за нескольких инициализаций.
Решение: убедитесь, что скрипт вставлен только один раз (например, в едином Layout/_app).
Примеры событий (сниппеты)
Отправка произвольного события (например, нажатие кнопки “Купить”):
// где-то в компоненте
import * as gtag from '../lib/gtag'
const onBuy = () => {
gtag.event({
action: 'purchase_click',
category: 'ecommerce',
label: 'buy_button',
value: 1,
})
}Альтернативы и когда GA не подходит
- Google Tag Manager (GTM): удобен при большом числе тегов и если маркетологи хотят управлять тегами без деплоя кода.
- Платные аналитики (Mixpanel, Amplitude): лучше подходят для продвинутой продуктовой аналитики и ретеншн-аналитики.
- Лёгкие приватные решения (Plausible, Fathom): если ваша цель — минимизировать сбор персональных данных.
Когда GA не подходит: требуются более детальные когортные анализы или хочется избежать сторонних скриптов вовсе.
Приватность и соответствие GDPR
- По GDPR нужно уведомлять пользователей о сборе аналитики и, в зависимости от юрисдикции, получать согласие.
- Рассмотрите согласие через CMP (consent management platform) и загружайте GA-скрипт только после согласия.
- Для уменьшения персональных данных можно включить анонимизацию IP (gtag конфигурация) и отказаться от рекламных функций.
Note: юридическая ответственность лежит на владельце сайта — проконсультируйтесь с юристом по соответствию.
Рольные чек-листы при развёртывании
Developer:
- Добавил Script с правильным strategy.
- Реализовал lib/gtag.js и pageview при смене маршрутов.
- Поместил NEXT_PUBLIC_GA_MEASUREMENT_ID в .env.local.
Product / PM:
- Согласованы ключевые метрики (sessions, pageviews, конверсии).
- Настроены события для основных воронок.
Privacy Officer:
- Проверен текст политики приватности и баннер согласия.
- Решено требовать ли opt-in для аналитики.
Мини-методология развёртывания
- Установить скрипт на staging.
- Протестировать real-time и ручные события.
- Проверить отсутствие дублирующих page_view.
- Включить на production после проверки.
Тест-кейсы (базовые)
Описание: при переходе с / на /about должен появиться второй page_view в GA.
Критерий приёмки: в реальном времени в GA видно два просмотра с различными путями.Описание: событие “sign_up” отправляется при клике на форму регистрации.
Критерий приёмки: событие отображается в отчётах Events.
Советы по безопасности и производительности
- Используйте стратегию загрузки afterInteractive — аналитика не блокирует отображение страницы.
- Не вставляйте скрипты в компоненты, которые рендерятся многократно.
- Для требований приватности загружайте скрипт после получения согласия.
Краткое резюме
Добавление Google Analytics в Next.js — это сочетание: правильной установки клиентского тега и ручного учета pageview при смене маршрутов в SPA. Храните Measurement ID в NEXT_PUBLIC переменной окружения, используйте next/script, проверяйте наличие window.gtag перед вызовами, и тестируйте на staging прежде чем выпускать в production.
Important: если вам нужна строгая приватность или отказ от сторонних скриптов, рассмотрите альтернативы вроде Plausible или серверного трекинга.
Ключевые ссылки и шаги в одно предложение: создайте ресурс в GA → скопируйте G-* → добавьте Script в head через next/script → реализуйте lib/gtag.js → вызывать pageview при routeChangeComplete.
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone