Teslim yaşam döngüsü
Orbit üzerinden gönderdiğiniz her giden mesaj, mesaj API çağrınızdan alıcının cihazına — veya bir başarısızlık sonucuna — doğru ilerlerken ilerleyen birstatus alanı taşır. Bu sayfa kavramsal durum makinesini açıklar: durumların ne anlama geldiği, her geçişi neyin yürüttüğü ve operatöre bağlı kenarların nerede olduğu. İlk webhook’unuza abone olmadan veya entegrasyonunuzu bir mesaj sonucuna göre dallandırmadan önce okuyun.
Durum semantiği, tam geçiş tablosu ve webhook olay haritası mesaj durumu yaşam döngüsü referansında yaşar; bir mesajın güncel durumunu okumak için yanıt şeması mesajlaşma API referansında bulunur. Bu sayfa ikisini daha üst düzeyde birbirine bağlar.
Mutlu yol
Uçtan uca başarılı olan bir mesaj şu yoldan geçer:pending → queued → sending → sent → delivered → read
Her geçişi farklı bir bileşen yürütür — hiçbir taraf yolun tamamını görmez:
Bu yolun yanında oturan ve bir kaydı ondan çıkarabilecek iki bileşen vardır:
- No-DLR zamanlayıcı. Bir taşıyıcı hiç teslim onayı döndürmediğinde, zamanlayıcı kanala özgü bir hoş görü penceresinden sonra
sent’isubmitted_no_receiptdurumuna yaşlandırır — bkz. Taşıyıcı doğrulamalı vs. hatta aracı. - Siz (gönderici). Henüz gönderilmemiş planlanmış bir mesajı iptal etmek onu
cancelleddurumuna sabitler; hiçbir sağlayıcı çağrısının ve hiçbir DLR’nin dokunmadığı nihai bir durumdur. Sandbox gönderimleri, sağlayıcıya herhangi bir yayınlanmadan önce raporlanan nihai bir durum olantest_sentolarak çözülür. Bir kaydı silmek herhangi bir nihai durumudeleteddurumuna taşır; ondan sonra hiçbir şey ona dokunamaz.
scheduled durumunda bekler, ardından kuyruğa katılır. scheduled yalnızca üç yoldan çıkabilir: lansman saatinde queued durumuna yükselme, sizden cancelled, ya da yayınlanmadan önce geçerlilik penceresi dolarsa expired.
Taşıyıcı doğrulamalı vs. hatta aracı
Raporlama ve mutabakat için en önemli ayrım, bir durumun taşıyıcı doğrulamalı bir sonuç mu yoksa hatta aracı bir anlaşmazlık mı olduğudur:deliveredvereadtaşıyıcı doğrulamalıdır. Gerçek bir DLR geldi; taşıyıcının kendisi sonucu kapattı.submitted_no_receiptaracıdır. Anlamı “gönderim için kabul edildi ve hoş görü penceresi içinde hiçbir onay dönmedi”. Her webhook’ta aracı olarak tanımlanır (state_class: "intermediate",is_terminal: false), çünkü gerçek birdelivered,readveya başarısız DLR daha sonra gelip onun yerini alabilir.
submitted_no_receipt’i bir teslim olarak değil, bilinmeyen bir sonuç olarak ele alın. “Bilinmeyen”in olumluya mı yoksa yalnızca aracıya mı yattığı kanala bağlıdır — bkz. Kanal varyasyonları.
expired öbür taraftan bakılan görünümdür: bir DLR geldi, ancak onay penceresi çoktan kapanmış olacak kadar geç. Sonuç bilinemez ve kayıt kapanmıştır; expired abonelere bir message.failed olayı olarak dağıtılır.
Kanal varyasyonları
- Meta DM kanalları (Instagram, Messenger). Meta’nın gönderim yüzeyi asla teslim onayı yaymaz. Gönderim
sentolarak Orbit’ten çıkar, mesaj meta verilerindeno_dlr_channel’ı işaretler ve 5 dakika sonrasubmitted_no_receiptdurumuna düşer. İsteğe bağlı olarak kabul edilmiş bir alıcıda Meta teslimi kabul anında garanti ettiğinden, bu kanallardasubmitted_no_receiptişlevsel bir teslim sinyali gibi davranır ve mesaj meta verileri durumu ayırt edebilmeniz içinno_dlr_channel: truetaşır. - SMPP destekli kanallar (SMS, MMS, sesli, faks, RCS). Hoş görü penceresi 30 dakikadır. Burada
submitted_no_receiptgerçek bir aracıdır: cihaz mesajı raporlanmamış onayla almış olabilir, taşıyıcı bu rotada asla onay yaymıyor olabilir veya onay aktarım sırasında düşmüş olabilir. Bu oranı teslim oranından ayrı bir sinyal olarak izleyin — bir hedefte yerleşmiş birsubmitted_no_receiptoranı ilgisiz bir rotaya veya kırık bir onay rotasına işaret eder ve her iki durumda da soruşturmayı hak eder. - E-posta. Saf DM kanallarının sahip olmadığı bir başarısızlık sonucu ekler: alıcı posta sunucusu mesajı reddettiğinde
bounced. Geri dönme,failedgibi nihai başarısızlık oranınıza dahil olur, ancak alıcı tarafı reddetmelerini sağlayıcı tarafı olanlardan ayırmanıza olanak tanıyan ayrı bir durumdur. - Gönderici iptali.
cancelledyalnızca sizin tarafınızdan raporlanır — henüz gönderilmemiş bir mesaj üzerindePOST /messages/:id/cancelaracılığıyla. Hiçbir taşıyıcı bunu asla yazmaz ve sonuç olarak hiçbir webhook olayı tetiklemez; hiçbir şey aboneye iptali bildirmez. İptali arayüzünüzde gösteriyorsanız ve izlemeniz gerekiyorsaGET /messages/:idçağırın. - Sandbox / test modu. Test gönderimleri, sağlayıcıya herhangi bir yayınlanmadan önce
test_sentolarak çözülür.status: "test_sent"vemetadata.test_mode: trueilemessage.senttetikler, bu nedenle abone sandbox trafiğini üretim işlemenin dışında tutmak içinmetadata.test_modeüzerinden dallandırmalıdır.
Neye göre dallanılır
Entegrasyonlar yalnızca makine tarafından okunabilir alanlara göre dallanmalı, asla gösterilen açıklamalara göre dallanmamalıdır:status— mesajın güncel durumu. Birincil dallanma noktası budur. Kümenin tamamını işleyin: mutlu yol ve başarısızlık durumlarının yanı sıracancelled,test_sent,submitted_no_receiptvebounced’ı unutmayın.metadata.classified_error_code— nihai başarısızlık sonuçlarında mevcut; makine tarafından tanımlanmış, makine etkin başarısızlık kategorisi. Operatörün sözlerini istediğinizdemessage.failedwebhook’undaki hamerror_code/error_messageile birleştirin.metadata.no_dlr_channel— Meta DM kayıtlarında mevcut;submitted_no_receipt’in SMPP’den çevrilen aracı değil, Meta’nın garanti ettiği teslim durumu olduğunu söyler.state_class/is_terminal— yaşam döngüsü webhook’unda.is_terminal: true(state_class: "terminal"ile eşleşmiş) sonucun nihai olduğu anlamına gelir;submitted_no_receipttam olarak kitabı üzerine kapatmayasınız diyeis_terminal: falseraporlar.
Sık yapılan hatalar
message.created’i kabul olarak ele almak.message.created, kayıt kuyruğa konduğu anda, herhangi bir sağlayıcı çağrısından önce tetiklenir. Eşzamanlı bir ret (gönderimde 4xx veya anındarejected/failed) bu olayı yine de teslim edilmiş bırakır. Mesajın çıktığı sonucuna varmadan önce onumessage.sentile birleştirin.delivered’ın değişmez olduğunu varsaymak. Bazı rotalardaki taşıyıcılar bir teslim onayı yayar ve dakikalar sonra bir düzeltme yayar — bazı Hintli ve Brezilyalı taşıyıcılar bunu yapar. Orbit buna saygı duyar: bir kayıtdelivered → undeliveredveyadelivered → faileddurumuna geçebilir. Durumları kendi veri deponuzda yansıtıyorsanız, güncellemeleri mesaj kimliğine göre idempotent olarak uygulayın; daha önce servis edilmiş bir mesaj için geçişleri atmak yerine.cancellediçin webhook beklemek. Asla gelmeyecek — iptal sizin API çağrınıza bağlıdır, bir taşıyıcı çağrısına değil, bu nedenle platform onun için bir olay yaymaz. Kayıt, siz silene kadarcancelleddurumunda oturur.submitted_no_receipt’i başarısızlık akışına atmak. Sınıflandırma nedenleriylemessage.failedolay türü olarak gelir (ayrı bir rota yoktur), ancak olay türüne değildata.status’a göre dallan ve onu sert başarısızlık tonlarından uzak tut.- Mesaj başına tek bir nihai olay beklemek. Bir mesaj,
status: "submitted_no_receipt"ilemessage.failedyayabilir ve ardından yavaş taşıyıcı onayı nihayet geç varış penceresinde geldiğindemessage.deliveredyayabilir.message_id’ye göre güncelleyin ve tekilleştirin, geç olayın kazanmasına izin verin.