Ilustrasi: workflow bergaya n8n berisi node yang terhubung, dari jadwal dan sheet klien ke tarik data, kode, draf AI, approval, dan email
8 mnt baca

Otomasi Laporan Klien Agency dengan n8n (Langkah demi Langkah)

Langkah membangun laporan klien otomatis di n8n: daftar klien di Sheets, data Meta dan Google Ads, node Code, ringkasan AI, approval, Gmail.

Untuk membuat laporan klien agency otomatis di n8n, cukup satu workflow. Schedule Trigger menjalankannya, Google Sheets menyimpan daftar klien, Loop Over Items memproses klien satu per satu, node Facebook Graph API mengirim data Meta langsung ke node Code, cabang Google Ads (opsional) berjalan terpisah, LLM menyusun ringkasan, dan Gmail mengirimnya setelah disetujui manajer.

Tulisan ini bagian dari seri laporan iklan otomatis untuk agency. Halaman pilar membahas alasannya, halaman ini membahas cara membangunnya. Polanya sama dengan yang saya pakai saat membangun sistem laporan untuk agency di n8n, dengan Dify di sisi AI.

Apa saja yang perlu disiapkan?

  • Instance n8n. Bisa n8n Cloud atau self-hosted. Semua langkah di bawah memakai node bawaan.
  • Akses Meta. Aplikasi Meta dan access token dengan izin ads_read untuk akun iklan yang dilaporkan. Untuk agency, token system user dari Business Manager lebih awet dibanding token akun pribadi.
  • Akses Google Ads (kalau melaporkan Google Ads). Kredensial Google Ads di n8n dan developer token dari akun manager (MCC).
  • Google Sheets sebagai daftar klien, plus satu tab lagi untuk log pengiriman.
  • LLM. Bisa chat model yang disambungkan ke node Basic LLM Chain di n8n, atau aplikasi Dify yang dipanggil lewat API-nya.
  • Gmail atau Slack untuk approval dan pengiriman.

Seperti apa bentuk workflow-nya?

Awalnya satu rangkaian, lalu setelah Loop Over Items pecah jadi dua jalur data yang terpisah, dan baru digabung lagi sebelum laporan disusun:

  • Awal: Schedule Trigger → Google Sheets (Get Row(s)) → Loop Over Items
  • Jalur Meta: Loop Over Items → Facebook Graph API → Code (metrik Meta)
  • Jalur Google Ads (opsional): Loop Over Items → HTTP Request (Google Ads API v25) → node pengolah sendiri (node Code atau Edit Fields terpisah)
  • Setelah kedua jalur: Merge → Basic LLM Chain (atau HTTP Request ke Dify) → Gmail (Send and Wait for Approval) → If → Gmail (Send) → Google Sheets (Append Row)

Kedua jalur tidak berbagi node sampai di Merge. Yang penting, HTTP Request Google Ads tidak boleh berada di antara node Facebook Graph API dan node Code Meta. Kalau hanya melaporkan Meta, lewati jalur Google Ads dan node Merge.

Penjelasan tiap langkah ada di bawah.

Bagaimana cara membangunnya?

Langkah 1: Siapkan daftar klien di Google Sheets

Satu baris untuk satu klien. Kolom yang biasa saya pakai:

Kolom

Contoh

Fungsi

client_name

Klien A

Dipakai di email dan prompt

active

TRUE

Untuk menjeda klien tanpa menghapus barisnya

meta_ad_account_id

1234567890

Tanpa awalan act_, awalan ditambahkan di node

google_ads_customer_id

1234567890

Tanpa tanda strip

result_action_type

lead

action_type Meta yang dihitung sebagai hasil untuk klien ini

target_cost_per_result

(target dari klien)

Untuk baris "sesuai/di atas target"

report_language

id

Diteruskan ke prompt

recipient_email

klien@contoh.com

Tujuan laporan yang sudah disetujui

approver_email

manajer@agencyanda.com

Yang menyetujui laporan

Simpan aturan di sheet, bukan di workflow. Dengan begitu, menambah klien tidak perlu mengutak-atik node.

Langkah 2: Pasang Schedule Trigger

Atur Trigger Interval ke mingguan (Weeks) atau bulanan (Months), sesuai jadwal laporan. Kalau ada klien mingguan dan bulanan, pakai dua trigger, atau tambahkan kolom cadence lalu filter di langkah berikutnya.

Langkah 3: Baca klien yang aktif

Tambahkan node Google Sheets, operasi Get Row(s), dengan filter active = TRUE. Setiap baris jadi satu item di n8n.

Langkah 4: Proses klien satu per satu

Tambahkan Loop Over Items dengan batch size kecil (1 sudah cukup). Dengan begitu, kalau satu klien gagal, klien lain tetap jalan, dan batas rate API lebih aman. Kalau masih kena limit, sisipkan node Wait di dalam loop.

Langkah 5: Tarik data Meta Ads

Tambahkan node Facebook Graph API:

  • Host URL: Default
  • HTTP Request Method: GET
  • Graph API Version: versi yang masih berlaku
  • Node: act_{{ $json.meta_ad_account_id }}
  • Edge: insights
  • Options → Fields: campaign_name, spend, impressions, clicks, ctr, actions
  • Options → Query Parameters: level = campaign, date_preset = last_month (atau last_7d untuk laporan mingguan)

Detail khusus Meta, seperti time_range, pagination, dan cara membaca actions, ada di laporan Meta Ads otomatis untuk agency.

Langkah 6: Tarik data Google Ads (opsional)

Node Google Ads bawaan n8n hanya untuk mengambil data kampanye. Untuk laporan, Anda butuh query GAQL lewat node HTTP Request:

  • Method: POST
  • URL: https://googleads.googleapis.com/v25/customers/{{ $json.google_ads_customer_id }}/googleAds:searchStream
  • Authentication: Predefined Credential Type → kredensial Google Ads Anda
  • Headers: developer-token, ditambah login-customer-id kalau akun diakses lewat akun manager
  • Body (JSON): query seperti
SELECT campaign.name, metrics.cost_micros, metrics.impressions,
       metrics.clicks, metrics.conversions
FROM campaign
WHERE segments.date DURING LAST_MONTH

Biaya dikembalikan dalam satuan micros, jadi bagi dengan 1.000.000. Selengkapnya di cara membuat laporan Google Ads otomatis.

Taruh node ini di jalur sendiri: sambungkan HTTP Request ke Loop Over Items, bukan ke node Facebook Graph API, lalu lanjutkan ke node pengolah sendiri (node Code atau Edit Fields terpisah) yang mengonversi cost_micros dan merapikan barisnya. Node Code Meta di Langkah 7 tidak membaca data Google Ads. Kalau Anda memakai kedua platform, gabungkan kedua jalur dengan node Merge setelah masing-masing node pengolah.

Langkah 7: Hitung metrik di node Code

Respons API belum siap jadi laporan. Meta mengirim angka dalam bentuk string, dan jumlah hasil ada di dalam daftar actions. Node Code (JavaScript, mode "Run Once for All Items") mengubahnya jadi baris dan total yang rapi:

const client = $('Loop Over Items').first().json;
const rows = $input.first().json.data || [];

const campaigns = rows.map(r => {
  const hit = (r.actions || []).find(a => a.action_type === client.result_action_type);
  const results = hit ? Number(hit.value) : 0;
  const spend = Number(r.spend || 0);
  return {
    campaign: r.campaign_name,
    spend,
    impressions: Number(r.impressions || 0),
    clicks: Number(r.clicks || 0),
    results,
    cost_per_result: results ? +(spend / results).toFixed(2) : null,
  };
});

const spend = campaigns.reduce((s, c) => s + c.spend, 0);
const results = campaigns.reduce((s, c) => s + c.results, 0);

return [{ json: {
  client_name: client.client_name,
  report_language: client.report_language,
  target_cost_per_result: Number(client.target_cost_per_result) || null,
  spend: +spend.toFixed(2),
  results,
  cost_per_result: results ? +(spend / results).toFixed(2) : null,
  campaigns,
}}];
Catatan urutan node: node Facebook Graph API harus tepat sebelum node Code ini. Kalau ada node lain di antaranya (misalnya HTTP Request Google Ads dari Langkah 6), spend setiap klien akan jadi 0 tanpa pesan error apa pun. Snippet ini hanya mengolah data Meta, dan hanya membaca halaman pertama hasil Insights (belum ada pagination).

Hitung di sini, jangan di prompt. LLM tidak bisa diandalkan untuk berhitung, kode bisa.

Langkah 8: Susun ringkasan dengan AI

Kirim data yang sudah diolah (output node Code Meta, digabung dengan jalur Google Ads kalau dipakai) ke node Basic LLM Chain dengan chat model, atau panggil aplikasi Dify Anda dari node HTTP Request. Prompt awal yang biasa saya pakai:

Kamu menulis ringkasan performa iklan yang singkat untuk klien sebuah agency marketing. Tulis dalam bahasa {{ report_language }}. Pakai hanya angka dari data di bawah. Jangan mengarang angka, penyebab, atau perbandingan yang tidak ada di data. Tulis 2 paragraf pendek: apa yang terjadi periode ini, dan apakah biaya per hasil di atas atau di bawah target. Tutup dengan satu saran langkah berikutnya, sebagai usulan yang perlu dikonfirmasi account manager.

Gaya bahasa dan aturan per klien juga bisa disimpan di sheet sebagai kolom tambahan yang ikut masuk ke prompt.

Langkah 9: Minta persetujuan manajer

Tambahkan node Gmail dengan operasi Send and Wait for Approval ke approver_email. Sertakan ringkasan dan tabel kampanye. Pilih Type of Approval = Approve and Disapprove supaya manajer bisa menolak draf. Setelah itu, pasang node If untuk membaca hasil approval: kalau disetujui, lanjut kirim. Kalau ditolak, buat catatan untuk account manager.

Kalau tim Anda lebih sering di Slack, operasi Send and Wait for Response di node Slack bisa dipakai untuk hal yang sama. Untuk approval bertingkat, dokumentasi n8n menyarankan node Wait.

Langkah 10: Kirim dan catat

Di cabang yang disetujui, node Gmail (Send, Email Type HTML) mengirim laporan ke recipient_email. Matikan Append n8n Attribution di bagian options. Lalu node Google Sheets (Append Row) mencatat nama klien, periode, waktu kirim, dan siapa yang menyetujui ke tab log.

Kalau klien minta PDF, perlu diketahui n8n tidak punya node bawaan untuk mengubah HTML jadi PDF. Gunakan layanan eksternal lewat node HTTP Request, lalu lampirkan file-nya lewat opsi Attachments di node Gmail.

Bagaimana menangani error?

  • Atur On Error di node API supaya lanjut lewat error output, lalu arahkan kegagalan ke notifikasi Slack atau email. Satu token yang rusak jangan sampai menahan 30 laporan lainnya.
  • Buat workflow terpisah dengan node Error Trigger supaya Anda tahu kalau ada crash yang tidak terduga.
  • Perhatikan token Meta yang kedaluwarsa dan akses akun iklan yang dicabut. Dua hal ini paling sering bikin workflow gagal.

Manual vs n8n: apa bedanya?

Manual

Workflow n8n

Ambil data

Login dan ekspor per klien

Tarik lewat API sesuai jadwal

Perhitungan

Rumus spreadsheet, disalin manual

Node Code, logikanya selalu sama

Ringkasan

Ditulis dari nol

Draf AI dari angka yang sudah diverifikasi, diedit manusia

Approval

Informal

Ada langkah setuju/tolak

Catatan pengiriman

Folder Sent

Sheet log untuk setiap run

FAQ

Bagaimana langkah membuat laporan klien agency otomatis dengan n8n?

Schedule Trigger → baca klien dari Google Sheets → Loop Over Items → jalur Meta: node Facebook Graph API → node Code. Jalur Google Ads (opsional, terpisah): HTTP Request → node pengolah sendiri. Lalu Merge → draf AI → Gmail Send and Wait for Approval → kirim dan catat.

n8n untuk apa di agency marketing?

Untuk laporan klien, n8n cocok kalau ada orang di tim yang terbiasa dengan API dan sedikit JavaScript. Logika per klien, prompt AI, dan langkah approval bisa ada dalam satu workflow. Kalau tidak mau membangun sama sekali, tool laporan jadi lebih sederhana.

Apakah n8n bisa terhubung ke Meta Ads?

Bisa, lewat node Facebook Graph API. Isi Node dengan act_<ID akun iklan> dan Edge dengan insights, lalu pilih field seperti spend, impressions, clicks, dan actions.

Bagaimana cara membuat laporan Google Ads otomatis di n8n?

Node Google Ads bawaan hanya untuk data kampanye. Untuk metrik laporan, panggil Google Ads API dengan query GAQL dari node HTTP Request memakai kredensial Google Ads.

Apakah laporan bisa dikirim otomatis tanpa dicek?

Secara teknis bisa, tapi saya tidak menyarankannya. Pertahankan langkah kirim-lalu-tunggu di Gmail atau Slack supaya setiap draf AI dibaca manusia sebelum sampai ke klien.

Bisa kirim laporan ke Slack, bukan email?

Bisa. Pakai node Slack untuk mengirim ringkasan yang sudah disetujui ke channel, atau pakai operasi Send and Wait for Response untuk langkah approval.

Panduan terkait

Mau workflow ini jalan di akun iklan Anda?

Ambil audit AI gratis. Kita petakan bersama cara tim Anda melapor ke klien sekarang, langkah mana yang bisa diambil alih n8n, dan di mana keputusan akhir tetap di tangan manusia.