GDPR (EU) & BIPA (Illinois) Implementation
This document outlines the comprehensive GDPR (EU General Data Protection Regulation) and BIPA (Illinois Biometric Information Privacy Act) compliance measures implemented in the GuestConnect All-Inclusive Digital Pass system.
Complete
December 17, 2025
Pending
// Database fields:
face_embedding: TEXT (JSON-serialized descriptor array from face-api.js)
face_photo_url: NULL (explicitly set to NULL, never stored)
face_embedding_version: 'face-api-v1.7.12-descriptor'
AES-256 via Cloudflare D1
All biometric templates are encrypted when stored
TLS 1.3 (Cloudflare automatic)
All API calls use HTTPS encryption
face-api.js native
Irreversible template processing
Requires 'settings_manage' permission
No cross-property access
No bulk export functionality
IP address & user agent tracked
// Database field
scheduled_deletion_date: DATETIME (checkout date + 24 hours)
// Automated job configuration (wrangler.jsonc)
"triggers": {
"crons": ["0 * * * *"] // Runs every hour
}
// API Endpoint
POST /api/admin/all-inclusive/biometric/auto-delete
24h after checkout date
Immediate deletion
Enforced by automated job
POST /api/admin/all-inclusive/passes/:pass_id/withdraw-consent
Response:
{
"success": true,
"message": "Biometric consent withdrawn",
"data_deleted": true,
"fallback_methods": [
"QR code",
"Wristband",
"Room card"
]
}
No delays • No staff intervention • Immediate deletion • Instant fallback to QR/wristband/room card
CREATE TABLE biometric_audit_log (
log_id INTEGER PRIMARY KEY AUTOINCREMENT,
pass_id INTEGER,
property_id INTEGER,
action_type TEXT, -- 'CONSENT_GRANTED' | 'CONSENT_WITHDRAWN' | 'AUTO_DELETED'
action_details TEXT, -- Full JSON context
performed_by TEXT, -- 'guest_request' | 'automated_job' | 'admin'
ip_address TEXT,
user_agent TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
# Production database
wrangler d1 migrations apply webapp-production --remote
# This applies migration: 0013_biometric_gdpr_compliance.sql
# Set CRON_SECRET to secure automated deletion endpoint
wrangler secret put CRON_SECRET --env production
# Enter a strong random token when prompted
{
"d1_databases": [{
"binding": "DB",
"database_name": "webapp-production"
}],
"triggers": {
"crons": ["0 * * * *"] // Runs every hour
}
}
npm run build
wrangler pages deploy dist --project-name webapp
# Manually trigger deletion job (with proper token)
curl -X POST https://your-domain.pages.dev/api/admin/all-inclusive/biometric/auto-delete \
-H "X-Cron-Token: your-secret-token"
# Check recent audit log entries
wrangler d1 execute webapp-production --remote \
--command="SELECT * FROM biometric_audit_log ORDER BY created_at DESC LIMIT 10"