14 gru 2024·7 min czytania

System powiadomień wielokanałowych: szablony, ponowienia, preferencje

Zaprojektuj system powiadomień wielokanałowych dla email, SMS i Telegram z szablonami, śledzeniem statusu, ponowieniami i preferencjami użytkownika zachowującymi spójność.

System powiadomień wielokanałowych: szablony, ponowienia, preferencje

Co rozwiązuje pojedynczy system powiadomień

Gdy email, SMS i Telegram są budowane jako oddzielne funkcje, szybko pojawiają się szczeliny. "To samo" powiadomienie kończy się różnym brzmieniem, różnym czasem wysyłki i różnymi zasadami kto je otrzymuje. Zespoły wsparcia potem ścigają trzy wersje prawdy: jedną u dostawcy email, jedną u bramki SMS i jedną w logu bota.

System powiadomień wielokanałowych naprawia to, traktując powiadomienia jako jeden produkt, a nie trzy integracje. Występuje jedno zdarzenie (reset hasła, faktura zapłacona, serwer nie działa), a system decyduje, jak je dostarczyć przez kanały na podstawie szablonów, preferencji użytkownika i reguł dostarczania. Treść może być sformatowana inaczej dla każdego kanału, ale pozostaje spójna w sensie, danych i śledzenia.

Większość zespołów i tak potrzebuje tej samej podstawy, niezależnie od tego, od którego kanału zaczęli: wersjonowane szablony ze zmiennymi, śledzenie statusu dostarczenia ("wysłane, dostarczone, nieudane, dlaczego"), sensowne ponowienia i fallbacki, preferencje użytkownika z zgodą i cichymi godzinami oraz ścieżka audytu, aby wsparcie mogło zobaczyć, co się stało bez zgadywania.

Sukces wygląda nudno — w dobrym znaczeniu. Wiadomości są przewidywalne: właściwa osoba dostaje właściwą treść we właściwym czasie przez wybrane kanały. Gdy coś idzie nie tak, rozwiązywanie problemów jest proste, ponieważ każda próba jest zapisana ze statusem i kodem powodu.

Alert "nowe logowanie" jest dobrym przykładem. Tworzysz go raz, wypełniasz tymi samymi danymi użytkownika, urządzenia i lokalizacji, a potem dostarczasz jako email dla szczegółów, SMS dla pilności i Telegram dla szybkiego potwierdzenia. Jeśli dostawca SMS ma timeout, system ponawia wysyłkę zgodnie z harmonogramem, loguje timeout i może przełączyć się na inny kanał zamiast porzucić alert.

Podstawowe koncepcje i prosty model danych

System powiadomień wielokanałowych pozostaje opanowalny, gdy oddzielisz "dlaczego informujemy" od "jak to dostarczamy". To oznacza niewielki zestaw współdzielonych obiektów oraz szczegóły specyficzne dla kanału tylko tam, gdzie rzeczywiście się różnią.

Zacznij od zdarzenia. Zdarzenie to nazwany wyzwalacz jak order_shipped lub password_reset. Utrzymuj nazwy spójne: małe litery, podkreślenia i czas przeszły, gdy ma to sens. Traktuj zdarzenie jako stabilny kontrakt, od którego zależą szablony i reguły preferencji.

Z jednego zdarzenia utwórz rekord powiadomienia. To zamiar skierowany do użytkownika: dla kogo jest, co się stało i jakie dane są potrzebne do wyrenderowania treści (numer zamówienia, data dostawy, kod resetu). Przechowuj tu pola współdzielone, takie jak user_id, event_name, locale, priority i scheduled_at.

Następnie rozdziel na wiadomości dla każdego kanału. Powiadomienie może wygenerować 0–3 wiadomości (email, SMS, Telegram). Wiadomości zawierają pola specyficzne dla kanału, takie jak cel (adres email, numer telefonu, Telegram chat_id), template_id i wyrenderowana zawartość (subject/body dla email, krótki tekst dla SMS).

Na końcu śledź każdą wysyłkę jako próbę dostarczenia. Próby zawierają provider request_id, znaczniki czasu, kody odpowiedzi i znormalizowany status. To jest to, co sprawdzasz, gdy użytkownik mówi: "Nic nie dostałem."

Prosty model często mieści się w czterech tabelach lub kolekcjach:

  • Zdarzenie (katalog dozwolonych nazw zdarzeń i domyślnych ustawień)
  • Powiadomienie (po jednym na zamiar użytkownika)
  • Wiadomość (po jednej na kanał)
  • PróbaDostarczenia (po jednej na próbę)

Planuj idempotencję wcześnie. Nadaj każdemu powiadomieniu deterministyczny klucz, np. (event_name, user_id, external_ref), aby ponowne próby z systemów zewnętrznych nie tworzyły duplikatów. Jeśli krok workflow uruchomi się ponownie, klucz idempotencyjny zapobiegnie wysyłce dwóch SMS-ów.

Przechowuj na dłużej tylko to, co potrzebne do audytu (zdarzenie, powiadomienie, finalny status, znaczniki czasu). Krótkoterminowe kolejki i surowe payloady dostawców trzymaj tylko tak długo, jak potrzebujesz do działania i debugowania.

Praktyczny przepływ end-to-end (krok po kroku)

System powiadomień działa najlepiej, gdy traktuje "decydowanie co wysłać" oddzielnie od "wysyłania tego". To utrzymuje aplikację szybką i ułatwia obsługę błędów.

Praktyczny przepływ wygląda tak:

  1. Producent zdarzeń tworzy żądanie powiadomienia. To może być "reset hasła", "faktura zapłacona" lub "bilet zaktualizowany". Żądanie zawiera user ID, typ wiadomości i dane kontekstowe (numer zamówienia, kwota, imię agenta wsparcia). Zapisz żądanie natychmiast, aby mieć ścieżkę audytu.

  2. Router ładuje reguły użytkownika i wiadomości. Sprawdza preferencje użytkownika (dostępne kanały, zgody, ciche godziny) oraz reguły wiadomości (np. alerty bezpieczeństwa najpierw email). Router decyduje plan kanałów, np. Telegram, potem SMS, potem email.

  3. System umieszcza zadania wysyłki do kolejki per kanał. Każde zadanie zawiera klucz szablonu, kanał i zmienne. Zadania idą do kolejki, żeby akcja użytkownika nie była blokowana przez wysyłkę.

  4. Workerzy kanałów dostarczają przez dostawców. Email idzie przez SMTP lub API email, SMS przez bramkę SMS, Telegram przez bota. Workerzy powinni być idempotentni, więc ponawianie tego samego zadania nie powoduje duplikatów.

  5. Aktualizacje statusów wpływają do jednego miejsca. Workerzy zapisują queued, sent, failed i, gdy dostępne, delivered. Jeśli dostawca potwierdza tylko "accepted", zapisz to i traktuj odmiennie od delivered.

  6. Fallbacky i ponowienia uruchamiają się z tego samego stanu. Jeśli Telegram zawiedzie, router (lub worker retry) może zaplanować SMS zamiast stracić kontekst.

Przykład: użytkownik zmienia hasło. Backend emituje jedno żądanie z userem i adresem IP. Router widzi, że użytkownik woli Telegram, ale ciche godziny blokują go w nocy, więc planuje email teraz i Telegram rano, śledząc oba w tym samym rekordzie powiadomienia.

Jeśli implementujesz to w AppMaster, trzymaj żądania, zadania i tabele statusów w Data Designer i wyrażaj logikę routera i ponowień w Business Process Editor, z asynchroniczną wysyłką, żeby UI został responsywny.

Struktura szablonów działająca we wszystkich kanałach

Dobry system szablonów zaczyna się od jednej idei: informujesz o zdarzeniu, a nie "wysyłasz email" albo "wysyłasz SMS". Stwórz jeden szablon na zdarzenie (Reset hasła, Zamówienie wysłane, Płatność nieudana), a następnie przechowuj warianty per kanał pod tym samym zdarzeniem.

Utrzymuj te same zmienne we wszystkich wariantach kanałów. Jeśli email używa first_name i order_id, SMS i Telegram powinny używać dokładnie tych samych nazw. To zapobiega subtelnym błędom, gdy jeden kanał renderuje poprawnie, a inny pokazuje puste pola.

Prosty, powtarzalny kształt szablonu

Dla każdego zdarzenia zdefiniuj mały zestaw pól per kanał:

  • Email: temat, preheader (opcjonalny), treść HTML, fallback tekstowy
  • SMS: treść w zwykłym tekście
  • Telegram: treść w zwykłym tekście, plus opcjonalne przyciski lub krótkie metadane

Jedyną rzeczą, która się zmienia per kanał, jest formatowanie, nie sens.

SMS ma specjalne zasady ze względu na ograniczoną długość. Zdecyduj z góry, co robić, gdy treść jest za długa i trzymaj się tego: ustaw limit znaków, wybierz regułę przycinania (obciąć i dodać ... lub najpierw usunąć opcjonalne linie), unikaj długich URL-i i dodatkowych znaków interpunkcyjnych, i umieść kluczowe działanie na początku (kod, termin, kolejny krok).

Lokalizacja bez kopiowania logiki biznesowej

Traktuj język jako parametr, nie osobny workflow. Przechowuj tłumaczenia per zdarzenie i kanał, potem renderuj z tymi samymi zmiennymi. Logika "Zamówienie wysłane" pozostaje ta sama, podczas gdy temat i treść zmieniają się per locale.

Tryb podglądu szybko się zwraca. Renderuj szablony z przykładowymi danymi (w tym skrajnymi przypadkami, jak długie imię), aby wsparcie mogło zweryfikować warianty email, SMS i Telegram przed uruchomieniem.

Status dostarczenia, któremu można zaufać i który da się debugować

Szybkie wdrożenie dostarczania wielokanałowego
Podłącz Telegram, email i SMS jako integracje, zachowując jednocześnie śledzenie w jednym miejscu.
Połącz kanały

Powiadomienie jest użyteczne tylko wtedy, gdy później możesz odpowiedzieć na jedno pytanie: co się z nim stało? Dobry system wielokanałowy oddziela wiadomość, którą chciałeś wysłać, od każdej próby jej dostarczenia.

Zacznij od niewielkiego zestawu wspólnych statusów, które znaczą to samo dla email, SMS i Telegram:

  • queued: zaakceptowane przez system, czekające na workera
  • sending: próba dostarczenia w toku
  • sent: przekazane pomyślnie do API dostawcy
  • failed: próba zakończyła się błędem, na który można zareagować
  • delivered: masz dowód, że dotarło do użytkownika (gdy to możliwe)

Trzymaj te statusy na głównym rekordzie wiadomości, ale zapisuj każdą próbę w tabeli historii. To ta historia ułatwia debugowanie: próba #1 nie powiodła się (timeout), próba #2 się udała, albo SMS zadziałał, a email wciąż odbija.

Co przechowywać per próbę

Znormalizuj odpowiedzi dostawców, aby można było wyszukiwać i grupować problemy, nawet gdy dostawcy używają różnych terminów.

  • provider_name i provider_message_id
  • response_code (znormalizowany kod jak TIMEOUT, INVALID_NUMBER, BOUNCED)
  • raw_provider_code i raw_error_text (do spraw wsparcia)
  • started_at, finished_at, duration_ms
  • channel (email, sms, telegram) i destination (zamaskowane)

Planuj częściowy sukces. Jedno powiadomienie może stworzyć trzy wiadomości kanałowe, które dzielą ten sam parent_id i kontekst biznesowy (order_id, ticket_id, alert_type). Jeśli SMS został wysłany, a email nie, nadal chcesz mieć pełną historię w jednym miejscu, a nie trzy niepowiązane incydenty.

Co naprawdę znaczy "dostarczone"

"Wysłane" to nie to samo co "dostarczone". Dla Telegrama możesz znać tylko, że API zaakceptowało wiadomość. Dla SMS i email dostarczenie często zależy od webhooków lub callbacków dostawcy, a nie wszyscy dostawcy są równie wiarygodni.

Zdefiniuj "dostarczone" per kanał z góry. Używaj potwierdzeń webhook, gdy są dostępne; w przeciwnym razie traktuj delivered jako nieznane i raportuj sent. To utrzymuje raportowanie uczciwe i odpowiedzi wsparcia spójne.

Ponowienia, fallbacki i kiedy przestać próbować

Ponowienia to miejsce, gdzie systemy powiadomień często zawodzą. Ponawiaj za szybko i stworzysz burze. Ponawiaj wiecznie i stworzysz duplikaty i problemy dla wsparcia. Cel jest prosty: próbuj ponownie, gdy istnieje realna szansa powodzenia i przestań, gdy jej nie ma.

Zacznij od klasyfikacji błędów. Timeout od dostawcy email, 502 od bramki SMS czy tymczasowy błąd API Telegram to zwykle błędy do ponowienia. Sformatowany niepoprawnie adres email, numer telefonu nie przechodzący walidacji czy zablokowany bot Telegram to nie są błędy do ponowienia. Traktowanie ich tak samo marnuje pieniądze i zasilenie logi.

Praktyczny plan ponowień jest ograniczony i stosuje backoff:

  • Próba 1: wysyłka teraz
  • Próba 2: po 30 sekundach
  • Próba 3: po 2 minutach
  • Próba 4: po 10 minutach
  • Zatrzymaj po maksymalnym wieku (np. 30–60 minut dla alertów)

Zatrzymanie musi mieć swoje miejsce w modelu danych. Oznacz wiadomość jako dead-letter (lub failed-permanently), gdy przekroczy limit prób. Zachowaj ostatni kod błędu i krótki komunikat, aby wsparcie mogło działać bez zgadywania.

Zapobiegaj powtórnym wysyłkom po sukcesie dzięki idempotencji. Stwórz klucz idempotencyjny per logiczną wiadomość (zwykle notification_id + user_id + channel). Jeśli dostawca odpowie późno i ponowisz próbę, druga próba powinna być rozpoznana jako duplikat i pominięta.

Fallbacki powinny być przemyślane, a nie automatyczną paniką. Zdefiniuj reguły eskalacji na podstawie ważności i czasu. Przykład: reset hasła nie powinien fallbackować na inny kanał (ryzyko prywatności), ale alert produkcyjny może spróbować SMS po dwóch nieudanych próbach Telegrama, a potem email po 10 minutach.

Preferencje użytkownika, zgoda i ciche godziny

Przejdź z budowy do wdrożenia
Wdróż na AppMaster Cloud lub do własnej chmury, gdy będziesz gotowy do uruchomienia.
Deploy App

System powiadomień wydaje się "inteligentny", gdy szanuje ludzi. Najprostszy sposób to pozwolić użytkownikom wybierać kanały per typ powiadomienia. Wiele zespołów dzieli typy na kubełki jak bezpieczeństwo, konto, produkt i marketing, ponieważ zasady i wymagania prawne się różnią.

Zacznij od modelu preferencji, który działa nawet gdy kanał nie jest dostępny. Użytkownik może mieć email, ale nie mieć numeru telefonu, lub nie połączyć Telegramu. Twój system powinien traktować to jako normalne, a nie błąd.

Większość systemów potrzebuje zwartego zestawu pól: typ powiadomienia (bezpieczeństwo, marketing, billing), dozwolone kanały per typ (email, SMS, Telegram), zgoda per kanał (data/czas, źródło i dowód jeśli potrzebny), powód rezygnacji per kanał (wybór użytkownika, odbicie email, odpowiedź "STOP") oraz reguła cichych godzin (start/koniec plus strefa czasowa użytkownika).

Ciche godziny to miejsce, w którym systemy często zawodzą. Zapisz strefę czasową użytkownika (nie tylko przesunięcie), aby zmiany czasu letniego nie robiły niespodzianek. Gdy wiadomość jest zaplanowana w czasie cichych godzin, nie oznaczaj jej jako błędu. Oznacz jako odroczoną i wybierz następny dozwolony czas wysyłki.

Domyślnie ważne powiadomienia mają znaczenie. Popularne podejście: powiadomienia bezpieczeństwa ignorują ciche godziny (ale nadal respektują twarde rezygnacje, gdy wymagane), natomiast aktualizacje niekrytyczne czekają i szanują wybory kanałów.

Przykład: reset hasła powinien iść natychmiast na najszybszy dozwolony kanał. Cotygodniowy digest powinien poczekać do rana i pominąć SMS, chyba że użytkownik wyraził zgodę.

Operacje: monitoring, logi i workflowy wsparcia

Szanuj preferencje użytkownika od początku
Zaimplementuj zgodę, ciche godziny i wybory kanałów bez rozdzielania logiki na kanały.
Buduj preferencje

Gdy powiadomienia obejmują email, SMS i Telegram, zespoły wsparcia potrzebują szybkich odpowiedzi: Czy wysłaliśmy to, czy dotarło i co się zepsuło? System powiadomień powinien wyglądać jak jedno miejsce do śledzenia, nawet jeśli w tle działa kilku dostawców.

Zacznij od prostego widoku administracyjnego, z którego każdy może korzystać. Umożliw wyszukiwanie po użytkowniku, typie zdarzenia, statusie i oknie czasowym, i pokaż najpierw najnowsze próby. Każdy wiersz powinien ujawniać kanał, odpowiedź dostawcy i następne planowane działanie (ponowienie, fallback lub zatrzymanie).

Metryki, które wychwytują problemy wcześnie

Awaryjność rzadko pojawia się jako jeden czysty błąd. Śledź niewielki zestaw liczb i sprawdzaj je regularnie:

  • Szybkość wysyłek per kanał (wiadomości na minutę)
  • Wskaźnik błędów per dostawca i kod błędu
  • Wskaźnik ponowień (ile wiadomości wymagało drugiej próby)
  • Czas do dostarczenia (queued do delivered, p50 i p95)
  • Wskaźnik porzuceń (zatrzymane z powodu preferencji użytkownika, zgody lub maks. prób)

Korelować wszystko. Generuj correlation ID gdy zdarzenie się dzieje (np. "faktura zaległa") i przekazuj go przez templating, queueing, wywołania dostawców i aktualizacje statusów. W logach ten ID staje się nitką do śledzenia, kiedy jedno zdarzenie rozchodzi się na wiele kanałów.

Bezpieczne odtwarzanie dla wsparcia

Odtworzenia są niezbędne, ale potrzebują zabezpieczeń, aby nie spamować ludzi lub nie naliczać opłat dwukrotnie. Bezpieczny przepływ odtwarzania zwykle oznacza: ponów wysyłkę tylko konkretnego ID wiadomości (nie całego zbioru), pokaż dokładną wersję szablonu i wyrenderowaną treść przed wysyłką, wymaga powodu i zapisz, kto wywołał odtworzenie, zablokuj odtworzenie jeśli wiadomość już została dostarczona chyba że wymusisz, i egzekwuj limity szybkości per użytkownik i per kanał.

Podstawy bezpieczeństwa i prywatności dla powiadomień

System powiadomień dotyka danych osobowych (emaile, numery telefonów, chat ID) i często obejmuje wrażliwe momenty (logowania, płatności, wsparcie). Zakładaj, że każde ciało wiadomości i każda linia logu może być kiedyś widoczna, więc projektuj ograniczanie tego, co przechowujesz i kto ma do tego dostęp.

Trzymaj dane wrażliwe poza szablonami kiedy tylko możesz. Szablon powinien być wielokrotnego użytku i prosty: "Twój kod to {{code}}" jest OK, ale unikaj wstawiania pełnych danych konta, długich tokenów czy czegokolwiek, co mogłoby posłużyć do przejęcia konta. Jeśli wiadomość musi zawierać jednorazowy kod lub token resetu, przechowuj tylko to, co potrzebne do weryfikacji (np. hash i datę wygaśnięcia), nie surową wartość.

Gdy przechowujesz lub logujesz zdarzenia powiadomień, maskuj agresywnie. Agent wsparcia zwykle musi wiedzieć, że kod został wysłany, nie musi znać samego kodu. To samo dotyczy numerów telefonów i emaili: przechowuj pełną wartość dla dostarczania, ale pokazuj zamaskowaną wersję na większości ekranów.

Minimalne kontrole zapobiegające większości incydentów

  • Role-based access: tylko niewielki zestaw ról może zobaczyć treści wiadomości i pełne dane odbiorcy.
  • Oddziel dostęp debug od dostępu wsparcia, aby debugowanie nie stało się wyciekiem prywatności.
  • Chroń endpointy webhook: używaj podpisanych callbacków lub współdzielonych sekretów, weryfikuj znaczniki czasu i odrzucaj nieznane źródła.
  • Szyfruj pola wrażliwe w spoczynku i używaj TLS w tranzycie.
  • Zdefiniuj zasady retencji: trzymaj szczegółowe logi krótko, potem przechowuj tylko agregaty lub hashowane identyfikatory.

Praktyczny przykład: jeśli SMS z resetem hasła nie powiódł się i zrobiłeś fallback na Telegram, zapisz próbę, status dostawcy i zamaskowanego odbiorcę, ale unikaj przechowywania samego linku resetu w bazie lub logach.

Przykładowy scenariusz: jedno powiadomienie, trzy kanały, rzeczywiste wyniki

Uruchom swoje pierwsze zdarzenie dziś
Zacznij od jednego zdarzenia, np. reset hasła, a potem dodawaj kolejne kanały.
Prototypuj teraz

Klientka Maya ma włączone dwa typy powiadomień: Reset hasła i Nowe logowanie. Woli Telegram, potem email. SMS chce tylko jako fallback dla resetu hasła.

Pewnego wieczoru Maya prosi o reset hasła. System tworzy pojedynczy rekord powiadomienia ze stabilnym ID, potem rozkłada go na próby kanałowe według jej preferencji.

Co Maya widzi: wiadomość Telegram przychodzi w ciągu sekund z krótkim kodem resetu i czasem wygaśnięcia. Nic więcej nie przychodzi, bo Telegram się powiódł i fallback nie był potrzebny.

Co system zapisuje (szczegółowo):

  • Powiadomienie: type=PASSWORD_RESET, user_id=Maya, template_version=v4
  • Próba #1: channel=TELEGRAM, status=SENT potem DELIVERED
  • Żadne próby email lub SMS nie zostały utworzone (polityka: zatrzymaj po pierwszym sukcesie)

Później w tym tygodniu pojawia się alert Nowe logowanie z nowego urządzenia. Preferencje Mai to tylko Telegram dla alertów logowania. System wysyła Telegram, ale dostawca zwraca błąd tymczasowy. System ponawia dwa razy z backoffem, potem oznacza próbę jako FAILED i zatrzymuje (dla tego typu alertu fallback nie jest dozwolony).

A teraz realna awaria: Maya prosi o kolejny reset hasła w podróży. Telegram zostaje wysłany, ale fallback SMS jest skonfigurowany, jeśli Telegram nie dostarczy w 60 sekund. Dostawca SMS zwraca timeout. System zapisuje timeout, ponawia raz i druga próba kończy się sukcesem. Maya otrzymuje SMS z kodem minutę później.

Gdy Maya kontaktuje wsparcie, wyszukują po użytkowniku i oknie czasowym i od razu widzą historię prób: znaczniki czasu, kody odpowiedzi dostawcy, licznik ponowień i finalny wynik.

Szybka lista kontrolna, typowe błędy i kolejne kroki

System powiadomień wielokanałowych łatwiej utrzymać, gdy szybko odpowiesz na dwa pytania: "Co dokładnie próbowaliśmy wysłać?" i "Co się potem stało?". Użyj tej listy kontrolnej zanim dodasz kolejne kanały lub zdarzenia.

Szybka lista kontrolna

  • Jasne nazwy zdarzeń i właściciel (np. invoice.overdue należące do billing)
  • Zmienne szablonów zdefiniowane raz (wymagane vs opcjonalne, domyślne, zasady formatowania)
  • Statusy uzgodnione z góry (created, queued, sent, delivered, failed, suppressed) i co każdy znaczy
  • Limity ponowień i backoff (max prób, odstępy, reguła zatrzymania)
  • Zasady retencji (jak długo przechowujesz treści wiadomości, odpowiedzi dostawców i historię statusów)

Jeśli zrobisz tylko jedną rzecz, zapisz różnicę między sent a delivered prostymi słowami. Sent to to, co zrobił twój system. Delivered to to, co raportuje dostawca (i może być opóźnione lub brakować). Mieszanie tych dwóch pojęć zmyli zespoły wsparcia i interesariuszy.

Typowe błędy do uniknięcia

  • Traktowanie sent jako sukcesu i raportowanie zawyżonych współczynników dostarczenia
  • Pozwolenie, by szablony per kanał dryfowały, aż email, SMS i Telegram będą się wykluczać
  • Ponawianie bez idempotencji, powodujące duplikaty gdy dostawcy timeoutują, a później akceptują wiadomość
  • Ponawianie w nieskończoność, zamieniające tymczasową awarię w hałaśliwy incydent
  • Przechowywanie zbyt wielu danych osobowych w logach i rekordach statusów "na wszelki wypadek"

Zacznij od jednego zdarzenia i jednego kanału głównego, potem dodaj drugi kanał jako fallback (nie jako równoległe rozsyłanie). Gdy przepływ będzie stabilny, rozszerzaj zdarzenie po zdarzeniu, utrzymując wspólne szablony i zmienne, aby wiadomości pozostały spójne.

Jeśli chcesz zbudować to bez ręcznego kodowania każdego elementu, AppMaster (appmaster.io) dobrze nadaje się do rdzeniowych części: modeluj zdarzenia, szablony i próby dostarczenia w Data Designer, implementuj routing i ponowienia w Business Process Editor i podłącz email, SMS i Telegram jako integracje, zachowując śledzenie statusów w jednym miejscu.

Łatwy do uruchomienia
Stworzyć coś niesamowitego

Eksperymentuj z AppMaster z darmowym planem.
Kiedy będziesz gotowy, możesz wybrać odpowiednią subskrypcję.

Rozpocznij