Introduction
When building digital experiences with Optimizely, not all data fits neatly into content types. From storing user preferences to logging external API responses, there’s a growing need for flexible, non-content data storage.
That’s where the Dynamic Data Store (DDS) shines; enabling you to store and retrieve strongly typed .NET objects without the overhead of content modeling or custom database tables.
What is the Dynamic Data Store?
The Optimizely Dynamic Data Store (DDS) is essentially an Object-Relational mapper. When used with compile time data types (.NET classes), properties with a public getter and a setter (setter does not need to be public) are mapped to a column in a database table.
In Optimizely, a Property Bag is a flexible data structure used to store and pass around key-value pairs, typically for custom attributes or additional data that isn’t part of the standard model. It’s a way to represent and manage data where the type of the data is not known at compile time. For runtime data types, each property added to a Property Bag is also mapped in the same way. A class used to save and load a collection a name/value pairs.
The Dynamic Data Store is Optimizely’s built-in, schema-less storage system designed for non-content data. It serializes and stores .NET objects in the database, automatically handling schema evolution and versioning in the background.
The Optimizely Dynamic Data Store (DDS) is essentially an Object-Relational mapper. When used with compile time data types (.NET classes), properties with a public getter and a setter (setter does not need to be public) are mapped to a column in a database table. For runtime data types, each property added to a Property Bag is also mapped in the same way.
DDS is a component offering an API and infrastructure for the saving, loading, and searching of compile time data types (.NET object instances) and runtime data types (property bags) in shared tables in SQL Server. The component is shipped as part of the Framework package.
When to Use DDS?
Think fast, flexible, and user focused. DDS is your go-to when you need to store:
Temporary or session-based data
User-specific configurations
Integration logs
Lightweight data models — no publishing, no workflows, no hassle.
Real-World Scenarios
1.Storing User Preferences
Need to store personalized dashboard configurations or user-selected options? DDS makes this easy with minimal setup.
public class UserPreference
{
public Identity UserId {get; set;}
public List SelectedWidgets {get; set;}
}No need to create new content types or custom tables — just store and retrieve as needed.
2.Logging External API Responses
When integrating with third-party services, it’s helpful to log API calls for auditing and troubleshooting. DDS provides a quick and structured way to store that data.
public class ApiLog
{
public DateTime Timestamp {get; set;}
public string Endpoint {get; set;}
public string ResponsePayload {get; set;}
}These logs can be stored, queried, and analyzed as needed, all without touching your main content structure.
3.Caching Product Inventory
For sites that sync inventory from external systems, DDS can serve as a lightweight cache layer to store SKU and stock level data temporarily.
public class InventoryCache
{
public string Sku {get; set;}
public int StockLevel {get; set;}
public DateTime LastUpdated {get; set;}
}This improves performance and reduces dependency on real-time API responses.
4.Handling Form Submissions and Surveys
If you’re collecting user-submitted data through surveys, polls, or custom forms, DDS offers a simple way to persist that data without requiring publishing workflows or version control.
public class SurveyResponse
{
public Guid SurveyId {get; set;}
public Identity RespondentId {get; set;}
public Dictionary<string, string> Answers {get; set;}
}This allows developers to quickly build and iterate on forms with minimal backend setup.
Benefits of Using DDS
Flexible: Store any serializable .NET object without rigid schemas.
Schema Evolution: Automatically adapts to changes in your object structure.
Rapid Development: Ideal for MVPs, internal tools, and integration storage.
No Extra Infrastructure: Uses your existing Optimizely database.
When to Use DDS — and When Not To
Use DDS when:
You need quick, non-relational data storage
Content types are too heavyweight for the data
The data is short-lived or low volume
Avoid DDS when:
You need complex querying, relationships, or reporting
The data volume is very large or high frequency
You require workflows, versioning, or publishing
Ready to Get Started?
DDS is available by default in Optimizely Content Cloud. Start by defining your class, annotate it with [EPiServerDataStore], and begin storing your data, all in just a few lines of code.
For full technical documentation, visit:
Optimizely Developer Docs – Dynamic Data Store
Need a Faster Way to Store Custom Data?
Building personalized experiences? Connecting third-party APIs? Need flexible storage on the fly?
The Dynamic Data Store (DDS) gives you the speed and agility to build fast; without forcing content types to do all the heavy lifting.
Keep your content model clean. Let DDS handle the rest.





