Powiadomienia SMS o zamówieniu: jak wysyłać status przesyłki ze sklepu internetowego
Jak wysyłać SMS o statusie zamówienia ze sklepu: WooCommerce (hook PHP lub n8n), Shopify przez webhook, gotowe szablony do 160 znaków i uwagi o polskich literach.

Powiadomienia SMS o zamówieniu są jedną z najprostszych automatyzacji w sklepie: klient dostaje krótką wiadomość, gdy zamówienie zostało przyjęte, wysłane lub czeka na odbiór. Dzięki smsportal SMS wychodzi z Twojego numeru, więc klient może odpisać na wątpliwości zamiast dzwonić. Ten artykuł pokazuje trzy drogi: kod PHP w WooCommerce, n8n oraz Shopify przez webhook, razem z szablonami mieszczącymi się w 160 znakach.
Jak działa wysyłka SMS po zmianie statusu zamówienia?
Sklep zgłasza zdarzenie („status zmienił się na wysłane”), a Twój kod lub automatyzacja wysyła żądanie POST na /gateway/send-sms. Telefon z Androidem przekazuje SMS operatorowi. Schemat jest ten sam w każdym sklepie, zmienia się tylko miejsce, z którego wychodzi żądanie.
- Zdarzenie: zmiana statusu (WooCommerce) lub webhook zamówienia (Shopify).
- Przekazanie: hook PHP albo workflow w n8n lub Make.
- Wysyłka:
POST https://smsportal.app/api/v1/gateway/send-smsz nagłówkiemx-api-key. - Status: webhooki
MESSAGE_SENT,MESSAGE_DELIVEREDlubMESSAGE_FAILEDwracają do sklepu.
Przed wdrożeniem skonfiguruj bramkę według instrukcji wysyłki SMS przez API: telefon z kartą SIM, klucz API i konto z bezpłatnym planem na start.
Jak napisać SMS o zamówieniu w 160 znakach?
Jedna część SMS-a w alfabecie GSM-7 mieści 160 znaków, a w UCS-2 (gdy w treści jest choć jedna polska litera) tylko 70. Krótkie szablony bez ogonków mieszczą się w jednym SMS-ie, a z ogonkami trzeba pisać ponad dwa razy krócej.
| Zdarzenie | Szablon bez polskich liter (GSM-7) | Znaki |
|---|---|---|
| Przyjęte | Zamowienie #1234 przyjete. Dziekujemy! Sklep Kowalski | 53 |
| Wysłane | Zamowienie #1234 wyslane. Paczka nr 520012345678. Sklep Kowalski | 64 |
| Do odbioru | Zamowienie #1234 czeka w punkcie odbioru. Kod: 4821. Sklep Kowalski | 67 |
| Zwrot | Zwrot do zamowienia #1234 przyjety. Pieniadze wroca w 14 dni. Sklep Kowalski | 76 |
Ta sama treść z ogonkami, np. Zamówienie #1234 wysłane. Paczka nr 520012345678. Sklep Kowalski (64 znaki), mieści się w jednej części UCS-2 (limit 70), ale dłuższe szablony z literami „ą”, „ę”, „ł” przekroczą go i zostaną podzielone na części po 67 znaków. Wybór jest prosty: albo piszesz bez ogonków, albo pilnujesz krótkich tekstów. Licznik znaków i części w aplikacji na telefonie pokazuje to na bieżąco.
Wskazówka: podpisuj SMS nazwą sklepu na końcu. Nie ma nadpisu nadawcy, bo wiadomość wychodzi z numeru telefonu, więc klient poznaje nadawcę po treści. Więcej o tym w artykule o nazwie nadawcy i własnym numerze.
Jak wysłać SMS po zmianie statusu w WooCommerce (kod PHP)?
W WooCommerce użyj hooka woocommerce_order_status_changed, który dostaje numer zamówienia, stary status, nowy status i obiekt zamówienia, a w jego funkcji wywołaj wp_remote_post na adres API. To około 30 linii kodu w pliku functions.php motywu potomnego lub w małej wtyczce.
Najpierw dodaj klucz do wp-config.php (nigdy do repozytorium ani motywu):
define( 'SMSPORTAL_API_KEY', 'TWÓJ_KLUCZ_API' );Następnie wklej hook:
add_action( 'woocommerce_order_status_changed', function ( $order_id, $from, $to, $order ) {
$templates = array(
'processing' => 'Zamowienie #%d przyjete. Dziekujemy! Sklep Kowalski',
'completed' => 'Zamowienie #%d wyslane. Sklep Kowalski',
);
if ( ! isset( $templates[ $to ] ) ) {
return;
}
// Numer w formacie +48...
$digits = preg_replace( '/\D/', '', $order->get_billing_phone() );
if ( strlen( $digits ) === 9 ) {
$digits = '48' . $digits;
}
if ( strlen( $digits ) < 11 ) {
return;
}
$response = wp_remote_post( 'https://smsportal.app/api/v1/gateway/send-sms', array(
'timeout' => 10,
'headers' => array(
'x-api-key' => SMSPORTAL_API_KEY,
'Content-Type' => 'application/json',
),
'body' => wp_json_encode( array(
'recipients' => array( '+' . $digits ),
'message' => sprintf( $templates[ $to ], $order_id ),
) ),
) );
if ( is_wp_error( $response ) ) {
error_log( 'smsportal: ' . $response->get_error_message() );
}
}, 10, 4 );Klucze tablicy (processing, completed) to statusy WooCommerce bez prefiksu wc-. Własne statusy dodane wtyczkami też zadziałają po podaniu ich nazwy. Numer przesyłki nie jest standardowym polem WooCommerce: jeśli używasz wtyczki do śledzenia paczek, pobierz go z pola zamówienia, które ta wtyczka zapisuje (nazwa zależy od wtyczki). Dokumentacja WooCommerce opisuje hooki zamówień w katalogu dla deweloperów.
Uwaga: hook wykonuje się przy zapisie zamówienia, więc 10-sekundowy limit czasu spowalnia panel, gdy API jest niedostępne. Przy większym ruchu przenieś wysyłkę do kolejki albo do zewnętrznego workflow (poniżej).
Jak połączyć WooCommerce z SMS bez pisania kodu?
Użyj webhooka WooCommerce z tematem „Order updated” i adresem workflow w n8n lub Make. Workflow filtruje status i wysyła SMS węzłem HTTP, więc zmiana treści nie wymaga edycji sklepu. To lepsza droga, gdy treści zmienia ktoś niebędący programistą.
- W WooCommerce: Ustawienia → Zaawansowane → Webhooki → Dodaj. Temat: Order updated, adres: Production URL z węzła Webhook w n8n.
- W n8n: węzeł IF sprawdza
{{ $json.body.status }}, np.completed. - Węzeł HTTP Request wysyła SMS (ustawienia i gotowy JSON do wklejenia znajdziesz w artykule o SMS w n8n):
{
"recipients": ["{{ $json.body.billing.phone }}"],
"message": "Zamowienie #{{ $json.body.number }} wyslane. Sklep Kowalski"
}W n8n jest też gotowy węzeł WooCommerce Trigger, który sam rejestruje webhook w sklepie. Dla Make użyj modułu Webhooks i modułu HTTP zgodnie z artykułem o Make i Zapierze. Pamiętaj, że telefon klienta w WooCommerce bywa bez prefiksu kraju: dodaj w workflow węzeł, który przed wysyłką dopisze +48.
WooCommerce wyłącza webhook po kilku kolejnych nieudanych dostawach, więc po awarii n8n sprawdź jego status w ustawieniach.
Jak wysłać SMS o zamówieniu ze sklepu Shopify?
W Shopify subskrybuj webhook zamówień (np. orders/create lub orders/fulfilled) i przekaż go do n8n, które wyśle SMS przez HTTP Request. Shopify nie wysyła SMS-ów z Twojego numeru, więc ten krok robi smsportal. Najprościej użyć węzła Shopify Trigger w n8n.
- Shopify Trigger w n8n: zdarzenie Order Created lub Order Fulfilled, po podłączeniu poświadczeń sklepu.
- IF (opcjonalnie): wyślij tylko, gdy zamówienie ma numer telefonu (
{{ $json.phone }}lub pole w adresie dostawy). - HTTP Request do
/gateway/send-smsjak wyżej.
Własny webhook (bez n8n) rejestrujesz przez API Shopify i weryfikujesz podpisem w nagłówku X-Shopify-Hmac-Sha256: dokumentacja webhooków Shopify opisuje tematy zamówień i sposób sprawdzania podpisu. Zwróć uwagę, że telefon klienta nie zawsze jest wymagany w koszyku, więc część zamówień nie wywoła SMS-a.
Czy muszę mieć zgodę klienta na SMS o zamówieniu?
SMS informujący o stanie konkretnego zamówienia jest wiadomością transakcyjną, ale nie wolno dopisywać do niego reklamy ani kuponu bez odrębnej zgody marketingowej. Zasady opisuje Prawo komunikacji elektronicznej i RODO, a praktyczny przegląd daje artykuł o zgodzie na SMS-y marketingowe. To nie jest porada prawna.
Dobre praktyki:
- zbieraj numer telefonu z informacją, po co go używasz (status zamówienia),
- nie wysyłaj SMS-ów w nocy: ustaw w workflow okno godzin i użyj pola
scheduledAt, - zamiast „odpisz STOP” w SMS-ach transakcyjnych podaj kontakt do sklepu.
Jak przetestować powiadomienia przed uruchomieniem w sklepie?
Zrób testowe zamówienie na własny numer i przejdź przez wszystkie statusy, dla których masz szablony. Dopiero potem włącz kod na sklepie produkcyjnym. Najlepiej robić to na kopii sklepu (staging) albo przynajmniej z filtrem, który przepuszcza tylko Twój numer.
- Złóż zamówienie z własnym telefonem w polu numeru, najlepiej w formacie bez prefiksu, jak wpisuje klient. Sprawdzisz tym normalizację do
+48…. - Zmień status w panelu sklepu na każdy ze skonfigurowanych (np. W trakcie realizacji, Zakończone) i po każdej zmianie sprawdź SMS.
- Sprawdź w panelu smsportal status wiadomości oraz liczbę części. Treść z polskimi literami ma ich więcej.
- Zmień status dwa razy z rzędu na ten sam i upewnij się, że SMS nie wyjdzie podwójnie. Hook uruchamia się przy realnej zmianie, ale wtyczki potrafią zapisywać zamówienie wielokrotnie.
- Sprawdź zamówienie bez numeru telefonu: kod powinien je po cichu pominąć.
Hook woocommerce_order_status_changed przyjmuje cztery argumenty (numer zamówienia, stary status, nowy status, obiekt zamówienia), co potwierdza kod klasy WC_Order w repozytorium WooCommerce. Uruchamia się on przy zmianie ze znanego poprzedniego statusu, więc dla świeżo utworzonych zamówień sprawdź na teście, czy SMS „przyjęte” faktycznie wychodzi.
Najczęstsze problemy: dlaczego SMS o zamówieniu nie wychodzi?
Zwykle winny jest zły nagłówek, numer bez prefiksu, wyłączony telefon albo adres webhooka, do którego sklep nie może dotrzeć. Poniżej objawy i naprawa.
| Objaw | Przyczyna | Co zrobić |
|---|---|---|
| 401 w logu | Nagłówek Authorization zamiast x-api-key | W wp_remote_post ustaw 'x-api-key' => SMSPORTAL_API_KEY |
| SMS nie dochodzi, odpowiedź 400 | Numer klienta bez +48 (np. 600 100 200) | Normalizuj do E.164: usuń spacje i myślniki, dopisz +48 dla 9 cyfr. Kod z artykułu to robi |
| SMS „w kolejce” długo | Telefon z bramką jest offline | Sprawdź zasięg, internet i zasilanie. Wiadomości czekają do 72 godzin |
| Webhook sklepu nie dociera do n8n | Adres nie jest publicznym HTTPS lub użyto adresu testowego | Wklej w WooCommerce lub Shopify adres produkcyjny workflow i włącz go. Adres testowy n8n działa tylko, gdy edytor nasłuchuje |
| Webhook WooCommerce przestał działać | Po kilku kolejnych nieudanych dostawach sklep sam wyłącza webhook | Napraw odbiorcę i włącz webhook ponownie w ustawieniach. Logi: WooCommerce → Status → Logs |
| SMS wychodzi w dwóch częściach | Polskie litery zmieniły kodowanie na UCS-2 (limit 70 znaków) | Pisz szablony bez ogonków lub skróć je. Licznik w aplikacji pokazuje części |
Gdy podejrzewasz kod PHP, sprawdź error_log serwera: hook z artykułu zapisuje tam błędy połączenia z API.
Kiedy własny telefon wystarcza do sklepu, a kiedy nie?
Telefon jako bramka obsłuży powiadomienia z małego i średniego sklepu: dziesiątki lub kilkaset wiadomości dziennie. Wysyła SMS-y w odstępach (domyślnie 5 sekund, ok. 720 na godzinę z jednego telefonu), więc nagłe piki, np. po wyprzedaży, rozkładają się w czasie. Przy dużym ruchu dodaj kolejne urządzenia lub wybierz hurtowego dostawcę (zob. ile kosztuje wysyłka SMS).
Telefon musi mieć zasięg, internet i zasilanie. Gdy jest offline, wiadomości czekają do 72 godzin, po czym wygasają, więc pilne kody (np. odbioru paczki) opatrz krótkim terminem ważności.
Następny krok
Załóż bezpłatne konto smsportal, podłącz telefon i wyślij testowy SMS ręcznie. Gdy to działa, wklej hook PHP lub workflow n8n i zmień status testowego zamówienia. Pola żądania opisuje dokumentacja API, a plany znajdziesz w cenniku. Podobny schemat działa przy przypomnieniach o wizycie.
Najczęściej zadawane pytania
Jak wysłać SMS o zmianie statusu zamówienia w WooCommerce?
Podłącz hook woocommerce_order_status_changed i w jego funkcji wyślij żądanie POST na https://smsportal.app/api/v1/gateway/send-sms z nagłówkiem x-api-key. Alternatywą jest webhook WooCommerce z tematem „Order updated” kierowany do n8n lub Make, bez pisania kodu w sklepie.
Czy do SMS-ów o zamówieniu potrzebuję zgody klienta?
SMS stricte informacyjny o realizowanym zamówieniu to wiadomość transakcyjna, ale reklamy i promocje wymagają odrębnej zgody marketingowej. Nie mieszaj ich w jednym SMS-ie. To nie jest porada prawna, więc sprawdź zasady w artykule o zgodach i RODO.
Ile znaków może mieć SMS o statusie zamówienia?
160 znaków w jednej części, jeśli używasz tylko znaków alfabetu GSM-7, czyli bez polskich liter. Jedna litera z ogonkiem przełącza wiadomość na UCS-2 i limit spada do 70 znaków. Dłuższa treść zostanie podzielona na kilka części.
Czy SMS może zawierać numer przesyłki i link do śledzenia?
Tak, o ile mieści się w limicie znaków. Numer paczki i krótki link wystarczą, a długie adresy śledzenia skracaj. Link w SMS-ie zawsze prowadź do domeny sklepu lub przewoźnika, żeby klient nie wziął go za oszustwo.
Co jeśli telefon z bramką jest wyłączony, gdy wpada zamówienie?
Wiadomość czeka w kolejce do 72 godzin i wyjdzie po powrocie telefonu do sieci. Po tym czasie wygasa. Do statusów zamówień to zwykle wystarcza, a stan telefonu sprawdzisz w panelu i w aplikacji.

