# Send a Message: hantar teks bebas

Hantar teks bebas — dengan lampiran jika perlu, pada saluran pelanggan sendiri atau satu yang dinamakan — dalam tetingkap mesej semasa saluran itu.

## Mula pantas

1. Pergi ke **Automate → Workflows** dan buka satu aliran kerja. Klik **+** dan pilih **Send a Message**.
2. Pilih satu saluran, atau biarkan pada yang terakhir digunakan pelanggan.
3. Taip teks di bawah **Message Content · Default**. Sisipkan `{{contact.name}}` (nama kenalan) untuk memperibadikannya.
4. Jika perlu: lampirkan sehingga 5 fail, atau, di bawah **Advanced Settings**, tambah langkah untuk dijalankan jika penghantaran gagal.
5. Tetapkan **Status** kepada **Published** di bar alat atas, **Save**, sahkan **Terbitkan**. Ejen: minta pemilik atau pentadbir.

## Beri perhatian

- Pada WhatsApp, Messenger atau Instagram, tiada apa dihantar selepas 24 jam sejak pelanggan terakhir menulis (atau menelefon, pada WhatsApp). Gunakan **Send WhatsApp Template** untuk WhatsApp.
- Penghantaran yang gagal tidak menghentikan aliran kerja. Tag atau penutupan yang diletakkan selepasnya tetap berlaku, melainkan anda menambah satu cabang kegagalan.

## Di mana untuk mencarinya

**Automate → Workflows**, buka satu aliran kerja, klik **+** pada kanvas, kemudian pilih **Send a Message** di bawah **Add Steps**.

## Sebelum anda mula

- **Pemilik**, **Pentadbir** atau **Ejen** boleh menambah langkah ini dan menyimpan aliran kerja. Hanya **Pemilik** atau **Pentadbir** boleh menerbitkannya, dan penerbitan itulah yang membuatkan ia berjalan pada perbualan sebenar.
- Membina dan menjalankan aliran kerja bergantung pada pelan anda; lihat [harga](/pricing).
- Tiada apa-apa di luar Inchat perlu disambungkan. Langkah ini menghantar pada saluran yang perbualan itu sudah guna, atau satu saluran yang anda namakan.

## Cara menyediakannya

1. Buka aliran kerja dan klik **+** di tempat mesej itu patut berada.
2. Pilih **Send a Message**.
3. Pilih satu saluran di bawah pemilih saluran — yang terakhir digunakan pelanggan, atau satu saluran tersambung yang dinamakan.
4. Taip teks di bawah **Message Content · Default**. Sisipkan `{{contact.name}}`, `{{answer.text}}` atau token medan lain di tempat anda mahu ia diperibadikan.
5. Jika perlu: lampirkan sehingga 5 fail di bawah **Attachment** (**Attachments (n/max)** sebaik sahaja lebih daripada satu ditambah). Tambah teks khusus saluran di bawah **Channel Response** untuk saluran yang perlukan kata-kata berbeza.
6. Jika perlu: tandakan **Also send on other channels** atau **Track links**, dan buka **Advanced Settings** untuk menambah satu cabang kegagalan.
7. Simpan langkah ini. Untuk menerbitkan: tetapkan **Status** kepada **Published** di bar alat di bahagian atas editor, klik **Save**, kemudian sahkan dengan **Terbitkan**. Menukar dropdown sahaja tidak mengubah apa-apa sehingga anda menyimpan.

## Medan

| Medan | Apa maksudnya | Lalai | Batasan |
| --- | --- | --- | --- |
| Channel | Tempat mesej itu dihantar: saluran terakhir perbualan itu berinteraksi, atau satu yang anda namakan. | Last interacted channel | — |
| Message Content · Default | Teks yang dihantar pada setiap saluran yang tiada gantian khususnya, sehingga 2,000 aksara. Token medan seperti `{{contact.name}}` diisi pada masa penghantaran. | — | Disertakan bersama lampiran pertama apabila media dilampirkan: sebaris di bawah imej, video atau dokumen WhatsApp. Untuk nota suara WhatsApp, atau mana-mana lampiran pada Messenger atau Instagram, ia dihantar sebagai mesej teks berasingan sejurus selepas fail itu. |
| Attachment / Attachments (n/max) | Sehingga 5 fail (imej, video, audio atau dokumen), dihantar mengikut susunan yang disenaraikan. | — | Mematikan **Also send on other channels** — penyebaran itu teks sahaja. |
| Also send on other channels | Menghantar teks yang sama pada sehingga tiga saluran lain milik orang yang sama, dipadankan melalui nombor telefon atau e-mel yang dikongsi pada rekod kenalan mereka. | tutup | Tidak tersedia bersama lampiran pada langkah ini. Satu penghantaran bagi setiap saluran walaupun lebih daripada satu rekod kenalan orang itu mengongsinya. |
| Track links | Menulis semula pautan dalam teks menjadi pautan pendek, supaya ketikan dikira ke arah statistik klik pautan dan boleh mencetuskan pencetus **Link clicked**. | tutup | — |
| Channel Response | Kata-kata berbeza untuk jenis saluran tertentu, digunakan menggantikan teks lalai apabila langkah ini benar-benar menghantar pada jenis saluran itu. | — | — |
| Add Message Failure Branch | Satu laluan yang berjalan menggantikan langkah yang sepatutnya mengikutinya, apabila penghantaran ini gagal. | tutup | Tanpanya, penghantaran yang gagal dicatat dan larian terus ke langkah seterusnya seolah-olah tiada apa berlaku. |

## Bagaimana ia berfungsi

- Pada WhatsApp, Messenger atau Instagram, langkah ini mula-mula menyemak sama ada mesej terakhir pelanggan — atau, pada WhatsApp, panggilan terakhir mereka — berada dalam tempoh 24 jam yang lalu. Di luar tempoh itu penghantaran ditolak sebelum API penghantaran saluran itu dipanggil, dan tiada apa sampai ke Meta.
- Token medan diisi, dan pautan dipendekkan jika **Track links** dihidupkan, sebelum mesej dihantar.
- Pada WhatsApp teks itu kemudian ditukar daripada markdown ringan Inchat sendiri kepada format WhatsApp sendiri (`**tebal**` menjadi `*tebal*`, dan seterusnya) sejurus sebelum penghantaran. Baris yang disimpan pada perbualan itu memegang teks sebelum penukaran itu, bukan aksara tepat yang WhatsApp tunjukkan kepada pelanggan.
- Nota suara yang dilampirkan di sini dihantar sebagai OGG/Opus mono jika anda merakamnya melalui pemuat naik langkah ini sendiri — ia ditukar. Pautan MP3 atau M4A yang ditampal dan ditanda sebagai nota suara ditolak sebelum sampai ke Meta, kerana WhatsApp hanya menerima nota suara OGG/Opus mono.
- Pautan `/api/media/<message>/<index>` yang ditampal — proksi peti masuk Inchat sendiri yang memerlukan log masuk — dicuba ditebus dahulu. Jika ia menunjuk kepada satu lampiran yang ruang kerja ini benar-benar simpan, ia ditukar kepada URL bertandatangan berjangka pendek sebelum penghantaran, dan diteruskan.
- Hanya pautan `/api/media/…` yang ditampal dan tidak dapat ditebus (bentuk `/api/media` yang tidak dikenali atau asing) kemudian mengenai semakan bentuk di bawah dan gagal.
- Selepas itu, URL lampiran hanya disemak dari segi bentuknya sahaja, sebelum penghantaran — ia mesti https dan berbentuk betul. Ia tidak pernah benar-benar diambil untuk mengesahkan fail itu benar-benar wujud.
- URL https yang berbentuk betul tetapi mati, peribadi, atau sekadar salah tetap lulus semakan ini dan sampai ke Meta. Ia boleh gagal pada muat turun Meta sendiri — kegagalan yang langkah ini tidak nampak, jadi ia dicatat sebagai dihantar walaupun pelanggan tidak menerima apa-apa.
- Dengan lebih daripada satu lampiran, setiap fail dihantar sebagai mesejnya sendiri, mengikut susunan yang disenaraikan. Teks mesej hanya disertakan dengan fail pertama — sebaris untuk imej, video atau dokumen WhatsApp, jika tidak sebagai mesej teks berasingan sejurus selepasnya.
- **Also send on other channels** mencari rekod kenalan lain dalam ruang kerja ini yang berkongsi nombor telefon atau e-mel kenalan ini. Ia mengambil sehingga tiga daripada perbualan mereka yang paling baharu aktif, satu bagi setiap saluran — tidak pernah dua pada saluran yang sama walaupun daripada dua baris kenalan yang sepadan.
- Penyebaran ini menghantar teks yang sama kepada perbualan itu selepas penghantaran utama berjaya, dan hanya boleh sampai pada Messenger, Instagram, WhatsApp atau widget laman web. Rekod berkaitan yang saluran terbaharunya adalah selain daripada itu (e-mel, Telegram, …) gagal pada penghantaran itu dengan **unsupported channel type** dan beralih ke sasaran seterusnya; langkah ini sendiri tidak terjejas.
- Penyebaran ini tiada semakan tetingkap mesej sendiri, berbeza daripada penghantaran utama.
- Setiap penghantaran yang berjaya ditulis pada perbualan sebagai balasan daripada aliran kerja, dan itulah yang membuatkan perbualan itu menunjukkan **Menunggu balasan anda** sebagai sudah dijawab dan bukan tersekat.

## Bila ia gagal

- Tetingkap mesej tertutup: pada WhatsApp, Messenger atau Instagram, selepas tetingkap itu, penghantaran ditolak sebelum Graph dipanggil. Baris log larian untuk langkah ini berbunyi `Messaging window closed — free-form send blocked`, mengarahkan anda kepada templat yang diluluskan sebaliknya.
- Tiada **Add Message Failure Branch**: langkah ini dicatat gagal dan larian terus ke langkah seterusnya dalam aliran. Satu tag, penugasan atau penutupan yang diletakkan selepasnya tetap berlaku, pada perbualan yang tidak pernah menerima mesej ini.
- Dengan cabang kegagalan dihidupkan, langkah cabang itu sendiri berjalan menggantikan yang sepatutnya mengikutinya, dan tiada apa selepas cabang itu berjalan pada laluan ini.
- Nota suara yang ditampal sebagai MP3/M4A dan ditanda sebagai nota suara gagal terus: log larian menamakan penyelesaiannya (fail OGG/Opus mono, atau muat naik melalui langkah itu supaya ia ditukar).
- URL lampiran yang bukan https atau berbentuk salah menggagalkan langkah ini sebelum sebarang penghantaran cuba dilakukan. Semakan ini tidak pernah mengambil URL itu, ia hanya menyemak bentuknya. Pautan https yang berbentuk betul tetapi mati atau peribadi tetap lulus dan sampai ke Meta, lalu boleh gagal di sana sebaliknya — secara tersembunyi daripada hasil yang dicatat langkah ini sendiri.
- Pautan `/api/media/…` yang ditampal gagal hanya apabila ia tidak dapat ditebus kepada fail yang ruang kerja ini benar-benar simpan; satu yang boleh ditebus ditukar kepada URL bertandatangan dan dihantar seperti biasa.
- Apabila penghantaran utama tidak dapat disahkan sama ada berjaya atau tidak, larian berhenti selepas langkah ini walaupun tiada cabang kegagalan ditetapkan. Langkah seterusnya tidak dicuba pada perbualan yang penghantaran terakhirnya belum disahkan.

## Apa yang ia tidak lakukan

- Ia tidak membuka semula perbualan yang ditutup dengan sendirinya dan tidak membuka semula tetingkap WhatsApp/Messenger/Instagram yang tertutup — itu tujuan **Send WhatsApp Template**.
- **Also send on other channels** ialah penyebaran teks yang sama kepada sehingga tiga saluran berkaitan. Ia tidak boleh membawa lampiran atau kata-kata khusus saluran, dan langsung tidak berjalan apabila langkah ini juga menghantar media.
- Berbeza daripada penghantaran utama, penyebaran itu tiada semakan tetingkap mesej sendiri.
- Semakan URL lampiran tidak pernah mengambil fail itu — ia hanya menyemak bentuk URL (https, berbentuk betul). Pautan https yang mati atau peribadi tidak ditangkap di sini; ia sampai ke Meta dan boleh gagal pada muat turun Meta sendiri sebaliknya, dengan langkah ini masih dicatat sebagai dihantar.
- Hanya pautan `/api/media/…` yang tidak dapat ditebus ditolak terus; satu yang membawa kepada lampiran tersimpan sebenar ditukar kepada URL bertandatangan dan dihantar.
- Ia tidak menunggu balasan. Larian terus ke langkah seterusnya sejurus selepas penghantaran disahkan (atau gagal), pada giliran yang sama — gandingkan dengan **Ask a Question** untuk langkah yang berhenti seketika menunggu jawapan.
- Ia menghantar pada saluran, bukan kepada nombor telefon tersimpan yang anda taip. Untuk mencapai nombor yang belum pernah anda hantar mesej, gunakan **Start a WhatsApp Chat**.

## Amalan terbaik

- Hidupkan **Add Message Failure Branch** pada apa-apa yang membawa kepada wang atau tarikh akhir — pautan pembayaran, pengesahan tempahan. Dengan itu tetingkap tertutup atau URL lampiran yang berbentuk salah tidak membiarkan aliran bertindak seolah-olah pelanggan sudah diberitahu.
- Cabang kegagalan tidak dapat menangkap pautan https yang mati tetapi berbentuk betul — itu tetap sampai ke Meta dan dicatat sebagai dihantar.
- Kekalkan **Track links** dihidupkan untuk pautan yang anda mahu pencetus **Link clicked** bertindak balas kemudian dalam aliran kerja yang sama atau yang lain.

## Contoh penggunaan

- Sahkan pesanan telah diterima, dengan imej resit dilampirkan sebagai media.
- Hantar jawapan ringkas sejurus selepas **AI Reply**, pada laluan di mana AI tidak dapat menjawab. Tambah satu cabang kegagalan yang beralih kepada versi teks biasa jika saluran itu menolak percubaan pertama.

## Soalan lazim dan penyelesaian masalah

### Mengapa mesej saya tidak pernah sampai, tanpa sebarang ralat ditunjukkan kepada pelanggan?

Selalunya kerana tetingkap mesej sudah tertutup. Pada WhatsApp, Messenger dan Instagram, Send a Message bebas di luar tetingkap ditolak sebelum sampai ke Meta — tiada apa dihantar, dan langkah itu ditanda gagal dalam tab **Activity** aliran kerja. Gunakan **Send WhatsApp Template** untuk mencapai pelanggan WhatsApp di luar tetingkap itu.

### Langkah ini gagal. Adakah selebihnya aliran kerja tetap berjalan?

Ya, melainkan anda hidupkan **Add Message Failure Branch**. Tanpanya, larian terus ke langkah seterusnya tanpa mengira — satu tag atau penugasan yang diletakkan selepasnya tetap berlaku. Dengannya, langkah cabang itu berjalan menggantikannya dan tiada apa selepas cabang itu berjalan pada laluan ini.

### Bolehkah saya hantar kepada nombor yang kenalan itu belum pernah hantar mesej?

Bukan dengan langkah ini — ia menghantar pada saluran perbualan itu sendiri atau satu yang anda namakan untuk perbualan ini. Untuk mencapai nombor WhatsApp yang perbualan ini belum pernah hantar mesej, gunakan **Start a WhatsApp Chat**.

### Adakah menambah lampiran mengubah apa yang Also send on other channels lakukan?

Ia mematikannya. Penyebaran kepada saluran berkaitan hanya menghantar teks, jadi ia dimatikan selagi satu lampiran ditetapkan pada langkah ini.

## Berkaitan

- [Send WhatsApp Template](https://inchat.inseller.my/help/workflows/send-whatsapp-template)
- [Send a File (voice / image / video)](https://inchat.inseller.my/help/workflows/send-a-file)
- [AI Reply](https://inchat.inseller.my/help/workflows/ai-reply)
- [Start a WhatsApp Chat (new number)](https://inchat.inseller.my/help/workflows/start-a-whatsapp-chat)
- [Workflow triggers](https://inchat.inseller.my/help/workflows/workflow-triggers)
- [Workflows: how a flow runs](https://inchat.inseller.my/help/workflows/workflows-overview)

---

Source files: `src/lib/workflows/ai-builder/spec.ts`, `src/lib/workflows/canvas-model.ts`, `src/components/workflows/WorkflowStepConfigDrawer.tsx`, `src/lib/workflows/engine-message-actions.ts`, `src/lib/workflows/engine.ts`, `src/lib/inbox/wa-window.ts`, `src/lib/workflows/send-message-media.ts`, `src/lib/workflows/media-type.ts`, `src/lib/workflows/media-url.ts`, `src/lib/send/rich-text.ts`, `src/lib/workflows/dispatch-send.ts`, `src/lib/access/permissions.ts`
