Binh Nguyen Thi
Jun 25, 2026
visibility 525
star star star star star
(1 votes)

Add more scheduled job settings from the Optimizely CMS 12 admin UI -- with OptiScheduledJob.ExtraParameters

 
Optimizely (EPiServer) CMS 12 ships a great scheduled-jobs framework, but it has one frustrating gap: a job has nowhere to store its own configuration. Want an administrator to tweak a batch size, flip a feature flag, pick a priority, or set a cut-off date for a job — within Scheduled Job Settings UI directly? Out of the box you can't. Teams usually end up hard-coding values, hanging them off `appsettings.json`, adding more content type as settings type.
 
OptiScheduledJob.ExtraParameters closes that gap. It lets you attach a strongly-typed settings class to any custom scheduled job and edit it right on the job's detail page in the admin UI — no extra plumbing, no custom screens.

 

Edited by CMS admins in a form rendered automatically under the default job settings
Persisted in Optimizely's Dynamic Data Store
Read back inside the job at execution time through a simple service
 

How to install

The package is published to the Optimizely NuGet feed https://nuget.optimizely.com. Register that feed as a source first, then install:
 
dotnet nuget add source https://api.nuget.optimizely.com/v3/index.json -n optimizely
dotnet add package OptiScheduledJob.ExtraParameters
 
Register the module once in Startup.cs:
 
using OptiScheduledJob.ExtraParameters.Infrastructure.Configuration;
 
 
public void ConfigureServices(IServiceCollection services)
{
    services.AddCms();
    // ...
    services.AddScheduledJobExtraParameters();
}
 
1. Define your settings

Create a class deriving from ScheduledJobExtraParametersBase and decorate each property with
[ExtraParametersPropertyDisplay] for its label, help text, and (optionally) dropdown options:

 

 
using OptiScheduledJob.ExtraParameters.Attributes;
using OptiScheduledJob.ExtraParameters.Models;

 

public class CleanupJobParameters : ScheduledJobExtraParametersBase
{
    [ExtraParametersPropertyDisplay(DisplayName = "Source folder", Description = "Path to scan")]
    public string SourceFolder { get; set; }
    [ExtraParametersPropertyDisplay(DisplayName = "Batch size", Description = "Items per run")]
    public int BatchSize { get; set; }
    [ExtraParametersPropertyDisplay(DisplayName = "Threshold", Description = "Minimum match score")]
    public decimal Threshold { get; set; }
    [ExtraParametersPropertyDisplay(DisplayName = "Send notifications")]
    public bool SendNotifications { get; set; }
    [ExtraParametersPropertyDisplay(DisplayName = "Run after")]
    public DateTime RunAfter { get; set; }
    // A string[] of options renders a dropdown.
    [ExtraParametersPropertyDisplay(DisplayName = "Priority", Options = new[] { "Low", "Medium", "High" })]
    public string Priority { get; set; }
}

 

2. Attach it to your job
[ScheduledPlugInWithExtraParameters] is a drop-in replacement for [ScheduledPlugIn]:

using EPiServer.Scheduler;
using OptiScheduledJob.ExtraParameters.Attributes;

[ScheduledPlugInWithExtraParameters(
    DisplayName = "Unused Image Removal",
    ExtraParameterDefinition = typeof(CleanupJobParameters))]
public class UnusedImageRemovalJob : ScheduledJobBase
{
    // ...
}
 
3. Read the values when the job runs
 
using OptiScheduledJob.ExtraParameters.Services;
 
public class UnusedImageRemovalJob : ScheduledJobBase
{
    private readonly IScheduledJobExtraParametersDataService _extraParameters;
    public UnusedImageRemovalJob(IScheduledJobExtraParametersDataService extraParameters)
    {
        _extraParameters = extraParameters;
    }
    public override string Execute()
    {
        var settings = _extraParameters.Get<CleanupJobParameters>(this.ScheduledJobId);
        var batchSize = settings?.BatchSize ?? 100;
        // ... use the settings
        return "Done";
    }
}

 

How it looks in the admin

Open Admin → Scheduled Jobs → your job. Below the standard "When to run" controls, an Extra Parameters form appears automatically. Each property is rendered with the right input control for its type — text box, number, date picker, checkbox or dropdown — one per row:
 

 

Saving — with notification
 
Hit Save on the Extra Parameters form and the values are posted back stored. You get a clear toast notification confirming the result:

 

Compatibility

- Optimizely CMS 12 (EPiServer.CMS 12.x)
- .NET 6, 8, 9 and 10 — the package multi-targets all four runtimes
- Optimizely CMS 13 -  planned in future no far

 

Links

- NuGet: Optimizely NuGet feed — https://nuget.optimizely.com/
- Source & issues: https://github.com/binhboong1802/optimizely-scheduledjob-extraparameters
Jun 25, 2026

Comments

Johan Book
Johan Book Jul 3, 2026 09:36 AM

Wow, such a nice addition! Thanks!

error Please login to comment.
Latest blogs
Copies vs. Connections: Modeling Content Areas for Multilingual Success

Starting With the Simple Question Most multilingual content modeling conversations start with a deceptively simple question from a client: "If we s...

Vipin Banka | Aug 23, 2026

Content Transfer coming to Optimizely SaaS CMS

Back in June I released Content Transfer on the Optimizely nuget feed – today I’m releasing version 1.0 , because we’ve had it running out in the...

Matt Pallatt | Aug 23, 2026

Improving Optimizely Product Information in LLM Tools

Tools like Claude Code can be great for working with Optimizely CMS, but when they index outdated or incomplete information about developing a...

Nicholas Sideras | Aug 21, 2026 |

How to Get a Bacpac Out of DXP (And Never Do It By Hand Again)

Every Optimizely DXP project eventually runs into the same task: getting production data onto a local machine so you can actually troubleshoot...

KennyG | Aug 20, 2026