Blog
PLEN

Stripe + BLIK + Przelewy24 dla małych firm — co mi zajęło 6h, a tobie zaoszczędzi tydzień

Setup płatności online dla agroturystyki, sklepu z miodem, kursu — od konta po pierwszy webhook. Konkretne walls które uderzają (BLIK over Stripe, faktury VAT, retencja danych), z linkami do dokumentacji.

·6 min read
Stripe + BLIK + Przelewy24 dla małych firm — co mi zajęło 6h, a tobie zaoszczędzi tydzień

Dostawałem przez ostatnie pół roku 5 razy to samo pytanie: „chcę przyjmować BLIK na stronie, jak to ugryźć". Klient prowadzi agroturystykę / pasiekę / kurs jogi i wie tylko że Stripe jest amerykański, a Przelewy24 polski, a BLIK ma być wszędzie. Tu rozkład tego co realnie wybrałem dla 4 ostatnich klientów i dlaczego.

Trzy pytania zanim wybierzesz dostawcę

  1. Sprzedajesz w PLN czy w EUR/USD? Jeśli głównie PL, Przelewy24 albo Stripe-z-BLIK. Jeśli mix UE, Stripe wygrywa.
  2. Faktury wystawiasz sam czy chcesz żeby system robił? Stripe nie wystawia faktur PL-zgodnych, Przelewy24 i Tpay tak.
  3. Ile transakcji miesięcznie? < 50/mc, BLIK manual link wystarczy. > 50, automation + webhook + DB.

Stripe — kiedy wybierać

Plus:

  • Najlepszy DX (developer experience): docs jak z innej planety, SDK dla wszystkiego
  • Webhooks działają jak prąd, niezawodne, retries, signature verification
  • Dashboard po angielsku ale logiczny, raporty PDF
  • Subscriptions, refunds, dispute management, wszystko out-of-the-box
  • BLIK od września 2024 jest oficjalnie supportowany jako payment method

Minus:

  • Faktury PL-zgodne nie istnieją, Stripe wystawia receipt, nie fakturę. Trzeba zrobić integrację z fakturownią/iFirmą/wFirmą lub Resend + template.
  • 2.9% + 0.30 EUR / transakcja, drożej niż polskie bramki dla małych transakcji
  • Wypłaty na konto PL co 7 dni (default), można skrócić do 2 dni

Setup BLIK on Stripe:

// app/api/checkout/route.ts
import Stripe from "stripe";
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!);
 
export async function POST(req: Request) {
  const { items } = await req.json();
  const session = await stripe.checkout.sessions.create({
    mode: "payment",
    payment_method_types: ["card", "blik", "p24"], // BLIK + Przelewy24 + karty
    currency: "pln",
    line_items: items.map((i) => ({
      price_data: {
        currency: "pln",
        product_data: { name: i.name },
        unit_amount: i.priceCents,
      },
      quantity: i.qty,
    })),
    success_url: `${process.env.SITE_URL}/dziekujemy?session={CHECKOUT_SESSION_ID}`,
    cancel_url: `${process.env.SITE_URL}/koszyk`,
  });
  return Response.json({ url: session.url });
}

Tyle. Stripe Checkout pokazuje w PLN BLIK kod do wpisania, P24 redirect do banku, karty Visa/Mastercard. Mobile-first.

Przelewy24 (P24) — kiedy

Plus:

  • Faktury VAT generowane automatycznie po stronie P24
  • Stawki 1.4-1.9% (zamiast 2.9% Stripe)
  • Polski support (telefon, email po polsku)
  • BLIK natywnie, Apple/Google Pay, wszystkie polskie banki przez pay-by-link

Minus:

  • DX gorszy od Stripe (REST API, dokumentacja w 50% po polsku, w 50% PL/EN mix)
  • Webhooks działają, ale signature verification mniej intuitive
  • Subscriptions wymagają osobnego module

Setup webhook w Next.js:

// app/api/p24/webhook/route.ts
import { createHmac } from "crypto";
 
export async function POST(req: Request) {
  const body = await req.text();
  const sign = req.headers.get("x-p24-signature");
 
  // P24 signs sha384 of (sessionId|orderId|amount|currency|crc)
  const expected = createHmac("sha384", process.env.P24_CRC!)
    .update(body)
    .digest("hex");
 
  if (sign !== expected) return new Response("invalid sig", { status: 401 });
 
  const data = JSON.parse(body);
  if (data.statusCode === 1) {
    // payment confirmed → mark order paid in DB
    await markPaid(data.orderId);
  }
  return new Response("ok");
}

P24 ma sandbox za free, można testować end-to-end bez prawdziwych pieniędzy.

Co wybrałem dla 4 ostatnich klientów

KlientWybórDlaczego
Pasieka (e-commerce miód)P24Faktury VAT auto, klient nie chciał integracji z fakturownią
Demo agroturystykaStripe + BLIKKlient targetuje też turystów z UE, EUR potrzebny
Sala weselna (zaliczki)StripeSubskrypcje (zaliczka + dopłata), Stripe robi to elegancko
Klinika kosmetologicznaP24 + manual BLIK linkMała ilość transakcji, prostszy setup

Pułapki, które realnie uderzają

1. „BLIK przez Stripe wymaga PL business entity." Tak, do października 2024 trzeba było polskiego NIP-u. Od końca 2024 to już nie jest wymagane (international Stripe akceptuje BLIK), ale wielu deweloperów ma stare info. Sprawdź stripe.com/docs/payments/blik.

2. „Faktury VAT z polskimi danymi nabywcy." Stripe nie zbiera NIP-u nabywcy domyślnie. Musisz custom field w Checkout albo własny formularz przed redirect. P24 ma to wbudowane.

3. „RODO i payment data." Nie przechowuj pełnych numerów kart (Stripe i P24 nigdy ich nie wysyłają w webhookach, ale czasem widzę programistów którzy logują request body bez maskowania). Trzymaj tylko last4 i brand.

4. „Refunds i podatek." Refund w Stripe = -X PLN w kasie. Ale jeśli już wystawiłeś fakturę VAT, musisz wystawić korektę. Jeśli używasz fakturowni z auto-syncem do Stripe webhooków, większość tego za ciebie zrobi.

5. „Stripe deklaracja celna." Wypłata Stripe → twoje konto PL = transfer wewnątrzunijny (Stripe Payments Europe SAS, Irlandia). Bez deklaracji celnych. Ale w PIT-cie wypłaty z Stripe to przychód, wpisuj na bieżąco.

Koszty real-world (4 klienci, 6 miesięcy)

Średnie koszty per klient za 6 miesięcy:

Pasieka (P24):     43 transakcji/mc × 89 zł avg = 3 827 zł obrót
                   × 1.6% = 61 zł/mc opłat
                   = 1.6% effective
 
Sala weselna (Stripe): 8 zaliczek/mc × 1500 zł = 12 000 zł
                       × 2.9% + 8×1.20 EUR = ~365 zł/mc
                       = 3.0% effective (drożej, ale subskrypcje wartość warta)

P24 ma ~2x niższe opłaty na małych transakcjach. Stripe tańszy gdy transakcja > 500 zł (bo flat 1.20 EUR rozkłada się).

Decision tree w 30 sekund

  • Sprzedajesz produkty fizyczne / usługi w PLN, średnia transakcja < 200 zł, liczba > 30/mc: P24
  • Sprzedajesz subskrypcje, kursy, mix waluty: Stripe
  • Sprzedajesz okazjonalnie (< 10/mc), klient pyta o BLIK: manual BLIK link generated z bankowości + przelew tradycyjny w stopce. Bez bramki.
  • Targetujesz UE / global: Stripe, ale zintegruj fakturownię
  • Małe firmy z mocnym brandem PL (lokalność istotna): P24 (klient widzi „Przelewy24" przy płatności i ufa)

Co jeszcze warto wiedzieć

  • Tpay istnieje, ale zostawiam za nawias, DX gorszy od P24, ceny porównywalne, marketshare mniejszy.
  • Autopay (Blue Media), używany w transporcie publicznym i parkingach, dla normalnego e-commerce raczej przegrywa z P24.
  • Revolut Business ma checkout link generator, ale bez BLIK-a, nie traktuję jako alternatywę dla Stripe/P24.
  • PayU, działa, polski, ale DX z 2010 roku. Tylko jeśli masz już PayU dla innych projektów i nie chce ci się migrować.

Setup tego całego jest prostszy niż wygląda. Dla pojedynczego klienta to ~6h dewelopera (Stripe full integration z fakturownią) lub ~2h (P24 podstawowy). Dla siebie zrobiłem moduł reusable który dorzucam do każdego nowego e-commerce.

Jeśli chcesz to wdrożyć dla swojej firmy, napisz. Robię też audyt istniejącego setupu (czy nic się nie sypie, czy faktury się wystawiają, czy webhooks dochodzą).