Як я підключив Mediavine Journey на сайт на Spring Boot

Оновлено:
Мова: 🇺🇦
Як я підключив Mediavine Journey на сайт на Spring Boot

Усі інструкції Mediavine написані для WordPress: встановили плагін — і готово. А якщо сайт самописний — на Next.js, Laravel, Django чи, як у мене, на Spring Boot — плагіни не допоможуть. У цій статті — повний шлях від відмов AdSense до працюючої реклами Journey by Mediavine на сайті без WordPress: з кодом, перевірками і проблемами, які з'явилися вже після запуску.

Приклади коду — на Spring Boot і Thymeleaf, але принцип однаковий для будь-якого стеку: скрипти в <head>, редирект для ads.txt, прибрати код AdSense.

⚡ Коротко

  • ✅ Результат: заявка в Journey схвалена за кілька годин, реклама працює з 15 жовтня 2026 року.
  • ✅ Що потрібно: скрипт Grow, підключений GA4, рекламний скрипт Mediavine, ads.txt через редирект.
  • ⚠️ Обов'язково: повністю прибрати код AdSense до перевірки.
  • 🛠️ Після запуску: довелося підняти плаваючі кнопки над мобільним банером і вимкнути форму підписки Grow.

📚 Зміст статті

📉 Передісторія: п'ять відмов AdSense

Я подавав заявку в Google AdSense п'ять разів. Щоразу приходив однаковий лист: «Потрібно дещо виправити, перш ніж ми зможемо схвалити заявку». Без жодної конкретної причини.

Між заявками я перевіряв і виправляв: — політика конфіденційності, ads.txt, контент, навігація тощо Справжньої причини відмов я так і не дізнався, тому не буду її вигадувати.

Після п'ятої відмови я подивився на альтернативи і дізнався, що з 15 січня 2026 року Journey by Mediavine приймає сайти від 1 000 сесій на місяць замість 10 000. У webscraft.org їх близько 8 000.

Порівняння двох платформ, їхніх вимог, переваг і недоліків — у статті Google AdSense vs Journey by Mediavine: що обрати для свого сайту.

⏱️ Хронологія: від Grow до запуску

  1. Створив акаунт Grow і встановив скрипт на всі сторінки.
  2. Підключив GA4 і подав заявку в Journey.
  3. Заявку схвалили через кілька годин.
  4. Пройшов онбординг: дані сайту, політика конфіденційності, рекламний скрипт, ads.txt, перевірка особи.
  5. Натиснув «Launch» — реклама з'явилася на сайті того ж дня.

Офіційно Journey радить тримати Grow на сайті щонайменше 30 днів, перш ніж чекати схвалення. Мене схвалили того ж дня — імовірно, тому що в GA4 вже була історія трафіку. Але це мій випадок, а не правило.

🧩 Крок 1. Grow через Thymeleaf-фрагмент

Grow — інструмент залучення читачів від Mediavine, і без нього реклама Journey не працює. Після реєстрації в кабінеті Grow ви отримуєте скрипт для вставки в <head>.

Головна порада: не копіюйте скрипт у кожен шаблон. Винесіть його в один Thymeleaf-фрагмент — пізніше туди ж додасться рекламний скрипт, і все зміниться в одному місці.

templates/fragments/ads.html:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<th:block th:fragment="ads">
    <!-- Grow by Mediavine -->
    <script data-grow-initializer="">/* ваш скрипт Grow з кабінету — без змін */</script>
</th:block>
</html>

У <head> кожного публічного шаблону — один рядок:

<th:block th:replace="~{fragments/ads :: ads}"></th:block>

Нюанси:

  • вставляйте скрипт дослівно і не видаляйте атрибут data-grow-initializer;
  • Thymeleaf не обробляє вміст <script> без th:inline, тож конфліктів з виразами не буде;
  • Grow рахує трафік тільки на сторінках зі скриптом — додайте його на всі публічні сторінки і всі мовні версії, інакше сесій буде менше, ніж насправді.

Перевірка. Я перевіряв так: DevTools → Network → оновлення сторінки. Мають завантажитися faves.grow.me/main.js і app.*.js зі статусом 200.

Нюанс, на якому я спіткнувся: на другій сторінці файли прийшли з позначкою «з кешу диска» — браузер узяв їх з кешу після головної. За такою перевіркою не видно, чи є скрипт саме на цій сторінці. Щоб перевірити напевно, увімкніть Disable cache і оновіть сторінку ще раз, або знайдіть у вкладці Elements атрибут data-grow-initializer у <head>.

📝 Крок 2. Заявка і онбординг

Заявка подається через Grow або на publishers.mediavine.com/join. Кілька моментів, на яких я зупинявся:

  • New чи existing publisher. Якщо у вас ще немає сайтів з рекламою Mediavine — new publisher, навіть якщо акаунт Grow уже є.
  • Business structure. Якщо ви приватна особа без зареєстрованої компанії — Sole proprietorship (no registered entity), а в назві компанії — своє повне ім'я латиницею. Воно має збігатися з податковою формою і рахунком для виплат.
  • Privacy Policy URL. Mediavine вимагає дійсну політику конфіденційності. Я вказав англійську версію — її легше перевірити.
  • Перевірка особи. Перша спроба завершилася помилкою «Error 6». Повторна спроба трохи пізніше пройшла без проблем.

🧹 Крок 3. Прибираємо AdSense

На кроці з рекламним скриптом Mediavine прямо попереджає: код попередніх рекламних партнерів потрібно прибрати до перевірки, інакше вона не пройде. Journey ексклюзивний для дисплейної реклами.

Що прибрати з усіх шаблонів:

  • мета-тег <meta name="google-adsense-account" ...>;
  • скрипт adsbygoogle.js;
  • усі блоки <ins class="adsbygoogle">;
  • інлайн-виклики (adsbygoogle = window.adsbygoogle || []).push({});.

Найшвидше знайти все пошуком по проєкту:

grep -rn "adsbygoogle\|ca-pub-" src/main/resources/templates/

📢 Крок 4. Рекламний скрипт Mediavine

Під час онбордингу Mediavine дає рекламний скрипт. Додаємо його в той самий фрагмент, поруч із Grow:

<th:block th:fragment="ads">
    <!-- Grow by Mediavine -->
    <script data-grow-initializer="">/* скрипт Grow */</script>

    <!-- Mediavine Ads -->
    <script type="text/javascript" async="async" data-noptimize="1" data-cfasync="false"
            src="//scripts.scriptwrapper.com/tags/YOUR-SITE-ID.js"></script>
</th:block>
  • data-cfasync="false" не дає Cloudflare Rocket Loader змінювати скрипт — залиште як є;
  • // на початку src — звичайне протокольно-відносне посилання, міняти на https:// не потрібно;
  • Mediavine рекомендує розміщувати скрипт перед закриваючим </head>.

Після деплою натисніть Verify Script в онбордингу.

🔀 Крок 5. ads.txt як 301-редирект у Spring Boot

Mediavine часто оновлює список рекламних партнерів, тому копіювати їхній ads.txt до себе не можна — копія застаріє. Правильно — зробити 301-редирект на файл, яким керує Mediavine.

Я робив це в коді, а не правилом Cloudflare: так логіка видна в репозиторії.

@RestController
public class AdsTxtController {

    private static final URI MEDIAVINE_ADS_TXT = URI.create(
            "https://adstxt.journeymv.com/sites/YOUR-SITE-ID/ads.txt");

    @GetMapping("/ads.txt")
    public ResponseEntity<Void> adsTxt() {
        return ResponseEntity.status(HttpStatus.MOVED_PERMANENTLY)
                .location(MEDIAVINE_ADS_TXT)
                .build();
    }
}

Старий рядок AdSense (google.com, pub-..., DIRECT, ...) прибираємо: потрібні записи Google вже є у файлі Mediavine.

Перевірка:

# має бути 301 і правильний location
curl -I https://your-site.com/ads.txt

# має бути ownerdomain=your-site.com і рядок journeymv.com з ID вашого сайту
curl -sL https://your-site.com/ads.txt | head -5

Якщо сайт за Cloudflare, подивіться заголовок cf-cache-status. DYNAMIC — усе добре; якщо Cloudflare віддає закешовану стару версію, зробіть Purge Cache для /ads.txt.

🔧 Що зламалося після запуску

Заглушки «Want fewer ads like this one?»

У перші дні на місці частини рекламних блоків з'являється банер Grow «Want fewer ads like this one? Get Grow Today». Це не платна реклама, а заглушка для місць, на які не знайшовся рекламодавець. Їх стає менше, коли система вчиться на вашому трафіку.

Порожнє зарезервоване місце

Mediavine заздалегідь резервує висоту під рекламу, щоб текст не стрибав під час завантаження. Поки блок не заповнився, на темній темі сайту це виглядає як білий прямокутник. Налаштувати це в Journey не можна.

Мобільний банер перекрив плаваючі кнопки

Mediavine показує «липкий» банер унизу екрана. У мене там стояли кнопка AI-чату і кнопка «нагору» — обидві з bottom: 24px. Рішення — підняти їх над банером і поставити стовпчиком:

.scroll-top-btn {
    bottom: 120px;   /* над рекламним банером */
    right: 28px;     /* центр на одній осі з кнопкою чату (56px vs 48px) */
}

.ai-chat-widget {
    bottom: 184px;   /* 120 + 48 (висота scroll-top) + 16 відступ */
    right: 24px;
}

@media (max-width: 768px) {
    .scroll-top-btn { bottom: 100px; right: 20px; }
    .ai-chat-widget { bottom: 160px; right: 16px; }
}

Плаваючий віджет Grow

Grow додає плаваючі кнопки «зберегти» і «поділитися». Вони теж перекривали мою кнопку, тому я переніс віджет ліворуч у налаштуваннях Grow. Повністю приховувати його через CSS не раджу: Grow обов'язковий для Journey.

Форма підписки Grow англійською

Grow автоматично вставив у статті форму «Subscribe to WebCraft!» англійською — на українських сторінках і світлу на темній темі. Я вимкнув її в кабінеті Grow: Subscribe → Forms, перемикач біля форми.

Чого не робити

Ніколи не клікайте на власну рекламу і не перезавантажуйте сторінки, щоб її «перевірити». Це недійсний трафік, за який можна втратити акаунт. Детальніше — у статті про антифрод.

💰 Скільки це приносить

⏳ Розділ оновлюється. Реальні цифри — RPM за сесію, дохід і розподіл трафіку за країнами — я опублікую після першого місяця роботи.

  • 📊 Місяць 1: [посилання — скоро]

Як порахувати прогноз для свого сайту, я пояснив у статті Google AdSense vs Journey by Mediavine: що обрати для свого сайту, у розділі «Скільки можна заробити».

✅ Чек-лист для тих, хто повторює

  • ☐ 1 000+ сесій на місяць за даними GA4
  • ☐ Акаунт Grow, скрипт на всіх публічних сторінках і мовних версіях
  • ☐ Підключений GA4, подана заявка в Journey
  • ☐ Дійсна політика конфіденційності (бажано англійською)
  • ☐ Повністю прибраний код AdSense і інших рекламних мереж
  • ☐ Рекламний скрипт Mediavine у <head>, перевірка Verify Script пройдена
  • ☐ /ads.txt віддає 301 на файл Mediavine
  • ☐ Плаваючі кнопки сайту не перекриваються мобільним банером
  • ☐ Податкова форма і дані для виплат заповнені в кабінеті
  • ☐ Не клікати на власну рекламу

❓ Часті питання (FAQ)

Чи можна встановити Journey без WordPress?

Так. Grow і рекламний скрипт — звичайні теги <script>, а ads.txt налаштовується редиректом на будь-якому стеку.

Чи можна залишити AdSense поруч із Journey?

Ні. Journey ексклюзивний для дисплейної реклами, і залишки коду AdSense блокують перевірку під час онбордингу.

Чи обов'язково чекати 30 днів з Grow?

Journey офіційно радить тримати Grow щонайменше 30 днів. Мене схвалили того ж дня, але це не гарантія для вашого сайту.

Чи можна приховати віджет Grow?

Скрипт Grow прибирати не можна — він обов'язковий. Положення віджета і форми підписки змінюються в кабінеті Grow; ховати їх через CSS не варто.

Чому ads.txt через редирект, а не копією файлу?

Mediavine регулярно оновлює список партнерів. Копія застаріє, а редирект завжди веде на актуальну версію.