Najpierw dla siebie czy od razu dla branży — jak zbudować pierwszą wersję, której użyje też konkurent?
Zbuduj od razu wielofirmowo, ale uruchom jako pilot u siebie. Identyfikator firmy przy każdym rekordzie i polityki dostępu na wierszach kosztują na starcie godziny; dorobione po starcie wymagają przepisania zapytań, ekranów i migracji całej historii — w Postgresie zmiana typu kolumny przepisuje tabelę z indeksami i chwilowo potrzebuje nawet dwa razy więcej miejsca na dysku.
Które decyzje o „wielu firmach” zapadają pierwszego dnia?
Sześć decyzji z tabeli niżej rozstrzyga, czy Twojej aplikacji użyje kiedykolwiek druga firma — i wszystkie zapadają, zanim powstanie pierwszy ekran. Żadna nie brzmi jak decyzja strategiczna: to sposób, w jaki zapisujesz rekord, sprawdzasz dostęp i nazywasz produkt.
W ponad 300 rozmowach o pomysłach na aplikację, które prowadziliśmy między czerwcem a wrześniem 2026 (ręczna klasyfikacja opisów pomysłu, stan 16.09.2026), 6 na 10 pomysłów to narzędzie dla firm z własnej branży, a 1 na 5 — platforma łącząca dwie strony branży.
Obie liczby znaczą dla pierwszej wersji to samo: w bazie musi istnieć pojęcie firmy, nie tylko pojęcie użytkownika. Użytkownik loguje się do aplikacji. Firma jest właścicielem danych, płatnikiem i stroną umowy — i to ona zostaje, gdy pracownik odchodzi.
Pilot u siebie tego nie unieważnia. Przez pierwsze tygodnie w bazie jest jedna firma, Twoja, i to jest w porządku. Różnica polega na tym, że siedzi tam jako firma z identyfikatorem, a nie jako założenie zaszyte w kodzie i w ekranach.
| Decyzja | Wariant „tylko dla mnie” | Wariant „dla branży” | Koszt zmiany później (co trzeba przebudować) |
|---|---|---|---|
| Czyje są dane w rekordzie | rekord ma autora i datę; właściciel jest oczywisty, bo jest jeden | każdy rekord wskazuje firmę, do której należy; firma jest osobnym bytem w bazie | kolumna w każdej tabeli z danymi, uzupełnienie całej historii i nowe indeksy; dołożenie ograniczenia „wartość wymagana” skanuje tabelę, zmiana typu klucza przepisuje ją razem z indeksami |
| Kto widzi wiersz | dostęp znaczy „zalogowany do mojej aplikacji” | polityka na wierszach na każdej tabeli, filtrująca po firmie zalogowanego | przegląd każdej tabeli i każdego zapytania; do czasu poprawki dane wszystkich firm są otwarte dla każdej roli z uprawnieniem |
| Role | ja i mój pracownik | role w firmie partnera oddzielone od roli operatora aplikacji | menu, ekrany i przyciski przestają zależeć od „zalogowany lub nie”; każdy widok dostaje warunek roli i osobny test |
| Ustawienia i słowniki | moje stawki, statusy i szablony wpisane w kod | te same wartości jako ustawienia firmy, z Twoimi jako startowymi | każdy zaszyty tekst i próg to osobna zmiana ekranu plus migracja danych istniejących firm |
| Płatności | żadnych — aplikacja nie przyjmuje pieniędzy | subskrypcja, faktura i historia płatności osobno dla każdej firmy | nowa warstwa: powiadomienia operatora płatności, dostęp zależny od statusu opłaty, dokumenty i ich numeracja |
| Marka i adres | nazwa Twojej firmy w nagłówku i w domenie | neutralna nazwa produktu i własna domena | zmiana domeny, adresów logowania, szablonów wiadomości i konfiguracji poczty wysyłkowej; zapisane przez partnerów linki przestają działać |
Dlaczego dorobienie „wielu firm” po starcie kosztuje więcej, niż wygląda?
Bo zmiana dotyka bazy, zapytań i ekranów naraz, a w bazie część zmian przepisuje całe tabele. Dokumentacja PostgreSQL 18 mówi to wprost: zmiana typu istniejącej kolumny normalnie przepisuje tabelę i jej indeksy, a przebudowa dużej tabeli chwilowo potrzebuje nawet dwa razy więcej miejsca na dysku (odczyt 16 września 2026).
Dodanie samej kolumny jest tanie i to właśnie myli. Kolumna ze stałą wartością domyślną nie wymusza przepisania tabeli. Ale dołożenie ograniczenia „wartość wymagana” każe przeskanować ją w całości, a polecenie zmieniające tabelę domyślnie bierze blokadę wyłączności — w tym czasie aplikacja tej tabeli nie czyta i nie zapisuje.
Najdroższa jest część, której w migracji nie widać: uzupełnienie historii. Do której firmy należy zlecenie sprzed dwóch lat, wystawione, gdy pojęcia firmy jeszcze nie było? To pytanie do Ciebie, nie do zespołu — i na kilku tysiącach rekordów zajmuje więcej niż sama zmiana schematu.
Druga pułapka dotyczy dostępu. Tabela wystawiona przez API bazy bez polityk na wiersze jest do odczytu i do zapisu dla każdej roli, która ma na niej uprawnienie — tak opisuje to dokumentacja Supabase (odczyt 16 września 2026). „Dostęp dorobimy na końcu” znaczy więc: do końca dane wszystkich firm stoją otworem.
Polityka nie jest też darmowa w działaniu. Działa jak warunek dokładany do każdego zapytania, więc kolumna, po której filtruje, musi mieć własny indeks i stać w nim na pierwszym miejscu. W przykładowym planie z dokumentacji odrzucenie 100 000 cudzych wierszy zajmuje 171 ms (odczyt 16 września 2026).
Trzecia droga — osobna kopia aplikacji dla każdej firmy — wygląda na ucieczkę od tych problemów i bywa najdroższa z całej trójki. Wytyczne Microsoftu o rozwiązaniach dla wielu najemców ujmują to jednym zdaniem: jeśli jeden najemca wymaga określonego kosztu infrastruktury, stu najemców wymaga zapewne stukrotności tej kwoty (odczyt 16 września 2026).
W cenniku widać to od pierwszego kroku: kolejny projekt bazy w planie Pro kosztuje od 10 USD miesięcznie (odczyt 16 września 2026). Gorsza jest reszta rachunku — każdą poprawkę wdrażasz osobno w każdej kopii, a wersje rozjeżdżają się po pierwszym pilnym wyjątku zrobionym dla jednej firmy.
Dla branży dochodzi warstwa, której pilot nie potrzebuje: rozliczenie cykliczne osobno dla każdej firmy. Moduł rozliczeń Stripe w wariancie „płacisz za to, czego używasz” kosztuje 0,7 % obrotu subskrypcyjnego, a płatność BLIK 1,6 % plus 1,00 zł (cenniki dla Polski, odczyt 16 września 2026).
Jak ta warstwa działa od środka, opisuje tekst o tym, jak działają płatności i subskrypcje w aplikacji dla firmy. Osobno policzone jest to, ile kosztuje miesięcznie utrzymanie aplikacji, z której korzysta 50 płacących firm.
Co celowo zostaje „tylko dla Ciebie” w pilocie?
Siedem rzeczy, które w pierwszej wersji świadomie zostają po Twojej stronie — nie dlatego, że są trudne, tylko dlatego, że bez drugiej firmy nikt nie wie, jak mają wyglądać. Każda z nich jest funkcją, nie fundamentem.
- Samodzielna rejestracja firmy z ulicy. Pierwszych partnerów zakładasz ręcznie i przy okazji słyszysz, co ich dziwi. Ekran samoobsługowy powstaje wtedy, gdy zakładanie firm zaczyna zjadać Twoje wieczory.
- Twoje stawki, statusy i szablony dokumentów. Zostają Twoje, ale jako wartości startowe w ustawieniach firmy, nie jako teksty w kodzie. Ta różnica kosztuje dzień pracy teraz i przebudowę ekranów później.
- Samoobsługowa zmiana planu i faktura. W pilocie fakturę wystawiasz ręcznie. Rozliczenie cykliczne wchodzi przy pierwszej firmie, która naprawdę płaci, a nie przy pierwszej, która obiecała.
- Integracje z Twoim własnym oprogramowaniem. Partner ma inny program magazynowy i inną księgowość. Obietnica „u Ciebie też podepniemy” złożona przed policzeniem jej jest długiem, nie zaletą.
- Porównania między firmami. Zestawienie „u kogo krok trwa dłużej” kusi najbardziej i najszybciej psuje zaufanie. Wymaga zgody partnerów i osobnej decyzji, co dokładnie w nim widać.
- Drobne role wewnątrz firmy partnera. W pilocie wystarczą dwie. Trzecia pojawia się, gdy partner powie, że u niego handlowiec nie może widzieć marży — i dopiero wtedy wiesz, jak ma działać.
- Kanał zgłoszeń. Wsparciem w pilocie jest Twój telefon. System zgłoszeń buduje się wtedy, gdy przestajesz pamiętać, kto o czym pisał i co komu obiecałeś.
Lista ma wspólny mianownik. Funkcję dokładasz wtedy, gdy wiesz, jak ma wyglądać, i kosztuje tyle, ile kosztuje. Fundament — czyja jest dana i kto ją widzi — dokładasz raz, bo poprawka dotyka wszystkiego, co już powstało.
Stąd próg do decyzji o pierwszej wersji: trzy firmy z branży, które nazwiesz z nazwy i w których wskażesz osobę do rozmowy. Jedna firma to Twój zwyczaj. Dwie to zbieg okoliczności. Trzy różne firmy z tym samym krokiem procesu to już proces branży.
Dlaczego trzy, a nie dziesięć? Bo koszt zbudowania wielofirmowego fundamentu jest jednorazowy i znany z góry, a koszt dorobienia go rośnie z każdym miesiącem historii w bazie. Przy trzeciej rozmowie odróżnisz już parametr od wyjątku, a czekanie nic do tego nie dodaje.
Reguła ma niewygodną drugą stronę. Jeśli po dwóch miesiącach pytań nadal masz jedną firmę, swoją, zbuduj narzędzie dla siebie i nie płać za warstwę wielu firm. Aplikacja dla branży bez trzech firm w rozmowach jest zakładem, nie planem.
Od ilu płacących firm ten fundament zwraca się w pieniądzach, liczy osobny tekst: od ilu firm aplikacja dla branży spina się jako drugie źródło przychodu. Sam zapis procesu, z którego powstaje zakres, opisuje tekst o tym, jak spisać swój proces dla całej branży.
Trzy rzeczy wchodzą u nas do pierwszej migracji i nie czekają na drugą firmę. Polityki dostępu na wierszach są włączone od początku, a automatyczna kontrola kodu odrzuca zmianę, która je wyłącza albo wpuszcza wszystkich.
Druga: rola operatora jest przypięta do identyfikatora użytkownika, nigdy do adresu e-mail — inaczej rejestracja „na ten sam adres” potrafi przejąć uprawnienia. Trzecia: ograniczenia nałożone na kolumny bez polityk na wiersze są pozorne i nie liczą się jako oddzielenie danych.
Konkurent jako partner: co go przekonuje, że to nie jest aplikacja Twojej firmy?
Konkurent nie pyta o architekturę. Pyta o cztery rzeczy: czy widzisz jego dane, czy aplikacja zmusi go do pracy po Twojemu, czy jutro nie odetniesz mu dostępu i czy jego ludzie będą codziennie logować się do czegoś z Twoim logo.
Na każdą z tych obaw odpowiada konkret w pierwszej wersji, nie zdanie w ofercie.
- Twoja firma jest w aplikacji jedną z firm. Jeśli Twoje rekordy są wyjątkiem bez wskazania właściciela, a Ty masz ekran, którego inni nie mają, partner zobaczy to przy pierwszej rozmowie o eksporcie danych.
- Rola operatora jest osobna i nazwana. Operator utrzymuje aplikację, administratorem danych jest partner u siebie. Te dwie role nie mogą być jedną tylko dlatego, że na starcie siedzą w jednej osobie.
- Prawda o dostępie technicznym zamiast obietnicy. Dokumentacja PostgreSQL 18 mówi wprost: superużytkownik i role z atrybutem pomijania polityk zawsze omijają zabezpieczenie na wierszach (odczyt 16 września 2026).
- Zdanie, które da się dotrzymać. „Technicznie nie mam dostępu” jest nieprawdą i partner z branży to sprawdzi. „Nie sięgam po Twoje dane bez Twojej zgody, a każde sięgnięcie zostawia ślad” jest sprawdzalne — i to zapisujesz.
- Jego sposób pracy jest parametrem. Wariant procesu ustawia się w jego firmie bez zmiany kodu. Jeśli wymaga zmiany kodu, to jest praca dodatkowa i tak ją nazywasz od początku, zanim padnie „przecież mówiłeś”.
- Neutralna nazwa i własna domena produktu. Pracownik partnera loguje się do produktu, a nie do firmy, z którą jego szef przegrywa przetargi. Adres w pasku przeglądarki jest argumentem, choć nikt tego nie powie wprost.
Jak pokazać partnerowi, że jego dane są oddzielone, i co może sprawdzić sam — to osobny temat: jak oddzielić dane konkurenta, żeby partner z branży zaufał. Ogólne zasady zebrane są w tekście o tym, które zasady bezpieczeństwa obowiązują od pierwszego dnia.
Czego nie obiecywać: wyłączności każdemu po kolei, ceny „na zawsze” i funkcji, której nie ma w planie prac. Partner z branży zna ten repertuar z własnych rozmów handlowych i wychwytuje go szybciej niż klient spoza branży.
Co zostaje po Twojej stronie, a co robi zespół, który buduje
Podział w tym temacie jest wyjątkowo ostry. Wszystko, co wymaga znajomości branży i ludzi w niej, jest po Twojej stronie. Wszystko, co wymaga znajomości bazy danych i uprawnień, jest po stronie zespołu technicznego — i nie da się tego zamienić miejscami.
| Po Twojej stronie (praktyk) | Po stronie zespołu, który buduje i utrzymuje |
|---|---|
| Lista firm, z którymi rozmawiałeś, i różnice w ich procesie | Model danych, w którym firma jest osobnym bytem, a każdy rekord ma właściciela |
| Decyzja, która różnica jest parametrem, a która wyjątkiem poza zakresem | Polityki dostępu na wierszach od pierwszej migracji i indeksy pod filtry tych polityk |
| Nazwy ról w branży i to, co każda z nich może zobaczyć | Techniczne role i uprawnienia, w tym rozdzielenie operatora aplikacji od administratora danych firmy |
| Lista rzeczy zostawionych „dla siebie” w pilocie i moment, w którym z niej schodzą | Rozliczenie osobno dla każdej firmy i dostęp zależny od statusu opłaty |
| Pierwsi trzej partnerzy, rozmowa o ich obawach i zebranie zobowiązań | Eksport danych partnera, kopie zapasowe i sprawdzone odtworzenie |
| Akceptacja ekranów i danych startowych, komunikacja w branży | Utrzymanie, aktualizacje i poprawki wchodzące dla wszystkich firm naraz |
Jedna pozycja jest wspólna. Ty decydujesz, co stoi na liście rzeczy zostawionych „tylko dla Ciebie” i kiedy z niej schodzi. Zespół pilnuje, żeby żadna z nich nie wsiąkła w fundament, bo stamtąd usuwa się je najdrożej.
Z czego taka aplikacja składa się warstwa po warstwie i co robi każda z nich, opisuje osobny tekst: z jakich warstw składa się aplikacja dla firmy.
Najczęstsze pytania
Czy pilot we własnej firmie ma sens, skoro aplikacja ma być dla branży?
Ma i jest najtańszym testem, jaki masz pod ręką. W pilocie właściciel procesu i użytkownik to ta sama osoba, więc błąd w zapisie procesu widać w tydzień, a nie po trzech miesiącach rozmów. Warunek jest jeden: pilot stoi na fundamencie dla wielu firm, a Twoja firma jest w bazie zwykłą firmą z identyfikatorem, nie wyjątkiem.
Co zrobić, gdy pierwszy partner chce, żeby aplikacja działała dokładnie tak jak u niego?
Rozdzielić dwie rzeczy. Wariant, który da się ustawić w jego firmie bez zmiany kodu, jest parametrem i wchodzi. Zmiana wymagająca innego ekranu albo innej reguły w bazie jest pracą dodatkową — wyceniasz ją osobno albo odkładasz do następnej wersji. Najgorsza odpowiedź to zgoda bez nazwania, do której z tych dwóch grup prośba należy.
Czy każda firma nie powinna mieć własnej, osobnej bazy?
Czasem powinna: gdy partner ma twarde wymagania zgodności albo płaci za wydzielenie. Wtedy liczysz to jako osobny produkt, nie jako wariant tego samego. W pozostałych przypadkach osobna baza mnoży koszt i pracę — kolejny projekt bazy w planie Pro to od 10 USD miesięcznie (cennik, odczyt 16 września 2026), a każdą zmianę wdrażasz osobno w każdej kopii.
Po czym poznać, że aplikacja została zbudowana tylko dla jednej firmy?
Po czterech znakach: nazwa firmy zaszyta na ekranach i w adresach, rekordy bez wskazania właściciela, jedno konto administratora dla wszystkich, ustawienia i słowniki wpisane w kod zamiast w dane. Każdy sprawdzisz bez programisty — poproś o ekran ustawień i zapytaj, w którym miejscu bazy stoi nazwa firmy, do której należy rekord.
Źródła
- PostgreSQL 18 — dokumentacja, 5.9. Row Security Policies (domyślnie brak polityk; role z atrybutem BYPASSRLS i superużytkownik omijają zabezpieczenie) — https://www.postgresql.org/docs/current/ddl-rowsecurity.html (odczyt 16.09.2026)
- PostgreSQL 18 — dokumentacja, ALTER TABLE, sekcja Notes (przepisanie tabeli przy zmianie typu kolumny, skan przy NOT NULL, do dwa razy więcej miejsca na dysku, blokada ACCESS EXCLUSIVE) — https://www.postgresql.org/docs/current/sql-altertable.html (odczyt 16.09.2026)
- Supabase — Row Level Security (tabela w wystawionym schemacie bez RLS jest do odczytu i zapisu dla każdej roli z uprawnieniem; polityka jako warunek dokładany do zapytania; indeks na kolumnie filtrowanej przez politykę) — https://supabase.com/docs/guides/database/postgres/row-level-security (odczyt 16.09.2026)
- Supabase — Row Level Security performance (przykładowy plan zapytania: 100 000 wierszy odrzuconych przez filtr polityki, czas wykonania 171 ms) — https://supabase.com/docs/guides/database/postgres/row-level-security-performance (odczyt 16.09.2026)
- Supabase — Securing your API (uprawnienia i polityki jako dwie osobne warstwy kontroli; domyślne uprawnienia nowych tabel w schemacie publicznym) — https://supabase.com/docs/guides/api/securing-your-api (odczyt 16.09.2026)
- Supabase — Pricing (plan Free: 50 000 aktywnych użytkowników, 500 MB bazy; plan Pro od 25 USD miesięcznie, kolejny projekt od 10 USD miesięcznie) — https://supabase.com/pricing (odczyt 16.09.2026)
- Stripe — cennik modułu Billing dla Polski (wariant pay as you go: 0,7 % obrotu rozliczeń cyklicznych) — https://stripe.com/pl/billing/pricing (odczyt 16.09.2026)
- Stripe — cennik dla Polski (BLIK 1,6 % + 1,00 zł; karty z Europejskiego Obszaru Gospodarczego 1,5 % + 1,00 zł) — https://stripe.com/pl/pricing (odczyt 16.09.2026)
- Microsoft Learn — Tenancy models for a multitenant solution (koszt stu najemców przy infrastrukturze dedykowanej; kiedy dzielić infrastrukturę) — https://learn.microsoft.com/en-us/azure/architecture/guide/multitenant/considerations/tenancy-models (odczyt 16.09.2026)
- Zasady, które wchodzą do pierwszej migracji w naszych wdrożeniach — praktyka zespołu — https://jakzrobicaplikacje.pl/o-serwisie/#skad (2026-09-16)
- Przegląd ponad 300 rozmów o pomysłach na aplikację, czerwiec–wrzesień 2026 (ręczna klasyfikacja opisów pomysłu) — zestawienie redakcji — https://jakzrobicaplikacje.pl/o-serwisie/#skad (2026-09-16)
Tekst przygotował Agent AI Tomka Niedźwieckiego — treść wygenerowana przez sztuczną inteligencję na podstawie własnych wdrożeń zespołu, dokumentacji dostawców i źródeł podanych wyżej, sprawdzona w osobnym przebiegu weryfikacji faktów i zredagowana. Za fakty odpowiada Tomek Niedźwiecki. Ostatnia weryfikacja: 16 września 2026.