2026-04-17·15 min read·

EU-US Data Privacy Framework (DPF): GDPR Chapter V Transfer Developer Guide (2026)

Post #402 in the sota.io EU Cyber Compliance Series

On 10 July 2023, the European Commission adopted an adequacy decision for the EU-US Data Privacy Framework (DPF) under GDPR Article 45. After three years of legal limbo following the Schrems II judgment that invalidated Privacy Shield, EU organisations once again have a simplified path for transferring personal data to DPF-certified US organisations.

But "simplified" does not mean "unverified". Developers building applications that touch EU personal data must understand exactly which transfers the DPF covers, when it is sufficient, when you need Standard Contractual Clauses (SCCs) alongside it, and how to design systems that survive a hypothetical Schrems III challenge.

GDPR Chapter V (Articles 44–50) governs transfers of personal data to third countries. The core rule is Article 44: transfers may only occur if the third country ensures an adequate level of protection, or if appropriate safeguards are in place.

Three mechanisms are relevant for EU-US data flows in 2026:

MechanismLegal BasisUS Applicability
Adequacy DecisionArt. 45 GDPRDPF-certified organisations only
Standard Contractual ClausesArt. 46(2)(c) GDPRAny US organisation (with TIA)
Binding Corporate RulesArt. 47 GDPRIntra-group transfers only

The DPF adequacy decision is the most operationally convenient: no SCC execution, no Transfer Impact Assessment (TIA) required, no ongoing supervisory authority approval. But it only applies when the US recipient is actively certified under the DPF.

What Is the DPF?

The Data Privacy Framework is a self-certification scheme administered by the US Department of Commerce. US organisations voluntarily commit to the DPF Principles and list themselves in the public DPF list at DPF.gov. In exchange, EU organisations can transfer personal data to them under the adequacy decision without needing SCCs.

Key history:

The DPF introduced structural improvements over Privacy Shield: binding commitments from the US Intelligence Community via Executive Order 14086, a new Data Protection Review Court (DPRC) with binding remedial powers accessible to EU individuals, and enhanced annual review mechanisms.

The Seven DPF Principles

A DPF-certified organisation must comply with seven core principles:

1. Notice

Certified organisations must publish a DPF-compliant privacy notice explaining what personal data is collected, the purposes for which it is used, the right to access and correct data, and how to contact the organisation's independent recourse mechanism.

Developer implication: Review your SaaS privacy policy. A generic GDPR policy is not sufficient — DPF requires specific disclosures about DPF certification status and the DPRC mechanism.

2. Choice

Individuals must be given the opportunity to opt out of (a) disclosure to third parties and (b) use for purposes materially different from those originally stated. For sensitive data, opt-in consent is required.

Developer implication: If your SaaS product shares user data with third-party US analytics or AI services, you need an explicit opt-out mechanism, not a buried consent checkbox.

3. Accountability for Onward Transfer

Before transferring DPF-covered data to a third party (whether in the US or abroad), you must:

Developer implication: Your sub-processor list must include DPF status for each US entity. A US cloud provider certified under DPF covers transfers to them; transfers from that provider to others require verification.

4. Security

Certified organisations must take reasonable and appropriate security measures to protect personal data from loss, misuse, and unauthorised access.

Developer implication: DPF does not define specific technical requirements. Apply NIST SP 800-53 or ISO/IEC 27001 controls as your security baseline and document them.

5. Data Integrity and Purpose Limitation

Personal data must be relevant for the purposes for which it is used, and certified organisations may not process data in a manner incompatible with the original collection purposes.

Developer implication: This aligns with GDPR's purpose limitation principle (Art. 5(1)(b)). A single data governance register covering both GDPR and DPF purposes reduces duplication.

6. Access

Individuals have the right to access personal data held about them and to correct, amend, or delete it where it is inaccurate or processed in violation of the Principles.

Developer implication: Your DSAR (Data Subject Access Request) process must cover DPF-held data in the US. Response timelines: the DPF does not specify a hard deadline, but 30 days (mirroring GDPR Art. 12) is best practice.

7. Recourse, Enforcement and Liability

Certified organisations must provide independent recourse mechanisms — typically through arbitration (the DPF Annex I arbitration panel) or EU Data Protection Authorities — and cooperate with investigations.

Developer implication: You must register with at least one independent recourse provider (e.g., BBB National Programs, TRUSTe/TrustArc, JAMS) as part of DPF certification.

DPF Certification Process (Step-by-Step)

1. Map your EU→US data flows
   └─ Which personal data categories flow to which US entities?
   └─ Are those entities DPF-certified? Check: dataprivacyframework.gov/list

2. Decide: DPF or SCCs?
   └─ US entity certified → DPF sufficient (no TIA needed)
   └─ US entity not certified → SCCs + TIA required

3. If self-certifying your own US entity:
   ├─ Prepare DPF-compliant privacy notice
   ├─ Register with independent recourse provider
   ├─ Register with US DoC at dpf.gov (USD 340/year for organisations with
   │   <100M revenue, higher for larger)
   ├─ Annual re-certification (certification lapses if not renewed)
   └─ Designate HR Practices separately if employee data is included

4. Update sub-processor register
   └─ Flag DPF status for each US sub-processor
   └─ Monitor for certification lapses (quarterly check recommended)

5. Document adequacy basis
   └─ Record "DPF adequacy decision (EU) 2023/1795" as transfer basis
   └─ Update ROPA (Records of Processing Activities) Art. 30 entries

Practical Data Flow Mapping

Most SaaS products have three categories of EU→US personal data flows:

Category A — Primary application data (user accounts, usage data, content)

Category B — Sub-processors (analytics, monitoring, CRM, error tracking) Common US sub-processors and their DPF status in 2026:

ServiceDPF CertifiedNotes
AWS (US East/West)✅ YesAmazon.com, Inc. certified
Google Cloud✅ YesGoogle LLC certified
Stripe✅ YesStripe, Inc. certified
Sentry✅ YesFunctional Software, Inc.
Datadog✅ YesDatadog, Inc. certified
Mixpanel✅ YesMixpanel, Inc. certified

Verification rule: Always check DPF.gov directly before relying on DPF status. Certifications lapse; the registry is authoritative.

Category C — Ad tech / marketing (Meta Pixel, Google Ads remarketing) These flows typically involve personal data (IP, identifiers) sent to US ad platforms. Most are DPF-certified, but the legal basis for the transfer is often consent (Art. 6(1)(a) GDPR) rather than the DPF adequacy decision. Ensure your consent management platform covers this layer.

The Schrems III Risk and Resilience Design

The DPF adequacy decision is under challenge. The European Parliament called for review in its October 2023 resolution. NOYB (Max Schrems' organisation) has indicated it will challenge the DPF before the CJEU once a concrete case arises.

A Schrems III judgment invalidating the DPF — analogous to Schrems I (Safe Harbor) and Schrems II (Privacy Shield) — would leave only:

Resilience strategy for developers:

# Resilient transfer design: DPF as primary, SCC as fallback
TRANSFER_BASIS_REGISTER = {
    "aws_us_east_1": {
        "primary": "DPF adequacy (EU) 2023/1795",
        "fallback": "SCCs (EU) 2021/914 Module 2 (C2P)",
        "scc_executed": "2024-03-15",
        "tia_completed": "2024-03-15",
        "tia_conclusion": "Adequate (EO 14086 + DPRC)",
        "last_verified": "2026-04-01",
    },
    "stripe_inc": {
        "primary": "DPF adequacy (EU) 2023/1795",
        "fallback": "SCCs via Stripe DPA (auto-updated)",
        "last_verified": "2026-04-01",
    }
}

The practical recommendation: execute SCCs in parallel with DPF for your critical sub-processors. The incremental legal work is low; the resilience benefit is high.

Python DPFTransferChecker

from dataclasses import dataclass, field
from datetime import date, timedelta
from enum import Enum
from typing import Optional
import json

class TransferMechanism(Enum):
    DPF = "EU-US DPF Adequacy (EU) 2023/1795"
    SCC = "Standard Contractual Clauses (EU) 2021/914"
    BCR = "Binding Corporate Rules (Art. 47 GDPR)"
    CONSENT = "Individual Consent (Art. 6(1)(a) GDPR)"
    NO_TRANSFER = "No Transfer (EU Hosting)"

@dataclass
class SubProcessor:
    name: str
    country: str
    data_categories: list[str]
    transfer_mechanism: TransferMechanism
    dpf_certified: Optional[bool] = None
    dpf_last_verified: Optional[date] = None
    scc_fallback_in_place: bool = False
    tia_completed: bool = False
    certification_expiry: Optional[date] = None

@dataclass
class DPFComplianceResult:
    processor: str
    status: str  # COMPLIANT | WARNING | NON_COMPLIANT
    issues: list[str] = field(default_factory=list)
    recommendations: list[str] = field(default_factory=list)

class DPFTransferChecker:
    def __init__(self, sub_processors: list[SubProcessor]):
        self.processors = sub_processors
        self.today = date.today()
        self.verify_staleness_threshold = timedelta(days=90)

    def check(self) -> list[DPFComplianceResult]:
        return [self._check_processor(p) for p in self.processors]

    def _check_processor(self, p: SubProcessor) -> DPFComplianceResult:
        issues = []
        recommendations = []

        if p.country != "US":
            if p.transfer_mechanism == TransferMechanism.NO_TRANSFER:
                return DPFComplianceResult(p.name, "COMPLIANT")
            # Non-US requires adequacy or Art.46 safeguard — out of DPF scope
            return DPFComplianceResult(
                p.name, "OUT_OF_SCOPE",
                issues=["Non-US processor: DPF not applicable"],
                recommendations=["Verify adequacy decision or execute SCCs for this country"]
            )

        if p.transfer_mechanism == TransferMechanism.DPF:
            if not p.dpf_certified:
                issues.append("DPF adequacy claimed but processor not verified as certified")
                recommendations.append(f"Check {p.name} on dataprivacyframework.gov/list")

            if p.dpf_last_verified:
                days_since_check = (self.today - p.dpf_last_verified).days
                if days_since_check > 90:
                    issues.append(
                        f"DPF certification last verified {days_since_check} days ago "
                        f"(threshold: 90 days)"
                    )
                    recommendations.append("Re-verify DPF certification status on DPF.gov")

            if p.certification_expiry and p.certification_expiry < self.today:
                issues.append(f"DPF certification expired {p.certification_expiry}")
                recommendations.append("Processor must re-certify or switch to SCCs immediately")

            if not p.scc_fallback_in_place:
                recommendations.append(
                    "Consider executing SCCs as Schrems III resilience measure"
                )

        elif p.transfer_mechanism == TransferMechanism.SCC:
            if not p.tia_completed:
                issues.append("SCCs in place but no Transfer Impact Assessment documented")
                recommendations.append("Complete TIA covering EO 14086 and US surveillance law")

        status = "NON_COMPLIANT" if any(
            "expired" in i or "not verified" in i for i in issues
        ) else ("WARNING" if issues else "COMPLIANT")

        return DPFComplianceResult(p.name, status, issues, recommendations)

    def summary_report(self) -> dict:
        results = self.check()
        return {
            "date": str(self.today),
            "total": len(results),
            "compliant": sum(1 for r in results if r.status == "COMPLIANT"),
            "warnings": sum(1 for r in results if r.status == "WARNING"),
            "non_compliant": sum(1 for r in results if r.status == "NON_COMPLIANT"),
            "findings": [
                {"processor": r.processor, "status": r.status,
                 "issues": r.issues, "recommendations": r.recommendations}
                for r in results if r.status != "COMPLIANT"
            ]
        }

# Example usage
processors = [
    SubProcessor(
        name="AWS (us-east-1)",
        country="US",
        data_categories=["user accounts", "usage logs", "application data"],
        transfer_mechanism=TransferMechanism.DPF,
        dpf_certified=True,
        dpf_last_verified=date(2026, 4, 1),
        scc_fallback_in_place=True,
        tia_completed=True,
    ),
    SubProcessor(
        name="Stripe",
        country="US",
        data_categories=["billing name", "email", "payment metadata"],
        transfer_mechanism=TransferMechanism.DPF,
        dpf_certified=True,
        dpf_last_verified=date(2026, 4, 1),
        scc_fallback_in_place=True,
        tia_completed=True,
    ),
    SubProcessor(
        name="Mystery Analytics Inc",
        country="US",
        data_categories=["user IDs", "page views"],
        transfer_mechanism=TransferMechanism.DPF,
        dpf_certified=False,  # Not verified!
        dpf_last_verified=None,
        scc_fallback_in_place=False,
        tia_completed=False,
    ),
]

checker = DPFTransferChecker(processors)
report = checker.summary_report()
print(json.dumps(report, indent=2, default=str))

Output (abridged):

{
  "date": "2026-04-17",
  "total": 3,
  "compliant": 2,
  "warnings": 0,
  "non_compliant": 1,
  "findings": [{
    "processor": "Mystery Analytics Inc",
    "status": "NON_COMPLIANT",
    "issues": ["DPF adequacy claimed but processor not verified as certified"],
    "recommendations": [
      "Check Mystery Analytics Inc on dataprivacyframework.gov/list",
      "Consider executing SCCs as Schrems III resilience measure"
    ]
  }]
}

DPF vs SCCs vs EU Hosting: Decision Matrix

ScenarioRecommended MechanismComplexity
US SaaS tool, DPF-certifiedDPF adequacyLow
US SaaS tool, not DPF-certifiedSCCs + TIAMedium
US tool, high-risk data (health, financial)SCCs + TIA + DPIAHigh
US group entityBCRs or intra-group SCCsHigh
Core application infrastructureEU-native hostingLowest (no transfer)
EU-native PaaS (e.g., sota.io)No transfer mechanism neededNone

The developer's first question should always be: "Can I host this in the EU?" If the answer is yes, the entire DPF/SCC analysis becomes irrelevant for that component. EU-native infrastructure eliminates Chapter V transfer risk entirely.

ROPA Updates for DPF

Your Article 30 Records of Processing Activities must document the transfer basis. For DPF-covered transfers, update the "transfers to third countries" column:

Transfer to: [US Sub-Processor Name]
Country: United States
Transfer mechanism: Adequacy Decision (EU) 2023/1795 — EU-US DPF
Date of adequacy decision: 10 July 2023
DPF certification verified: [Date of last verification]
Fallback safeguard: SCCs (EU) 2021/914 Module 2 — executed [date]

25-Item DPF Compliance Checklist

Inventory & Mapping

Privacy Notice & Transparency

Accountability for Onward Transfer

Security

Individual Rights

Schrems III Resilience

Annual Maintenance

Common Compliance Mistakes

Mistake 1: Assuming DPF certification is permanent DPF certification must be renewed annually. An organisation that certified in 2023 and forgot to renew is no longer covered — and your adequacy reliance on them is invalid. Always verify on DPF.gov, not on the processor's own privacy policy.

Mistake 2: Relying on DPF for non-certified recipients DPF only covers transfers to listed, active certifications. Sub-processors, sub-sub-processors, and any downstream US entity that is not individually certified require their own transfer mechanism.

Mistake 3: No parallel SCC strategy The Schrems I and Schrems II decisions came with no grandfathering period — data flows needed to stop or switch mechanisms immediately. Having executed SCCs alongside DPF means that if the CJEU invalidates the DPF, your transfers remain lawful without an emergency SCC execution sprint.

Mistake 4: Not updating the ROPA Data protection authorities during audits will ask for the specific legal basis and the date of last verification. "We rely on the DPF" without a ROPA entry and verification date record is a finding.

Mistake 5: Treating consent as a DPF substitute Consent under Art. 6(1)(a) GDPR is a valid transfer basis under Art. 49(1)(a), but it requires freely given, specific, informed, and unambiguous indication. For ongoing SaaS relationships where consent cannot be withdrawn without service disruption, consent is not a valid basis. Use DPF or SCCs.

sota.io and EU-Native Infrastructure

If your application is hosted on EU-native infrastructure, most Chapter V transfer questions disappear at the application layer. When personal data is processed exclusively on EU servers — as with workloads deployed on sota.io — the data never leaves the EEA and no transfer mechanism is required for that component.

The DPF analysis then narrows to your third-party integrations: US-based analytics, monitoring, email delivery, payment processing, and support tooling. This is a much smaller and more manageable surface area than architecting for a US-hosted application.

For any integration sending personal data to US services, the DPF checker above gives you an automated compliance baseline. Combined with quarterly DPF.gov verification and parallel SCCs for critical paths, you can maintain lawful EU→US transfers even in the face of continued legal uncertainty.


This guide covers the status of the EU-US DPF as of April 2026. The legal landscape may change; monitor EDPB opinions and CJEU case C-446/21 (ongoing) for developments that may affect the adequacy determination.