GDPR and CCPA Compliance Implementation

Whistl is fully compliant with GDPR (EU) and CCPA (California) privacy regulations. This comprehensive guide explains data subject rights implementation, consent management, data processing agreements, and how Whistl protects user privacy by design.

Why Compliance Matters

Financial apps handle sensitive data requiring strict protection:

  • GDPR: EU regulation with global reach (€20M or 4% revenue fines)
  • CCPA: California law with consumer rights (statutory damages)
  • User trust: Privacy is essential for financial apps
  • Global users: Whistl serves users worldwide

Compliance isn't optional—it's built into Whistl from the ground up.

GDPR Overview

General Data Protection Regulation applies to EU residents:

Key Principles

PrincipleRequirementWhistl Implementation
LawfulnessLegal basis for processingConsent + Contract necessity
Purpose LimitationSpecific, explicit purposesPrivacy policy defines purposes
Data MinimisationAdequate, relevant, limitedOnly necessary data collected
AccuracyAccurate and up-to-dateUser can edit all data
Storage LimitationKept no longer than necessaryAuto-deletion after account closure
IntegritySecure processingEncryption, access controls
AccountabilityDemonstrate complianceDocumentation, audits

Data Subject Rights (GDPR)

EU users have extensive rights over their data:

Right to Access (Article 15)

Users can request a copy of all their data:

// Data Export Implementation
class DataExportService {
    func generateExport(for user: User) async throws -> DataExport {
        return DataExport(
            personalInfo: await getPersonalInfo(user),
            transactions: await getTransactions(user),
            settings: await getSettings(user),
            goals: await getGoals(user),
            interventionHistory: await getInterventionHistory(user),
            analyticsData: await getAnalyticsData(user),
            generatedAt: Date(),
            format: .json  // Also available: PDF, CSV
        )
    }
    
    // Export delivered via secure download link
    // Link expires after 7 days
}

Right to Rectification (Article 16)

Users can correct inaccurate data:

  • In-app editing: All personal data editable
  • Support requests: Email privacy@whistl.app
  • Response time: Within 30 days

Right to Erasure (Article 17)

"Right to be forgotten" - users can delete their data:

class DataDeletionService {
    func deleteAllData(for user: User) async throws {
        // Delete from primary database
        try await db.deleteUser(user.id)
        
        // Delete from backups (scheduled)
        try await scheduleBackupDeletion(user.id)
        
        // Delete from analytics
        try await analytics.deleteUser(user.id)
        
        // Delete from third parties
        try await notifyProcessors(.deletion, user: user)
        
        // Log deletion for compliance
        try await auditLog.log(.dataDeletion, user: user)
        
        // Confirm to user
        try await sendDeletionConfirmation(user)
    }
    
    // Deletion completed within 30 days
    // Some data retained for legal obligations (fraud prevention)
}

Right to Portability (Article 20)

Users can export data in machine-readable format:

  • Formats: JSON, CSV, XML
  • Structure: Standardized schema
  • Delivery: Secure download link
  • Direct transfer: API for automated transfer

Right to Object (Article 21)

Users can object to certain processing:

  • Analytics: Opt-out in settings
  • Marketing: Unsubscribe from emails
  • Profiling: Disable ML-based features

CCPA Overview

California Consumer Privacy Act applies to California residents:

CCPA Rights

RightDescriptionWhistl Implementation
Right to KnowWhat data is collectedPrivacy policy + data export
Right to DeleteDelete personal informationIn-app deletion + support
Right to Opt-Out"Do Not Sell My Data"No selling + opt-out toggle
Right to Non-DiscriminationSame service regardlessFull features for all users
Right to CorrectFix inaccurate dataIn-app editing

Consent Management

Whistl uses explicit, informed consent:

Consent Categories

enum ConsentCategory: String, CaseIterable {
    case essential = "Essential Services"
    case analytics = "Analytics & Improvement"
    case personalization = "Personalization"
    case marketing = "Marketing Communications"
    
    var description: String {
        switch self {
        case .essential:
            return "Required for app functionality (cannot be disabled)"
        case .analytics:
            return "Help us improve Whistl with anonymous usage data"
        case .personalization:
            return "Personalize your experience with ML recommendations"
        case .marketing:
            return "Receive tips, updates, and product news"
        }
    }
    
    var defaultState: Bool {
        switch self {
        case .essential: return true  // Required
        case .analytics: return false  // Opt-in
        case .personalization: return false  // Opt-in
        case .marketing: return false  // Opt-in
        }
    }
}

Consent Dialog

struct ConsentManagerView: View {
    @State private var consents: [ConsentCategory: Bool] = [
        .essential: true,
        .analytics: false,
        .personalization: false,
        .marketing: false
    ]
    
    var body: some View {
        VStack(spacing: 20) {
            Text("Your Privacy Choices")
                .font(.title)
                .fontWeight(.bold)
            
            ForEach(ConsentCategory.allCases, id: \.self) { category in
                ConsentRow(
                    category: category,
                    isOn: $consents[category] ?? false,
                    disabled: category == .essential
                )
            }
            
            Button("Save Preferences") {
                saveConsents(consents)
            }
            .buttonStyle(.borderedProminent)
            
            Text("You can change these settings anytime in Privacy Settings.")
                .font(.caption)
                .foregroundColor(.secondary)
        }
        .padding()
    }
}

Data Processing Agreements

Third-party processors are bound by DPAs:

Processor Categories

ProcessorPurposeData SharedLocation
PlaidBank connectivityAccount info, transactionsUS (SCCs)
AWSCloud hostingEncrypted user dataUS/EU (SCCs)
SentryCrash reportingAnonymized crash dataUS (SCCs)
Google AnalyticsAnalyticsAnonymous usage dataUS (SCCs)
SendGridEmail deliveryEmail addressesUS (SCCs)

Standard Contractual Clauses

All US-based processors sign EU SCCs for data transfers.

Data Breach Procedures

Whistl has procedures for data breaches:

Breach Response

  1. Detection: Automated monitoring + user reports
  2. Assessment: Determine scope and impact
  3. Containment: Stop the breach
  4. Notification: Inform authorities within 72 hours (GDPR)
  5. User notification: Inform affected users
  6. Remediation: Fix vulnerabilities
  7. Documentation: Record for compliance

Privacy by Design

Privacy is built into Whistl from the start:

Design Principles

  • Data minimization: Collect only what's necessary
  • Purpose limitation: Use data only for stated purposes
  • Storage limitation: Delete when no longer needed
  • Security: Encrypt data at rest and in transit
  • Transparency: Clear privacy notices
  • User control: Easy-to-use privacy settings

Children's Privacy

Whistl is not intended for children under 18:

  • Age verification: Users must confirm age 18+
  • No collection: Don't knowingly collect from under-18s
  • Parental rights: Parents can request deletion

International Data Transfers

Data transfers comply with regulations:

Transfer Mechanisms

  • EU-US: Standard Contractual Clauses (SCCs)
  • UK: UK Addendum to SCCs
  • Australia: Adequacy decision (no additional measures needed)
  • Other: SCCs or adequacy decisions

Compliance Documentation

Whistl maintains comprehensive documentation:

Required Documents

  • Record of Processing Activities (ROPA)
  • Data Protection Impact Assessments (DPIA)
  • Data Processing Agreements (DPA)
  • Privacy Policy
  • Cookie Policy
  • Breach Response Procedures
  • Data Subject Request Procedures

Contact Information

Users can contact Whistl for privacy matters:

  • Privacy Email: privacy@whistl.app
  • Data Protection Officer: dpo@whistl.app
  • Response Time: Within 30 days
  • Supervisory Authority: Office of the Australian Information Commissioner (OAIC)

Conclusion

Whistl is fully compliant with GDPR and CCPA through comprehensive privacy controls, user rights implementation, and privacy-by-design architecture. Users have full control over their data with easy-to-use tools for access, deletion, and consent management.

Privacy isn't just compliance—it's a core value at Whistl.

Your Privacy Protected

Whistl is GDPR and CCPA compliant with comprehensive privacy controls. Download free and control your data.

Download Whistl Free

Related: Privacy-Compliant Analytics | Local Storage Encryption | Cloud Sync with E2E Encryption