samil.pl

Realizacje

18 spraw, opisanych tak, jak są zapisane

Każda ma ślad w moich rozliczeniach albo w kodzie. Klienta nazywam tylko wtedy, gdy mam na to zgodę. Nie podaję przyczyn ani wyników, których nie udokumentowałem - jeśli czegoś nie wiem, piszę to wprost.

Część z nich opisuję też na stronach dla sklepów, agencji i software house'ów, razem z przebiegiem współpracy. Bezpłatną rozmowę, płatny audyt i sposób wyceny znajdziesz na stronie Jak pracuję.

Awarie na produkcji

Sklep nie działa - i trzeba ustalić, gdzie leży problem

Trzy awarie: moduł płatności dostawcy, zapełniony dysk i jedna, której przyczyny nie ustalono. W dwóch pierwszych problem leżał poza kodem sklepu.

toys4boys.plgrudzień 2024

Sklep przestał odpowiadać w szczycie sprzedażowym - moduł InPost Pay

Sytuacja

Ruch obsługiwany przez moduł płatności InPost Pay przeciążył serwer w szczycie sprzedażowym. Sklep nie działał od godziny do dwóch.

Co zrobiłem

Analiza logów, identyfikacja źródła ruchu, tymczasowe wyłączenie modułu, reguły w Cloudflare. Źródło problemu leżało po stronie modułu dostawcy. Po telekonferencji z InPost dostawca wprowadził zmiany po swojej stronie, a ja włączyłem moduł z dodatkowymi zabezpieczeniami.

1-2 h

przestój w szczycie sprzedażowym

bez kodu

logi, reguły w Cloudflare i rozmowa z dostawcą

klient bezimiennymaj 2025

Sobota, strona nieosiągalna - dwa sklepy na nowym serwerze tego samego dnia

Sytuacja

Zgłoszenie w sobotę: strona się nie otwiera. Pamięć serwera podwyższona, ale nieprzekroczona, do bazy szło więcej połączeń i zapytań niż zwykle, a ich źródła nie było widać.

Co zrobiłem

Przeszedłem po kolei każdy element. Przeniosłem domenę do Cloudflare, żeby mieć kontrolę nad źródłami ruchu, włączyłem zabezpieczenia przed botami po stronie hostingu, wyczyściłem cache i zbędne pliki. Wyłączyłem wszystko poza dwoma sklepami klienta, żeby w ogóle się otwierały, a zebrane dane przekazałem hostingowi. Jeszcze tego samego dnia przeniosłem oba sklepy na serwer, na którym mogłem pracować: bazy, pliki, konfigurację i SSL. W poniedziałek ponownie uruchomiłem integrację z BaseLinkerem.

Czego nie wiem

Co dokładnie położyło stronę, nie zostało ustalone. Dlatego nie podaję przyczyny.

1 dzień

od zgłoszenia do przeniesienia obu sklepów na inny serwer

2

sklepy przeniesione razem z bazami, plikami i SSL

klient bezimiennysierpień 2020

Nie zawsze kod: sklep stanął, bo skończyło się miejsce na serwerze

Sytuacja

Strona przestała działać. Diagnoza wskazała przepełniony dysk serwera.

Co zrobiłem

Najpierw porządki na szybko, żeby uruchomić stronę. Potem dokładna analiza zawartości serwera i usunięcie zbędnych danych. Przy okazji sprawdziłem, które rozmiary zdjęć generuje szablon, i wyłączyłem nieużywane, żeby zajmowały mniej miejsca.

55 GB+

zbędnych danych usuniętych z serwera

serwer

awaria poza kodem sklepu

Wydajność i ruch

Wolny sklep ma konkretną przyczynę - i da się ją zmierzyć

zmienolej.plwyszukiwarka dopasowań

Dobór oleju do auta bez liczenia przy każdym zapytaniu

Problem

Dobór filtra czy oleju do konkretnego auta wymaga przecięcia kilku cech naraz: marki, modelu, silnika. Przy 4800 produktach i prawie 25 000 kategorii dopasowań liczenie tego na żądanie jest wolne.

Rozwiązanie

Wynik nie jest liczony przy wejściu użytkownika - moduł materializuje go cyklicznie przez crona, partiami po 200 rekordów, i aktualizuje tylko różnicę zamiast przebudowywać wszystko od nowa.

~3 mln

wpisów powiązań produkt↔kategoria

25 000

kategorii dopasowań marka/model/silnik

klient bezimiennymaj 2020

Jeden moduł odpowiadał za połowę czasu ładowania

Problem

Sklep ładował się wolno. Zadanie: skrócić czas wykonywania operacji po stronie serwera.

Co zrobiłem

Zmierzyłem czasy profilerem PrestaShop i w logach serwera. Największe opóźnienie dawał moduł MailChimp. Razem z tym wyłączyłem zbędne moduły, dodałem indeksy w bazie, ustawiłem cache plików statycznych i zoptymalizowałem zdjęcia produktów. Wynik w testach szybkości Google się poprawił.

50%

czasu ładowania przypadało na jeden moduł

~10%

miejsca zaoszczędzone na zdjęciach produktów

klient bezimienny2026

130 tysięcy z 200 tysięcy zapytań dziennie to były boty

Problem

Sklep obsługiwał ok. 200 000 zapytań na dobę, z czego 130 000 pochodziło od botów. Jeden crawler, Meta-ExternalAgent, odpowiadał za ponad 100 000 z nich.

Co zrobiłem

Celem nie była blokada, tylko kontrola: kto przychodzi i po co. Podzieliłem ruch w Cloudflare na kategorie: crawlery AI, asystenci AI, wyszukiwarki AI i klasyczne wyszukiwarki. Ustawiłem reguły WAF i ograniczenie częstotliwości w robots.txt. Na końcu porównałem ruch sprzed wdrożenia i po nim w raporcie dla klienta.

65%

zapytań dobowych pochodziło od botów (130 000 z 200 000)

100 000+

zapytań na dobę od jednego crawlera

Rdzeń PrestaShop i moduły

Rdzeń, override czy moduł: gdzie powinna trafić zmiana

sklep4x4.expedycja.plpublicznie weryfikowalne

Poprawka przyjęta do rdzenia PrestaShop

Problem

Stany magazynowe zestawów się nie zgadzały. Po wyłączeniu modyfikacji i porównaniu plików z czystym rdzeniem wyszło, że błąd leży w silniku PrestaShop: Pack::getQuantity ignorował typ „Decrement pack only”, bo empty(0) zwraca prawdę.

Co zrobiłem

Zgłosiłem błąd na GitHubie razem z poprawką. Opiekun projektu włączył ją do gałęzi 9.2.x - możesz to sprawdzić sam, bez pytania mnie o referencje. W sklepie klienta obejście przeniosłem z modyfikacji rdzenia do override.

PR #42123

poprawka włączona do gałęzi 9.2.x

3

zgłoszenia do rdzenia PrestaShop na GitHubie

karcher-apeks.plstyczeń 2026

Sortowanie przed paginacją i wyjątek od własnej reguły

Problem

Lista produktów miała być sortowana po dostępności do sprzedaży. Żeby kolejność zgadzała się na każdej stronie listy, sortowanie musi się odbyć przed paginacją, w rdzeniu.

Co zrobiłem

Przeanalizowałem listowanie w rdzeniu: providery, hooki, paginację, stany i backorders. Przetestowałem koncepcję i wdrożyłem sortowanie po available_for_order. Przy ograniczonym budżecie klienta część zmiany zostawiłem w klasie Category zamiast w override. To świadomy wyjątek, nie reguła: przy aktualizacji tę zmianę trzeba przenieść.

produkcja

rozwiązanie działa w sklepie klienta

core + moduł

zmiana w klasie Category i w module filtrowania

moduł własnydyrektywa (UE) 2023/2673

Jeden moduł na trzy generacje PrestaShop

Sytuacja

Od 19 czerwca 2026 każdy sklep sprzedający konsumentom w Unii musi udostępnić cyfrową funkcję odstąpienia od umowy, niezależnie od tego, na której wersji PrestaShop stoi.

Co zrobiłem

Napisałem moduł samilreturns: formularz odstąpienia dla klienta bez konta, wielojęzyczny, zgodny z multistore, na PrestaShop 1.6, 1.7 i 8. Różnice między 1.6 a nowszymi wersjami trzyma jedna warstwa zgodności, a nie warunki rozsypane po kodzie. Kod działa jednocześnie na PHP 5.6 i 8.x, testuję go na trzech wersjach PrestaShop w Dockerze. Pisałem go z pomocą AI, na środowisku pracy zbudowanym pod ten projekt.

1.6 → 8

wersje PrestaShop obsługiwane jednym modułem

produkcja

działa w kilku sklepach

Dane i stany magazynowe

Kiedy baza mówi co innego niż magazyn

grupa kilku sklepówmultistore, PrestaShop 1.6

Poprzedni wykonawca zmieniał stany magazynowe zapytaniami SQL - dane się rozjechały

Zastane

Inny wykonawca wdrożył na produkcji moduł zmieniający stany magazynowe zapytaniami SQL z pominięciem klas PrestaShop. Ruch magazynowy przestał się zgadzać na grupie sklepów na wspólnej instalacji.

Co zrobiłem

Zlokalizowałem błąd, naprawiłem dane na podstawie informacji z bazy i zmieniłem wdrożony moduł. Dostęp do produkcji dla poprzedniego wykonawcy został zablokowany.

multistore

grupa kilku sklepów z zaawansowanym zarządzaniem magazynem

kilka tys.

produktów z błędnymi stanami do naprawy

grupa kilku sklepów2016-2017

Standard programowania dla zespołu, który nie miał żadnego

Sytuacja

Ten sam klient: bez własnego działu IT, kilka sklepów na multistore i kilku zewnętrznych programistów.

Co zrobiłem

Spisałem kilkanaście zasad: osobne tabele zamiast zmian w rdzeniu, natywne funkcje do komunikacji z bazą, testy na własnym środowisku, weryfikacja u mnie przed produkcją. Egzekwowałem je przez kontrolę kodu i koordynowałem ok. 10 osób: programistów, grafika, hosting i magazyn. Osobno, w 2017 roku, wdrożyłem dwa mechanizmy kontroli spójności stanów uruchamiane cronem.

ok. 10

osób koordynowanych wokół sklepów klienta

80+

produktów z rozjazdem sum poprawionych przy wdrożeniu kontroli spójności

klient bezimienny2018

Drugie zamówienie nadpisało pierwsze

Problem

Po złożeniu drugiego zamówienia w pierwszym zmienił się klient oraz oba adresy: dostawy i faktury.

Co zrobiłem

Odtworzyłem oś czasu ze znaczników w bazie. Drugie zamówienie zrobiło update pierwszego zamiast nowego wpisu, a oba koszyki odwoływały się do tego samego klienta. Potem usunąłem moduł zmieniający numery zamówień i uprościłem ich generowanie, żeby wykluczyć moduły, które mogły wpływać na błąd. Sprawa nie zamknęła się jednym wnioskiem, dalej była obserwowana.

3 pola

nadpisane w pierwszym zamówieniu: klient, adres dostawy, adres faktury

oś czasu

mechanizm wskazany ze znaczników w bazie

Środowiska i bezpieczeństwo

Zanim cokolwiek trafi na produkcję

mierzymy.plsklep.dayspashe.pl2025

Dev, staging i produkcja z automatycznym wdrażaniem z GitHuba

Co zrobiłem

Osobne bazy i konfiguracja dla dev i staging, konta FTP dla każdego środowiska, basic auth na środowiskach testowych, zabezpieczenie .htpasswd i repozytorium przed dostępem z zewnątrz. Webhook z GitHuba aktualizuje gałęzie na serwerze, a hook post-merge czyści cache po wdrożeniu zmian.

Utrzymanie

To nie jest jednorazowa konfiguracja. W listopadzie 2025 naprawiłem webhook, który przestał się uruchamiać na dev i staging.

3

środowiska: dev, staging, produkcja

ok. 90%

moich klientów pracuje na Git i GitHubie

duetunicato.pl2026

Sklep skonfigurowany automatycznie, bez kontroli zabezpieczeń

Zastane

Cron ustawiony błędnie, więc nie odświeżały się sitemapa, wyniki wyszukiwania, filtrowanie ani ceny do Omnibusa. Ponad 40 nieaktualnych modułów. Dostęp SSH otwarty, hasła do FTP i bazy do wymiany, brak CDN.

Co zrobiłem

Zacząłem od audytu serwera i sklepu. Podpiąłem pod crona indeksy, sitemapę i Omnibus, zaktualizowałem moduły, poprawiłem sitemapę i robots.txt. Wymiana haseł, wyłączenie SSH i Cloudflare zostały wdrożone po audycie. Przy aktualizacjach znalazłem zmiany wprowadzone bezpośrednio w źródłach modułu wFirma, które utrudnią jego kolejne aktualizacje.

40+

nieaktualnych modułów zaktualizowanych

3

zadania automatyczne podpięte pod crona: indeksy, sitemapa, Omnibus

Dla agencji marketingowych

Pomiar i feedy: cztery sprawy z 2026 roku

Współpracuję z agencją online-partners, w 2026 roku przy kilku projektach jej klientów. Klientów końcowych nie nazywam, opisuję problem i moją część pracy.

klient agencjiluty-marzec 2026

Audyt pomiaru konwersji: czy zamówienia trafiają do GA4

Sytuacja

Agencja wdrożyła pomiar przez GTM i moduł w sklepie. Potrzebowała odpowiedzi, czy dane z zamówień docierają do GA4 w całości i co dokładnie zbiera moduł.

Co zrobiłem

Przeanalizowałem moduł, bazę, crona i statusy zamówień pod kątem miejsc, w których dane mogą zginąć. Sprawdziłem, jakie dane zbiera moduł, w tym identyfikatory łączące zdarzenie z użytkownikiem. Zdarzenia purchase dosyłane cronem weryfikowałem w GA4 z raportów, bo w tym module nie dało się włączyć debugu. Przepływ przetestowałem na zamówieniach na produkcji, a na końcu sprawdziłem, czy cron jest rzeczywiście podpięty.

raport

z listą miejsc, w których dane mogą zginąć

klient agencjimarzec-maj 2026

Transakcje bez sesji i dane, które przestały się zapisywać

Problem

Bez zgód transakcja trafiała do GA4 jako „not set”, bez sesji i użytkownika. Jedna z testowych transakcji była w bazie oznaczona jako wysłana, a w GA4 w ogóle jej nie było. Zgody ustawiały się za późno i w złej kolejności. Po zmianie konfiguracji GTM dane w GA4 przestały się zapisywać, choć w czasie rzeczywistym ruch było widać.

Co zrobiłem

Przetestowałem zamówienia bez zgód i ze zgodami, sprawdziłem kolejność uruchamiania hooków modułów oraz konfigurację tagu, zgód i filtrów w GA4. Wskazałem błędy w GTM, a po aktywacji poprawnej wersji dane zaczęły się zapisywać. Zaleciłem też cron dosyłający brakujące zamówienia co 10 minut.

10 min

odstęp crona dosyłającego brakujące zamówienia

klient agencjiczerwiec 2026

Sklep, CRM i GA4 pokazywały trzy różne zestawy zamówień

Problem

Liczba i kwoty zamówień w GA4 nie zgadzały się ze sklepem. Agencja podejmowała decyzje na danych, których nie mogła zweryfikować.

Co zrobiłem

Porównałem zamówienia z bazy sklepu z GA4 i z tym, co przekazał CRM. Wskazałem pierwszy błąd po stronie CRM, wypisałem brakujące zamówienia i opisałem pięć wzorców naliczania kwot. Prawidłowy był tylko jeden. W pozostałych kwota nie uwzględniała rabatu, była naliczona podwójnie albo liczona brutto zamiast netto. Rozbieżność kwot została naprawiona.

129 z 130

zamówień trafiło do GA4 w pierwszym sprawdzanym okresie (99%); w szerszym 285 z 293 (97%)

108 z 130

zamówień z tego samego okresu przekazał CRM - brak 22 to pierwszy wykryty błąd

klient agencjimarzec-kwiecień 2026

Ceny i stany w Merchant Center odświeżane raz na dobę

Problem

Serwer aktualizował plik feedu co 3 godziny, a Merchant Center pobierał go raz na 24 godziny. Platforma sklepu, oparta na modelu SaaS, udostępniała tylko jeden plik i nie miała Merchant API.

Co zrobiłem

Przeanalizowałem cztery warianty, od Merchant API po pliki uzupełniające, i przetestowałem odczyt przez API na koncie klienta. Zaproponowałem podział pracy: co ma zbudować wykonawca po stronie platformy, a co przekazuje marketing. To była analiza i rekomendacja. Wdrożenie mechanizmu leżało po stronie innego wykonawcy.

4

warianty aktualizacji danych w Merchant Center

24 h

odstęp między pobraniami feedu w stanie zastanym

Następny krok

Opisz problem, nie rozwiązanie

Napisz, co się dzieje i od kiedy. Zaczynamy od krótkiej rozmowy bez zobowiązań.

Przejdź do kontaktu