Workflow & Template

Menyusun alur notifikasi: step, delay, filter, fallback, sintaks template, dan preferensi subscriber.

#Membuat & Mempublish Workflow

  1. Console → Workflows → Workflow baru. Isi nama, trigger key (huruf kecil, angka, -, _; unik per environment), dan prioritas.
  2. Tambahkan step di editor, atur isi pesan, dan lihat preview live memakai sample payload.
  3. Simpan draft berulang kali dengan aman; draft tidak mempengaruhi trafik.
  4. Publish membuat versi baru yang tidak bisa diubah dan mengaktifkan workflow. Publish ditolak dengan daftar masalah bila ada step yang tidak valid.
StatusPerilaku
DRAFTBelum bisa dipicu API (422 workflow_inactive)
ACTIVEMenerima trigger. Bisa dinonaktifkan/diaktifkan dari daftar workflow.
ARCHIVEDDisembunyikan; tidak bisa dipicu
  • Versioning: eksekusi memakai versi yang berlaku saat event diterima. Mengedit & publish ulang tidak mengubah eksekusi yang sedang berjalan (mis. masih menunggu delay).
  • Prioritas HIGH atau tanda Kritis (mis. OTP) memakai antrean prioritas.
  • Batas: maksimal 20 step per workflow.

Aturan validasi saat publish: minimal satu step CHANNEL; step FILTER tidak boleh terakhir; DELAY 1 detik sampai 30 hari; email wajib punya subject; sintaks template harus valid; fallback harus menunjuk step channel lain.

#Tipe Step: Channel, Delay, Filter

Step dijalankan berurutan dari atas ke bawah.

CHANNEL — kirim pesan

Pilih channel (WhatsApp, Email, Telegram, In-App), provider (default atau pilihan), subject (Email/In-App), isi pesan, dan fallback. Dilewati (SKIPPED) bila subscriber tidak punya tujuan untuk channel itu (no_destination) atau memilih opt-out (opted_out); workflow tetap lanjut ke step berikutnya.

DELAY — tunggu

Menjeda eksekusi (detik sampai hari, maks. 30 hari) lalu melanjutkannya otomatis. Selama menunggu, eksekusi berstatus WAITING dan bisa dibatalkan lewat DELETE /events/{id}.

FILTER — kondisi

Daftar rule yang digabung AND. Jika ada yang tidak terpenuhi, sisa workflow dihentikan (step ditandai SKIPPED: filter_false) dan eksekusi dianggap selesai normal.

OperatorArtiContoh nilai
eq / neqsama / tidak samagold
gt gte lt lteperbandingan angka1000000
insalah satu dari daftar (pisah koma)gold,platinum
containsteks mengandung@contoh.com
existsnilai tidak kosong—

Path memakai awalan payload. atau subscriber., mis. payload.amount atau subscriber.plan.

#Fallback & Retry

Retry otomatis. Kegagalan sementara (timeout, 5xx, 429) dicoba ulang hingga 3 kali dengan jeda bertahap (5 detik, 15 detik, 60 detik). Kegagalan permanen (nomor tidak valid, kredensial salah, 4xx lain) tidak dicoba ulang.

Fallback. Pada step channel, pilih Fallback jika gagal ke step channel lain di workflow yang sama. Step fallback tidak berjalan di alur normal; ia hanya dijalankan bila step utama gagal permanen, lalu workflow lanjut ke step setelah step utama.

Contoh
1. WhatsApp   fallback → #3      ← dicoba pertama
2. In-App                       ← selalu berjalan
3. Email                        ← hanya jika WhatsApp gagal permanen

Hasil akhir eksekusi: COMPLETED (semua berhasil atau tergantikan fallback), PARTIAL (sebagian berhasil, sebagian gagal), atau FAILED (semua pengiriman gagal).

#Sintaks Template

Template memakai sintaks variabel sederhana yang aman: tidak ada eksekusi kode. Teks seperti @php atau system() diperlakukan sebagai teks biasa atau ditolak saat validasi.

text
Halo {{ subscriber.first_name|default:"Pelanggan" }}, pesanan {{ payload.invoiceId }}
sebesar {{ payload.amount|currency:"IDR" }} sudah kami terima pada {{ payload.paid_at|date:"d M Y H:i" }}.
RootIsi
payloadObjek payload dari trigger (akses bersarang: payload.items.0.name)
subscriberfirst_name, last_name, full_name, email, phone, locale, timezone, id, serta semua field di data
eventid, created_at
workspacename

Filter

FilterFungsiContoh → hasil
upper lower titleUbah hurufbudi|upper → BUDI
trimHapus spasi tepi
default:"x"Nilai cadangan jika kosongdefault:"-"
truncate:NPotong dan tambah …truncate:20
currency:"IDR"Format mata uang450000 → Rp 450.000
number:NFormat angka, N desimalnumber:2
date:"format"Format tanggal di zona waktu subscriberdate:"d M Y"
eEscape HTML
jsonSerialisasi JSON
  • Variabel yang tidak ditemukan dirender kosong (peringatan muncul di preview editor).
  • Konten HTML email di-escape otomatis. Output dibatasi 100 KB; template maksimum 20.000 karakter.
  • Sintaks yang rusak (mis. @{{ tanpa penutup) ditolak saat Publish.

#Override Template per Trigger

Ganti subject atau isi untuk satu trigger tanpa mengubah workflow, lewat overrides.channels.<channel> (nama channel huruf kecil: whatsapp, email, telegram, in_app). Override dirender dengan engine template yang sama.

json
{
  "workflow": "order-confirmed",
  "to": "usr_102",
  "payload": { "invoiceId": "INV-9901" },
  "overrides": {
    "channels": {
      "email": { "subject": "Pesanan {{ payload.invoiceId }} siap", "body": "Teks khusus untuk pesanan ini." },
      "whatsapp": { "body": "Pesanan {{ payload.invoiceId }} dikonfirmasi ✅" }
    }
  }
}

#Preferensi & Opt-out

Sebelum mengirim, Notifora memeriksa preferensi subscriber untuk channel tersebut.

  1. Opt-out global (channel dimatikan untuk semua workflow) selalu berlaku, termasuk untuk workflow kritis.
  2. Workflow kritis (mis. OTP, tanda Kritis di editor) mengabaikan opt-out per-workflow.
  3. Selain itu, opt-out per-workflow dihormati; tanpa preferensi, default-nya diizinkan.

Step yang dilewati karena opt-out berstatus SKIPPED: opted_out. Kelola lewat API preferensi atau halaman subscriber di Console.

Notifora Engineering Knowledge Base · Terakhir diperbarui: Oktober 2026 · Rilis v1.0 Kembali ke atas ↑

© 2026 notifora. All rights reserved. Created by notifora