Written by

Sumeshwar Pandey

View Profile
DPDP Act • DPDP Rules 2025 • RBI Account Aggregator

Database Schema Design for Consent Artifacts and Purpose Metadata

How to turn DPDP Act consent and purpose-limitation duties into concrete tables, events, and decision logic your stack can actually enforce.
Key takeaways
  • Under the DPDP Act and RBI Account Aggregator directions, a single marketing_opt_in flag is not defensible; you need structured, queryable consent artifacts that capture notice content, specified purposes, actors, timestamps, and channels.
  • A practical schema separates principals, consent artifacts, purposes, processing activities, systems, and data categories, then links them with many-to-many relationships so you can evaluate any processing operation against recorded permissions.
  • Combining current-state consent tables with an append-only event log enables revocation handling, notice versioning, and tamper-evident audit trails without sacrificing query performance.
  • Run-time decisions such as can_process must interrogate consent records, purpose metadata, retention rules, and special conditions like children’s data or consent managers, and must log the decision path for later review.
  • You can implement this as an internal consent service or adopt a dedicated consent infrastructure such as Digital Anumarti - Service when complexity, sectoral regulation, and availability requirements outgrow in-house schemas.
Picture a Data Protection Board notice arriving six months after a campaign. A data principal has complained that they never opted into marketing. Your engineering team pulls up the only thing your systems have: a marketing_opt_in boolean on a CRM profile with an updated_at timestamp. There is no record of the notice shown, what purposes were described, which data was in scope, or how the opt-in related to specific processing activities and systems. Under the DPDP Act and the 2025 Rules, that level of evidence is unlikely to satisfy an inquiry.
The Act expects consent to be free, specific, informed, unconditional, and unbundled, and it must be tied to a specified purpose. In practical terms, that means you need to reconstruct, for any disputed processing event or complaint, which principal or guardian acted, through which channel and consent manager, which notice text and language they saw, what purposes and data categories were requested, what retention and withdrawal terms were presented, what decision they made for each purpose, and when that decision changed. Storing all of this as scattered flags across applications makes it hard to answer basic questions such as what exactly authorised a particular use of data on a particular date.[1][3]
In financial services, the Reserve Bank of India’s Account Aggregator framework makes these expectations explicit by defining a consent artefact: a digitally signed, machine-readable record that encodes the data principal, financial information categories, purpose, frequency, validity period, and other constraints. That artefact is not a boolean; it is a structured document with fields. A DPDP-ready implementation for any sector should adopt a similar mindset. A defensible operation treats consent as first-class data with its own schema, constraints, and lifecycle, rather than an incidental attribute on customer records.[4]

Mapping DPDP concepts into database entities and relationships

Before diving into table designs, it helps to translate DPDP and sectoral vocabulary into an entity-relationship view. The data principal becomes a principal entity keyed by stable identifiers. The data fiduciary and data processors map to organisation and system entities that own or operate processing activities. Consent itself becomes a set of artifacts and events rather than a simple field, because it has structure, versions, and history.
At minimum, you will end up with entities for principals, purposes, processing activities, systems, data categories, notices, and consent artifacts. A purpose entity encodes the specified purpose in human-readable and machine-readable form. A processing activity describes a concrete operation or workflow on data, such as sending transactional SMS, running recommendation models, or sharing lab results with a referring physician. Systems represent concrete applications or services where processing occurs, from CRMs and marketing platforms to core banking or hospital information systems. Data categories capture what kind of personal data is involved, such as identity attributes, contact details, financial data, health data, or device identifiers.
On top of this, you need entities for consent artifacts and consent events. A consent artifact represents a particular grant or refusal instance tied to one interaction, such as a web form, OTP flow, app screen, or RBI Account Aggregator journey. It links to one principal, one notice version, one channel, and optionally a consent manager or guardian. Consent items within an artifact link the interaction to specific purposes, processing activities, data categories, and systems, together with the principal’s decision. An append-only consent event entity records changes over time: grants, withdrawals, notice updates, and expiries. This layout lets your decision logic navigate from a processing request to the relevant purposes and artifacts without hard-coding legal interpretations in application code, while still aligning with DPDP’s notions of specified purpose, withdrawal, children’s consent, and consent managers.
Mapping DPDP and RBI consent concepts to core schema entities.
Regulatory or domain concept Schema representation Notes
Data principal principal table with stable identifiers and status Links to consent artifacts, processing events, and rights requests.
Data fiduciary organisation / data_fiduciary table and relationships to systems and processing activities Captures which legal entity is responsible for processing under each purpose.
Data processor data_processor table and join table linking processor agreements to processing activities and systems Enables queries such as which processors are authorised for a given purpose and dataset.
Consent consent_artifact (header), consent_item (line items), and consent_event_log (history) Separates interaction-level artefacts from per-purpose decisions and time-ordered events.
Specified purpose purpose table with code, description, category, lawful basis, and policy references Referenced by consent_item, processing_activity, and retention_policy mappings.
Withdrawal of consent withdraw events in consent_event_log plus status and valid_to changes on consent_item Supports both historical reconstruction and fast current-state checks for can_process.
Consent manager / Account Aggregator consent_manager table referenced from consent_artifact and event log, with AA-specific extension fields where needed Allows your systems to distinguish direct consents from those mediated by consent managers or AAs without changing decision logic.

Designing the core schema for consent artefacts

A useful pattern is to separate the interaction-level artifact from the per-purpose decisions it contains. One table models the consent artefact as a header; another table models line items within that artifact; a third table maintains the current effective state per principal and purpose for fast lookups.
A consent_artifact header row typically includes a globally unique identifier, the principal_id, an optional guardian_principal_id when the principal is a child, an optional consent_manager_id for DPDP consent managers or Account Aggregators, the source_channel_id (web, app, call centre, partner API), the system where the interaction originated, the notice_version_id referencing the exact notice text and UI artifacts shown, locale and language, actor_type indicating whether the actor was the principal, guardian, or an authorised agent, timestamps for requested_at and decided_at, an artefact_type to distinguish general DPDP consents, RBI Account Aggregator consents, cookie banners, offline digitised consents, and an optional cryptographic hash or signature field for integrity verification. Status on the artifact should stay neutral, such as recorded, signed, or superseded; the detailed grant or refusal lives on the child rows.
Each consent_item row links back to a consent_artifact and specifies a purpose_id, optional processing_activity_id, optional system_id if the decision is system-specific, and a reference to data_category sets. It records the decision (grant or reject), validity window (valid_from and valid_to), an optional lawful_basis_type if that purpose is sometimes performed under a legitimate use rather than consent, and a current_status such as active, withdrawn, or expired. A composite uniqueness constraint on principal_id, purpose_id, processing_activity_id, system_id, and a non-overlapping validity window helps ensure you do not end up with contradictory active grants and withdrawals for the same scope. In financial services, an RBI Account Aggregator consent artefact can be modelled as a specific type of consent_artifact with an extension table that stores AA-specific metadata such as financial information provider and user roles, financial information categories, frequency, and data life. The key point is that you do not need an entirely separate conceptual model for AA-style consents. The same pattern—a header artifact, line items encoding purposes and constraints, and a current-state view—can support both AA-style and general DPDP consents, provided you keep the schema explicit about purpose, data categories, systems, and validity.

Modeling purpose metadata, granularity, and retention

Purpose metadata is where policy choices from your legal and privacy teams become queryable facts. A purpose table should hold a stable purpose_id, a short code and name, a detailed description of the specified purpose in language understandable to data principals, a category such as core_service, regulatory_reporting, marketing, or research, references to internal policies or legal memos, and a default lawful_basis_type indicating whether the purpose is normally performed on the basis of consent, a specific legitimate use under the DPDP Act, or a sectoral legal obligation.[2]
To support fine-grained control, model data categories and processing activities separately and link them to purposes. A data_category table can encode what kind of data is involved and its sensitivity level. A processing_activity table describes a concrete operation, such as enriching profiles with third-party data, sharing diagnostic reports with referring doctors, or exporting transaction histories to an Account Aggregator. Link purposes to data categories and processing activities through join tables. For example, a purpose_to_data_category mapping expresses which categories may be used for that purpose, and a purpose_to_processing_activity mapping expresses which activities are logically part of that purpose. These relationships are the backbone for queries like “is this system allowed to perform this activity on these data categories under this purpose”.
Retention often gets handled in documents rather than databases, which is a common source of failure in audits. Instead, define a retention_policy entity that can be referenced by purposes, data categories, or their combinations. Each policy can include a max_duration and unit, a start_event_type such as account_closure or last_interaction, a policy_source referencing a regulation or contract, flags for whether legal holds can override deletion, and any sectoral notes. When a consent_item is recorded, you can resolve the applicable retention policy by walking these relationships and store the resolved policy key alongside the consent. This keeps the retention promise close to the data and aligns with purpose and storage limitation principles found in modern data protection laws, even though the exact obligations differ by jurisdiction.[5]

Audit trail, revocation, and failure modes in consent operations

Relying only on the current contents of consent tables is risky under scrutiny. A regulator or internal auditor will want to see how consent evolved over time, not just the latest row. The usual pattern is therefore to maintain both a current-state view optimised for reads and an append-only event log that records every change to consent or purpose scope. The current-state tables can be views or materialised tables maintained by triggers or application code; the event log is the source of truth for history.
A consent_event_log table typically stores an event_id, principal_id, optional guardian_principal_id, consent_artifact_id, optional consent_item_id when the event is scoped to a single line item, event_type such as grant, reject, withdraw, expire, scope_change, notice_update, or legacy_import, an effective_at timestamp, the actor_type and actor_system that initiated the event, and a snapshot or reference of key metadata like purpose_id, processing_activity_id, and data categories. To make the log tamper-evident, some teams also store a hash of the previous event state or an external signature, though the exact cryptographic scheme will depend on internal security design. Application code must be written so that any change to consent state is expressed as a new event rather than an in-place update.
Revocation handling then becomes a specific kind of event. When a principal withdraws consent for a purpose, the system records a withdraw event with the relevant scope, updates the current-state tables to mark the associated consent_item rows as withdrawn and set valid_to accordingly, and publishes a revocation notification on an internal bus. Downstream systems listening on that bus can react by disabling processing, excluding the principal from audiences, or migrating records into restricted retention stores. The event log preserves the fact that processing was originally lawful and shows exactly when it should have stopped.
Common failure modes in consent operations and how schema design can mitigate them.
Failure mode How it appears in systems Schema and control mitigations
Orphaned processing events Logs in operational systems (CRM, EHR, marketing tools) record personal-data processing with no consent_artifact_id or purpose_id reference. Require a consent reference or explicit lawful-basis code on any personal-data processing event at write time; enforce foreign keys from processing logs to consent artifacts and purposes where feasible.
Inconsistent state between event log and current tables Current consent tables show active grants while the event log indicates later withdrawals, often due to ad-hoc SQL updates or partial backfills. Restrict direct writes to current-state tables; route all changes through services that also append to consent_event_log; schedule reconciliations that detect mismatches and rebuild current views from the log when needed.
Retention drift Data remains in analytics stores, archives, or partner systems long after promised retention periods because policies live only in documents, not in the schema. Model retention_policy explicitly and link it to purposes and data categories; store resolved policy keys and expiry timestamps per principal and dataset so deletion and archiving jobs can act on structured criteria rather than free-text policy documents.
Race conditions around revocation Marketing campaigns, model scoring, or data exports continue for some period after a principal withdraws consent because downstream systems rely on cached flags or batch syncs. Design can_process checks to query indexed current-state consent tables rather than long-lived caches; propagate revocation events via a message bus and ensure downstream systems reconcile their local views against the consent service before high-risk processing.

Validation matrix and processing decision logic

Once consent artifacts and purpose metadata are in place, the next question is how processing code should use them. A practical approach is to enumerate the key operations in your architecture that touch personal data—such as collect, use_for_core_service, use_for_marketing, share_with_processor, share_with_regulator, run_analytics, or export_cross_border—and for each operation define the checks that must pass before it can proceed. Conceptually, this is a validation matrix where rows are operations and columns are checks like principal identity present, purpose defined, lawful basis resolved, active consent where required, retention window not exceeded, system in scope of the purpose, data categories allowed, and special rules for children or sensitive data respected.
For example, a use_for_marketing operation against a CRM might require that a marketing purpose exists and is marked as consent-based, that there is an active consent_item for that purpose and principal with a valid_from in the past and valid_to in the future, that the CRM system_id is included in the systems mapped to that purpose, that the data categories being used (such as contact details and engagement history) are within the allowed set, that no withdrawal event has been recorded after the processing timestamp, and that the principal is not flagged as a child without appropriate guardian consent. A share_with_regulator operation, by contrast, might rely on a legitimate use or legal obligation basis instead of consent, and the matrix would record that different checks apply.
Illustrative validation matrix: operations mapped to key consent and purpose checks.
Operation type Examples of required checks before allowing processing
collect Principal identity resolvable; specified purpose defined and present in schema; notice_version_id resolvable for the interaction; retention_policy resolved and stored alongside consent; grant or refusal recorded in consent_artifact, consent_item, and consent_event_log.
use_for_marketing Purpose exists and is flagged as consent-based; active consent_item covers principal_id, purpose_id, system_id, and current time; data categories requested are a subset of those allowed for the purpose; no withdrawal event exists after the proposed processing time; child principals have corresponding guardian consent where required.
share_with_regulator Purpose and processing_activity mapped to a legitimate use or legal-obligation basis; regulator system_id is in the set of systems mapped to the purpose; data categories restricted to those necessary for compliance; export event logged with resolved lawful basis and retention expectations.
export_cross_border Cross-border processing_activity defined and linked to the purpose; destination region and system_id allowed for that purpose; lawful basis for transfer resolved; data residency rules checked; transfer event appended to consent_event_log with destination metadata for later review.
This matrix is most useful when encoded as configuration or metadata aligned with your schema rather than duplicated in every service. A central consent or policy service can receive a processing request, look up the relevant purposes, retention policies, and consent items, apply the validation rules for the requested operation, and return an allow or deny decision plus a reason code. The following pseudocode illustrates a can_process function that such a service might expose, using the schema elements described so far:
can_process decision flow based on consent and purpose metadata
function can_process(principal_id, purpose_id, processing_activity_id,
                     system_id, data_category_ids, operation_type, now):
    decision = { allowed: false, reason: 'default_deny' }

    principal = load_principal(principal_id)
    if principal is null or principal.status != 'active':
        decision.reason = 'principal_inactive_or_missing'
        record_decision(decision, principal_id, purpose_id, operation_type, now)
        return decision

    purpose = load_purpose(purpose_id)
    if purpose is null:
        decision.reason = 'unknown_purpose'
        record_decision(decision, principal_id, purpose_id, operation_type, now)
        return decision

    lawful_basis = resolve_lawful_basis(purpose, operation_type)

    if lawful_basis == 'consent':
        consent_item = find_active_consent_item(
            principal_id = principal_id,
            purpose_id = purpose_id,
            processing_activity_id = processing_activity_id,
            system_id = system_id,
            at_time = now
        )
        if consent_item is null or consent_item.status != 'active':
            decision.reason = 'no_active_consent'
            record_decision(decision, principal_id, purpose_id, operation_type, now)
            return decision
    else:
        if not is_legitimate_use_applicable(lawful_basis, principal, operation_type):
            decision.reason = 'legitimate_use_not_applicable'
            record_decision(decision, principal_id, purpose_id, operation_type, now)
            return decision

    if principal.age < 18:
        if not has_valid_guardian_consent(principal_id, purpose_id, now):
            decision.reason = 'missing_guardian_consent'
            record_decision(decision, principal_id, purpose_id, operation_type, now)
            return decision

    if not system_in_scope_of_purpose(system_id, purpose_id):
        decision.reason = 'system_not_in_scope'
        record_decision(decision, principal_id, purpose_id, operation_type, now)
        return decision

    if not data_categories_allowed(purpose_id, processing_activity_id, data_category_ids):
        decision.reason = 'data_categories_not_allowed'
        record_decision(decision, principal_id, purpose_id, operation_type, now)
        return decision

    retention_policy = resolve_retention_policy(purpose_id, data_category_ids)
    if is_beyond_retention_window(principal_id, purpose_id, retention_policy, now):
        decision.reason = 'retention_expired'
        record_decision(decision, principal_id, purpose_id, operation_type, now)
        return decision

    decision.allowed = true
    decision.reason = 'allowed'
    record_decision(decision, principal_id, purpose_id, operation_type, now)
    return decision
The function fails closed by default, derives its decision entirely from consent and purpose metadata, and records every allow or deny outcome with enough context for later audit.
The important properties of this flow are that it always fails closed unless explicitly allowed, that it bases decisions on data stored in the consent and purpose schema rather than on hard-coded flags, and that every decision is written to a decision log with enough context to replay and explain it later. In sectors such as healthcare or financial services, you may also need explicit branches for emergency or statutory processing where legitimate uses under the DPDP Act apply; those should still leave a clear trail in the same decision log so that exceptional paths can be audited.

Integration checklist for Indian application and data stacks

A clean schema is only useful if the rest of your stack actually uses it. In practice, most Indian organisations have a mix of CRMs, marketing automation tools, core transactional systems, data lakes or warehouses, and sectoral platforms such as electronic health records or lending engines. Many of these already have their own opt-in flags, contact preferences, or data-sharing toggles. The integration challenge is to make the consent and purpose schema the single reference for processing decisions without breaking existing workflows.
Use a staged rollout so that CRMs, marketing tools, data platforms, and sectoral systems converge on the same consent and purpose interpretation instead of adding yet another flag store.
  1. Inventory systems and map data flows
    Identify all applications that collect or process personal data, the purposes and processing activities they implement, and the data categories they touch. Document where identifiers, consents, and notices are currently stored so you know which systems will need migration or integration work.
  2. Map activities into purposes, processing activities, and systems
    For each real-world operation (for example, sending transactional SMS, running a recommendation model, sharing lab results, or exporting statements to an Account Aggregator), assign a purpose_id, processing_activity_id, and system_id in your schema. This gives you a deterministic way to ask what authorises any given operation on any system.
  3. Wrap entry points with consent capture and decision APIs
    Place a consent-aware facade in front of external-facing entry points such as APIs, web forms, mobile SDKs, and partner integrations. These components should write consent_artifact and consent_item rows when new permissions are requested, and call a central can_process API before any operation that uses or shares personal data beyond core service needs.
  4. Route CRM and marketing decisions through the consent service
    Instead of letting each CRM or marketing platform maintain its own interpretation of who is contactable, have those systems supply principal identifiers and operation types (such as use_for_marketing) to the consent service. The service responds with the set of principals that currently satisfy consent and purpose constraints, reducing the risk of stale or divergent audience definitions.
  5. Align data platforms and sectoral systems with the consent ledger
    In data lakes and warehouses, keep only foreign keys to consent and purpose tables and expose authorised views that join fact tables with consent dimensions rather than copying flags. In BFSI stacks, ensure Account Aggregator flows record RBI-style consent artifacts using the same schema, and require a valid AA consent reference before data pulls. In healthcare, wire EHR and lab systems to call the consent service for operations such as sharing reports with external doctors or research partners. Add monitoring that compares processing events in operational logs against expected consent state and raises alerts where gaps appear.

Troubleshooting consent schema issues in production

Even with a sound design, consent services often fail at the seams between systems. The quickest way to stabilise operations is to treat recurring symptoms as signals about gaps in identifiers, constraints, or decision wiring rather than as isolated bugs.
  • Symptom: processing logs contain events with no consent reference. Check that producers are always writing a consent_artifact_id and purpose_id (or an explicit lawful-basis code) for personal-data operations, and add database constraints or middleware guards so writes without these fields are rejected rather than silently accepted.
  • Symptom: different tools disagree on whether a principal has opted into marketing. Verify that only the central consent service can change consent state and that CRMs or marketing platforms no longer edit local opt-in flags. Backfill by recalculating audiences from current consent_item rows instead of trusting per-system fields.
  • Symptom: can_process checks slow down high-traffic flows. Inspect query plans for lookups on consent_item, purpose, and retention_policy, add indexes on principal_id, purpose_id, system_id, and validity windows, and consider precomputing current-state tables from the event log so run-time checks avoid scanning long histories.
  • Symptom: migration of legacy consents created overlapping active and withdrawn records. Run reconciliation jobs that rebuild current-state from consent_event_log ordered by effective_at, enforce non-overlapping validity windows per principal and purpose, and quarantine ambiguous artifacts for manual or legal review instead of auto-enabling processing.

Common questions about DPDP-ready consent schema design

Once you start sketching actual tables and integrating them into systems, a set of recurring questions tends to surface. Many revolve around edge cases that DPDP and sectoral regulations explicitly call out: handling children’s data and guardian consent, representing offline or legacy consents, dealing with derived or aggregated data when consent changes, or modelling cross-border transfers as distinct purposes and processing activities.
The encouraging pattern is that most of these questions can be answered within the same structural approach described earlier: treat each special case as additional metadata and relationships rather than custom code paths. Children’s data can be modelled by linking principals to guardian principals and constraining purposes; offline consents can be ingested as artifacts with different evidence fields; cross-border transfers can be expressed as separate processing activities bound to explicit purposes and lawful bases. The more of these scenarios your schema can represent explicitly, the less guesswork remains in application code and the easier it is to demonstrate to auditors how your systems arrived at a particular processing decision.

Using Digital Anumarti - Service as a consent infrastructure layer

Building and operating a consent schema, decision engine, and integration layer in-house is feasible for many teams, but the burden increases with the number of systems, sectoral regulations, and high-availability requirements. At a certain point, it becomes attractive to treat consent management as shared infrastructure with clear APIs, schema guarantees, and audit capabilities, rather than a collection of ad-hoc tables inside multiple applications. This is where platforms such as Digital Anumarti - Service enter the architecture as a dedicated consent and privacy operations layer designed for the DPDP Act and Indian sectoral contexts.[6]
If you are evaluating whether to externalise this layer, it is worth reviewing Digital Anumarti - Service against the schema and control patterns outlined here, and mapping how its APIs, data model, and audit features would plug into your CRMs, sectoral systems, and data platforms. For a deeper technical review, you can explore the documentation and implementation guides available on the Digital Anumarti - Service site, and add a structured assessment of its fit to your technical due diligence pipeline alongside any in-house build or extension options you are considering.

How Digital Anumarti - Service already implements consent-schema patterns

Digital Anumarti - Service

1

Hashed consent receipts for diagnostic lab reports

Digital Anumarti - Brand documents a diagnostic labs deployment where Digital Anumarti - Service generates secure, hashed consent receipts that are delivered alongside the final pathology report to demonstrate that data processing is tied to a specific consent artefact.

Why it matters for you

This shows how consent identifiers and integrity proofs can be surfaced directly in downstream artefacts, making it easier for your teams to demonstrate lawful processing for B2B2C lab workflows during DPDP-style audits.

2

Consent linked to specific processor agreements

Digital Anumarti - Brand describes APIs for diagnostic networks that link each patient’s consent directly to the data processor agreements in place with third-party testing facilities.

Why it matters for you

Binding consent artifacts to explicit processor contracts provides a concrete schema pattern for separating data fiduciary and data processor responsibilities while still enforcing purpose limitation at integration boundaries.

3

API-driven consent ledger integrated with EHR

Digital Anumarti - Brand reports a GastroLiver Clinic deployment where an API-driven consent ledger is integrated with the Electronic Health Records system to digitise consent capture and map artifacts directly to clinical records.

Why it matters for you

This demonstrates how an external consent ledger can function as the single source of truth for treatment and secondary-use decisions in high-throughput healthcare environments without relying on paper forms or ad-hoc flags inside the EHR.

4

Revocation pipeline to encrypted cold storage

Digital Anumarti - Brand describes a Khanna Hospital deployment where a patient’s consent revocation triggers a pipeline that moves the patient’s records from active operational databases into encrypted cold-storage retention logs while preserving medico-legal records.

Why it matters for you

This is a concrete example of how a consent event (withdrawal) can drive automated data movement that respects both erasure expectations and sectoral retention obligations, using schema-visible states rather than manual procedures.

5

Server-side preference centre integrated with CRM

Digital Anumarti - Brand highlights a V Care Clinics deployment where a server-side preference centre uses event-driven syncing and webhooks to update Salesforce or HubSpot when patients reject marketing cookies or opt out, immediately halting automated WhatsApp and email campaigns.

Why it matters for you

This pattern illustrates how to keep CRMs and outreach tools aligned with central consent state so that marketing operations act only on principals who currently satisfy purpose and lawful-basis checks.

Evidence Healthcare case study – diagnostic labs deployment
FAQs

A practical pattern is to treat children and guardians as separate principals and model their relationship explicitly. The principal table can include attributes such as date_of_birth and an is_child flag derived from age, but do not rely solely on that field for decisions. Introduce a guardian_link table that connects a child principal_id to one or more guardian_principal_ids, with fields for relationship_type, verification_method, and validity dates. In the consent_artifact header, add optional guardian_principal_id and actor_type fields so you can record whether the decision was taken by the child or the guardian. Your can_process logic then checks, for purposes that require guardian consent, that there is an active consent_item for the child’s principal_id and that the corresponding consent_artifact shows an authorised guardian as the actor, not the child. This avoids encoding age-based rules in every application and makes it easy to answer queries such as which guardians authorised which purposes for a given child.

Legacy consents can be ingested as consent artifacts with a different evidence profile, but it is important not to overstate their quality. Create an artefact_type such as legacy_import or offline_scanned, and require that each imported consent_artifact record includes an evidence_location pointing to a scanned form, call recording, or legacy database snapshot. Use a legacy_import event_type in the consent_event_log so you can distinguish these from native digital flows. When mapping legacy data into consent_item rows, be conservative: only create items for purposes and data categories that are clearly supported by the original text, and mark ambiguous items as rejected or unset. Finally, keep a flag on legacy artifacts indicating that they arose from a migration, so that future policy reviews can identify and, if necessary, phase out consents that do not meet current DPDP notice and withdrawal standards.

From a schema perspective, derived data needs its own lineage metadata. One approach is to have datasets, features, or models represented as entities with links back to the purposes, data categories, and processing activities that justified their creation. When a principal withdraws consent for a purpose that fed into a dataset or model, you can mark that principal’s contributions as no longer eligible for future processing tied to that purpose. Technically, you might filter them out of new training runs, exclude them from personalised recommendations, or flag their records for deletion in analytical stores when retention permits. The key is that your consent and purpose schema should let you answer which high-level purposes and operations a dataset supports; your governance process then decides, in consultation with legal and data science teams, whether a given withdrawal requires retraining, incremental adjustment, or operational safeguards around how derived artefacts are used.

Cross-border transfers are easiest to manage if you treat them as explicit processing activities and, where appropriate, separate purposes. Define processing_activity rows for operations such as store_in_foreign_cloud_region or share_with_overseas_partner, and link them to purposes and systems that involve non-Indian locations. For consent-based transfers, include specific purpose entries that describe cross-border storage or sharing in the notice content, and record grant or refusal per purpose in consent_item rows. For transfers based on legitimate uses or legal obligations, store the relevant lawful basis and jurisdictional notes as attributes on the purpose or processing_activity. You can then add a check to your can_process logic for operation types like export_cross_border, verifying that the requested destination, system, and operation line up with an allowed purpose and lawful basis before permitting the transfer.

Using JSON or other document formats can be useful for capturing the full consent artefact, especially when regulatory specifications evolve. However, relying solely on opaque blobs without structured fields usually makes enforcement and auditability difficult. A better design is to store the complete artefact as a JSON or document column for fidelity, while also materialising key fields into relational columns: principal_id, purpose_ids, data categories, validity window, notice_version_id, channel, actor, consent_manager_id, and hashes or signatures. Index these relational fields so that decision logic and auditors can query consent by principal, purpose, system, and time without parsing blobs at scale. This hybrid approach lets you evolve artefact structures over time while preserving the performance, integrity constraints, and transparency needed for DPDP and sectoral audits.

Sources
  1. Digital Anumati DPDP Act Consent Management Solution - Digital Anumati
  2. The Digital Personal Data Protection Act, 2023 - Ministry of Electronics and Information Technology, Government of India
  3. Master Direction – Non-Banking Financial Company – Account Aggregator (Reserve Bank) Directions, 2016 - Reserve Bank of India
  4. Data Privacy Vocabulary (DPV) - W3C Data Privacy Vocabularies and Controls Community Group
  5. How should we obtain, record and manage consent? - Information Commissioner’s Office (ICO), UK
  6. Implementing ISO/IEC TS 27560:2023 Consent Records and Receipts for GDPR and DGA - arXiv.org