Custom metric AdOps adalah angka bernama yang datang dari Google Sheets, bukan dari Meta. Anda memberi metric itu spreadsheet id, nama sheet, kolom kunci, dan kolom nilai; saat evaluasi, AdOps mencocokkan campaign dengan kolom kunci lalu membaca kolom nilai. Angka tersebut kemudian bisa berperan sebagai ambang kondisi, nominal budget, atau token yang ditulis ke nama campaign.
Custom metric itu untuk apa?
Untuk setiap keputusan yang bergantung pada angka yang tidak dimiliki Meta. Meta tahu spend, purchase, dan ROAS Anda. Meta tidak tahu margin Anda, sisa stok, kenaikan harga dari supplier, target ROAS per produk, atau fakta bahwa SKU ini berhenti dijual Jumat depan.
Tiga bentuk berikut mencakup sebagian besar kebutuhan:
- Target yang Anda rawat. Satu kolom
target_roas, dikunci per campaign id, disunting saat margin bergeser. - Status dari sistem lain. Sisa stok, diekspor ke sheet oleh sistem inventori apa pun yang Anda pakai.
- Angka yang berubah berkala. Alokasi daily budget per lini produk, diputuskan di rapat perencanaan lalu diketik ke sheet, bukan ke dua belas rule.
Benang merahnya: angka itu milik bisnis, berubah mengikuti ritme manusia, dan sebaiknya hidup di satu tempat.
Bagaimana sheet-nya ditata?
AdOps membaca sheet sebagai tabel, jadi aturan tata letaknya adalah aturan yang dipedulikan parser CSV mana pun. Kalau benar, metric-nya berperilaku; kalau salah, ia diam-diam membaca kolom yang keliru.
- Satu baris header, di paling atas. Nama header dipangkas spasinya, jadi spasi di ujung dimaafkan; sel yang digabung dan baris judul di atas header tidak.
- Satu baris per kunci. AdOps mengambil baris pertama yang cocok untuk sebuah kunci. Campaign id yang kembar berarti baris yang lebih dulu muncul yang menang, dan itu bukan keputusan yang layak diambil tanpa sengaja.
- Jumlah kolom konsisten. Baris yang jumlah kolomnya tidak sama dengan header akan dibuang, bukan digeser ke field yang salah — pilihan yang disengaja supaya ekspor berantakan berakhir jadi data kosong, bukan data keliru.
- Koma dan tanda kutip aman di dalam sel. Parser-nya menangani sel berkutip dan kutip ganda, jadi nama produk dan alamat tetap utuh.
- Nilai sebaiknya terbaca sebagai angka biasa. Kolom nilai berisi
Rp 1.500.000adalah teks, bukan angka.
Formulir metric meminta Google Spreadsheet ID — pengenal panjang di URL sheet — plus Sheet Name, Column ID (kolom kunci), dan Value Column. Saat disimpan, AdOps membaca sheet-nya dan memastikan kedua kolom itu benar-benar ada. Kalau salah satunya hilang, modal merah Google Sheets Validation Failed memuat seluruh masalahnya beserta daftar “How to fix”, dan metric-nya tidak tersimpan. Pemeriksaan itulah saat terbaik menangkap tab yang berganti nama.
Satu catatan akses: AdOps membaca spreadsheet sebagai service account Google, bukan sebagai Anda. Sheet yang tidak bisa dibuka service account akan gagal validasi sekalipun nama kolomnya sudah benar.
Di mana nilainya bisa dipakai?
Di mana pun sebuah metric dipilih, tab Custom metrics muncul di sebelah metric Meta standar. Itu memberi empat posisi:
| Posisi | Fungsinya |
|---|---|
| Metric kondisi | Menguji nilai sheet secara langsung — stock sama dengan 0, flag lebih besar dari 0 |
| Metric pembanding | Membandingkan metric Meta yang live dengan nilai sheet, masing-masing dengan periodenya sendiri |
| Nilai budget | Memakai nilai sheet sebagai nominal untuk increase, decrease, atau set budget |
| Token nama campaign | Menulis nilainya ke nama campaign lewat token {custom_metric|<id>} |
Posisi pembanding adalah yang paling berguna dari keempatnya. Kondisi Purchase ROAS, 7 hari terakhir, lebih kecil dari custom metric target_roas memberi setiap campaign ambangnya sendiri, tersimpan di spreadsheet, tanpa harus membuat satu rule per campaign.
Posisi nilai budget adalah yang mengubah bentuk sebuah akun. Set budget menerima nilai literal atau custom metric, jadi sheet perencanaan dengan kolom daily_budget menjelma jadi alokasi budget akun, yang diterapkan sebuah rule sesuai jadwal.
Contoh nyata: pause karena stok habis
Rule yang paling sering diminta pertama, karena menghapus satu rasa malu yang berulang.
- Ekspor stok ke sheet dengan dua kolom:
campaign_iddanunits_in_stock. Satu baris per campaign. - Buat custom metric bernama “Units in stock”, mengarah ke sheet itu, dengan Column ID
campaign_iddan Value Columnunits_in_stock. - Tulis rule dengan dua task:
- Pause. Kondisi: custom metric “Units in stock” sama dengan 0.
- Add to name. Kondisi sama, mode APPEND, teks
[OOS {date}], action frequency sekali seumur hidup.
- Tulis rule cerminnya untuk menyalakan kembali: filter Campaign Status is
PAUSEDdan Campaign Name containsOOS, kondisi “Units in stock” lebih besar dari ambang restock, action start plus remove from name.
Pasangan itu bekerja karena sheet-nya adalah sumber kebenaran dan kedua rule membaca angka yang sama. Tidak ada yang perlu mengingat campaign mana yang tadi di-pause, dan alasannya tertulis di campaign itu sendiri.
Seberapa baru sebenarnya angkanya?
Bagian ini perlu dijelaskan persis, karena “membaca spreadsheet secara live” hampir benar tetapi tidak persis benar.
AdOps menyimpan baris sheet di cache memori dengan jendela dua menit yang dihitung dari akses terakhir, dan menyalin setiap pengambilan yang berhasil ke MongoDB. Pengambilan menuju ekspor spreadsheet langsung lebih dulu dengan batas waktu 30 detik, beralih ke Google Sheets API, lalu beralih lagi ke baris yang tersimpan di MongoDB.
Ada dua konsekuensi. Pertama, karena jendela cache dihitung dari akses terakhir, bukan dari waktu pengambilan, sheet yang terus dibaca oleh evaluasi rule yang sering bisa terus menyajikan snapshot yang sama; anggap nilainya mendekati real time, bukan seketika, dan jangan membangun rule yang mengandaikan suntingan mendarat dalam hitungan detik. Kedua, karena cadangan terakhirnya adalah baris tersimpan, sheet yang menjadi tidak terbaca — akses dicabut, tab berganti nama, file dipindah ke sampah — bisa tetap dievaluasi memakai nilai lama alih-alih gagal dengan jelas. Setiap kali pengaturan berbagi atau strukturnya berubah, buka metric-nya lalu simpan ulang supaya validasinya jalan lagi.
Bagaimana memastikan semuanya bekerja?
Dari execution log. Ketika sebuah kondisi memakai custom metric, halaman detail log mengembalikan id metric itu jadi namanya, sehingga kondisinya terbaca “Units in stock”, bukan sederet id database, dan panel Condition Evaluations mencetak nilai yang benar-benar dilihat engine di sebelah nilai yang diharapkan. Itu cara tercepat memastikan pencarian di sheet mengenai baris yang Anda maksud.
Di rule builder, id custom metric yang sudah tidak dikenali tampil merah — pertanda sebuah metric dihapus sementara masih ada rule yang merujuknya.
Dua kebiasaan membuat semua ini tetap membosankan, dan membosankan itulah tujuannya. Simpan satu sheet untuk satu keperluan, bukan satu sheet raksasa berisi banyak tab dengan bentuk berbeda-beda. Dan ketika sebuah angka cukup penting untuk menggerakkan spend otomatis, tulis nama penanggung jawabnya di baris header, karena spreadsheet yang mengubah budget layak punya pemilik.