Collecting and Storing GDPR-Compliant Consent for SaaS Products
Four technical decisions determine whether your SaaS product faces a GDPR fine.

GDPR compliance for a SaaS product boils down to four technical decisions: how consent gets collected, how it's stored, how withdrawal reaches every system touching that data, and how fast a company can delete someone's records on request. Get those four things wrong, and the fallout is a fine with your company's name on it, published for anyone to read.
GDPR applies to any company processing EU residents' personal data. Where the company is incorporated doesn't matter, and that catches a lot of founders off guard. A SaaS business based in Ohio with three EU customers carries the same exposure as one headquartered in Berlin. SaaS products carry more risk than most businesses too: global user bases, a dozen third-party tools wired into the stack, data moving between internal systems and outside vendors all day, every day.
The enforcement numbers back this up. Regulators issued more than €1.6 billion in fines in 2024 alone, and cumulative GDPR penalties passed €5.88 billion by 2026. Enforcement is getting faster, too. Cross-border coordination through the European Data Protection Board has increased regulatory capacity and enabled more consistent enforcement across member states.
This has turned into a sales problem as much as a legal one. Growing SaaS companies increasingly find that privacy compliance becomes a hard requirement during enterprise procurement, with EU customers making demonstrated compliance a condition of signing. Another software company bought a consent management platform for one reason: an EU customer's contract made proof of compliance a condition of signing. GDPR compliance now sits in the procurement stack right next to SOC 2 and uptime guarantees. It's a gate, and gates don't open just because you knock politely.
How GDPR's lawful basis framework determines which decisions a SaaS product actually owns
SaaS companies don't get to pick one lawful basis and slap it on everything the product does. Each use of personal data needs its own justification, mapped individually, purpose by purpose. Most teams skip this step, and it's the single most expensive shortcut on this list.
Two bases matter most. Contract performance covers the core mechanics: account creation, billing, delivering the service someone paid for. Consent covers everything optional: marketing emails, behavioral analytics, non-essential tracking, any feature a user could say no to and keep using the product just fine.
The distinction decides what happens the moment a user pushes back. Data processed under contract performance can be kept as long as the service runs; data processed under consent has to stop the second consent gets pulled. Mix those two up in the data architecture, and the product physically can't respond correctly when someone asks it to stop.
Here's where fast-moving teams trip, and it happens constantly: data collected for one purpose gets quietly reused for another. A team builds an onboarding flow that logs click events for product analytics, then six months later feeds that same data into a new ad-targeting pipeline. No fresh consent, no new justification, just a shared table and a bad assumption. That's a violation, and it happens because nobody flagged the reuse as a decision that needed checking in the first place.
There's also a dual-role problem specific to SaaS. When a platform processes end-user data on behalf of its business customers, it's acting as a processor. When it processes that same category of data for its own purposes (billing, account management, product analytics), it's a controller. Both roles carry liability, and 2025 enforcement made processor liability explicit in a way it hadn't been before. "We were just following our customer's instructions" stopped being a shield somewhere around then.
The fix starts before a single line of code gets written: map every data collection point to a lawful basis first. Skip that step, and the product carries a liability with a login page.
What valid consent actually requires at the point of collection
GDPR sets four bars for consent: freely given, specific, informed, unambiguous. Miss any one, and the consent isn't valid, no matter how many checkboxes got clicked.
Freely given means no bundling. A company can't make accepting the terms of service a package deal with accepting marketing tracking. Locking core functionality behind a "yes" to non-essential data collection isn't allowed either. That kind of forced trade-off has nothing to do with genuine consent; it's coercion with a checkbox.
Specific means one checkbox can't cover three different purposes. Analytics, marketing, and personalization each need their own signal. A single "I agree to data processing" box covering all three is the exact kind of vague bundling regulators have been fining for years, and it hasn't gotten any less fineable with time.
Informed means the user knows, before clicking, what data gets collected, why, and for how long. Not buried in a privacy policy linked in 8-point gray text at the bottom of the page — stated plainly, at the point of the ask.
Unambiguous rules out pre-ticked boxes, implied consent from continued browsing, and silence. No clear affirmative action means no valid consent on file.
In practice, this means a checkbox per processing purpose, and that sounds like over-engineering until you remember it's the floor, not the ceiling. Double opt-in (a user confirming consent a second time, usually by email) isn't required by GDPR outright, but it's the standard move for email marketing and cross-border data collection, where proving the consent was genuinely informed carries the most weight later.
Withdrawal symmetry is the one thing product teams underestimate most. The EDPB treats it as a hard requirement: if accepting takes one click and withdrawing takes four clicks through a buried settings menu, that asymmetry is the violation. Several of the largest fines on record trace back to exactly this pattern, and none of them needed a second offense to get expensive.
One more thing worth saying plainly: consent to one purpose doesn't carry over to a related one. A user who opts into product analytics hasn't opted into having that same data used for ad targeting, even if the two feel adjacent from an engineering standpoint. They aren't the same purpose, and treating them as interchangeable is exactly where teams get into trouble.
The design patterns regulators are actively fining in 2025 and 2026
The GDPR Enforcement Tracker now logs 3,186 enforcement actions, and invalid cookie consent shows up again and again as one of the most common, most expensive categories on the list.
A few cases set the current bar. In January 2022, the CNIL fined Google €150 million and Facebook €60 million for the exact asymmetry problem above: accepting cookies took one click, rejecting took five on Google and three on Facebook, with daily penalties of €100,000 tacked on for continued non-compliance. In September 2025, the CNIL came back with a €325 million fine for Google and €150 million for Shein, this time because inspectors found cookies installed before users had given any permission at all, alongside banners that didn't explain what was actually being collected. Swedish regulators have similarly pursued enforcement actions against companies for dark patterns steering users toward acceptance without giving them a real choice.
Different countries, same playbook. France, Spain, Italy, and Sweden are all fining the same handful of behaviors: lopsided accept/reject paths, cookies that fire before consent is given, banner copy vague enough to mean nothing, and consent flows that don't let users say yes to one thing and no to another.
The lesson for anyone building a SaaS product: a consent banner sitting on the page isn't enough on its own anymore. The mechanics matter more than the copy. Accept and reject need to be equally easy to find and equally easy to click, and the banner needs to say, specifically, what's being collected. Maximum exposure under GDPR runs up to €20 million or 4% of global annual turnover, and the enforcement record shows regulators reach for whichever number stings more.
Consent UI used to live in the design team's Figma file. Now it lives in legal review too, and the pixels carry compliance weight whether anyone on the design team signed up for that or not.
The consent record: what to store, at what level of detail, and why the schema matters
Collecting consent without a record that holds up leaves a company just as exposed as never collecting it at all. The burden of proof sits with the company, not the regulator. If an investigator asks for evidence a specific user consented to a specific purpose on a specific date, "trust us, they clicked yes" doesn't hold up, and it never will.
ISO/IEC TS 27560:2023 gives teams a technical spec to build against, so nobody has to invent a consent schema from scratch. At minimum, a consent record needs a user or session identifier, the exact timestamp of the consent action, the version of the privacy notice shown at that moment, the specific purposes consented to (stored individually, not as one flattened boolean), the actual signal given (accept, reject, or partial per purpose), a withdrawal timestamp if one exists, and a jurisdiction flag showing which region's rules triggered the flow in the first place.
Version tracking matters more than it looks like it should. Privacy policies change, and if a user consented under version 3 of the notice while the company's now on version 7, the record needs to show which version that user actually saw. Without that, there's no way to know whose consent needs refreshing and whose is still good.
This is the artifact regulators ask for during an investigation: a timestamped log, per user, per purpose. The schema isn't a one-time build, either. New analytics tools get added, new integrations get plugged in, new features launch, and the record structure has to absorb new purposes without quietly invalidating everything collected before it.
Propagating consent withdrawal across every system that touches the data
Withdrawal only means something if it reaches every system processing that data. A withdrawal flag sitting in a database the analytics pipeline never checks is a violation on file, filed neatly, just waiting to get found.
Consent choices have to flow outward: from the consent record into analytics tools, ad platforms, CRMs, email systems, internal data pipelines. Every integration point is a place the signal can get lost, and most stacks have a lot of integration points.
Three things need to be true for this to work. The halt on processing needs to fire automatically, not sit as a task someone remembers after reviewing a weekly report. There needs to be a clear map of which processing activities tie to which consent purpose, so pulling consent for analytics doesn't accidentally kill contract-based billing processing too. And someone needs the ability to audit whether withdrawal actually got enforced, not just logged somewhere and forgotten about.
A fragmented tool stack makes this harder by multiplication, not addition. Every separate tool (analytics here, billing there, a CRM somewhere else) needs its own integration to receive and act on a consent signal, and every new tool added is a new seam where the signal can fail to travel. A unified backend, where user records, event data, and consent signals all live in one system, turns this from a multi-webhook orchestration headache into a single database query. Platforms that combine authentication, the customer database, and analytics under one roof treat consent enforcement as a backend function from day one, rather than something stitched together after the fact across five disconnected vendors.
On timing: the EDPB expects withdrawal honored promptly. Promptly means without meaningful delay, not on the next scheduled sync job, even if that job runs nightly.
Storage limitation and data retention: where most enforcement actually lands
Storage limitation has been a prominent enforcement category, and not because the concept is hard to understand. Most SaaS teams simply never build a retention policy into the product until a regulator, or a customer's legal team, asks for one. At that point it's a fire drill, not a settings file someone checks a box on.
The rule itself is plain: keep personal data only as long as it's needed for the purpose it was collected under, and once that purpose ends, delete it or anonymize it. Simple to say, harder to run across a real product with real edge cases and real backups nobody's touched in two years.
Behavioral data collected under consent should be kept only for the period the privacy notice actually promised, then deleted or anonymized at the record level. Billing and transaction data might stick around longer, but that runs on a separate legal basis (financial regulation, contractual obligation), not consent, and it shouldn't share the same retention clock. Churned accounts are where this quietly falls apart most often: marking an account "inactive" and letting the personal data sit there indefinitely, including in backups, is a violation.
The Right to Erasure closes this loop. Users can request deletion of their account and its data, subject to the usual exceptions (legal retention obligations, ongoing disputes), and the product needs to make that request easy to find and actually erase the data, rather than just flipping an "inactive" flag and calling it done.
Retention schedules should be built per data category, not as one blanket policy. "We delete everything after three years" sounds tidy on a slide, but it'll conflict with some legal retention requirements and fall short on others. Automated deletion jobs and anonymization pipelines tied to when a consent purpose expires are infrastructure, not a nice-to-have. Build that early, and it runs quietly in the background. Skip it, and it turns into a multi-week audit project three years out, with someone squinting at a spreadsheet trying to figure out what can legally go and what can't.
Handling data subject requests within the 30-day window
GDPR gives companies 30 days to fulfill access, correction, deletion, restriction, and portability requests. The clock starts the moment the request comes in, not when someone gets around to reading the email.
The IAPP estimates manual processing of one of these requests costs $1,500 or more at enterprise scale. That number is pure labor: someone hunting down every place a user's data lives and stitching it into one response by hand.
That cost balloons when the data is scattered. If a user's information sits across an authentication system, a billing platform, an analytics tool, a CRM, and a support inbox, fulfilling one access request means coordinating across all five. Each tool exports data differently, runs its own API, and often has its own definition of what counts as "the user." Reconciling all of that by hand, at $1,500 a pop, doesn't scale past a handful of requests a month, and any company with real EU traffic blows past a handful fast.
A self-service preference center earns its keep two ways. It gives users a place to check their consent status, adjust preferences, and request or delete their data without opening a support ticket, and it directly demonstrates the withdrawal symmetry GDPR requires. This is the actual mechanism that satisfies the "as easy to withdraw as to give" rule, separate from any cosmetic UX polish added for the audit.
The consent record built earlier pays off here too. "What data do you hold on me, and under what basis" is a database query if the schema was built to answer it, and a multi-day manual investigation if it wasn't. On a unified backend, where authentication, user records, and event data share one identifier, a data subject request turns into a bounded query instead of an archaeology dig across five separate systems. That's the actual payoff of unified architecture, and it's the specific gap platforms like Tiun are built to close by default.
What to evaluate when choosing between building consent infrastructure and buying it
The build-versus-buy question isn't about which option costs less upfront, and treating it that way is how teams end up with the wrong tool. The real question is which one can carry the full weight of the consent lifecycle: collection, storage, propagation, retention, and fulfilling requests inside 30 days. Optimize for sticker price, and the tool you end up with solves maybe a third of the problem.
A genuinely compliant consent layer needs to do four things well: collect per-purpose consent signals with version-aware tracking of which privacy notice a user actually saw; store timestamped, auditable records that hold up under a regulator's request; push withdrawal signals out to every downstream system touching that data while enforcing retention schedules automatically instead of relying on someone remembering to run a cleanup script; and give users a self-service way to manage preferences and trigger deletion requests.
Buying a dedicated consent management platform makes sense when the bulk of a product's data processing is cookie and tracking related. A CMP handles the front-end banner and the audit log competently enough. Where it falls short, consistently, is propagation past its own walls into every other system a company runs: the CRM, the billing tool, the internal analytics pipeline. A CMP logo in the footer doesn't close that gap; it just makes the gap look official.
Building makes more sense when consent has to get enforced deep inside product logic itself, not just at the marketing-site layer. This is the actual test: does gating a feature depend on live consent status, checked in real time, rather than a one-time cookie banner someone clicked through months ago? If account data, behavioral data, and consent state all interact continuously, buying a bolt-on CMP just moves the gap somewhere else. Consent becomes a property of the backend architecture itself in that scenario, one that has to get treated that way from the first schema decision onward, not patched in after the fact when a regulator comes asking.


