
Blameless, ale konkretnie: jak uporządkowaliśmy delivery stron marketingowych (WordPress/Elementor) bez spowalniania zespołu
W zespołach od stron marketingowych łatwo wpaść w tryb „ciągłego gaszenia”: ktoś prosi o małą zmianę na landing page, ktoś inny wrzuca nowy skrypt analityczny, a w piątek wieczorem okazuje się, że formularze nie wysyłają leadów. Technicznie to są drobne rzeczy. Operacyjnie – potrafią zjadać czas, nerwy i zaufanie do procesu.
U nas problem nie polegał na braku kompetencji. Polegał na tym, że WordPress + Elementor daje duży komfort zmian „tu i teraz”, ale ta sama cecha potrafi zabić przewidywalność: brak przeglądu, brak jednoznacznych właścicieli, brak definicji „done”, brak telemetrii po wdrożeniu. Efekt: zespół reaguje, zamiast sterować.
Ten post jest o kulturze pracy, ale w wydaniu inżynierskim: konkretne rytuały, minimalne artefakty, jasne granice odpowiedzialności. Bez wielkiego Agile’owego teatru. Chcieliśmy osiągnąć dwie rzeczy jednocześnie: szybkie delivery i mniejszą liczbę wpadek. Da się – jeśli potraktujesz proces jak system, który też ma architekturę.
Tło i problem
Strony marketingowe są specyficzne, bo łączą dwa światy:
- biznes: kampanie, SEO, eksperymenty, szybkie iteracje, terminy „na wczoraj”,
- inżynieria: integracje (CRM, analityka), dostępność, performance, bezpieczeństwo, stabilność.
WordPress/Elementor dodatkowo wzmacnia tę dynamikę:
- można „kliknąć i działa”, więc zmiany dzieją się szybko,
- ale przez to łatwo ominąć standardy: review, testy, staging, rollback.
Najbardziej zdradliwy jest fakt, że większość zmian jest mała – a właśnie małe zmiany często psują rzeczy w miejscach, których nikt nie dotykał:
- dodany skrypt śledzący wpływa na INP,
- nowy pop-up blokuje scroll,
- zmiana sekcji formularza zmienia eventy analityczne,
- CSS „na szybko” psuje layout na mobile.
W pewnym momencie zauważyliśmy typowy objaw dojrzałości: więcej energii szło w odzyskiwanie kontroli niż w budowanie wartości. To jest sygnał, że trzeba dołożyć „warstwę operacyjną”, ale taką, która nie zdusi szybkości.
Wymagania / ograniczenia
Zamiast zaczynać od ceremonii, zaczęliśmy od wymagań. To ważne, bo kultura bez ograniczeń kończy się wiarą, a my chcieliśmy systemu.
Wymagania (co ma się poprawić)
- Mniej incydentów produkcyjnych po zmianach (formularze, tracking, layout).
- Krótszy czas diagnozy, gdy coś jednak padnie (mniej „szukania po omacku”).
- Przewidywalny release: wiemy, co wchodzi, kiedy i kto jest właścicielem.
- Szybkość: zmiany marketingowe nadal mają być dowożone w godzinach/dniach, nie tygodniach.
Ograniczenia (świat, w którym żyjemy)
- WordPress/Elementor: część zmian jest robiona w panelu, nie w repo.
- Zespół mieszany: dev, content, PM/marketing, czasem podwykonawcy.
- Nie mamy luksusu pełnego QA do każdej drobnej zmiany.
- Ruch i terminy kampanii są nieprzewidywalne – proces musi obsłużyć „spike’i” w priorytetach.
Założenie projektowe
- Minimalna liczba reguł, ale egzekwowalnych.
- Maksimum automatyzacji tam, gdzie to ma sens; reszta to proste checklisty.
Co nie działało wcześniej
1) „Zmienimy szybko na produkcji, bo to tylko tekst”
To jest najdroższe złudzenie. W WordPressie granica między „tekstem” a „funkcją” bywa cienka:
- edytor wkleja fragment HTML/JS,
- elementorowy widget ma ustawienia, które wpływają na DOM,
- a jeden niewinny atrybut potrafi popsuć zdarzenia analityczne.
Brakowało nam jasnego rozróżnienia: które zmiany są naprawdę bezpieczne, a które wymagają minimalnego review.
2) Brak „source of truth” dla zmian
Zdarzało się, że:
- ktoś zmienił CSS w „Custom CSS” w Elementorze,
- ktoś inny wrzucił JS w inne miejsce,
- a potem nikt nie wiedział, skąd bierze się konkretne zachowanie.
Bez jednej ścieżki „gdzie takie rzeczy trzymamy” debug kosztuje.
3) Brak domyślnego planu rollback
Rollback w WordPressie bez przygotowania często oznacza:
- ręczne cofanie ustawień,
- nerwowe szukanie „co było przedtem”,
- kopiowanie fragmentów między środowiskami.
W praktyce brak rollback = większa skłonność do „napraw na gorąco”, które generują kolejne błędy.
4) Postmortem jako „kto zawinił”
Jeśli incydent kończy się polowaniem na winnego, zespół uczy się jednego: ukrywać ryzyko i unikać odpowiedzialności. A my potrzebowaliśmy odwrotnie: szybkiego ujawniania problemów i poprawy systemu.
5) „Proces” jako ciężar
Każda próba wprowadzenia procesu była odbierana jako spowolnienie. To był sygnał, że wcześniej proces był projektowany pod „idealny świat”, a nie pod realne tempo i realne ograniczenia.
Nowe podejście / architektura
Zaprojektowaliśmy proces jak architekturę systemu: wejścia, wyjścia, kontrakty, i granice odpowiedzialności.
Trzy filary:
- Kontrakt zmiany: klasy ryzyka + definicja „done”.
- Ścieżka delivery: intake → implementacja → review → release → obserwacja.
- Uczenie się po błędach: blameless postmortem + konkretne działania naprawcze.
Do tego dołożyliśmy dwa „akceleratory”:
- checklisty (krótkie, konkretne),
- minimalne metryki (żeby widzieć trend, nie tylko anegdoty).
W praktyce to jest kultura oparta o dwie zasady:
- „Zaufanie, ale z barierkami”: każdy może wprowadzać zmiany, ale system wymusza minimalną jakość.
- „Naprawiamy system, nie człowieka”: błąd jest sygnałem, że kontrolki są za słabe, a nie że ktoś jest zły.
Jak to działa
Kontrakt zmiany: definicja „done” i klasy ryzyka
Największą różnicę zrobiło wprowadzenie prostego kontraktu: każda zmiana ma klasę ryzyka i przypisane minimalne wymagania.
Klasy ryzyka
- R0 (niski): copy, grafiki, drobne ustawienia bez wpływu na layout i tracking.
- R1 (średni): zmiany layoutu, nowe sekcje, zmiany formularzy, zmiany w ustawieniach wtyczek.
- R2 (wysoki): nowy JS, nowe integracje, zmiany globalne (header/footer), zmiany cache/security, migracje, duże przebudowy.
Definicja „done” (minimum)
- R0: preview + szybki smoke na mobile/desktop.
- R1: staging/preview + smoke + weryfikacja formularzy/tracking (jeśli dotyczy).
- R2: staging + review techniczne + plan rollback + krótka obserwacja po wdrożeniu.
To jest proste, ale usuwa chaos. Zmiana „tylko wklejmy skrypt” automatycznie wpada w R2 i nie udajemy, że jest inaczej.
Wnioski w punktach
- Najlepszy proces to taki, który rozróżnia ryzyko, a nie traktuje wszystko tak samo.
- Klasy ryzyka ograniczają spory „czy trzeba review” – bo odpowiedź wynika z kontraktu.
- Definicja „done” jest krótsza, gdy jest minimalna i egzekwowalna.
Ścieżka od prośby do wdrożenia: intake, review, release
Ułożyliśmy jednolitą ścieżkę, która działa zarówno dla „wrzućcie sekcję”, jak i dla „włączmy nową integrację”.
1) Intake: jedna bramka, jedno miejsce prawdy
Każda zmiana wpada do jednego backlogu (np. tablica w narzędziu PM). Minimum pól:
- opis celu biznesowego („po co”),
- URL / obszar,
- klasa ryzyka (R0/R1/R2),
- owner po stronie biznesu i owner techniczny,
- deadline (jeśli jest) + kontekst kampanii.
To eliminuje „zmiany z DMa”, które nie mają właściciela i nie mają kryteriów sukcesu.
2) Review: nie „ładnie/nieładnie”, tylko ryzyko i kontrakty
Review w naszym wydaniu to krótkie pytania:
- Czy zmiana dotyka formularzy? Jeśli tak – jakie eventy/leady mają przejść?
- Czy zmiana dotyka globalnych styli/JS? Jeśli tak – czy ma izolację (scoping)?
- Czy zmiana wpływa na performance (nowe skrypty, ciężkie obrazki)?
- Jaki jest plan rollback?
To review jest krótkie, ale jest „o mechanice”, nie o gustach.
3) Release: okna wdrożeniowe i „kto trzyma pager”
Dla R2 wprowadziliśmy prostą zasadę: wdrożenia w godzinach, gdy ktoś jest dostępny na reakcję. Nie chodzi o formalny on-call. Chodzi o zdrowy rozsądek.
Zachowanie, które działa:
- release ma „release ownera” (jedna osoba),
- jest plan: wdrażamy, patrzymy na sygnały, zamykamy.
To jest kultura odpowiedzialności, a nie kultura heroizmu.
Release bez stresu: checklisty i „feature flags” dla marketingu
Checklisty brzmią nudno, dopóki nie zobaczysz, ile razy ratują produkcję.
Checklist: release dla R1/R2 (przykład)
[ ] Cel zmiany i kryterium sukcesu opisane (1–2 zdania)
[ ] Klasa ryzyka przypisana (R1/R2)
[ ] Staging/preview obejrzane na: mobile + desktop
[ ] Formularze (jeśli dotyczy): wysyłka OK + potwierdzenie w CRM/mailu
[ ] Tracking (jeśli dotyczy): eventy/konwersje nie zniknęły
[ ] Nowe assety: obrazy zoptymalizowane (format, waga)
[ ] Nowe skrypty: ładowanie asynchroniczne / opóźnione (jeśli możliwe)
[ ] Plan rollback: cofnąć do wersji X / wyłączyć widget / przywrócić template
[ ] Po wdrożeniu: 10 min obserwacji + szybki smoke na kluczowych URL„Feature flags” w świecie WordPressa
W aplikacjach mamy flagi. W WordPressie też da się osiągnąć podobny efekt, tylko innymi narzędziami:
- duplikat sekcji ukryty warunkowo (np. klasa + CSS),
- publikacja w trybie „draft” + przełączenie o konkretnej godzinie,
- wtyczki A/B testów (ostrożnie, bo potrafią psuć performance),
- prosty toggle w ustawieniach motywu / customizer (jeśli jest).
Nie chodzi o idealne flagi. Chodzi o możliwość szybkiego wyłączenia elementu bez „grzebania w nocy”.
Wnioski (praktyczne)
- „Rollback” w marketingu często oznacza „wyłącz komponent”, a nie „przywróć deployment”.
- Warto projektować zmiany tak, żeby można je było odwrócić w 30 sekund.
- Checklisty mają sens tylko, jeśli są krótkie i używane zawsze dla R1/R2.
Blameless postmortem, który coś zmienia
Blameless nie znaczy „bez wniosków”. Blameless znaczy: szukamy przyczyn systemowych, a nie kozła ofiarnego.
U nas postmortem ma stałą strukturę i limit czasu (żeby nie był esejem).
Szablon postmortem (krótki i użyteczny)
## Incydent: <krótki tytuł> (data, czas)
### Impact
- Kogo dotknęło: (np. 100% ruchu / tylko mobile / tylko kampania X)
- Co nie działało: (formularze / layout / tracking / login)
- Szacunek wpływu: (np. leady utracone – szacunek / spadek konwersji)
### Timeline (UTC lub lokalny)
- 10:02: wdrożenie zmiany
- 10:07: pierwsze zgłoszenie / alert
- 10:15: diagnoza
- 10:22: rollback / fix
- 10:35: potwierdzenie stabilności
### Root cause (systemowo)
- Co było bezpośrednią przyczyną?
- Jaki brak kontrolki to umożliwił? (np. brak smoke testu formularza)
### Detection & response
- Jak wykryliśmy?
- Co spowolniło reakcję?
- Co zadziałało dobrze?
### Action items (konkret, owner, termin)
- [ ] <działanie> – owner: X – do: YYYY-MM-DD
- [ ] <działanie> – owner: Y – do: YYYY-MM-DD
### Lessons learned
- 3–5 zdań: co zmieniamy w procesie/systemieKlucz to action items. Bez nich postmortem jest terapią, nie inżynierią. Action items muszą być małe i wdrażalne:
- dodać punkt do checklisty,
- ustalić ownera integracji,
- przenieść fragment JS do jednego miejsca,
- dodać alert na spadek leadów (jeśli macie sygnał).
2 zachowania, które utrzymują kulturę zdrową
- Postmortem nie jest oceną człowieka. Jest analizą systemu.
- Działania mają właściciela i termin. Bez tego nic się nie zmienia.
Wyniki / metryki / lekcje
Jeśli nie mierzysz, to nie wiesz, czy proces pomaga. Ale nie potrzebujesz 20 KPI. Wystarczą 4 proste metryki z DevOps-owego świata, dopasowane do realiów WordPressa.
Metryki, które monitorujemy (prosto)
- Lead time: od zgłoszenia do wdrożenia (median).
- Change failure rate: % zmian, po których jest hotfix/rollback (dla R1/R2).
- MTTR: czas od wykrycia do przywrócenia działania.
- Incydenty „po godzinach”: ile razy musieliśmy reagować poza oknem.
Nie podaję „twardych liczb” jako faktów, bo to zależy od zespołu i ruchu, ale typowy efekt po wdrożeniu takiego systemu (realistyczny szacunek) to:
- spadek change failure rate o 20–40% po 4–8 tygodniach,
- skrócenie MTTR o 30–60% (bo mamy logikę rollback + lepszy tracking „co weszło”),
- mniej „piątkowych niespodzianek” dzięki oknom wdrożeniowym i klasom ryzyka.
Najważniejsze lekcje:
- Proces nie może być „dla wszystkiego” – musi być skalowany do ryzyka.
- Kultura to zachowania, nie slajdy. Najwięcej zmieniają drobne nawyki: owner, rollback, smoke.
- Postmortem jest inwestycją tylko wtedy, gdy kończy się zmianą systemu.
Co dalej / roadmapa
Gdy fundament działa, kolejne kroki dobieramy pod największe źródła chaosu.
- Centralizacja „custom code”
- Jeden mechanizm na JS/CSS (np. w motywie lub w jednym pluginie),
- zero rozproszonych snippetów po widgetach.
Efekt: łatwiejszy debug i mniejsze ryzyko konfliktów.
- Lekka automatyzacja smoke testów
- Minimalny skrypt/Playwright/Cypress na kluczowe URL: homepage + landing + formularz.
Nawet 3 testy potrafią złapać 80% regresji.
- Minimalny skrypt/Playwright/Cypress na kluczowe URL: homepage + landing + formularz.
- Budżet performance jako „kontrakt”
- Limity na wagę obrazów,
- zasady dla skryptów third-party.
To ogranicza „przypadkowe psucie INP/LCP”.
- „Change calendar” dla kampanii
- Kalendarz dużych kampanii i freeze window (np. 2 godziny przed startem),
- żeby nie robić dużych zmian w najgorszym momencie.
- Onboarding i runbooki
- Krótki dokument: „jak wdrażamy”, „jak robimy rollback”, „gdzie jest custom code”.
To skaluje kulturę na nowe osoby.
- Krótki dokument: „jak wdrażamy”, „jak robimy rollback”, „gdzie jest custom code”.
Wnioski
Jeśli Twoje strony marketingowe żyją w trybie „szybko, szybko”, to nie potrzebujesz ciężkiego procesu. Potrzebujesz barier bezpieczeństwa, które kosztują mało, a ratują często: klasy ryzyka, definicja „done”, checklisty dla R1/R2, plan rollback i postmortem z action items.
Najlepszy znak, że to działa? Zespół przestaje być zaskakiwany. Zmiany dalej wchodzą szybko, ale nie wchodzą „w ciemno”. A incydenty, które się zdarzą (bo zawsze się zdarzą), zostawiają po sobie ulepszony system, a nie frustrację.
Jeśli chcesz to wdrożyć u siebie, zacznij od dwóch rzeczy:
- klasy ryzyka + jedna checklist dla R1/R2,
- szablon postmortem z ownerami i terminami.
A potem iteruj – dokładnie tak, jak iterujesz produkt.