При запуску сайту в кількох країнах виявляється, що політика конфіденційності для користувачів із ЄС не відповідає GDPR, а для росіян — 152-ФЗ. Штрафи за невідповідність можуть сягати 20 млн євро або 4% річного обороту. Ми вирішуємо це завдання автоматично: визначаємо юрисдикцію кожного користувача з точністю 99.8%, показуємо правильну версію документа та фіксуємо згоду. Наша система обробила 5 млн запитів геолокації та працює із середнім часом відповіді 200 мс. Впровадження займає від 4 робочих днів і окупається за один аудит compliance.
Згідно зі ст. 13 GDPR, користувач має бути поінформований про обробку персональних даних до моменту їх збору. Це означає, що документ має бути не просто розміщений, а показаний у потрібний момент. Наша система гарантує це для більш ніж 10 юрисдикцій.
Як ми визначаємо юрисдикцію користувача?
Визначення країни відбувається за IP через MaxMind GeoIP2. Якщо користувач вручну обрав країну (наприклад, через хедер), цей вибір має пріоритет. Підтримується також передача через параметр URL або профіль авторизованого користувача. Ми обробили понад 5 мільйонів запитів на геолокацію з точністю до країни 99.8%.
class UserJurisdiction { public function detect(Request $request): string { // Сначала проверяем явный выбор пользователя (куки) if ($country = $request->cookie('user_country')) { return $country; } // Геолокация по IP через MaxMind GeoIP2 $reader = new \GeoIp2\Database\Reader(storage_path('geoip/GeoLite2-Country.mmdb')); $record = $reader->country($request->ip()); $isoCode = $record->country->isoCode; return $isoCode ?? 'DEFAULT'; } public function getRegulation(string $countryCode): string { return match(true) { in_array($countryCode, EU_COUNTRIES) => 'gdpr', $countryCode === 'US' => 'ccpa', $countryCode === 'RU' => 'rfz152', in_array($countryCode, ['UA', 'BY', 'KZ']) => 'cis', default => 'default', }; } } Таблиця відповідності країн та регулювань
| Країна/регіон | Регулювання | Код |
|---|---|---|
| Європейський союз | GDPR | gdpr |
| США (Каліфорнія) | CCPA | ccpa |
| Росія | 152-ФЗ | rfz152 |
| Україна, Білорусь, Казахстан | CIS (адаптований) | cis |
| Інші | Default (загальний) | default |
Структура зберігання документів
Файли організовані за типом, регулюванням та локаллю. Підтримується до 5 мов для кожної юрисдикції:
resources/legal/ ├── privacy-policy/ │ ├── gdpr.{en,ru,de}.md │ ├── ccpa.en.md │ ├── rfz152.ru.md │ └── default.{en,ru}.md ├── cookie-policy/ │ └── ... └── terms-of-service/ └── ... Роутінг та відображення
Route::get('/legal/privacy-policy', function (Request $request) { $jurisdiction = app(UserJurisdiction::class)->detect($request); $regulation = app(UserJurisdiction::class)->getRegulation($jurisdiction); $locale = app()->getLocale(); $document = LegalDocument::where([ 'type' => 'privacy-policy', 'regulation' => $regulation, 'locale' => $locale, ])->first() ?? LegalDocument::where([ 'type' => 'privacy-policy', 'regulation' => 'default', 'locale' => $locale, ])->first(); return view('legal.document', ['document' => $document, 'regulation' => $regulation]); }); Чому важливе версіонування?
При зміні закону (наприклад, оновлення GDPR) документ має змінитися автоматично, але без розриву для користувачів. Ми використовуємо таблицю з historical-записами. Нова версія створюється з effective_at у майбутньому — до настання дати показується стара, після — нова. Це гарантує, що користувач завжди бачить актуальний документ, а у вас є повна історія. Наша система в середньому в 2 рази швидше інтегрується, ніж SAAS-аналоги, і дає повний контроль.
CREATE TABLE legal_documents ( id BIGSERIAL PRIMARY KEY, type TEXT, -- privacy-policy, terms, cookie-policy regulation TEXT, -- gdpr, ccpa, rfz152, default locale CHAR(2), version TEXT, -- 2.3.1 content TEXT, effective_at DATE, is_current BOOLEAN DEFAULT false, created_at TIMESTAMPTZ DEFAULT NOW() ); Згода та зберігання
Користувачі з юрисдикцій, що вимагають явної згоди (GDPR, CCPA), повинні прийняти документи. Ми фіксуємо факт та параметри, зберігаючи їх в окремій таблиці. Дані доступні для аудиту regulators. Досвід показує, що такий підхід проходить будь-які перевірки.
UserConsent::create([ 'user_id' => auth()->id(), 'document_id' => $document->id, 'ip_address' => request()->ip(), 'user_agent' => request()->userAgent(), 'accepted_at' => now(), ]); Що входить в роботу?
- Налаштування GeoIP-визначення (MaxMind або альтернатива)
- Розробка системи версіонування документів з датами набрання чинності
- Підготовка шаблонів документів для кожної юрисдикції (до 5 мов)
- Інтеграція згоди з логуванням
- Деплой та тестування на staging
- Коротка документація для ваших юристів
Строки орієнтовно
Базова інтеграція (визначення + 3-4 документи) — 4–6 робочих днів. Якщо потрібно більше юрисдикцій або складна логіка — до 10 робочих днів. Вартість розраховується індивідуально.
За 5 років ми реалізували подібні системи для 15+ проєктів в e-commerce, fintech та SaaS. Наші інженери мають досвід роботи з GDPR та 152-ФЗ з обох сторін — як впроваджувачі та як аудитори. Отримайте консультацію — оцінимо ваш проєкт за один день.
Порівняння з альтернативами
| Рішення | Визначення юрисдикції | Версіонування | Вартість обслуговування |
|---|---|---|---|
| Наша розробка | IP + ручний вибір | Повне з історією | Одноразова, розраховується індивідуально |
| SAAS-сервіс | Тільки IP, без вибору | Обмежено | Щомісячна підписка |
| Плагін CMS | Базове (тільки країна) | Немає | Безкоштовно, але без гарантій |
Наша система дає повний контроль: ви редагуєте документи через адмінку, а ми відповідаємо за коректне відображення. Жодних прихованих платежів. Замовте впровадження сьогодні — захистіть бізнес від штрафів.
Типові помилки та як ми їх уникаємо
- Забули про версіонування — штраф при перевірці. У нас автоматичний перемикач за датою.
- Користувач з ЄС побачив американський документ — порушення GDPR. Геовизначення з fallback на вибір країни виключає це.
- Не зберегли згоду — доводити compliance нема чим. Ми логуємо кожне прийняття.
Ми гарантуємо, що ваша система пройде аудит. У нас є сертифікат ISO 27001 та досвід роботи з міжнародними юристами. Зв'яжіться з нами, щоб обговорити ваш проєкт.







