Dane konkurenta w Twojej aplikacji — jak je oddzielić, żeby partner z branży zaufał?
Siedem warstw, każda sprawdzalna bez programisty: konto firmy jako właściciel każdego rekordu, polityki dostępu w bazie, role u partnera, imienny dostęp Twojego zespołu, dziennik dostępu, eksport i usunięcie, benchmarki wyłącznie zanonimizowane. Domyślnie tabela w Postgresie nie ma żadnej polityki, a właściciel tabeli omija je wszystkie — oddzielenie jest decyzją, nie ustawieniem.
Co partner naprawdę Ci powierza i kim wtedy jesteś w świetle prawa?
Partner, który wpuszcza dane do Twojej aplikacji, przestaje być zwykłym klientem. W rozumieniu RODO to on jest administratorem danych swoich klientów, a Ty podmiotem przetwarzającym, który działa na jego udokumentowane polecenie (art. 28 ust. 3 lit. a).
Powierza Ci trzy rzeczy naraz i tylko pierwsza jest oczywista: dane osobowe swoich klientów, swoje ceny i marże oraz swój kalendarz pracy. Dwie ostatnie nie są danymi osobowymi — i to właśnie przez nie konkurent zwleka z podpisem.
Jest jeszcze czwarta, o której mówi się rzadko: jego zegar. Art. 33 ust. 2 nakazuje podmiotowi przetwarzającemu zgłosić naruszenie administratorowi bez zbędnej zwłoki.
Administrator ma potem 72 godziny na zawiadomienie organu nadzorczego (art. 33 ust. 1). Twoja usterka uruchamia więc jego termin i jego rozmowę z urzędem.
Dlatego rozmowa o danych partnera nie jest rozmową o regulaminie, tylko o architekturze. Umowa powierzenia ma formę pisemną, w tym elektroniczną (art. 28 ust. 9), i wymienia, co robisz z danymi.
Zapisu nie da się jednak dotrzymać, jeśli aplikacja tego nie potrafi wykonać. Co musi się w takiej umowie znaleźć, rozstrzyga osobny tekst o tym, co zapisać w umowie z partnerem z branży.
Tutaj zostajemy przy tym, co musi umieć sama aplikacja — bo to ją partner sprawdzi, zanim przeczyta jakikolwiek dokument.
Siedem warstw oddzielenia danych — czego partner szuka w każdej?
Oddzielenie danych to nie jeden przełącznik, tylko siedem warstw — a partner może sprawdzić każdą z nich sam, z poziomu przeglądarki. Żadna nie wymaga od niego wiedzy technicznej ani dostępu do kodu.
Punkt wyjścia jest niewygodny. Dokumentacja PostgreSQL 18 mówi wprost: tabele domyślnie nie mają żadnych polityk, więc jeśli użytkownik ma uprawnienie do tabeli, wszystkie jej wiersze są dla niego jednakowo dostępne (odczyt 16 września 2026 r.).
Dokumentacja Supabase, dostawcy bazy, na której budujemy, dopowiada resztę. Tabela w schemacie wystawionym na zewnątrz bez włączonej ochrony wierszy jest do odczytu i zapisu dla każdej roli z nadanym uprawnieniem, a samo dodanie polityki tego uprawnienia nie cofa (odczyt 16 września 2026 r.).
| Warstwa | Co chroni partnera | Jak partner sprawdzi to sam w 5 minut | Co się psuje, gdy tego brak |
|---|---|---|---|
| Konto firmy jako właściciel każdego rekordu | Dane dwóch firm nigdy nie leżą w jednym worku bez etykiety | Zakłada konta w dwóch firmach i z drugiego szuka klienta wpisanego w pierwszej | Rozdziela ekran, nie baza — zmiana jednego parametru w adresie pokazuje cudze dane |
| Polityki dostępu na poziomie wierszy w bazie | Reguła działa w bazie, a nie w kodzie ekranu | Pyta, czy ochrona wierszy jest włączona na każdej tabeli z danymi firm | Tabela bez polityk wydaje wszystkie wiersze każdemu, kto ma do niej uprawnienie |
| Role wewnątrz firmy partnera | Jego pracownik nie widzi marż ani pełnej bazy klientów | Zakłada u siebie konto pracownika i wchodzi na ekran z cenami | Rola przypięta do adresu e-mail albo do samego faktu zalogowania |
| Twój dostęp: konta imienne, zero cichego wglądu | Nie wchodzisz w jego dane przy okazji ani bez śladu | Prosi o wykaz wejść Twojego zespołu do jego danych z ostatnich 30 dni | Jeden wspólny klucz serwisowy omijający polityki — w dzienniku wszystkie wejścia są identyczne |
| Dziennik dostępu z terminem przechowywania | Pytanie „kto to oglądał” ma odpowiedź także po fakcie | Pyta o liczbę dni przechowywania i prosi o wpis sprzed tygodnia | Dziennik żądań w planie darmowym żyje 1 dzień — po dwóch tygodniach nie ma czego pokazać |
| Wyjście: eksport i usunięcie na żądanie | Partner nie jest zakładnikiem Twojej bazy | Klika eksport, otwiera plik w arkuszu i pyta o termin usunięcia po wypowiedzeniu | Zrzuty ekranu zamiast pliku — art. 20 ust. 1 wymaga formatu do odczytu maszynowego |
| Benchmarki i statystyki zbiorcze | Ze średniej branżowej nie da się odczytać jednej firmy | Otwiera benchmark i sprawdza, ile firm liczy najmniejsza kategoria | Kategoria z dwiema firmami ujawnia ceny konkurenta; motyw 26 mówi o wyodrębnianiu wpisów |
Najważniejsze pytanie brzmi jednak inaczej: kto te polityki omija? Dokumentacja PostgreSQL 18 odpowiada, że superużytkownicy i role z atrybutem pomijania zawsze przechodzą obok ochrony wierszy, a właściciel tabeli robi to domyślnie, o ile jawnie nie każe stosować polityk także wobec siebie.
Dostawca bazy dokłada własny wariant: rola serwisowa ma pełny dostęp i omija polityki, więc jej klucz ma prawo istnieć wyłącznie po stronie serwera (odczyt 16 września 2026 r.). Partner, który zapyta o tę jedną rzecz, dowie się o Twojej aplikacji więcej niż z całej prezentacji.
Trzy lekcje z własnej praktyki, które kosztowały nas czas. Sam fakt zalogowania nie jest uprawnieniem administratora — rolę sprawdzamy po identyfikatorze użytkownika w osobnym miejscu. Identyfikator w adresie nie jest hasłem. Ograniczenie widocznych kolumn bez polityki na wiersze jest pozorne.
Czwarta lekcja jest najbardziej podstępna. Podmiana definicji widoku potrafi po cichu zgubić ustawienie, które każe widokowi działać z uprawnieniami pytającego. Po każdej zmianie widoku sprawdzamy więc, czy nie zaczął omijać polityk — z ekranu tego nie widać, widać dopiero w danych.
Test w pięć minut: co partner ma zrobić, zanim podpisze?
Sześć ruchów, w sumie około pięciu minut, bez programisty i bez dostępu do kodu. Partner wykonuje je na wersji pokazowej, zanim cokolwiek podpisze — i to samo powinieneś zrobić na własnej aplikacji, zanim go zaprosisz.
Ten test nie jest uprzejmością wobec partnera. Art. 32 ust. 1 lit. d wymaga regularnego testowania, mierzenia i oceniania skuteczności środków technicznych i organizacyjnych — a pięć minut raz na kwartał to najtańsza wersja tego obowiązku.
- Dwa konta w dwóch firmach (90 sekund). Zakłada konto w firmie A, wpisuje klienta o wymyślonej nazwie, po czym szuka tej nazwy z konta firmy B — w wyszukiwarce, na listach i w raportach.
- Podmiana identyfikatora w adresie (30 sekund). Otwiera dowolny swój rekord i zmienia w adresie jedną cyfrę. Cudzy rekord na ekranie kończy rozmowę; to zasada z tekstu o zasadach bezpieczeństwa od pierwszego dnia.
- Konto pracownika i ekran z cenami (60 sekund). Zakłada w swojej firmie konto o najniższych uprawnieniach i próbuje wejść na widok marż, raportów i pełnej listy klientów.
- Pytanie o dziennik (60 sekund). Pyta o dwie liczby: ile dni żyje zapis dostępu i czy da się pokazać wpis sprzed tygodnia. Odpowiedź „mamy logi” bez liczby dni nie jest odpowiedzią.
- Eksport (30 sekund). Klika eksport swoich danych i otwiera plik w arkuszu. Sprawdza przy okazji, czy eksport obejmuje dane klientów, czy tylko ustawienia konta.
- Najmniejsza kategoria benchmarku (30 sekund). Otwiera zestawienie branżowe i szuka kategorii, w której są dwie albo trzy firmy. Jeśli takie kategorie istnieją, benchmark ujawnia pojedyncze firmy.
Trzy odpowiedzi dyskwalifikują od razu: „filtrujemy to zapytaniem w aplikacji”, „dziennik mamy, ale nie da się go pokazać” oraz „eksport przygotujemy ręcznie, jak będzie trzeba”. Każda mówi to samo — ochrona siedzi w kodzie ekranu albo w dobrych chęciach.
Stąd próg, który przyjmujemy sami i który polecamy partnerom. Dziennik dostępu krótszy niż 30 dni jest bezużyteczny, bo art. 12 ust. 3 daje administratorowi miesiąc na odpowiedź na żądanie osoby, a skarga klienta partnera dotrze do Was po tygodniu albo dwóch.
Ten próg ma swoją cenę. W cenniku Supabase, dostawcy bazy, na której budujemy, retencja dzienników (API i baza) wynosi 1 dzień w planie darmowym, 7 dni w planie Pro, 28 dni w planie zespołowym i 90 dni w planie dla przedsiębiorstw (odczyt 16 września 2026 r.).
Zapis logowań ma własną skalę: 1 godzina w planie darmowym i 7 dni w planie Pro (odczyt 16 września 2026 r.). Rozszerzenie audytowe bazy pozwala zapisywać zdarzenia dla sesji, użytkownika, całej bazy albo wskazanego obiektu — ale zapisany dziennik i tak żyje tyle, ile pozwala plan.
Ile kosztuje miesięcznie utrzymanie aplikacji, z której korzysta pięćdziesiąt płacących firm, liczy tekst siostrzanego serwisu: rachunek utrzymania przy 50 klientach. Tutaj wystarczy jedna decyzja: plan dobierasz do długości dziennika, nie odwrotnie.
Konkurent jako partner: co zamienia obawę o dane w podpis?
Konkurent nie kupuje aplikacji dlatego, że jest ładna — kupuje wtedy, gdy zyskuje więcej, niż ryzykuje. Oddzielenie danych jest dokładnie tym miejscem, w którym ryzyko da się pokazać jako zamknięte.
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.
W obu układach pierwszym użytkownikiem bywa ktoś, kto dziś walczy z Tobą o to samo zlecenie. Pięć rzeczy zamienia jego obawę w podpis i każda z nich jest zapisem, nie obietnicą.
- Cel przetwarzania na piśmie. Jego dane obsługujesz wyłącznie na jego udokumentowane polecenie (art. 28 ust. 3 lit. a). To zdanie wyklucza sięganie do jego bazy klientów na potrzeby własnej sprzedaży.
- Lista podwykonawców i uprzedzenie o zmianie. Art. 28 ust. 2 zabrania brać kolejnego podwykonawcy bez zgody administratora. Dostawca bazy publikuje taką listę — jej aktualizację odczytaliśmy z datą 1 czerwca 2026 r.
- Prawo do audytu. Art. 28 ust. 3 lit. h daje partnerowi prawo do audytów i inspekcji, także przez upoważnionego audytora. Test z tej strony jest jego pierwszą, darmową wersją.
- Wyjście z danymi. Po zakończeniu usług usuwasz albo zwracasz wszystkie dane i kasujesz kopie (art. 28 ust. 3 lit. g). Kopia dla partnera ma być w formacie do odczytu maszynowego (art. 20 ust. 1), a żądanie usunięcia od jego klienta wykonujesz bez zbędnej zwłoki (art. 17 ust. 1).
- Benchmark jako korzyść, nie jako ryzyko. Porównania do reszty branży konkurent nie kupi nigdzie indziej. Motyw 26 rozporządzenia stawia granicę: dane są anonimowe dopiero wtedy, gdy nie da się z nich wyodrębnić wpisów o jednej firmie.
Czego nie obiecywać: „nikt z nas nigdy nie zobaczy Twoich danych”. W aplikacji, która ma wsparcie i awarie, to nieprawda, a partner sprawdzi to pierwszego dnia po pierwszym zgłoszeniu.
Uczciwa wersja brzmi inaczej: wejście naszego zespołu jest imienne, odbywa się na Twoje zgłoszenie i zostawia wpis w dzienniku, który możesz obejrzeć. Obietnica, której da się dotrzymać, sprzedaje lepiej niż obietnica, która brzmi ładniej.
Czego konkretnie boi się konkurent i co pokazać mu na pierwszym spotkaniu, rozstrzyga osobny tekst: jak sprzedać oprogramowanie konkurentowi. Decyzję, czy pierwsza wersja ma od razu obsługiwać wiele firm, opisuje tekst o tym, czy budować najpierw dla siebie, czy od razu dla branży.
Co zostaje po Twojej stronie, a co robi zespół, który buduje
W tym temacie podział jest ostry. To, co jest chronione, definiuje praktyk — bo tylko on wie, która liczba w jego branży jest marżą, a która zwykłą stawką. To, jak jest chronione, wykonuje zespół techniczny.
| Ty — praktyk, który zna branżę | Zespół techniczny, który buduje i utrzymuje |
|---|---|
| Wskazujesz pola wrażliwe w języku branży: które liczby są marżą, które stawki są poufne, czego nie wolno pokazać pracownikowi partnera | Zamienia tę listę na polityki dostępu w bazie, role po identyfikatorze użytkownika i ograniczenia na poziomie kolumn |
| Ustalasz role, które naprawdę istnieją w firmach z branży, i kto w nich co widzi | Buduje model ról tak, żeby nie dało się go podnieść z poziomu konta użytkownika |
| Decydujesz, jak długo żyje dziennik dostępu i co wchodzi do benchmarku | Dobiera plan dostawcy do tego terminu, włącza zapis zdarzeń i pilnuje progu anonimizacji |
| Przechodzisz test w pięć minut na własnej aplikacji, zanim zaprosisz pierwszego partnera | Przygotowuje konta pokazowe i eksport tak, żeby test dało się wykonać bez pomocy |
| Negocjujesz zakres powierzenia z pierwszymi partnerami i podpisujesz | Dostarcza fakty do umowy: gdzie leżą dane, kto jest podwykonawcą, co znika po wypowiedzeniu |
| Odpowiadasz przed partnerem za to, co obiecałeś | Odpowiada za to, żeby aplikacja umiała to wykonać i utrzymała ten stan po starcie |
Warstwy, na których to wszystko stoi — front, funkcje serwerowe, baza i usługi zewnętrzne — opisuje tekst o warstwach aplikacji dla firmy. Mechanizmy RODO w samym kodzie, w tym kaskadowe usuwanie, retencja i eksport, są w tekście o RODO wdrożonym w kodzie.
Minimalny zestaw obowiązków, od którego nie ucieknie nawet jednoosobowa firma, zebrał serwis siostrzany: minimalny zestaw obowiązków z RODO, DSA i AI Act. Ta strona nie zastępuje prawnika — ocena konkretnego przypadku należy do administratora danych.
Zostaje jedno zdanie do zapamiętania z całej tej roboty. Partner nie kupuje Twojego zapewnienia, że jego dane są oddzielone; kupuje możliwość sprawdzenia tego bez Ciebie, w pięć minut, kiedy tylko zechce.
Najczęstsze pytania
Czy osobne konto w aplikacji wystarczy, żeby dane partnera były oddzielone?
Nie. Konto to etykieta na rekordzie, a rozdzielanie danych musi działać w bazie. Dokumentacja PostgreSQL 18 mówi, że tabela bez polityk wydaje wszystkie wiersze każdemu, kto ma do niej uprawnienie (odczyt 16 września 2026 r.). Jeśli ochronę robi warunek w kodzie ekranu, wystarczy jedno wywołanie poza ekranem, żeby ją ominąć.
Czy każdy partner powinien dostać własną bazę danych?
Nie musi, choć własna baza upraszcza usunięcie i przeniesienie danych na koniec współpracy. Kosztuje za to przy każdej zmianie: aktualizacje i migracje mnożą się przez liczbę partnerów. U nas osobny projekt bazy dostaje każda aplikacja, a nie każdy jej użytkownik biznesowy — rozdzielanie wewnątrz aplikacji robią polityki dostępu na wierszach i role.
Partner pyta wprost, czy widzisz jego ceny. Co odpowiedzieć?
Prawdę, z mechanizmem. Jeśli masz dostęp serwisowy, powiedz, że istnieje, jest imienny, uruchamiany na zgłoszenie i zostawia wpis w dzienniku, który partner może obejrzeć. Dokumentacja dostawcy bazy potwierdza, że rola serwisowa omija polityki dostępu, więc zaprzeczenie i tak się nie obroni (odczyt 16 września 2026 r.). Wiarygodność buduje ślad, nie zapewnienie.
Czy mogę pokazywać partnerom średnie z całej branży?
Tak, jeśli ze średniej nie da się odczytać jednej firmy. Motyw 26 rozporządzenia uznaje za anonimowe tylko takie dane, z których nie da się wyodrębnić wpisów o konkretnym podmiocie — a kategoria z dwiema firmami ten warunek łamie. Praktyczne rozwiązanie to minimalny próg liczby firm w kategorii i zgoda na udział w zestawieniu zapisana w umowie.
Co dzieje się z danymi partnera po zakończeniu współpracy?
Art. 28 ust. 3 lit. g mówi, że po zakończeniu świadczenia usług podmiot przetwarzający — zależnie od decyzji administratora — usuwa albo zwraca wszystkie dane i kasuje istniejące kopie, chyba że przepis nakazuje ich przechowywanie. Własne terminy na kopie ma też dostawca infrastruktury; jego dokument powierzenia w wersji z 1 sierpnia 2026 r. odczytaliśmy 16 września 2026 r.
Źródła
- RODO — rozporządzenie Parlamentu Europejskiego i Rady (UE) 2016/679, art. 12 ust. 3, art. 17 ust. 1, art. 20 ust. 1, art. 28, art. 32 ust. 1, art. 33 oraz motyw 26 (Dz.U. L 119 z 4.5.2016, wersja polska, CELEX 32016R0679) — https://publications.europa.eu/resource/celex/32016R0679 (odczyt 16.09.2026 (tekst pobrany z serwera Urzędu Publikacji UE))
- PostgreSQL 18 — 5.9 Row Security Policies: brak polityk domyślnie, domyślna odmowa po włączeniu ochrony, pomijanie przez superużytkownika, rolę z atrybutem BYPASSRLS i właściciela tabeli — https://www.postgresql.org/docs/current/ddl-rowsecurity.html (odczyt 16.09.2026)
- Supabase Docs — Row Level Security: tabela w schemacie wystawionym na zewnątrz bez RLS jest do odczytu i zapisu dla roli z nadanym uprawnieniem; rola serwisowa ma pełny dostęp i omija RLS — https://supabase.com/docs/guides/database/postgres/row-level-security (odczyt 16.09.2026)
- Supabase — Pricing, porównanie planów: „Log retention” (API i baza) 1 dzień / 7 dni / 28 dni / 90 dni oraz „Auth Audit Logs” 1 godzina / 7 dni / 28 dni — https://supabase.com/pricing (odczyt 16.09.2026)
- Supabase Docs — PGAudit: poziomy zapisu zdarzeń (sesja, użytkownik, cała baza, wskazany obiekt) — https://supabase.com/docs/guides/database/extensions/pgaudit (odczyt 16.09.2026)
- Supabase — Data Processing Addendum, wersja 1 z 1 sierpnia 2026 r. — https://supabase.com/legal/dpa (odczyt 16.09.2026)
- Supabase — Subprocessor List, aktualizacja z 1 czerwca 2026 r. — https://supabase.com/legal/customer-resources/subprocessor-list (odczyt 16.09.2026)
- Polityki dostępu i dziennik zdarzeń w aplikacjach, które budujemy — praktyka zespołu — 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.