figma guide

Designing data subject access request (DSAR) and GDPR portal UI in Figma: intake, identity verification, and fulfillment

Design DSAR and GDPR rights portals in Figma with request intake forms, identity verification, SLA tracking, fulfillment packages, and admin queues for Privacy teams.

Published
Updated
Aug 02, 2026
Read time
9 min
Level
Intermediate

Quick answer

A data subject access request (DSAR) portal is how individuals exercise GDPR and similar privacy rights—access, deletion, correction, portability, restriction, and objection—through a structured intake and fulfillment workflow. Design a public request form with right-type selection and jurisdiction; identity verification before sensitive data is released; an admin queue with SLA countdowns (30 days GDPR default); and fulfillment packages (secure download, redaction notes, partial denial reasons). Start from the Figma guides hub and pair with privacy settings, compliance exports, PIA/DPIA workflow, DPA hub, and Dev Mode handoff.


Who this is for

  • Product designers building privacy rights centers for B2C apps, B2B SaaS, or enterprise admin consoles.
  • Design system teams aligning request forms, status trackers, and secure download patterns with forms and progress steppers.
  • Privacy officers and Legal defining verification tiers, extension rules, and denial letter templates.

DSAR hub (internal admin overview)

DSARHub — Acme Privacy Ops · Open requests: 34 · Due this week: 9 · Overdue: 1
├── Header: Median fulfillment 18 days · Extension rate 8% · Denial rate 3%
├── Actions: [ Create manual request ] [ Bulk assign ] [ Export SLA report ]
├── Tabs: Intake queue · Verification · In progress · Awaiting approval · Completed · Templates
├── Alert: REQ-8842 overdue 2 days · Access · Enterprise customer · Escalated to DPO
├── SLA banner: GDPR 30-day clock · CCPA 45-day · Extensions logged with reason
└── Link: [Privacy settings self-serve](/designing-privacy-settings-and-data-management-ui-in-figma/) · Compliance exports · Audit log
SectionPurpose
Intake queueNew web/email requests awaiting triage
VerificationID checks before data release
In progressCross-system data gathering
Awaiting approvalLegal/DPO review for denials or partial fulfillment
CompletedClosed with package hash and notification sent
TemplatesAcknowledgment, extension, denial, fulfillment emails

Verdict: DSAR UI spans public portal + admin ops—design both so status is never opaque to the data subject after submit.


Public request intake

DSARPortal — Submit a privacy request · acme.com/privacy/requests
├── Step 1: I am requesting as · [ Data subject myself ] [ Authorized agent ] [ Parent/guardian ]
├── Step 2: Request type (select one):
│   ├── Access / copy of my data (Art. 15)
│   ├── Delete my data (Art. 17)
│   ├── Correct inaccurate data (Art. 16)
│   ├── Export portable data (Art. 20)
│   ├── Restrict processing (Art. 18)
│   └── Object to processing (Art. 21)
├── Step 3: Account identifier · Email · Optional account ID · Region of residence
├── Step 4: Details · Free text · Scope (all data vs specific product)
├── Step 5: Verification method · Email OTP · Upload ID · Login to account
├── Submit → Reference REQ-8847 · Confirmation email · Do not include data in email
└── Footer: Privacy Policy · [Cookie settings](/designing-cookie-consent-and-tracking-preference-ui-in-figma/) · Contact DPO
Intake fieldDesign note
Request typePlain language + legal article in helper text
Agent authorizationUpload power of attorney; separate workflow
RegionDrives SLA, verification tier, and template
ScopeReduces over-broad engineering queries
Reference IDProminent on confirmation and status page
No data in emailSecurity copy on every confirmation

Use forms patterns with clear labels—“Delete” must confirm irreversibility in a follow-up modal.

Logged-in users should pre-fill from session and offer one-click requests in privacy settings—portal handles guests and agents.


Identity verification tiers

Verification — REQ-8847 · Tier 2 · Status: Awaiting ID upload
├── Tier 0: Logged-in session · Sufficient for self-serve export in app settings
├── Tier 1: Email OTP · Low-risk access for known email match
├── Tier 2: Government ID + selfie match · High-risk or agent requests
├── Tier 3: Notarized agent docs · Enterprise legal hold exceptions
├── Failed attempt: 2 of 3 · Lock 24h · Link [account recovery](/designing-suspicious-login-alerts-and-account-recovery-ui-in-figma/)
└── Privacy: Delete ID images within 30 days after verification · Document in UI copy
TierWhen to useUX
SessionUser already authenticatedRedirect to in-app privacy center
Email OTPEmail matches accountCode entry + resend timer
ID uploadGuest delete or large exportDrag-drop + progress + encryption notice
AgentThird-party requestSeparate upload + manual review queue

Verification UI must explain why ID is needed and retention period for uploaded documents—link to privacy settings data retention copy.

Show verification status chip on request tracker: Pending · Verified · Failed · Manual review.


Request status tracker (data subject view)

RequestStatus — REQ-8847 · Access request · Submitted Aug 1, 2026
├── Timeline:
│   ├── ✓ Received · Aug 1 · Acknowledgment sent
│   ├── ✓ Identity verified · Aug 2
│   ├── → In progress · Gathering data from 6 systems · Est. completion Aug 20
│   ├── ○ Review · Legal redaction if needed
│   └── ○ Delivered · Secure download link (7-day expiry)
├── SLA: 26 days remaining (GDPR 30-day deadline)
├── Message thread: Privacy team note Aug 2 · "We extended search to backup archive"
└── Actions: [ Upload additional info ] [ Cancel request ] [ Contact DPO ]
Tracker stateUser communication
ReceivedAuto-ack with reference ID and SLA
Verification neededClear CTA; do not start SLA until verified (jurisdiction-dependent—Legal defines)
In progressHonest scope; no fake progress bars
ExtensionFormal notice with reason before deadline
Partial fulfillmentExplain exclusions (third-party data, trade secrets)
CompletedSecure link; no attachment in email

Use progress steppers for major phases—not per-database micro steps that leak internals.

Cancel request available until fulfillment ships; confirm in modal for deletion requests.


Admin fulfillment workspace

FulfillmentWorkspace — REQ-8847 · Assignee: @privacy-analyst
├── Data sources checklist:
│   ├── [x] Production DB user profile · Auto-export script
│   ├── [x] Support tickets (Zendesk) · Manual export · Redact third-party PII
│   ├── [ ] Marketing automation · Waiting on vendor · Due Aug 10
│   ├── [x] Analytics (aggregated only) · Excluded per policy · Note attached
│   └── [x] Backups · Legal approved narrow search · Aug 5–Aug 12 window
├── Redaction panel: Highlight rows · Reason code · Reviewer sign-off
├── Package builder: ZIP encrypted · Password via separate channel · Expiry 7 days
├── Denial draft: Art. 12(5) manifestly unfounded · Requires DPO approval
└── [ Mark ready for review ] [ Send extension notice ] [ Complete and notify ]
Workspace elementHandoff detail
Source checklistIntegrations list; owner per system
RedactionReason codes sync to audit log
PackageFile manifest; checksum; download audit
DenialTemplate with legal article and appeal path
Extension+60 days max under GDPR with documented complexity

Partial denials need plain-language explanation in the delivery email—not only legal citations.

Link fulfilled exports to compliance exports when litigation hold affects scope—show banner on request if hold applies.


Self-serve vs portal routing

RoutingRules — Where requests land
├── Logged-in + Access/Export/Delete → [Privacy settings](/designing-privacy-settings-and-data-management-ui-in-figma/) automated flows
├── Guest or Agent → Full DSAR portal with verification
├── Enterprise org admin → B2B flow · May affect multiple users · Legal review gate
├── Employee HR data → Separate HR privacy inbox · Not mixed with product DSAR queue
└── Duplicate detection: Same email + type within 30 days → Merge thread
RightSelf-serve candidatePortal required
Access copyYes, if session verifiedGuest users
Delete accountYes with re-authAgent-initiated
Portability JSONYes
Object to marketingPreference center + settingsFormal objection letter
Restrict processingRare; usually manualAlways portal + review

Design consistent status language across self-serve and portal—users should not see different terminology for the same state.


Handoff checklist (Dev Mode)

  • Request — id, type, jurisdiction, submitter_email, agent_flag, status, sla_deadline.
  • Verification — tier, method, verified_at, id_document_retention_days.
  • Timeline event — timestamp, phase, public_message, internal_note flag.
  • Data source — system_id, export_status, redaction_required, owner.
  • Package — download_url_ttl, encryption, manifest_file_list, checksum.
  • Denial/extension — template_id, legal_basis, approver_role, sent_at.
  • Notifications — email_template_keys; never attach fulfillment files.
  • Accessibility — form errors linked; status timeline as ordered list for screen readers.

Common mistakes

MistakeWhy it hurtsFix
Fulfillment attached to emailData breach vectorSecure portal download only
SLA clock starts before verificationPremature overdue alertsLegal-defined start trigger per region
Opaque “in progress” for weeksRegulatory complaintsPhase updates + extension notices
Same queue for HR and product dataWrong fulfillment scopeRoute by data domain
No duplicate mergeRepeated work; inconsistent answersDetect same email + type
ID images stored indefinitelySecondary privacy violationRetention countdown in admin UI
Delete request without re-authAccount takeover abuseStep-up auth or OTP
Engineering raw DB dumpOver-disclosureManifest + redaction workspace
Denial without DPO/Legal gateInvalid rejectionApproval state in admin
Portal disconnected from ROPACannot map processing activitiesLink request types to PIA registry categories

  1. Design public intake with right types, agent path, and verification tier selection.
  2. Build status tracker with SLA visibility and secure messaging thread.
  3. Spec admin fulfillment workspace with source checklist, redaction, and package builder.
  4. Define routing between portal and privacy settings self-serve.
  5. Create email templates for ack, extension, denial, and delivery—no attachments.
  6. Wire audit trail to compliance exports for regulatory requests.

FAQ

DSAR portal vs in-app privacy settings?

Settings automate high-volume self-serve rights for logged-in users. Portal handles guests, agents, complex requests, and manual fulfillment—share status vocabulary.

Marketing opt-out may be instant via preference center; formal objection under Art. 21 may still need portal trail—Legal defines which rights use which path.

DPA hub when vendor holds data?

Fulfillment checklist includes processor requests—admin UI shows pending subprocessors (support tool, analytics vendor) with due dates.

CCPA vs GDPR copy?

Intake collects region and switches SLA text (45 vs 30 days), verification, and “Do not sell/share” cross-links—one portal, region-aware templates.

Enterprise B2B?

Org admin requests affecting employee lists need separate approval—do not merge with consumer queue; pair with team roles.


Next steps

Share on X

§ Keep reading

Related guides.