Arsitektur
Cara AdOps menjalankan satu aturan
AdOps menjalankan aturan Meta Ads Anda lewat dua layanan: sebuah dispatcher bangun tiap 10 detik dan memilih aturan yang sudah jatuh tempo, lalu sebuah worker membaca metrik yang diminta tiap kondisi, melipatnya dengan logika AND atau OR Anda, menjalankan aksi yang Anda pilih, dan menulis satu catatan per campaign untuk setiap eksekusi.
Ada sembilan tahap antara detak jam yang membuat sebuah aturan jatuh tempo dan catatan yang menjelaskan apa yang terjadi pada tiap campaign. Halaman ini menelusuri kesembilannya, lengkap dengan angka yang membuatnya konkret.
Alurnya
Dari detak jam sampai satu catatan tertulis.
Evaluasi aturan dibagi ke dua layanan yang dihubungkan antrean berbasis Redis. Dispatcher menentukan apa yang jatuh tempo dan menarik campaign-nya; worker membaca metrik dan menjalankan aksinya. Pemisahan inilah yang membuat satu ad account yang lambat tidak menahan aturan Anda yang lain.
-
Sapuan mengambil aturan yang jatuh tempo
Sebuah cron bangun tiap 10 detik dan mencari aturan berstatus ACTIVE, yang waktu eksekusi berikutnya sudah lewat, dan yang jendela tanggal mulai serta selesainya masih terbuka. Sapuan didaftarkan sedemikian rupa sehingga detak berikutnya tidak bisa mulai selagi sapuan sebelumnya masih berjalan.
Tiap 10 dtk sapuan dispatch
-
Meta hanya mengembalikan campaign yang masuk cakupan aturan
Pre-filter aturan — id campaign, potongan nama campaign, atau effective status campaign — diserialisasi ke parameter filtering Graph API, jadi Meta yang mempersempit daftarnya sebelum apa pun melintas. Filter status diterjemahkan ke operator himpunan yang diminta Graph API.
3 field pre-filter
-
Semua halaman diikuti, pengambilan yang gagal diulang
Entitas diminta 1.000 per halaman dan cursor paging tiap respons diikuti sampai Meta tidak mengembalikan halaman lagi. Pengambilan yang gagal diulang sampai total 3 percobaan, dengan jeda 1 detik lalu 2 detik. Kalau ketiganya gagal, ad account itu dilewati dan sisa aturan tetap berjalan.
3 percobaan, jeda 1 dtk lalu 2 dtk
-
Pekerjaan disebar, satu job per ad account
Tiap ad account dalam aturan menjadi job tersendiri di antrean berbasis Redis, membawa semua yang dibutuhkan worker: access token, dokumen aturan, daftar entitas yang sudah diambil, id ad account, dan satu batch id untuk pengiriman itu.
1 job per ad account
-
Satu pembacaan Insights batch, tepat untuk metrik yang diminta
Worker mengelompokkan kondisi task berdasarkan rentang laporan, menghapus duplikasi field Insights yang dibutuhkan tiap rentang, lalu mengirimkannya sebagai satu batch request Graph per campaign. Metrik yang bukan field Insights — jam, custom metric, daily budget, umur campaign — tidak ikut diambil di situ dan diselesaikan terpisah. Pembacaan batch dikirim dengan unified attribution setting.
1 batch request per campaign
-
Custom metric diselesaikan dari spreadsheet Anda
Kondisi yang memakai custom metric diselesaikan lewat Google Sheet: id spreadsheet dan nama sheet yang Anda atur, satu kolom pencarian yang dicocokkan dengan id campaign, dan satu kolom nilai yang dibaca sebagai angkanya. Baris disimpan di memori selama 2 menit sejak akses terakhir, dengan salinan di MongoDB yang dipakai kalau pengambilan langsung gagal.
2 menit cache sheet di memori
-
Kondisi dilipat dengan AND atau OR
Tiap kondisi diselesaikan menjadi angka lalu dibandingkan memakai salah satu dari enam operator, terhadap nilai tetap atau terhadap metrik lain yang boleh memakai rentang laporannya sendiri. Kondisi-kondisi task itu kemudian dilipat dengan operator grup yang Anda pilih, AND atau OR, menjadi satu hasil lolos atau tidak.
6 operator, atas 45 metrik
-
Aksi dijalankan lewat Graph API
Sebelum bertindak, worker memeriksa cooldown task: kalau waktu eksekusi berikutnya pada hasil terakhir yang tereksekusi masih di depan, ia menulis catatan skipped lalu berhenti. Aksi budget dan nama membaca ulang daily budget atau nama terkini dari Meta sebelum menulis, dan perubahan budget dijepit ke batas atas atau batas bawah yang Anda tentukan alih-alih melewatinya.
11 aksi yang bisa dijalankan satu task
-
Eksekusinya dicatat
Tiap campaign dan tiap task menghasilkan satu catatan eksekusi: aksinya, apakah tereksekusi, parameter yang dipakai, nilai sebelum dan sesudah ketika ada yang berubah, tiap kondisi lengkap dengan angka yang dilihat dan status lolosnya, lama tiap langkah internal dalam detik, dan waktu eksekusi berikutnya yang diizinkan. Tiap pengiriman juga menulis satu catatan batch berisi aturan, ad account, jumlah item, dan status eksekusinya.
1 catatan per campaign, per task, per eksekusi
Dalam praktik
Arti tiap tahap buat Anda.
Sembilan tahap yang sama, dibaca dari luar — satu baris masing-masing, tanpa arsitektur.
| Tahap | Artinya buat Anda |
|---|---|
| Sapuan mengambil aturan yang jatuh tempo | Aturan dengan interval rapat terambil dalam hitungan detik setelah jatuh tempo, dan sapuan yang lambat tidak pernah menjalankan aturan yang sama dua kali. |
| Meta hanya mengembalikan campaign yang masuk cakupan aturan | Di akun dengan ribuan campaign, aturan yang dibatasi ke satu konvensi penamaan hanya pernah melihat campaign tersebut. |
| Semua halaman diikuti, pengambilan yang gagal diulang | Galat sesaat di Graph API menghabiskan satu percobaan ulang, bukan satu eksekusi yang hilang — dan satu akun bermasalah tidak menghentikan akun lain. |
| Pekerjaan disebar, satu job per ad account | Satu aturan bisa mencakup semua akun klien yang Anda kelola, dan tiap akun diproses sendiri tanpa menunggu yang lain. |
| Satu pembacaan Insights batch, tepat untuk metrik yang diminta | Aturan yang membandingkan hari ini dengan 7 hari terakhir memakan satu request, bukan dua, dan ROAS yang terbaca sama dengan yang dilaporkan attribution window ad set Anda. |
| Custom metric diselesaikan dari spreadsheet Anda | Target yang Anda simpan di sheet back-office sendiri — margin, stok, batas bawah ROAS per produk — bisa menggerakkan aturan tanpa diketik ulang ke dalamnya. |
| Kondisi dilipat dengan AND atau OR | Anda bisa menulis “purchase ROAS 7 hari terakhir di bawah 1,2 DAN spend hari ini di atas Rp 500.000” dan membacanya lagi sebulan kemudian tanpa perlu menerjemahkan. |
| Aksi dijalankan lewat Graph API | Aturan yang berjalan tiap 15 menit tetap hanya bisa menaikkan budget sekali sehari, dan tidak bisa menaikkan campaign melewati batas atas yang Anda pasang. |
| Eksekusinya dicatat | Saat sebuah campaign dijeda, Anda bisa melihat kondisi mana yang melewati ambang mana, berapa angkanya, dan seperti apa budget atau namanya sebelum dan sesudah. |
Penjadwalan
Bagaimana AdOps menentukan sebuah aturan jatuh tempo?
Tiap aturan menyimpan waktu eksekusi berikutnya miliknya sendiri. Dispatcher tidak menghitung ulang jadwal saat berjalan; ia membaca timestamp itu lalu bertindak.
- Interval pemeriksaan, dalam menit
- Eksekusi berikutnya adalah waktu sekarang ditambah interval aturan. Kalau intervalnya tidak diisi, aturan kembali ke 60 menit.
- Timetable mingguan
- Kisi tujuh hari berisi jam. Slot berikutnya di hari ini dipakai kalau masih ada; kalau tidak, pemindaian maju hari demi hari, mengurutkan slot hari itu, dan mengambil yang paling awal.
- Tanggal mulai dan selesai
- Kedua mode bisa membawa jendela tanggal. Aturan hanya berjalan selama hari ini ada di dalamnya, jadi aturan promo berhenti sendiri tanpa harus diingat.
- Jam sebagai kondisi
- Terpisah dari jadwal, sebuah kondisi bisa dibatasi pada jam tertentu dan pada sekumpulan hari — mekanisme yang dipakai template bawaan Night Budget Reset.
- Sapuan dispatch
- Tiap 10 detik detak tidak pernah tumpang tindih
- Interval bawaan
- 60 menit kalau aturan tidak mengisinya
- Rentang laporan
- 11 dipilih per kondisi
- Cooldown aksi
- 11 15 menit sampai sekali seumur hidup
Data contoh Batasan
Yang tidak akan dilakukan engine atas inisiatifnya sendiri.
Otomasi yang membelanjakan uang butuh batas yang tetap berlaku sekalipun aturannya keliru. Batas berikut bersifat struktural, bukan pengaturan yang harus Anda ingat.
- Dispatcher tidak bisa mengubah iklan
- Layanan yang menentukan apa yang jatuh tempo hanya pernah mengirim permintaan baca ke Graph API. Semua perubahan budget, jeda, dan penggantian nama terjadi di worker terpisah, sehingga rilis dispatcher yang buruk tidak bisa mengubah campaign.
- Tidak ada yang berjalan di ad account yang belum Anda aktifkan
- Ad account yang ditemukan dari Meta disimpan dalam keadaan nonaktif. Sampai Anda menyalakannya, tidak ada aturan yang menargetkannya dan tidak ada spend yang dibaca darinya.
- Cooldown diperiksa sebelum tiap aksi
- Tiap task membawa action frequency-nya sendiri, dari 15 menit sampai sekali seumur hidup, terpisah dari seberapa sering aturannya dievaluasi.
- Penulisan budget dijepit
- Kenaikan berhenti di batas atas yang Anda tentukan dan penurunan berhenti di batas bawah, dengan menulis nilai batas alih-alih nilai proyeksinya.
- Nilai terkini dibaca ulang sebelum ditulis
- Aksi budget dan nama mengambil daily budget atau nama terkini dari Meta tepat sebelum mengubahnya, bukan mempercayai nilai yang dibawa job.
- Skip dicatat, bukan ditelan
- Ketika cooldown menahan sebuah aksi, engine menulis catatan skipped yang eksplisit berisi alasannya dan kapan aksi itu berikutnya diizinkan.
- Satu kegagalan tidak menghentikan eksekusi
- Campaign yang error dicatat dan batch-nya lanjut. Ad account yang pengambilannya gagal dilewati dan sisa aturan tetap berjalan.
- Ada rem tingkat platform
- Sebuah flag environment yang diperiksa di awal tiap sapuan membekukan semua aksi iklan otomatis, untuk dipakai saat ada insiden di Meta atau jendela maintenance.
Bukti
Apa yang bisa Anda periksa setelah satu eksekusi?
Satu catatan per campaign, per task, per eksekusi. Layar detail rule log menampilkannya field demi field.
| Field | Yang diberitahukannya |
|---|---|
| Executed, Not executed, Skipped | Badge pada tiap task, lengkap dengan alasan skip kalau ada. |
| Parameter aksi | Nilai persis yang dipakai aksi — tipe, jumlah, batas, pemisah, template nama. |
| Sebelum dan sesudah | Nilai lama dan nilai baru untuk aksi yang mengubah budget atau nama. |
| Hasil kondisi | Tiap kondisi beserta angka yang dilihat engine dan status lolosnya. |
| Waktu eksekusi | Total waktu tersimpan pada tiap catatan; linimasa per langkah ditampilkan untuk akun ADMIN. |
| Eksekusi berikutnya | Kapan task itu berikutnya diizinkan berjalan untuk campaign tersebut. |
| Batch id | Id korelasi yang mengikat semua catatan dari satu pengiriman. |
Lihat sendiri di satu ad account.
Mulai dari template, arahkan ke satu akun, dan biarkan aturannya berstatus draft sampai angkanya terlihat benar. Tidak ada yang menyentuh campaign Anda sampai Anda menyetelnya live.