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 doğru — ya da bir hata sonucuna doğru — ilerlerken değişen birstatus alanı taşır. Bu sayfa, bu durum makinesini kavram düzeyinde açıklar: durumların ne anlama geldiğini, her geçişi neyin tetiklediğini ve operatöre özgü uçların nerede olduğunu. İlk webhook’unuza abone olmadan veya entegrasyonunuzu mesaj sonuçlarına göre dallamadan önce bunu okuyun.
Durum başına anlamlar, tam geçiş tablosu ve webhook-olay eşlemesi mesaj durumu yaşam döngüsü referansında; bir mesajın güncel durumunu okumak için yanıt şeması Messaging API referansında bulunur. Bu sayfa ikisini daha üst bir düzeyde birbirine bağlar.
Başarı yolu
Uçtan uca başarılı olan bir mesaj şunları geçer:pending → queued → sending → sent → delivered → read
Her geçiş farklı bir aktör tarafından tetiklenir — hiçbir tek taraf tüm yolu görmez:
Bu yolun yanında duran ve bir kaydı yoldan çıkarabilen iki aktör vardır:
- DLR-olmayan zamanlayıcı. Bir operatör hiç teslim onayı döndürmediğinde, bir zamanlayıcı kanal başına belirlenen zaman aşımı penceresinden sonra
sent’isubmitted_no_receipt’e yükseltir — bkz. Operatör onaylı vs. hat ara bekçisi. - Siz (operatör). Henüz gönderilmemiş bir zamanlanmış mesajın iptali onu
cancelled’e taşır — hiçbir sağlayıcı çağrısının ve hiçbir DLR’ın dokunmayacağı bir nihai durum. Sandbox gönderileritest_sent’e çözünür — herhangi bir sağlayıcı gönderisinden önce ulaşılan bir nihai durum. Bir kaydı silmek herhangi bir nihai durumudeleted’e taşır; ardından hiçbir şey ona dokunamaz.
scheduled’da bekler ve sonra kuyruğa katılır. scheduled’dan sadece üç şekilde çıkabilir: ateşleme zamanında queued’a yükselen, siz tarafından cancelled ya da gönderimden önce geçerlilik penceresi kapanırsa expired.
Operatör onaylı vs. hat ara bekçisi
Raporlama ve uzlaşma açısından en önemli ayrım, bir durumun bir operatör onaylı sonuç mu yoksa bir hat ara bekçisi mi olduğudur:deliveredvereadoperatör onaylıdır. Gerçek bir DLR geldi; operatör sonucu bizzat iddia etti.submitted_no_receipthat aradır. Anlamı “gönderim kabul edildi ve belirlenen süre içinde hiçbir onay gelmedi” dir. Her webhook’ta ara olarak işaretlenir (state_class: "intermediate",is_terminal: false), çünkü gerçek birdelivered,readveya hata DLR’si sonradan gelip üzerine yazabilir.
submitted_no_receipt’i sonuç bilinmiyor olarak ele alın, bir teslim olarak değil. “Bilinmiyor” un olumluya mı yoksa gerçekten belirsiz bir duruma mı yattığı kanala bağlıdır — bkz. Kanal başına uyarılar.
expired karşı taraftaki eşdövcüdür: Bir DLR geldi, ama onay penceresinin çoktan kapandığı kadar geç geldi. Sonuç bilinemez ve kayıt kapanır; expired abonlere bir message.failed olayı olarak dağıtılır.
Kanal başına uyarılar
- Meta DM kanalları (Instagram, Messenger). Meta’nın Send API’si asla teslim onayı yayınlamaz. Gönderi Orbit’ten
sentolarak ayrılır, mesaj meta verilerindeno_dlr_channelolarak işaretlenir ve 5 dakika sonrasubmitted_no_receipt’e dönüşür. Katılmış (opt-in) bir alıcı için Meta, kabulde teslimi garanti eder — bu kanallardasubmitted_no_receiptbu yüzden işlevsel bir teslim sinyali gibi davranır ve mesaj meta verileri bu durumu ayırt edebilmeniz içinno_dlr_channel: truetaşır. - SMPP destekli kanallar (SMS, MMS, ses, faks, RCS). Zaman aşımı penceresi 30 dakikadır. Burada
submitted_no_receiptgerçekten belirsizdir: cihaz mesajı almış olabilir ama bir onay bildirilmemiş, operatör o rotada hiç onay göndermeyebilir veya onay yolda düşmüş olabilir. Bu oranı teslim oranınızdan ayrı izleyin — bir hedefte yükselensubmitted_no_receiptpayı, işbirliği yapmayan bir rotaya ya da kırık bir onay yoluna işaret eder ve her iki durumda da araştırmaya değer. - E-posta. Diğer kanallarda olmayan bir hata sonucu ekler:
bounced, alıcı posta sunucusu mesajı reddettiğinde. Bounced, nihai hata oranınızafailedgibi katılır, ama alıcı tarafı retlerini sağlayıcı tarafı retlerinden ayırt edebilmeniz için ayrı bir durumdur. - Operatör iptali.
cancelledyalnızca sizin tarafınızdan ulaşılabilir — gönderilmemiş bir mesajdaPOST /messages/:id/cancelüzerinden. Hiçbir operatör bunu yazmaz ve dolayısıyla hiçbir webhook olayı tetiklenmez; bir iptal hakkında hiçbir abone bilgilendirilemediği için. Kendi arayüzünüzde iptali sunduyorsanız ve onu gözlemekzorsanızGET /messages/:id’yi sorgulayın. - Sandbox / test modu. Test gönderileri herhangi bir sağlayıcı gönderisinden önce
test_sent’e çözünür.status: "test_sent"vemetadata.test_mode: trueilemessage.senttetiklerler, bu nedenle bir abonenin sandbox trafiğini üretim işleminden dışarıda tutmak içinmetadata.test_modeüzerine dallanması gerekir.
Ne üzerine dallanmalı
Entegrasyonlar yalnızca makine tarafından okunabilir alanlara bakmalı, görüntü etiketlerine asla bakmamalıdır:status— mesajın güncel durumu. Bu birincil dallanma noktasıdır. Kuruluşunuzu bütün küme üzerine kurun: başarı yolu ve sık hata durumlarının yanı sıracancelled,test_sent,submitted_no_receiptvebounced’ı unutmayın.metadata.classified_error_code— nihai hatalarda bulunur; normalleştirilmiş, makine tarafından okunabilir hata kategorisi. Operatörün kendi kelime seçimini istediğinizde onumessage.failedwebhook’larındaki hamerror_code/error_messageile birleştirin.metadata.no_dlr_channel— Meta DM kayıtlarında bulunur; birsubmitted_no_receipt’in teslim garantili Meta durumu olduğunu, belirsiz SMPP durumu olmadığını söyler.state_class/is_terminal— yaşam döngüsü webhook’larında.is_terminal: true(eş değeristate_class: "terminal") sonucun nihai olduğu anlamına gelir;submitted_no_receiptözellikle dosyayı kapatmamanız içinis_terminal: falserapor eder.
Yaygın tuzaklar
message.created’i kabul olarak ele almak.message.created, kayıt kuyruğa konulduğu anda, herhangi bir sağlayıcı çağrısından önce tetiklenir. Eşzamanlı bir ret (gönderi sırasında bir 4xx veya anındarejected/failed) yine de bu olayı teslim edilmiş bırakır. Mesajın çıktığı sonucuna varmadan önce onumessage.sentile eşleştirin.delivered’in değiştirilemez olduğunu varsaymak. Bazı rotalardaki operatörler bir teslim onayı verir, sonra dakikalar sonra bir düzeltme yayınlar — bazı Hindistan ve Brezilya operatörleri bunu yapar. Orbit bunu onaylar: kayıtdelivered → undeliveredveyadelivered → failedşeklinde hareket edebilir. Durumları kendi veri deposunuza yansıtıyorsanız, güncellemeleri mesaj kimliğine göre idempotent olarak uygulayın — zaten teslim olarak işaretlediğiniz bir mesaj için geçişleri görmezden gelmeyin.cancellediçin webhook beklemek. Asla gelmeyecek — iptal kendi API çağrınızdan çıkar, bir operatör geri çağrısından değil, bu yüzden platform onun için hiçbir olay yayınlamaz. Kayıt sadececancelled’da kalır, siz silene kadar.submitted_no_receipt’i hata kutuna atmak. Taşıma nedenleriylemessage.failedolay türünde gelir (özel bir olay yok), ama yükününstatus’usubmitted_no_receiptveis_terminal: false’tur.data.statusüzerine dallanım, olay türüne değil; ve onu kesin hata metriklerinden dışarıda tutun.- Her mesaj için tam bir nihai olay beklemek. Bir mesaj, yavaş bir operatör onayı geç gelme penceresinin içinde sonunda gelirse, önce
status: "submitted_no_receipt"ilemessage.failed, sonramessage.deliveredyayınlayabilir.message_idile tekrarları ayıklayın ve uzlaştın, sonraki olayın üstün gelmesine izin verin.