Pendahuluan

Jika Anda pernah mengatur integrasi antara dua layanan — misalnya, agar data dari satu sistem otomatis masuk ke CRM atau Google Sheets — Anda mungkin pernah menemukan istilah "webhook". Ini adalah salah satu teknologi yang diam-diam menopang sebagian besar otomatisasi modern, mulai dari notifikasi Slack hingga sinkronisasi pesanan di toko online. Dalam artikel ini, kita akan membahas apa itu webhook dengan bahasa sederhana, bagaimana bedanya dengan permintaan API biasa, dan cara mengatur notifikasi klik untuk tautan pendek menggunakan webhook di Lix.li secara praktis.

Apa Itu Webhook, Secara Sederhana

Webhook adalah cara mengirimkan data secara otomatis dari satu layanan ke layanan lain pada saat peristiwa tertentu terjadi. Alih-alih sistem Anda terus-menerus bertanya "apakah ada yang baru?", layanan itu sendiri yang mengirimkan data ke server Anda begitu peristiwa tersebut terjadi. Cara termudah untuk memahami perbedaannya adalah dengan analogi surat:

  • Permintaan API biasa seperti Anda sendiri yang berulang kali pergi ke kotak surat untuk memeriksa apakah ada surat yang datang.
  • Webhook seperti berlangganan layanan pengantaran: surat itu sendiri yang tiba di depan pintu Anda begitu sudah siap. Secara teknis, webhook hanyalah permintaan HTTP biasa (biasanya POST) yang dikirim oleh satu server ke URL yang telah dikonfigurasi sebelumnya di server lain, setiap kali peristiwa terkait terjadi — pembayaran pesanan, perubahan status tugas, atau dalam kasus Lix.li, klik pada tautan pendek.

Mengapa Webhook Diperlukan

Webhook menyelesaikan satu masalah spesifik: bagaimana mendapatkan data terbaru tanpa harus terus-menerus melakukan "polling" ke layanan eksternal. Tanpa webhook, untuk mengetahui adanya peristiwa baru, Anda harus mengirim permintaan secara berkala ke API — setiap menit, setiap lima menit — dan setiap kali memeriksa apakah ada sesuatu yang baru. Ini menciptakan beban yang tidak perlu pada kedua server, dan selalu menambah jeda waktu antara peristiwa itu sendiri dengan saat Anda mengetahuinya. Webhook membalikkan logika ini: layanan itu sendiri yang memberi tahu Anda ketika sesuatu terjadi. Ini sangat berguna untuk:

  • Otomatisasi proses bisnis — misalnya, mencatat lead baru secara otomatis ke CRM.
  • Integrasi dengan analitik — mengirimkan data klik ke sistem pelacakan Anda sendiri.
  • Bot dan notifikasi — mengirim peristiwa ke bot Telegram atau kanal Slack tim.
  • Sinkronisasi data — memperbarui Google Sheets, dashboard, atau sistem internal secara real-time.

Cara Kerja Webhook: Contoh di Lix.li

Di Lix.li, webhook memungkinkan Anda menerima informasi tentang klik pada tautan pendek Anda langsung ke server Anda sendiri — secara otomatis, tanpa perlu terus-menerus melakukan polling ke API layanan. Ini berguna jika Anda ingin memasukkan peristiwa ini ke CRM Anda, sistem analitik, Google Sheets, bot Telegram, atau sistem otomatisasi lainnya.

Bagaimana Cara Kerjanya

  • Klik tidak dikirim satu per satu — melainkan dikumpulkan dan dikirim dalam bentuk batch, sekali setiap beberapa menit. Ini mengurangi beban baik pada server Anda maupun server Lix.li.
  • Pengiriman terjadi mendekati waktu nyata, tetapi tidak instan — webhook dirancang untuk skenario di mana jeda beberapa menit dapat diterima, bukan untuk reaksi instan terhadap setiap klik.
  • Pengiriman dijamin berdasarkan prinsip "setidaknya sekali": jika terjadi kegagalan jaringan saat pengiriman, batch mungkin akan datang kembali. Karena itu, setiap peristiwa memiliki event_id unik — Anda harus menggunakannya untuk menyaring duplikat di pihak Anda.

Mengatur Webhook di Dashboard

Fitur webhook tersedia di paket Premium. Pengaturannya hanya membutuhkan beberapa langkah:

  1. Buka bagian "Webhook" di dashboard Anda dan klik "Tambah."
  2. Isikan:
    • URL penerima — alamat di server Anda yang akan menerima permintaan masuk (misalnya https://api.situsanda.com/webhooks/lix);
    • cakupan — apakah mengirim peristiwa untuk semua tautan, grup tautan tertentu, atau hanya satu tautan;
    • apakah alamat IP pengunjung perlu disertakan dalam data peristiwa (nonaktif secara default, karena ini adalah data pribadi).
  3. Segera setelah webhook dibuat, Anda akan diperlihatkan kunci rahasia yang hanya ditampilkan satu kali — pastikan untuk menyimpannya, karena digunakan untuk memverifikasi keaslian permintaan masuk.
  4. Klik "Uji Coba" — layanan akan mengirim peristiwa uji dan menunjukkan apakah server Anda merespons dengan benar. Proses pembuatan webhook dan daftar webhook yang dikonfigurasi di dashboard Lix.li

Apa yang Diterima Server Anda

Setiap permintaan dikirim menggunakan metode POST dengan body dalam format application/json. Selain data itu sendiri, permintaan mencakup beberapa header layanan:

Header Fungsi
X-Lix-Signature Tanda tangan body dalam format sha256= — digunakan untuk verifikasi keaslian.
X-Lix-Timestamp Waktu pengiriman permintaan, dalam bentuk timestamp Unix.
X-Lix-Delivery Pengenal unik untuk pengiriman ini.
User-Agent Diatur ke Lix-Webhooks/1.0.
Body permintaan berisi batch peristiwa itu sendiri:
{
  "delivery_id": "0f3b9c2e-6a1d-4e88-9d5a-2f8c1b7a4e10",
  "event_type": "redirects.batch",
  "sent_at": "2026-06-01T12:05:00Z",
  "window": {
    "from": "2026-06-01T12:00:00Z",
    "to":   "2026-06-01T12:03:30Z"
  },
  "count": 2,
  "truncated": false,
  "events": [
    {
      "event_id":   "2ef7bde608ce5404e97d5f042f95f89f1c232871",
      "link_id":    12345,
      "datetime":   "2026-06-01T12:01:00Z",
      "country":    "US",
      "city":       "Boston",
      "browser":    "Chrome",
      "os":         "Windows",
      "device":     "Desktop",
      "ref_domain": "google.com",
      "group_id":   null,
      "is_bot":     false
    }
  ]
}

Setiap peristiwa dalam batch mencakup ID tautan, waktu klik dalam UTC, negara, kota, browser, sistem operasi, jenis perangkat, domain asal klik, ID grup (jika ditentukan), dan penanda apakah klik tersebut berasal dari bot. Alamat IP pengunjung hanya disertakan jika Anda secara eksplisit mengaktifkan opsi tersebut saat mengatur webhook. Jika terlalu banyak peristiwa terkumpul, sebuah batch dapat ditandai dengan truncated: true — ini berarti sebagian data akan tiba pada pengiriman berikutnya, dan tidak ada data yang hilang.

Cara Memverifikasi Keaslian Permintaan

Karena URL server Anda secara teknis dapat menerima permintaan dari mana saja, penting untuk memastikan bahwa permintaan tersebut benar-benar berasal dari Lix.li dan bukan palsu. Untuk itulah tanda tangan pada header X-Lix-Signature digunakan. Prinsip verifikasinya: Anda mengambil body permintaan yang "mentah" (belum diproses), menghitung HMAC-SHA256 darinya menggunakan kunci rahasia Anda, dan membandingkan hasilnya dengan yang tercantum di header. Perbandingan harus dilakukan dengan cara yang aman (constant-time) untuk mencegah serangan timing. Contoh PHP:

$raw    = file_get_contents('php://input');
$secret = 'your_secret';
$expected = 'sha256=' . hash_hmac('sha256', $raw, $secret);
if (!hash_equals($expected, $_SERVER['HTTP_X_LIX_SIGNATURE'] ?? '')) {
    http_response_code(401);
    exit;
}

Contoh Node.js (Express):

const crypto = require('crypto');
// penting untuk mendapatkan body MENTAH: app.use(express.raw({ type: 'application/json' }))
const expected = 'sha256=' + crypto.createHmac('sha256', secret).update(req.body).digest('hex');
const got = req.header('X-Lix-Signature') || '';
if (expected.length !== got.length ||
    !crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(got))) {
  return res.sendStatus(401);
}

Contoh Python (Flask):

import hmac, hashlib
raw = request.get_data()  # byte mentah
expected = 'sha256=' + hmac.new(secret.encode(), raw, hashlib.sha256).hexdigest()
if not hmac.compare_digest(expected, request.headers.get('X-Lix-Signature', '')):
    return '', 401

Persyaratan untuk Server Penerima Anda

Agar webhook dapat bekerja dengan andal, server Anda perlu mengikuti beberapa aturan berikut:

  1. Merespons dengan kode 2xx. Kode lain apa pun, atau waktu tunggu yang habis, dianggap sebagai kegagalan, dan pengiriman akan dicoba ulang.
  2. Merespons dengan cepat. Anda hanya memiliki beberapa detik untuk merespons — hindari memproses data secara sinkron di dalam handler permintaan itu sendiri. Pendekatan yang benar: simpan data yang masuk dengan cepat (misalnya ke antrean atau basis data), kembalikan 2xx, lalu proses secara terpisah setelahnya.
  3. Deduplikasi berdasarkan event_id. Karena mekanisme percobaan ulang, peristiwa yang sama terkadang dapat tiba dua kali.
  4. Bersifat idempoten. Memproses ulang batch yang sama tidak boleh merusak data Anda.
  5. Selalu verifikasi tanda tangan pada setiap permintaan masuk.
  6. Gunakan HTTPS. Alamat lokal dan internal tidak didukung untuk menerima webhook.

Yang Terjadi Saat Terjadi Kegagalan

Jika server Anda tidak merespons dengan kode 2xx, Lix.li akan mencoba ulang pengiriman dengan jeda yang semakin bertambah di antara percobaan. Jika penerima sama sekali tidak merespons dalam waktu lama (banyak percobaan gagal berturut-turut), webhook akan otomatis dijeda untuk menghindari pengiriman data ke tempat yang tidak berguna. Ini akan terlihat di log pengiriman pada dashboard Anda, dan setelah Anda memperbaiki masalah di pihak Anda, Anda dapat mengaktifkan kembali webhook tersebut.

Mengelola Webhook di Dashboard

Untuk setiap webhook yang dikonfigurasi, tindakan berikut tersedia:

  • Uji Coba — mengirim satu peristiwa uji dan langsung melihat hasilnya: berhasil, atau kode respons spesifik dari server Anda.
  • Jeda / Lanjutkan — menghentikan atau melanjutkan pengiriman peristiwa sementara.
  • Ganti kunci rahasia — menghasilkan kunci baru untuk menggantikan yang lama; kunci lama langsung berhenti berfungsi, jadi pastikan untuk segera memperbaruinya di pihak Anda juga.
  • Hapus — menghapus webhook sepenuhnya.
  • Log pengiriman — riwayat pengiriman terbaru, menampilkan status, kode respons HTTP, jumlah peristiwa dalam batch, dan waktu pengiriman.

Pertanyaan yang Sering Diajukan

Seberapa cepat peristiwa tiba? Dalam bentuk batch, sekitar setiap beberapa menit, dengan sedikit jeda pemrosesan. Ini bukan pengiriman push instan, melainkan skenario mendekati waktu nyata. Bisakah peristiwa yang sama tiba dua kali? Ya, jika terjadi pengiriman ulang setelah kegagalan jaringan. Karena itulah penting untuk melakukan deduplikasi peristiwa berdasarkan kolom event_id di pihak Anda. Apakah urutan ketat peristiwa dijamin? Di dalam satu batch, peristiwa disusun secara kronologis, tetapi tidak ada jaminan urutan ketat antar batch yang berbeda — gunakan kolom datetime pada setiap peristiwa untuk pengurutan. Apa yang terjadi dengan volume trafik yang sangat besar? Jika terlalu banyak peristiwa terkumpul dalam satu interval, batch akan ditandai dengan truncated: true, dan sisa datanya akan tiba pada pengiriman berikutnya — tidak ada data yang hilang dalam proses ini. Apakah HTTPS wajib digunakan? Ya, alamat penerima harus dimulai dengan https://. Alamat lokal dan internal tidak diterima. Bisakah saya hanya menerima peristiwa untuk satu tautan atau grup tautan tertentu? Bisa. Saat membuat webhook, Anda dapat memilih cakupan "Satu tautan" atau "Grup" alih-alih semua tautan di akun Anda.

Contoh Handler Lengkap dalam PHP

Berikut adalah contoh handler minimal namun berfungsi, yang memverifikasi tanda tangan, merespons dengan cepat, dan memproses peristiwa dengan perlindungan terhadap duplikat: