Dokumentasi alur kerja sistem untuk mengambil search terms 0-click, analisis AI, input negative keywords via Velocity API, ekspor Excel, dan notifikasi Telegram.
- Ambil search terms 0-click dari API eksternal (Velocity).
- Simpan unik ke database dan saring kata-kata yang dikecualikan.
- Analisis relevansi dengan AI (
relevanataunegatif). - Untuk yang
negatif, input sebagai negative keywords via Velocity API (terms dan frasa). - Update status di database (berhasil/gagal) dan kirim notifikasi Telegram.
- Ekspor data ke Excel dari UI menggunakan parameter
export=exceldi route yang sama.
App\Models\NewTermsNegative0Click- Relasi:
frasa()→ keNewFrasaNegative. - Status:
status_input_google(berhasil/gagal/null),retry_count,notif_telegram. - Scope:
needsGoogleAdsInput()→ pilih terms denganhasil_cek_ai = negatif,status_input_googlenull/gagal,retry_count < 3.
- Relasi:
App\Models\NewFrasaNegative- Relasi:
parentTerm()→ keNewTermsNegative0Click. - Status: sama pola dengan terms.
- Scope:
needsGoogleAdsInput()untuk frasa (pola sama).
- Relasi:
negative-keywords:fetch-terms --limit=100- Ambil terms dari API eksternal Velocity (via
SearchTermFetcher), simpan unik, saring kata-kataexcludedWords.
- Ambil terms dari API eksternal Velocity (via
negative-keywords:analyze-terms --batch-size=10- Analisis AI untuk terms yang belum dinilai (via
TermAnalyzer), sethasil_cek_aimenjadirelevanataunegatif.
- Analisis AI untuk terms yang belum dinilai (via
negative-keywords:input-velocity --source=both|terms|frasa --mode=validate|execute --batch-size=50- Kirim terms/frasa ke Velocity API (via
NegativeKeywordInputService::send()). - Jika
mode=execute, update status DB:- Berhasil → set
status_input_google = berhasil,notif_telegram = berhasil. - Gagal → increment
retry_count, setstatus_input_google = gagal.
- Berhasil → set
- Kirim notifikasi Telegram (berhasil/gagal) dengan daftar item (maks 50).
- Kirim terms/frasa ke Velocity API (via
negative-keywords:process-phrases --batch-size=10- Pecah terms yang sudah diproses menjadi frasa individual (menyiapkan input frasa), update status sesuai hasil.
negative-keywords:input-google --batch-size=5- Integrasi Google Ads dinonaktifkan saat ini (stub
addNegativeKeyword()selalufalse), jadwal default masih memanggil ini.
- Integrasi Google Ads dinonaktifkan saat ini (stub
negative-keywords:test-system --component=ai|google-ads|database|telegram|all- Uji tiap komponen sistem (konfigurasi, koneksi, layanan).
App\Services\Velocity\NegativeKeywordInputServicesend(array $terms, string $matchType, string $mode)→ mengembalikan{ success, status, json, error }.- Header
Authorizationmenggunakan token dari env (config('integrations.velocity_ads.api_token')berformatBearer <token>). getMatchTypeForSource('terms'|'frasa')→ diatur via env (EXACTuntuk terms,PHRASEuntuk frasa).Http::retry(3, 200)dengantimeout(30), logging saat gagal.
App\Services\GoogleAds\SearchTermFetcher- Mengambil terms 0-click dari Velocity API (konfigurasi
api_url,api_token). - Memiliki daftar kata yang dikecualikan (mis.
jasa,harga,murah, dll.). addNegativeKeyword()adalah stub (integrasi Google Ads mati).
- Mengambil terms 0-click dari Velocity API (konfigurasi
App\Services\AI\TermAnalyzer- Dipakai di
negative-keywords:analyze-termsuntuk klasifikasirelevanataunegatif.
- Dipakai di
App\Services\Telegram\NotificationServicesendMessage()ke beberapa chat ID (HTMLparse_mode).- Helper:
notifyNegativeKeywordSuccess/Failure(per keyword),notifyBatchResults,notifyAiAnalysisResults,notifyNewTermsFetched,notifySystemError,notifyDailySummary. - Command Velocity menggunakan
sendMessage()dengan pesan batch yang memuat jumlah, match-type, mode, status API, dan daftar item.
TermsController@index- Filter: pencarian, hasil AI, status Google, notif Telegram, sort, rentang tanggal (
date_from/date_to). - Jika request mengandung
export=excel, returnExcel::download(new TermsExport($query), 'terms_export.xlsx').
- Filter: pencarian, hasil AI, status Google, notif Telegram, sort, rentang tanggal (
FrasaController@index- Filter: mirip dengan terms, rentang tanggal juga.
- Jika
export=excel, returnExcel::download(new FrasaExport($query), 'frasa_export.xlsx').
App\Exports\TermsExportdanApp\Exports\FrasaExport- Implement
FromQuery,WithHeadings,WithMapping,ShouldAutoSize. - Mapping kolom sesuai kebutuhan (ID, isi, parent term, status, retry, notif, created_at).
- Implement
- UI (Vue)
TermsFilters.vue/FrasaFilters.vuememiliki tombol "Export to Excel" yang mengakses route index yang sama dengan?export=excel&<filters>.
- Siklus 7-menit:
- Menit 1 →
negative-keywords:fetch-terms --limit=50. - Menit 2 →
negative-keywords:analyze-terms --batch-size=10. - Menit 3 → Saat ini:
negative-keywords:input-google --batch-size=5(integrasi Google Ads nonaktif).- Rekomendasi: ganti ke
negative-keywords:input-velocity --source=both --mode=execute --batch-size=50.
- Rekomendasi: ganti ke
- Menit 7 (mod 0) →
negative-keywords:process-phrases --batch-size=10.
- Menit 1 →
- Perawatan:
- Ringkasan harian pukul 23:00 → memanggil
NotificationService(perlu penyesuaian agar memakainotifyDailySummary(stats)). - Pembersihan mingguan (Minggu 02:00) → hapus data berhasil lebih dari 30 hari (terms dan frasa).
- Setiap jam → reset
status_input_googlekenulluntuk itemgagaldenganretry_count < 3(agar bisa diproses ulang).
- Ringkasan harian pukul 23:00 → memanggil
- Fetch → simpan unik → saring kata dikecualikan.
- Analisis AI → set
hasil_cek_ai. - Input Velocity:
- Petakan sumber (
terms/frasa) via scopeneedsGoogleAdsInput. - Kumpulkan array item (limit batch).
- Kirim ke Velocity API (
send()), bentuk pesan Telegram (berhasil/gagal) berisi ringkasan dan daftar item, kirim viasendMessage(). - Jika
mode=execute, update status DB sesuai hasil; yang gagalretry_count++.
- Petakan sumber (
- Phrases (opsional) → pecah terms menjadi frasa, persiapan input frasa, update status sesuai hasil.
- UI → pengguna dapat ekspor Excel dari halaman
terms/frasa.
- Velocity:
VELOCITY_ADS_API_URL(fetch terms),VELOCITY_ADS_API_TOKEN(token mentah; akan di-prefixBearerdi config).VELOCITY_ADS_INPUT_API_URL(input negative keywords).VELOCITY_ADS_MATCH_TYPE_TERMSdefaultEXACT,VELOCITY_ADS_MATCH_TYPE_FRASAdefaultPHRASE.
- Telegram:
TELEGRAM_BOT_TOKEN,TELEGRAM_CHAT_ID(bisa multi-ID, pisahkan dengan koma).
- AI:
OPENAI_API_KEY,OPENAI_MODEL.
- Velocity
send()melakukan retry 3x dengan delay 200ms, timeout 30s, dan logging detail saat gagal. - Command Velocity:
- Saat gagal,
retry_countbertambah dan status disetgagal. - Scheduler hourly mengosongkan status
gagaluntukretry_count < 3agar bisa dicoba lagi.
- Saat gagal,
- Notifikasi
notifySystemError()tersedia untuk error sistem yang perlu diangkat.
- Jalankan komponen tertentu untuk verifikasi cepat:
php artisan negative-keywords:fetch-terms --limit=50php artisan negative-keywords:analyze-terms --batch-size=10php artisan negative-keywords:input-velocity --source=both --mode=execute --batch-size=50php artisan negative-keywords:process-phrases --batch-size=10php artisan negative-keywords:test-system --component=all
- Update Kernel menit ke-3 ke
input-velocityuntuk menjalankan alur baru (Google Ads input saat ini nonaktif). - Daily summary di Kernel memanggil metode yang tidak ada (
sendDailySummary()), perlu diganti ke pemanggilannotifyDailySummary(stats)dengan penyusunanstats. - Jika ingin notifikasi Telegram per item (bukan batch),
NotificationServicesudah menyediakannotifyNegativeKeywordSuccess/Failure, namun saat ini command Velocity mengirim batch summary agar tidak spam.