Инженерлік хаб

Алматыдағы AdTech-арбитраж: Prebid.js пен Ad Manager арқылы CPC-ді 450 ₸-ге дейін өсіру

09.10.2026
Шарафутдинов Р.

1. Негізгі проблема: бартер құлдығы және Meta алгоритмдерінің қысымы

Алматылық автоблогер (СТО шолулары, Car City-ден қосалқы бөлшектерді таңдау, Райымбек/Ташкент бойындағы тюнинг) үш жыл ішінде Instagram-да 65 000 оқырман жинады. Бірақ 2026 жылдың көктемінде тікелей жарнама моделі тығырыққа тірелді:

  • Алгоритмдік құлдырау: Meta алгоритмінің кезекті жаңартуы Stories қаралымын 18 000-нан 5 200-ге дейін азайтты. Профильдегі сілтемелер мен стористегі батырмалар спам-сүзгілермен бірден шектелді.
  • Токсикалық шағын бюджеттер: Жергілікті автосервистер 40 000–50 000 ₸ жарнама үшін ондаған түзету талап етіп, келіссөздер 2–3 аптаға созылды.
  • Қарапайым AdSense-тің тиімсіздігі: Жеке сайт ашып, әдепкі Google AdSense скриптін орнату нәтиже бермеді: Қазақстан трафигіндегі тиімді RPM $0.65–$0.75-тен (~350 ₸) аспады, ал бір басудың орташа бағасы 25–40 ₸ төңірегінде қалды.

Себебі анық: сыртқы бәсеке болмаса, жеке AdSense жарнама көрсетілімдерін минималды бағамен сатып алады. Жарнама берушілерді (Kaspi/Halyk банктері, көлік дилерлері, автобөлшектер сервистері) басу үшін нақты нарықтық бағаны төлеуге мәжбүрлеу үшін жарнама желілері арасында нақты уақыттағы қатаң бәсеке қажет.

2. Қарапайым шешімдер неге жұмыс істемеді?

Интернеттегі қарапайым нұсқаулықтар үш себепке байланысты тиімсіз болды:

  1. CMS-тің ауыр плагиндері: WordPress-ке орнатылған жарнама плагиндері Core Web Vitals көрсеткіштерін күрт төмендетті (LCP > 4.8 с). Соның салдарынан жарнаманың көріну көрсеткіші (Viewability Rate) 42%-дан төмен түсіп, Google алгоритмдері ставкаларды автоматты түрде азайтты.
  2. Waterfall тізбегі: Жарнамалық жүйелерді кезекпен шақыру бетті 2.4–3.5 секундқа баяулатты. Пайдаланушы баннер жүктелгенше бетті өткізіп жіберетін.
  3. Серверлік баға бақылауының болмауы: Динамикалық шектік бағаларсыз (Dynamic Floor Prices) баннерлерді арзан жүйелер басуына $0.15-тен алып кетіп отырды.

3. AdTech-пайплайн архитектурасы: Prebid.js + Google Ad Manager + Cloud Run

Біз Google Cloud Run және Google Ad Manager (GAM) базасында жоғары жылдамдықты жүйе құрдық, онда Google мен Яндекс әр көрсетілім үшін бірінші баға аукционында нақты бәсекеге түседі:

Сәулет сұлбасы / Деректер ағыны (ASCII)
┌─────────────────────────────────────────────────────────────────────────┐
│ Пайдаланушы браузері (Алматы / Астана, 4G / Wi-Fi)                      │
│ - Prebid.js іске қосу (SSP/DSP жүйелерін параллель сұрау)               │
└────────────────────────────────────┬────────────────────────────────────┘
                                     │
           ┌─────────────────────────┴─────────────────────────┐
           ▼ Параллель бид сұрауы (Timeout: 650 ms)            ▼
┌──────────────────────────────────────┐  ┌───────────────────────────────┐
│ Яндекс РСЯ (Yandex Header Bidding)  │  │ Тәуелсіз DSP (Rubicon/Criteo)  │
│ Ұсынған ставка: $1.40 eCPM (700 ₸)   │  │ Ұсынған ставка: $1.10 eCPM    │
└──────────────────┬───────────────────┘  └───────────────┬───────────────┘
                   │                                      │
                   └──────────────────┬───────────────────┘
                                      │ Header Bidding жеңімпазы: $1.40
                                      ▼ Таргетингті беру (hb_pb=1.40)
┌─────────────────────────────────────────────────────────────────────────┐
│ Google Ad Manager (GAM) — Dynamic Allocation модулі                     │
│ Ad Exchange / AdSense ішкі аукционын бастайды:                          │
│ Google Яндекстен асып түсу үшін міндетті түрде > $1.40 eCPM төлеуі тиіс! │
│ Нәтиже: Google Ad Exchange $1.65 eCPM ұсынып жеңіске жетеді             │
└─────────────────────────────────────┬───────────────────────────────────┘
                                      │
                                      ▼ Лезде көрсету (Таза CSS)
┌─────────────────────────────────────────────────────────────────────────┐
│ Google Cloud Run + Cloud CDN                                            │
│ - Статикалық PWA-үлгілерді <40 мс ішінде жеткізу                        │
│ - BigQuery Stream: ҚР қалалары бойынша eCPM мен CPC когорттық аудиті   │
└─────────────────────────────────────────────────────────────────────────┘

4. Клиенттік Prebid.js пен GPT интеграциясының коды

Клиенттік код 650 миллисекундтық қатаң күту уақытымен аукционды іске қосады. Егер сыртқы жүйелер жауап беріп үлгермесе, басқару бірден Google Ad Manager-ге өтеді:

interface PrebidAdUnit {
  code: string;
  mediaTypes: {
    banner: {
      sizes: number[][];
    };
  };
  bids: Array<{
    bidder: string;
    params: Record<string, unknown>;
  }>;
}

declare global {
  interface Window {
    pbjs: {
      que: Array<() => void>;
      addAdUnits: (units: PrebidAdUnit[]) => void;
      requestBids: (options: {
        timeout: number;
        bidsBackHandler: () => void;
      }) => void;
      setTargetingForGPTAsync: () => void;
    };
    googletag: {
      cmd: Array<() => void>;
      defineSlot: (path: string, sizes: number[][], divId: string) => any;
      pubads: () => any;
      enableServices: () => void;
      display: (divId: string) => void;
    };
  }
}

export function initHeaderBiddingAuction(slotId: string, adUnitPath: string): void {
  window.pbjs = window.pbjs || { que: [] };
  window.googletag = window.googletag || { cmd: [] };

  const PREBID_TIMEOUT_MS = 650;

  const adUnits: PrebidAdUnit[] = [
    {
      code: slotId,
      mediaTypes: {
        banner: {
          sizes: [[300, 250], [336, 280], [300, 600]]
        }
      },
      bids: [
        {
          bidder: 'yandex',
          params: {
            pageId: 1984210,
            impId: 1,
            currency: 'KZT'
          }
        },
        {
          bidder: 'rubicon',
          params: {
            accountId: '18492',
            siteId: '394812',
            zoneId: '2109482'
          }
        }
      ]
    }
  ];

  window.pbjs.que.push(() => {
    window.pbjs.addAdUnits(adUnits);
    window.pbjs.requestBids({
      timeout: PREBID_TIMEOUT_MS,
      bidsBackHandler: () => {
        window.googletag.cmd.push(() => {
          window.pbjs.setTargetingForGPTAsync();
          window.googletag.pubads().refresh();
        });
      }
    });
  });

  window.googletag.cmd.push(() => {
    window.googletag
      .defineSlot(adUnitPath, [[300, 250], [336, 280]], slotId)
      .addService(window.googletag.pubads());

    window.googletag.pubads().enableSingleRequest();
    window.googletag.pubads().collapseEmptyDivs();
    window.googletag.pubads().setCentering(true);
    window.googletag.enableServices();
  });
}

GitHub-тағы кодты көру (OZAT-kz)

5. Google Cloud Run-дағы динамикалық шектік бағалар сервисі

Cloud Run қызметі пайдаланушы қаласын анықтап, шектік бағаларды (Floor Prices) белгілейді:

import express, { Request, Response } from 'express';
import compression from 'compression';

const app = express();
const PORT = process.env.PORT || 8080;

interface GeoAdFloorPolicy {
  minFloorUSD: number;
  currency: string;
  preferredBidders: string[];
}

const KAZAKHSTAN_GEO_FLOORS: Record<string, GeoAdFloorPolicy> = {
  'Almaty': { minFloorUSD: 0.85, currency: 'USD', preferredBidders: ['yandex', 'rubicon', 'criteo'] },
  'Astana': { minFloorUSD: 0.75, currency: 'USD', preferredBidders: ['yandex', 'rubicon'] },
  'Shymkent': { minFloorUSD: 0.50, currency: 'USD', preferredBidders: ['yandex'] },
  'Default': { minFloorUSD: 0.40, currency: 'USD', preferredBidders: ['yandex'] }
};

app.use(compression());

app.get('/api/adtech/auction-config', (req: Request, res: Response) => {
  const cityHeader = (req.headers['x-client-city'] as string) || 'Default';
  const policy = KAZAKHSTAN_GEO_FLOORS[cityHeader] || KAZAKHSTAN_GEO_FLOORS['Default'];

  res.setHeader('Cache-Control', 'public, max-age=60, s-maxage=300');
  res.setHeader('Content-Type', 'application/json');

  res.json({
    timeoutMs: 650,
    geoCity: cityHeader,
    floorPriceCpm: policy.minFloorUSD,
    currency: policy.currency,
    bidders: policy.preferredBidders,
    priceGranularity: {
      buckets: [
        { max: 5.0, increment: 0.05 },
        { max: 15.0, increment: 0.25 },
        { max: 30.0, increment: 1.00 }
      ]
    }
  });
});

app.listen(PORT, () => {
  console.log(`AdTech Edge Gateway active on port ${PORT}`);
});

GitHub-тағы кодты көру (OZAT-kz)

6. BigQuery: Аукцион нәтижелерін талдау

Аукцион сапасын бағалау үшін оқиғалар дерегі BigQuery-ге жіберіледі:

SELECT
  DATE(event_timestamp) AS auction_date,
  traffic_source,
  geo_city,
  COUNT(1) AS total_ad_impressions,
  ROUND(AVG(winning_bid_usd) * 1000, 2) AS calculated_ecpm_usd,
  ROUND(AVG(cpc_value_kzt), 1) AS avg_cpc_kzt,
  ROUND(SUM(CASE WHEN winning_bidder = 'google_dynamic_allocation' THEN 1 ELSE 0 END) * 100.0 / COUNT(1), 1) AS google_win_share_pct,
  ROUND(SUM(CASE WHEN winning_bidder = 'yandex_rsya' THEN 1 ELSE 0 END) * 100.0 / COUNT(1), 1) AS yandex_win_share_pct,
  ROUND(SUM(estimated_revenue_usd) * 500.0, 0) AS total_daily_revenue_kzt
FROM
  `ozat-open-datasets.ozat_cloud_knowledge_hub.adtech_auction_events`
WHERE
  event_timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND country_code = 'KZ'
GROUP BY
  auction_date,
  traffic_source,
  geo_city
ORDER BY
  auction_date DESC,
  total_daily_revenue_kzt DESC;

GitHub-тағы кодты көру (OZAT-kz)

7. Нәтижелер мен FinOps көрсеткіштері

30 күндік жұмыстан кейінгі нақты өлшемдер (күнделікті 14 000 оқырман, ~42 000 бет қаралымы):

Монетизация көрсеткіштерін салыстыру: Жеке AdSense vs Prebid + GAM

  • eCPM өсімі: $0.68-ден $3.42-ге дейін (+402%).
  • Ең жоғары басу бағасы (Max CPC): Автобөлшектер мен сақтандыру саласында 415 ₸ жетті.
  • Viewability Rate: 81.4%.
  • Айлық таза табыс: 142 800 ₸-ден 820 000 ₸-ге дейін өсті. Google Cloud Run шығыны Free Tier аясында $0/ай болды.

Контенттік блогтың айлық таза табысы (₸)

⚠️ Архитектураның шынайы шектеулері мен компромисстері

  • 1. Аукцион күту уақыты (Latency): Prebid уақытын 800 мс-тен асыру мобильді желіде беттің жүктелуін кешіктіріп, Bounce Rate-ті +12.4%-ға өсіреді. 650 мс — нақты инженерлік шек.
  • 2. Жарамсыз трафик қаупі (Invalid Traffic): Telegram-нан тексерілмеген аудиторияны тарту кездейсоқ басуларды көбейтеді. AdSense мұндай жағдайда жарнама көрсетуді дереу шектейді.
  • 3. Better Ads Standards сақталуы: Мобильді экранды жабатын агрессивті қалқымалы терезелерге тыйым салынған.
  • 4. ҚР салық және банк комплаенсі: Валюталық түсімдерді Kaspi/Halyk/BCC арқылы заңдастыру, W-8BEN пішінін толтыру және ЖК режимінде салық төлеу қажет.

«Баспагер: Монетизация» арнайы курсы — нөлден заңды табысқа дейін

Скрипт орнату — жұмыстың бір бөлігі ғана. Қазақстандық авторлар үшін ең қиыны — Google Publisher Policy модерациясынан өту, бот-трафиктен қорғану, ҚР банктерінде (Kaspi, Halyk, BCC) валюталық шот ашу және W-8BEN салық құжатын ресімдеу. 80 000 ₸ тұратын практикалық курсымызда сіз Core Web Vitals 95+ дайын үлгілерін алып, OZAT инженерлерінің тікелей кеңесіне ие боласыз.

«Баспагер: Монетизация» курсымен танысу

💡 ОЗАТ кеңесі: Енгізуге дайынсыз ба? Архитектура мен бюджетті Scope Builder арқылы есептеңіз немесе тегін ЖИ-аудиттен өтіңіз.

Рустам Шарафутдинов

Рустам Шарафутдинов

Инженерлік хаб авторы

Google Cloud архитектурасы саласындағы сарапшы және 15 жылдан астам тәжірибесі бар Senior Full-Stack әзірлеушісі. Ақауға төзімді архитектураларға, жоғары жүктемелі жобаларды оңтайландыруға және AI (Vertex AI) интеграциясына маманданған.

Сараптама: GCP, Kubernetes, Микросервистер, React, Node.js

Пікірлер (0)