Pawan Singh
workspace_premiumPaaS CMS Administrator Certification
Jul 21, 2025
visibility 823
star star star star star
(0 votes)

Optimizely Forms: Forcing New Submission on Every Post

By default, Optimizely Forms uses browser cookies to track submissions and updates the existing submission if the same user submits the form again. While this behavior works well in most scenarios, we had a custom business requirement: for certain forms, each submission needed to be treated as a new entry, regardless of whether it came from the same user or browser session. At the same time, all other forms in the solution were expected to retain the default cookie-based behavior.

Initially, this seemed complex
, but after inspecting the Optimizely Forms framework, we discovered that the ProgressiveSubmitInfoService class could be leveraged to inject this behavior in a clean and maintainable way, as shown below.

using EPiServer.Forms.Core.Internal;
using EPiServer.Forms.Core.Models.Internal;
namespace alloy_example.Customization.Forms;

public class ExtendedProgressiveSubmitInfoService : ProgressiveSubmitInfoService
{
    public override ProgressiveSubmitInfo GetProgressiveSubmitInfo(Guid formContentGuid, HttpContext httpContext,
        string formLanguage)
    {
        //var isPathFound = httpContext.Request.Path.StartsWithSegments(RootPath); // e.g. can be checked based on httpContext 
        if (!string.IsNullOrEmpty(httpContext.Request.Form["TestElement"]))
        {
            return null;
        }
        return base.GetProgressiveSubmitInfo(formContentGuid, httpContext, formLanguage);
    }
}

Above code check if Element TestElement is found under httpContext after submission, this it will simply return null and forcing optimizely framework to generate new submissionId for given form submission.

As last step, make sure to register in DI container as below.

using EPiServer.Forms.Core.Internal;

services.AddSingleton<ProgressiveSubmitInfoService, ExtendedProgressiveSubmitInfoService>();

This overrides the default service and enables custom logic while keeping the framework's core behavior intact.

Hope, it helps someone!

Jul 21, 2025

Comments

error Please login to comment.
Latest blogs
So you've decided to move to .NET 10 (but stay on CMS 12)

Ok, "decided" is a strong word. Microsoft decided for us. .NET 8 and .NET 9 both reach end of support on November 10, 2026 , and if you're on CMS 1...

KennyG | Oct 2, 2026

From robots.txt to GEO Analytics: A Year On

In September 2025, I wrote about updating

Adnan Zameer | Oct 2, 2026 |

Connect Your AI Agents Directly to Optimizely CMS

Connect any AI agent to Optimizely CMS and Commerce via Epicweb Agent API, reusing CMS-aware tools, instructions, and permissions to automate SEO,...

Luc Gosso (MVP) | Oct 1, 2026 |

Why Your CMS 12 and CMS 13 Sites Can't Share a Graph Instance

If you're planning your Optimizely CMS 13

Adnan Zameer | Oct 1, 2026 |

Bulk Catalog Import in Optimizely Commerce. Part 1: Why the DTO API

Why bulk catalog writes in Optimizely Commerce belong on the DTO API rather than IContentRepository — measured 2.7-3.3x faster, and what it costs you.

Stanisław Szołkowski | Sep 30, 2026 |

I Put Claude in Charge of GitHub Copilot During an Optimizely Upgrade

How we used Claude to plan and review an Optimizely CMS 11 to CMS 12 migration while GitHub Copilot handled the code changes, including the...

Dom Reilly | Sep 29, 2026 |