GDPR-Relevant Engineering Practices for Software Teams
Software teams support GDPR compliance not by interpreting the regulation themselves, but by building systems that can actually do what a compliance program needs: collect only the data a feature genuinely requires, locate and delete a specific person's data across primary stores, backups, and downstream systems on request, export that data in a usable format, record and honor consent choices, control where data is stored and processed, and restrict and log access to it. This article covers those practices from an engineering angle only. It is general technical guidance, not legal advice — whether a given system satisfies GDPR is a legal determination that requires qualified counsel, not an engineering judgment call.
Key takeaways
- Data minimization, right-to-erasure support, and portability are architecture decisions, not features bolted on later
- Deletion is the practice most teams underestimate — it has to reach backups, logs, caches, and downstream systems, not just the primary database
- Consent needs to be modeled as structured, timestamped, purpose-specific records a system can query and act on, not a one-time checkbox
- Where data is stored and processed, and which subprocessors touch it, are infrastructure choices with real compliance surface area
- This is engineering guidance only — GDPR compliance determinations require qualified legal counsel, not an engineering judgment call
Most engineering teams building software that touches personal data of people in the EU or EEA eventually run into the same realization: GDPR isn't primarily a legal document that engineers read once and then ignore. It's a set of obligations — data minimization, the right to erasure, the right to portability, honoring consent, controlling where and how data moves — that only become real if the underlying systems are actually built to support them. A legal team can determine what a business is obligated to do. Whether a piece of software can actually do it is an engineering question, and it's one that's far cheaper to answer correctly during design than it is to retrofit after a request comes in.
Before going further, it's worth being explicit about what this article is and isn't, because the topic invites confusion between the two. This is a technical guide to engineering practices relevant to GDPR — how to design data models, deletion workflows, export formats, consent records, and infrastructure choices in ways that make compliance obligations achievable. It is not legal advice, and it should not be treated as one. Whether a specific system, feature, or organization actually complies with GDPR is a legal determination that depends on facts this article has no way to evaluate — what data is collected, under what legal basis, for what purpose, in what contractual context, and under which supervisory authority's interpretation. That determination requires qualified legal counsel familiar with the organization's specific circumstances. Nothing here should be read as asserting that following these practices satisfies any particular legal obligation. Engineering practice and legal compliance are related but distinct, and treating sound engineering as a substitute for legal review is a mistake in either direction — building well without legal input risks solving the wrong problem, and getting legal sign-off on a policy that engineering can't actually implement is just as risky.
With that boundary established, the rest of this article covers the technical practices themselves, organized around the parts of GDPR that have the most direct architectural consequences: data minimization, the right to erasure, data portability, consent as a technical system, data residency and cross-border transfer, encryption and access control, privacy by design as a development discipline, third-party subprocessors, and a practical framework for keeping privacy review part of ongoing development rather than a one-time exercise.
Data minimization as a design principle
Data minimization is usually introduced as a legal principle — collect no more personal data than necessary for the stated purpose — but it has a very concrete engineering translation: every field in a data model should be traceable to a feature that actually needs it, and every retention period should be a deliberate decision rather than an accident of "we never got around to deleting it."
Why "just in case" fields accumulate
Data models tend to grow more permissive over time, not less, for reasons that have nothing to do with compliance. A third-party signup form makes it trivial to add a phone number field even though no feature uses it yet. A developer copies a payload from an upstream API and persists the whole object because extracting only the needed fields takes extra work in the moment. An analytics event includes a full user object "in case it's useful later" rather than the two fields an actual dashboard queries. None of these decisions look risky individually. Collectively, they produce a system that holds meaningfully more personal data than its actual functionality requires — which increases the surface area for a breach, complicates every later deletion and export request, and adds fields that a legal review will eventually have to justify or remove.
Minimization at each layer
Minimization isn't a single decision made once at the database schema level — it applies at several distinct layers, each with a different failure mode:
- Input collection: does a form or API endpoint request a field the feature behind it actually uses? A checkout flow asking for a date of birth when it only needs to confirm the user is over a threshold age is collecting more than the purpose requires.
- Persistence: is a field stored just because it arrived in a request, or because something downstream reads it? Logging an entire inbound payload for debugging purposes and never pruning sensitive fields out of it is a common, easily overlooked source of unnecessary persisted personal data.
- Propagation: does a field get passed on to a third-party service, an analytics pipeline, or a downstream microservice that doesn't actually need it, just because it happened to be present on the object being passed around?
- Retention: does data get deleted or anonymized once its purpose is fulfilled, or does it accumulate indefinitely because no expiry was ever defined? A support-ticket system that never purges resolved tickets, or a session-logging system with no rotation policy, are common examples of retention drifting far past actual need.
Making minimization a reviewable engineering decision
The practical mechanism for keeping data minimization real, rather than aspirational, is making it a question asked explicitly during design and code review for any change that adds or modifies a field touching personal data: what is this field for, which feature reads it, and what's the retention period. A schema change that adds a personal-data field without an answer to those three questions is worth pausing on before it ships, not revisiting months later when a legal or security review asks the same questions with more friction attached.
The right to erasure: an underestimated engineering challenge
If there's one GDPR-relevant obligation that engineering teams consistently underestimate at design time, it's the right to erasure — commonly called the right to be forgotten. The underestimation isn't about understanding that deletion needs to happen; it's about underestimating how many places a person's data actually lives once a system has been running for a while.
Why deletion is rarely a single operation
A request to delete one person's data sounds, at first glance, like a DELETE statement against a users table. In practice, a mature system's data about a single person is typically spread across:
- The primary database, often across multiple tables linked by foreign keys or a user identifier
- One or more read replicas, which may lag behind the primary and need their own propagation path
- A search index (Elasticsearch, Algolia, or similar) that's a denormalized copy of some of that data
- A caching layer (Redis or similar) holding a shorter-lived but still-live copy
- Application logs, access logs, and error-tracking systems that may have captured identifiers or payloads containing personal data
- Analytics and event pipelines, which often retain raw event data far longer than the operational systems that generated it
- Email and notification tooling, which may hold delivery history and engagement data
- Automated backups and archival snapshots, some of which may be months old and effectively immutable once written
- Any downstream system or subprocessor the data was shared with, which needs its own deletion path
A deletion process that only addresses the primary database will genuinely remove the record from the place engineers look first, while leaving the same person's data recoverable from half a dozen other places — which defeats the purpose of the request even though it looks, from the primary application, like it succeeded.
Designing deletion in, not bolting it on
Systems that handle erasure well tend to share a few design characteristics, put in place well before the first real request arrives:
- A canonical way to identify all of a person's data. This usually means a consistent user or subject identifier propagated through every system that stores personal data, so that a deletion workflow has a reliable key to search on everywhere rather than reconstructing an ad hoc list of "everywhere this person's email address might appear."
- A deletion workflow that fans out, not a single query. A practical pattern is a deletion service or job that, given a subject identifier, triggers deletion or anonymization across every registered downstream system, tracks which ones have confirmed completion, and surfaces the ones that haven't — rather than relying on someone manually running queries against a growing list of data stores.
- A defined approach for logs. Since logs are often append-only and not designed for targeted deletion, a common practical approach is avoiding storing directly identifying information in logs in the first place — referencing a user by an opaque identifier rather than an email address or name — combined with a bounded retention period so that logs age out naturally rather than persisting indefinitely.
- A defined approach for backups. Full backups are frequently the hardest part of erasure to handle cleanly, because restoring an old backup can reintroduce data that was deleted from the live system. Two common, complementary approaches: keeping backup retention periods short enough that old backups age out naturally within a reasonable window, and maintaining a process — even if partly manual — for applying pending deletions to a backup if it's ever restored, so a restore doesn't silently undo a completed erasure.
- Anonymization as an alternative to hard deletion where deletion would break referential integrity. Sometimes a record can't simply be deleted without breaking a downstream system's data model — an order history referencing a deleted customer, for instance. Replacing personal fields with anonymized placeholders while preserving the non-personal parts of the record is a common pattern that satisfies the substance of an erasure request without breaking the systems that depend on the record's continued existence.
A framework for scoping a deletion workflow
The table below is a starting structure for mapping where a deletion request actually needs to reach, and is a useful exercise to run once during architecture and revisit whenever a new data store is introduced:
| Data location | Typical deletion challenge | Practical approach |
|---|---|---|
| Primary database | Data spread across many related tables | Maintain a mapped, tested cascade or a dedicated deletion routine, not ad hoc queries |
| Read replicas | Replication lag before deletion propagates | Confirm propagation completion, not just issuance of the delete |
| Search index / cache | Denormalized copies drift out of sync with source | Trigger index/cache invalidation as part of the same deletion workflow |
| Logs | Often append-only, not built for targeted deletion | Avoid storing direct identifiers in logs; bound retention |
| Analytics/event pipelines | Raw events often retained longer than operational data | Apply the same subject identifier and a deletion or anonymization job |
| Backups | Old snapshots contain data by definition | Bound backup retention; have a process for restored-backup remediation |
| Third-party subprocessors | Deletion depends on vendor capability and cooperation | Confirm vendor deletion support before adoption; track completion |
Treating each row as a distinct checkpoint that needs its own confirmed completion, rather than assuming a single deletion call handles everything downstream, is what separates a deletion workflow that actually works from one that only looks like it does.
Data portability: exporting in a genuinely usable format
The right to portability asks for something narrower than erasure but still has real technical requirements: a person should be able to receive the personal data they've provided in a structured, commonly used, machine-readable format, and in principle transfer it to another provider.
What "machine-readable" rules out
A PDF summary or an HTML page rendering a user's data satisfies neither the letter nor the spirit of portability, however complete it looks to a human reader — it's not structured in a way another system could parse and import. Formats like JSON or CSV, with a clearly documented schema, are what portability is actually asking for: something a script, not just a person, could consume.
Designing an export that's actually complete and actually usable
A few practical considerations make the difference between a token export feature and one that holds up under real use:
- Scope the export to data the person provided or that's clearly about them, distinguishing it from derived or aggregate data that isn't meaningfully "theirs" to export — a distinction that has both technical and legal dimensions, and one worth confirming with legal counsel rather than assuming from an engineering read alone.
- Use a stable, documented schema for the export rather than dumping raw internal database structures, which tend to include internal identifiers, foreign keys to unrelated systems, and field names that only make sense inside the originating application.
- Include enough structure to be genuinely portable, not just complete — nesting related records logically (an order with its line items, rather than two flat unrelated tables) so that another system could plausibly reconstruct the relationships, not just the raw values.
- Automate the export path rather than relying on a manual, one-off data pull, both because manual exports don't scale past a handful of requests and because a manual process is more error-prone at exactly the point where completeness matters most.
- Test the export against systems added after the original export feature shipped. Portability features, like deletion, tend to be built once against the system as it existed at that time and then quietly become incomplete as new data stores get added without anyone updating the export logic to include them.
Consent management as a technical system
Consent, when GDPR requires it as the legal basis for processing, isn't a single checkbox event — it's a state that needs to be recorded, queryable, and actionable over the lifetime of a person's relationship with a system. Treating it as a purely legal/UX concern and underinvesting in its technical representation is a common gap.
What a consent record actually needs to capture
A consent record that can genuinely support later obligations — proving what was agreed to, honoring a withdrawal, applying the right version of a policy — typically needs to capture, at minimum:
- What was consented to, specifically — which processing purpose, not just a generic "I agree" — since GDPR requires consent to be purpose-specific rather than blanket.
- When consent was given, as a timestamp, since a consent's validity can depend on how long ago it was granted and what's changed since.
- What version of the relevant policy or purpose description was in effect at the time, since a later change to what data is processed or why may require re-obtaining consent rather than relying on a prior, differently-scoped agreement.
- How consent was obtained — through what specific interface element or flow — since a valid consent record generally needs to reflect a clear, affirmative action, not a pre-checked box or an inferred default.
- Current status, including whether it has since been withdrawn, and when.
Building withdrawal as a real, honored capability
A consent system is only as credible as its withdrawal path. Recording consent but having no mechanism that actually stops the associated processing when consent is withdrawn is a gap that tends to surface only when it's tested for real — a withdrawal request that a support agent has to manually track down and act on, or a downstream system that keeps processing data because nothing told it consent changed. Practical design choices that make withdrawal real rather than nominal:
- A consent state that's checked at the point processing actually happens, not just at the point data was originally collected — so a withdrawal takes effect on the next relevant operation, not only for data collected afterward.
- Propagation of a withdrawal event to every system that consumes the associated consent state, similar in shape to the fan-out problem in erasure — a marketing-email system, an analytics pipeline, and a personalization engine may each need to independently honor the same withdrawal.
- A clear, low-friction path for a person to withdraw consent that's at least as accessible as the path used to give it — a design expectation that often has both technical and legal dimensions worth confirming with counsel.
Consent as data, not configuration
The most durable technical pattern here treats consent as its own auditable data — a table or dedicated store of consent records with the fields above — rather than a boolean flag bolted onto a user profile with no history. A flag that's simply overwritten when a preference changes loses the "when" and "what version" information that matters if a consent's validity is ever questioned later. Modeling consent with the same rigor as an audit log, because that's functionally what it is, avoids that loss.
Data residency and cross-border transfer at the infrastructure level
Where personal data is actually stored and processed is an architecture decision with direct compliance relevance, not an incidental detail of which cloud region happened to be the default when a project was set up.
Why region selection is a compliance-relevant technical choice
Cloud infrastructure typically defaults to whichever region is closest to the team provisioning it or cheapest at the time, unless someone deliberately overrides that default. For a system processing personal data of people in the EU/EEA, the region a database, a backup, a queue, or a logging pipeline actually runs in — and the regions any managed service or subprocessor behind it uses — is directly relevant to cross-border transfer considerations that a legal team needs to evaluate. Engineering's role here is making the actual data flow visible and controllable, not making the legal determination about which transfer mechanisms are sufficient for a given case.
Mapping where data actually goes, not where it's assumed to go
It's common for a team to have a general sense of "our primary database is in the EU" while being far less certain about where a logging service, an email-delivery provider, an analytics tool, or a support-ticketing system — each potentially touching the same personal data — actually store and process it. A practical exercise worth doing directly, and revisiting whenever a new service is added, is mapping every system that touches personal data against the region(s) it actually operates in, rather than assuming a single primary-database decision covers the whole system.
Technical levers for residency control
Several concrete engineering choices affect data residency in practice:
- Region pinning for managed services and storage, rather than accepting a default region.
- Multi-region architecture that deliberately keeps EU/EEA personal data within EU/EEA infrastructure where that's a requirement, rather than a single global deployment that happens to run wherever is operationally convenient.
- Data-flow diagrams maintained as living documentation, not a one-time diagram produced for an audit and never updated as the architecture changes.
- Vendor configuration settings — many cloud and SaaS providers offer region-scoping options that aren't enabled by default and require deliberate configuration to take effect.
None of this substitutes for a legal assessment of what transfer mechanism, if any, is required or sufficient for a specific data flow — that's squarely a legal question. What engineering can and should do is make the actual data flow accurate, visible, and controllable enough that legal counsel can evaluate it against real infrastructure rather than an idealized description of it.
Encryption and access control for personal-data stores
Encryption and access control don't themselves determine legal compliance, but they're foundational technical safeguards that any serious approach to protecting personal data depends on, and they intersect directly with GDPR's expectations around appropriate technical measures. The stakes are highest wherever GDPR-relevant personal data overlaps with another regulated category — clinical records in healthcare software, or transaction and account data in fintech — where a gap in access control or encryption compounds two sets of obligations at once, not just one.
Encryption in transit and at rest
Personal data should be encrypted in transit using current, properly configured TLS across every hop it travels — between a client and an application server, between internal services, and to any third-party integration — not just at the public-facing edge. At rest, encryption should apply to primary databases, backups, and any derived stores such as search indexes or caches that hold copies of the same data. Backups deserve particular attention here, since they're sometimes treated as a lower-priority target for encryption than the live database, despite containing the same sensitive content and often being stored somewhere with different, sometimes weaker, access controls.
Least-privilege access to personal-data stores
Access to systems holding personal data should follow the same least-privilege principle that applies to any sensitive system: engineers, support staff, and services should have only the access their role genuinely requires, scoped as narrowly as practical, rather than broad standing access to a full production database because it's operationally convenient. Direct production database access for routine debugging is a common and avoidable source of unnecessarily broad exposure — a read-only, field-masked, or purpose-built tooling layer often serves the same debugging need with meaningfully less access to raw personal data.
Audit logging of access to personal data
Recording who accessed what personal data, when, and for what stated purpose is both a security control and a practice that directly supports answering later questions about how a specific person's data was handled — including questions that arise from a data-subject request or an internal investigation. Audit logs covering personal-data access should themselves be protected at least as carefully as the data they describe, since an audit trail that can be altered or deleted by the same people it's meant to hold accountable doesn't serve its purpose.
Privacy by design as an engineering discipline
Privacy by design is often described at a level abstract enough to feel like a slogan rather than a practice. Concretely, for an engineering team, it means the considerations covered above — minimization, erasure support, portability, consent modeling, residency, access control — get raised during architecture and design review, before a system is built, rather than being retrofitted once a compliance review flags a gap.
The cost asymmetry that makes this worth doing early
The pattern here mirrors security-by-design: a data-model decision made at design time — whether to store a field at all, whether a new data store needs to be included in the deletion fan-out, whether a new integration needs its region confirmed — costs a short conversation. The same decision, discovered after the system is in production with real data and real integrations depending on the existing structure, costs a migration, a backfill, and often a period where the gap existed and needs a considered response for the data already collected under it. Privacy-by-design isn't a moral stance about doing the right thing early; it's a straightforward recognition of how much cheaper the same fix is at different points in a system's life.
What this looks like in a design review
A short, consistent set of questions applied to any design touching personal data does most of the work: What personal data does this feature actually need, and can that be narrowed? If a person asks for this data to be deleted, does that reach every place this design causes it to be stored? If a person asks for a copy of their data, is what this design stores structured well enough to include in that export? Does this design introduce a new consent-relevant purpose, and if so, is consent for that purpose modeled explicitly? Does this design introduce a new third-party dependency or a new region, and has that been accounted for in the data-flow map? None of these questions require legal training to ask — they require treating privacy-relevant impact as a standard design-review dimension alongside performance, security, and maintainability.
Third-party subprocessors and the technical implications of vendor choices
Every third-party service an engineering team integrates that stores, processes, or even transiently handles personal data — cloud infrastructure, analytics platforms, email-delivery services, customer-support tooling, error-tracking and logging services — becomes a subprocessor with its own compliance surface area, and the choice of which vendor to use is, practically speaking, an engineering decision with downstream compliance consequences.
Why this is an engineering concern, not only a legal or procurement one
Data processing agreements between an organization and its subprocessors are a legal and contractual matter, appropriately owned by legal and procurement functions. But the underlying facts those agreements need to accurately describe — what data actually flows to a given vendor, in what form, to which region, and for how long it's retained there — are determined by how engineering configures and uses that vendor's service. An analytics tool configured to receive a full user object when it only needs an anonymized event identifier, or a logging service that ends up capturing more request payload detail than intended, changes the actual data-processing relationship with that vendor regardless of what the signed agreement says should happen.
Practical technical questions worth asking before adopting a vendor
- Does the vendor support the deletion and export workflows this system needs to build, or would using it create a documented gap in the erasure or portability fan-out described earlier?
- What regions does the vendor process and store data in, and is that configurable?
- What does the vendor's own subprocessor chain look like — does adopting this vendor introduce further subprocessors beyond the ones already accounted for?
- What's the minimum data this integration actually needs to send, and is the integration built to send only that, or does it pass along a broader object out of convenience?
- What's the vendor's own data-retention default, and is it aligned with what this system's data-retention policy requires?
Keeping the vendor list itself current and reviewed
A data-flow map is only useful if it reflects the current, real set of vendors in use, not the set that existed when it was last updated. New tools get adopted by individual engineers or teams outside of any formal procurement process reasonably often — a new error-tracking service trialed during an incident, a new analytics tool added by a single team — and each one that touches personal data needs the same evaluation as a formally procured vendor, or it becomes an unaccounted-for gap in whatever review legal counsel is relying on to make the compliance determination.
A practical framework for ongoing privacy-relevant review
The single structural mistake that undermines most of the practices above is treating them as a one-time audit rather than a recurring part of how a team builds software. A system evaluated once against these considerations and never revisited will drift out of alignment with them as soon as the next feature, the next vendor, or the next data store is added.
Folding privacy review into existing development gates
Rather than standing up a separate, periodic privacy-audit process, the more durable pattern is extending the review gates a team already has — design review and code review — with a short, consistent set of privacy-relevant questions applied specifically to changes that touch personal data:
- At design time: What personal data does this feature introduce or modify, and is it minimized to what the feature actually needs? Does it introduce a new consent-relevant purpose, a new subprocessor, or a new region? Has it been checked against the deletion and export fan-out?
- At code-review time: Does the diff introduce a new field, log statement, or third-party call that captures personal data not covered by the design review? Does a new data store need to be registered in the deletion workflow?
- At vendor-adoption time: Has the new service been evaluated against the technical questions above before it's wired into the personal-data-handling parts of the system?
- On a recurring cadence, independent of any single change: Is the data-flow map still accurate? Are retention periods still being enforced, or has something started accumulating data past its intended lifetime? Does a test deletion request actually reach every system it's supposed to?
Why a recurring cadence matters even with good gates
Even well-run design and code review can miss issues that only show up in aggregate — a retention policy that was correctly implemented per-feature but never enforced by an actual scheduled job, or a data-flow map that's individually accurate for each change but has drifted from reality as an accumulation of small, individually-reasonable decisions. A periodic, dedicated pass — reviewing the current data inventory, testing the deletion and export workflows end-to-end against real (or realistic test) data, and confirming the vendor list against the data-flow map — catches what per-change review structurally can't, because per-change review only ever looks at one change at a time.
Treating this as ongoing engineering work, not a phase
The practices covered in this article — minimization, erasure support, portability, consent modeling, residency awareness, access control, privacy-by-design review, and subprocessor evaluation — share the same character as the security practices they parallel: none of them are ever permanently finished. New features add new data. New vendors get adopted. New regions get spun up for good operational reasons unrelated to compliance. A team that budgets ongoing time for this — as a normal, recurring part of engineering work rather than a project that ends once a checklist is completed — ends up with systems that stay technically capable of supporting compliance obligations as they evolve, rather than systems that were compliant-by-design once, at a single point in time, and drifted from that state without anyone noticing until a request or a review exposed the gap.
None of this replaces legal judgment, and it isn't meant to. Engineering can make a deletion request technically fulfillable, a consent choice technically honored, and a data flow technically visible and controlled. Whether those capabilities, taken together with an organization's actual processing activities, contracts, and legal basis for processing, satisfy GDPR is a determination for qualified legal counsel to make — informed by an accurate technical picture, but not substituted for by one.
To work through these practices against a specific system, use the interactive GDPR Engineering Readiness Checklist — the same practices covered above as a checklist you can check off and print, engineering guidance only.
Frequently asked questions
Does following this guide mean our software is GDPR compliant?
No, and that distinction matters. This article describes engineering practices that make GDPR-relevant obligations technically achievable — designing systems so a deletion request can actually be fulfilled, so consent is recorded and honored, so exports are usable. Whether a specific organization's overall processing activities, legal basis for processing, contracts, and operational practices satisfy GDPR is a legal determination that depends on facts an engineering guide can't evaluate: what data is collected, why, under what legal basis, in what jurisdiction, and under what contractual terms with customers and vendors. That determination requires qualified legal counsel. Sound engineering makes compliance achievable; it doesn't itself constitute compliance.
Why is the right to erasure harder to implement than it sounds?
Because "delete this person's data" is rarely a single delete statement against one table. A typical system's data about one person is spread across a primary database, one or more read replicas, a search index, a caching layer, application and access logs, analytics and event pipelines, email and notification tooling, and both automated and manual backups — and a backup taken before the deletion will still contain the data until it's rotated out or specifically addressed. Some of those systems support targeted deletion easily; others, particularly immutable logs and older backup snapshots, often don't without deliberate design work done in advance. Teams that only think about erasure when a request first arrives typically discover the backup and logging gaps at that point, which is a considerably worse time to discover them than during initial architecture.
What's the difference between data minimization and just not collecting personal data at all?
Data minimization doesn't mean avoiding personal data — most useful software has to process some. It means collecting and retaining only what a specific feature genuinely needs to function, for only as long as it's needed, rather than defaulting to broad collection because a field might be useful someday or because a third-party form makes it easy to add extra inputs. In practice this shows up as concrete decisions: not adding a date-of-birth field when a feature only needs an age range, not persisting a full request payload when only two fields from it are used downstream, and setting a retention period instead of keeping records indefinitely by default.
Do we need to worry about this if we use third-party cloud infrastructure or analytics tools?
Yes — using a third-party service to store, process, or analyze personal data extends the technical and compliance surface of a system to that vendor, regardless of how the underlying application code is written. Where that vendor stores and processes data, what its own subprocessors are, and what data it retains and for how long all become relevant. This doesn't mean avoiding third-party infrastructure — that's rarely practical — but it does mean engineering teams should treat vendor selection and configuration (region settings, data-retention settings, what fields actually get sent to a given service) as decisions with compliance relevance, made in coordination with whoever in the organization owns the actual compliance determination.
Should privacy review happen once, during a compliance audit, or continuously?
Continuously, integrated into normal development rather than treated as a periodic audit event. A one-time review captures the system as it existed at that moment; every feature added afterward that touches personal data reopens the same questions the audit answered, and without a recurring process those questions simply don't get asked again until the next scheduled audit — often long after a privacy-relevant gap has already shipped. Folding a short, consistent set of privacy-relevant questions into design review and code review for any change touching personal data catches issues while they're still cheap to fix, the same way that ongoing security review works better than security treated as a pre-release checklist.
Related reading
- Custom Software DevelopmentDesign and development of secure, scalable custom software for companies across Sweden and the Nordic region.
- Data Engineering & AnalyticsData pipelines, warehousing, quality validation and BI reporting built to make scattered operational and sensor data reliable enough to trust.
- HealthcareCustom scheduling, patient-portal and referral-workflow software for healthcare providers, plus data integration with existing EHR/EMR systems.
- FinTechCustom fintech software: open banking API integration, KYC workflow automation and data platforms. North Tech Labs is not a licensed payment institution.
Have a specific question about your project?
This article covers the general pattern — the fastest way to get a specific answer is to ask us directly.