Skip to main content

SaaS LLM conversation state: tenant isolation, retention and deletion

Secure LLM conversation history with server-side ownership checks, minimal state, explicit retention, tenant-scoped identifiers and deletion that reaches derived data and providers.

In this guide

How should a SaaS app store LLM conversation state?

Store only the conversation state your feature needs, under a server-controlled owner and tenant boundary. A provider response ID, conversation ID or previous-turn token is a reference to state; it is not proof that the current user may read or continue that state. Check authorization on every read, continuation, export and delete request, and plan for provider-managed retention separately from the copies your application controls.

Use an application record as the ownership authority

Create a random, unguessable internal conversation ID and bind it to the authenticated user, tenant, data classification, provider reference and retention policy. On every request, query the record through tenant-scoped authorization before using a provider ID. Never accept an arbitrary provider reference from the browser as permission to retrieve another conversation.

Minimize raw history and derived summaries

Decide which turns, attachments, tool results and summaries are necessary for the next task. Redact or omit sensitive fields before persistence where feasible. Treat a model-generated summary as untrusted and potentially incomplete: validate identifiers and permissions against current application data rather than trusting memory text to define the user, tenant or access level.

Separate provider state from your own storage

Document whether each API call stores a response, creates a persistent conversation, chains from a previous response or uses another provider feature. Verify the endpoint, project settings, contractual terms, retention controls, logging and exceptions in current documentation. A setting that disables one form of API storage does not automatically delete your database, traces, files, backups or every provider-side feature.

Conversation-state inventory and retention worksheet
Data copyOwner and tenant keyPurposeRetention/deletion pathProvider or backup dependency
Application turns
Provider state reference
Summary, cache or trace

How do you prevent cross-tenant access and stale memory?

Authorize every continuation and lookup

Resolve the internal conversation record using both its ID and the current authenticated tenant. Recheck membership and role on each turn, because access may have changed after the conversation began. Do not copy a conversation between tenants by changing a client-supplied ID or by reusing an old provider thread after an account transfer.

Version and invalidate state when permissions change

Attach source-record versions or policy epochs to retained context when it can influence access or decisions. If permissions are revoked, records are deleted or a tenant is offboarded, stop continuing state that contains those records and invalidate summaries, caches and retrieved context according to policy. Rebuild from currently authorized sources rather than assuming old assistant memory remains valid.

Protect identifiers and state-management endpoints

Keep provider secrets and provider IDs server-side. Use CSRF protections where applicable, rate limits, authentication, object-level authorization and audit logging on state endpoints. Avoid exposing identifiers in public URLs, analytics events, support tools or error messages; rotate references after a suspected leak and invalidate affected sessions.

How do retention, export and deletion work in practice?

Set a documented retention rule for each copy

Specify the purpose, retention period, deletion trigger, legal hold conditions, access roles and backup behavior for raw turns, files, summaries, vector entries, caches, moderation cases and traces. Make the product’s user-facing promise match the actual lifecycle and provider configuration. Have counsel review obligations for the service’s jurisdictions and customer contracts.

Make deletion a tracked workflow across dependencies

When a conversation is deleted, mark it unavailable immediately, enqueue idempotent deletion for provider state and derived records, invalidate caches and retrieval entries, and record completion or a retryable failure. Define how backup expiration works and what the user is told while a dependency completes. Test deletion on a conversation with attachments, summaries and failed background jobs.

Test retention settings rather than relying on a product label

Provider retention, endpoint behavior and eligibility can differ by feature and account. Verify the current terms and actual endpoint settings with a test project, document exceptions, and review changes before a new stateful API feature is enabled. The product team remains responsible for its own copies and disclosures.

LLM conversation state security: FAQs