Firma z ponad 20-letnim doświadczeniem na rynku pożyczek pozabankowych, kilkadziesiąt zapytań miesięcznie, rozbudowana oferta produktowa — i strona internetowa, która była technicznym hamulcem całego biznesu. Klasyczny WordPress z rozbudowanymi wtyczkami, wolny TTFB, brak kontroli nad frontendem i coraz trudniejsza rozbudowa o nowe funkcjonalności.

Kiedy podhipoteke24.pl zgłosiło się do nas, zakres projektu był jasny: pełna przebudowa architektury — od monolitycznego WordPressa do nowoczesnego stacku headless, który daje przewagę zarówno w wydajności, jak i możliwościach dalszego rozwoju. Poniżej opisuję dokładnie, co zbudowaliśmy, jakie decyzje techniczne podjęliśmy i dlaczego.

Dlaczego headless? Decyzja architektoniczna

Klasyczny WordPress w branży finansowej napotyka na specyficzne ograniczenia. Klient potrzebował czegoś, czego żaden motyw WP nie byłby w stanie zapewnić bez kompromisów: 8 zaawansowanych narzędzi finansowych z logiką kalkulacyjną, interaktywnym UI i generowaniem raportów PDF. Próba wbudowania tego w WordPress oznaczałaby labirynt wtyczek, PHP po stronie klienta i niemożliwe do utrzymania rozwiązania.

Architektura headless rozwiązuje ten problem elegancko: WordPress pozostaje backendem treści — redaktorzy pracują w znajomym panelu, SEO jest obsługiwane przez Yoast — a frontend działa jako osobna aplikacja Next.js. Komunikacja przez GraphQL (WPGraphQL) daje pełen dostęp do wszystkich danych CMS-a bez żadnych kompromisów narzucanych przez motyw.

Aspekt Klasyczny WordPress Headless Next.js
WydajnośćPHP na każdym żądaniu, TTFB >800msISR + Edge CDN, TTFB <200ms
FrontendMotyw narzuca ograniczeniaPełna kontrola — React, Tailwind, TypeScript
Narzędzia finansoweWtyczki + shortcodes + hackiDedykowane komponenty React z pełną logiką
SEOYoast działa natywnieYoast zachowany przez WPGraphQL
SkalowanieKażda nowa funkcja = wtyczka lub hackNowe route'y w Next.js, niezależnie od WP

Stack technologiczny — konkretne wersje, konkretne powody

Stos dobierałem pod kątem długoterminowego utrzymania i możliwości zespołu klienta:

  • Next.js 16.1.6 + React 19.2.3 — najnowsze mechanizmy renderowania, streaming SSR i App Router jako domyślna architektura routingu.
  • TypeScript 5 — statyczne typowanie eliminuje całą klasę błędów w runtime'ie, szczególnie ważne przy skomplikowanej logice kalkulatorów finansowych.
  • Tailwind CSS v4 — zero runtime, style kompilowane statycznie, brak wpływu na Core Web Vitals.
  • Apollo Client 4.1.4 + GraphQL 16.12.0 — komunikacja z WPGraphQL z cache'owaniem zapytań po stronie klienta.
  • Radix UI + shadcn/ui — dostępne komponenty UI bez narzucania stylów, idealne dla Tailwinda.
  • React PDF Renderer — generowanie spersonalizowanych raportów PDF po stronie klienta bez zewnętrznych serwisów.
  • Vercel + Edge Network + Speed Insights — deployment na globalny CDN z analityką wydajności.

Wydajność — jak architektura daje przewagę, której WP nie osiągnie

Wydajność w headless to nie kwestia optymalizacji — to kwestia fundamentów. Oto konkretne mechanizmy:

ISR (Incremental Static Regeneration) — strony są generowane statycznie przy pierwszym żądaniu i odświeżane w tle co 24 godziny. Użytkownik zawsze dostaje gotowy HTML z cache'u CDN, serwer PHP nie jest w ogóle pytany. W klasycznym WP nawet z agresywnym cachowaniem każde żądanie z niezakeszowanego IP powoduje wywołanie PHP.

Next.js Image z WebP i lazy loadingiem — wszystkie obrazy są automatycznie konwertowane do WebP, serwowane w odpowiednim rozmiarze (srcset) i ładowane leniwie. W klasycznym WP osiągnięcie tego wymaga przynajmniej dwóch wtyczek, które same w sobie spowalniają stronę.

Edge deployment przez Vercel CDN — treść jest serwowana z węzła geograficznie najbliższego użytkownikowi. Dla polskiego ruchu to kilkadziesiąt milisekund różnicy na starcie każdego żądania.

Apollo Client v4 z cache'owaniem GraphQL — zapytania do WordPressa nie są powtarzane przy każdym renderze. Apollo przechowuje odpowiedzi w pamięci podręcznej — dla powtarzających się danych (np. menu, treści stron) WordPress jest odpytywany jednorazowo.

8 narzędzi finansowych — interaktywny hub kalkulatorów

To serce projektu pod względem funkcjonalności i największa wartość dla użytkownika. Każde narzędzie to samodzielny komponent React z własną logiką kalkulacyjną, formularzem leadowym i integracją z GA4.

Narzędzie Co robi Output
Kalkulator ratySymulacja miesięcznej raty pożyczkiHarmonogram spłat + lead
Estymator kwotyIle można pożyczyć pod daną nieruchomośćSzacunkowa kwota + lead
Kalkulator konsolidacjiAnaliza opłacalności konsolidacji długówOszczędności miesięcznie + lead
PorównywarkaZestawienie różnych scenariuszy pożyczkowychTabela porównawcza
Diagnostyka finansowaQuiz kwalifikujący do produktuRekomendacja produktu
Wynik diagnostykiSpersonalizowany raport na podstawie quizuPDF wysyłany na email
Wykres spłatyWizualizacja harmonogramu (Recharts)Interaktywny wykres
Wykres oszczędnościPorównanie kosztów konsolidacjiWykres Recharts + lead

Każde z narzędzi generuje lead do backendu WordPress przez dedykowane REST API i jest w pełni śledzone w GA4 przez zdarzenia tool_started, tool_result i quiz_step/quiz_completed. Wybrane narzędzia generują spersonalizowany raport PDF — tworzony po stronie klienta przez React PDF Renderer i wysyłany na email użytkownika przez endpoint POST /wp-json/ph24/v1/send-pdf.

Własna wtyczka WordPress — system zarządzania leadami zamiast CRM

Zamiast podpinać zewnętrzny CRM z miesięcznym abonamentem i zależnością od zewnętrznego serwisu, zdecydowaliśmy się zbudować dedykowaną wtyczkę WordPress obsługującą cały lejek sprzedażowy.

Wtyczka podhipoteke-leads udostępnia REST API na /wp-json/ph24/v1/ i zarządza własną tabelą ph24_leads w bazie danych WordPress.

Metoda Endpoint Funkcja
POST/leadsPrzyjmowanie leadów z Next.js (rate limiting: 5 req/min per IP)
GET/leads + filtryPanel administracyjny (tylko admin, paginacja)
PATCH/leads/{id}Zmiana statusu leada
DELETE/leads/{id}Usuwanie leada
GET/leads/exportEksport CSV z BOM (gotowy do Excela)
POST/send-pdfWysyłka raportu PDF na email (base64 → wp_mail)

Tabela ph24_leads przechowuje pełen zestaw danych: imię, telefon, email, miasto, wiadomość, dane z narzędzi (JSON), status leada, IP oraz pełną atrybucję UTM: utm_source, utm_medium, utm_campaign, utm_content, utm_term i gclid. Każdy lead wie, skąd pochodzi.

Panel administracyjny w WordPress pozwala zarządzać leadami bez wychodzenia ze znajomego interfejsu: filtrowanie po statusie i źródle ruchu, kolorowe badge'e SEO vs. Google Ads, zmiana statusu inline przez AJAX, podgląd danych z kalkulatorów i eksport CSV jednym kliknięciem.

UTM attribution end-to-end — skąd pochodzi każdy lead

To element, który odróżnia profesjonalne wdrożenie od przeciętnego. Standardowe formularze kontaktowe zbierają imię i telefon. Tu zbieramy pełną ścieżkę, którą przyszedł użytkownik.

Mechanizm działa w trzech krokach:

  1. Przechwytywanie przy wejściu — biblioteka analityczna czyta parametry URL przy pierwszej wizycie i zapisuje je w sessionStorage.
  2. Dołączanie do zdarzenia GA4 — przy form_submit parametry UTM są dołączane do payloadu zdarzenia.
  3. Zapisanie w bazie WP — te same parametry trafiają do każdego rekordu leada w bazie danych.

Efekt: klient może w dowolnym momencie wyeksportować listę leadów i zobaczyć, ile pochodzi z organicznego SEO, ile z konkretnej kampanii Google Ads (po utm_campaign), a ile trafiło bezpośrednio. To dane, których nie daje żaden standardowy formularz kontaktowy.

Śledzenie konwersji GA4 — 14 typów zdarzeń

Centralna biblioteka lib/analytics.ts obsługuje cały tracking w jednym miejscu. Żadnych rozproszonych wywołań po komponentach — jedno wywołanie funkcji, jeden punkt wejścia, pełna spójność danych.

Zdarzenie GA4 Trigger
phone_clickKliknięcie numeru telefonu
cta_clickKliknięcie przycisku CTA
form_startPierwsza interakcja z formularzem
form_submitWysłanie formularza + pełna atrybucja UTM
faq_expandRozwinięcie pytania FAQ
scroll_depthGłębokość scrolla (25 / 50 / 75 / 100%)
file_downloadPobranie raportu PDF
cookie_consentAkceptacja lub odrzucenie cookies
tool_startedUruchomienie narzędzia finansowego
tool_resultWynik kalkulacji (z danymi wejściowymi)
quiz_stepPrzejście do kolejnego kroku diagnostyki
quiz_completedUkończenie diagnostyki finansowej

Osobne śledzenie konwersji Google Ads odpala się przy każdym wysłaniu formularza — bez duplikowania kodu, bo każde miejsce wywołuje tę samą funkcję z biblioteki analytics.

42 landing page'e dla miast — lokalne SEO w skali

Pożyczki pod zastaw nieruchomości mają charakter lokalny — klienci szukają konkretnych fraz z nazwą miasta. Sieć 42 landing pages dla największych miast Polski odpowiada na ten popyt.

To nie są strony z wymienioną tylko nazwą miasta. Każda z nich zawiera lokalne ceny nieruchomości (rynek wtórny i pierwotny), dzielnice danego miasta, treści SEO w poprawnych formach gramatycznych oraz dane strukturalne Schema.org z atrybutem LocalBusiness. Strony są generowane statycznie przez generateStaticParams() i serwowane z CDN — zero dodatkowego obciążenia serwera przy ruchu.

Middleware 301 i dynamiczna sitemap

Next.js middleware obsługuje całą logikę przekierowań w jednym pliku TypeScript — 9 slugów stron usługowych i stare wpisy blogowe przekierowane z zachowaniem wartości SEO. Zero ręcznych wpisów w htaccess, zero wtyczek.

Sitemap XML generuje się automatycznie z rewalidacją co 24 godziny. Pole lastmod pobierane jest bezpośrednio z pola modified WordPressa przez GraphQL — to rzeczywista data ostatniej aktualizacji treści, nie statyczna data deploymentu.

Skala projektu i wyniki

Element projektu Liczba
Komponenty React (TypeScript)60
Route'y aplikacji Next.js25
Zapytania GraphQL (Apollo Client)8
Narzędzia finansowe8
Landing pages miast42
Typy zdarzeń GA414
Pola UTM w bazie leadów6 (+ gclid)

Migracja z klasycznego WordPress do headless odbyła się bez żadnego downtime'u. Nowa architektura daje fundamenty, których monolityczny WP nie był w stanie zapewnić: Core Web Vitals na poziomie niedostępnym dla klasycznego WordPress, system leadów z pełną atrybucją UTM, 8 kalkulatorów jako maszyna do generowania zapytań i fundamenty pod dalsze skalowanie — nowe landing pages, nowe narzędzia, nowe produkty bez dotykania backendu.

Headless to w tym projekcie konkretna decyzja architektoniczna, która rozwiązuje konkretny problem: firma pożyczkowa potrzebuje narzędzi, których klasyczny WordPress nie jest w stanie dostarczyć bez kompromisów. Headless daje obie rzeczy jednocześnie — znajomy panel redakcyjny WP dla treści i pełną swobodę React dla funkcjonalności.