Contact Us

If you still have questions or prefer to get help directly from an agent, please submit a request.
We’ll get back to you as soon as possible.

Please fill out the contact form below and we will reply as soon as possible.

  1. Fotoware Alto
    • Release Notes
    • End-User Manual
    • Solutions
    • Terminology
    • User Guides
    • API Changelog
  2. Fotoware Veloz
    • Fotoware Veloz releases
    • Managing users and groups
    • Configuring archives
    • Configuring workflows
    • Configuring site behavior
    • Navigating and searching to find your assets
    • Working with your assets
    • Editing asset metadata
    • Uploading files
    • Version Control in Fotoware
    • Albums - Creating and sharing collections
    • Placing assets in a Content Management System (CMS)
    • Working with the Fotoware Pro interface
    • Using the Fotoware plugins
    • Consent management
    • User guide to FotoWeb for iPad (Legacy)
    • Picture conferencing with FotoWeb Screens (Legacy)
    • What's what in Fotoware
    • GDPR
    • Activity Exports
    • Example workflows
  3. Fotostation
    • Getting started with Fotostation
    • Viewing, selecting and sorting files
    • Managing your assets with archives
    • Adding metadata to assets in Fotostation
    • Searching for assets
    • Working with your assets
    • Version Control in Fotostation
    • Automating tasks with Actions
    • Configuring metadata fields and editors
    • Configuring Fotostation
    • Configuring Fotostation for multi-user environments
    • Troubleshooting Fotostation
  4. Fotoware Flow
    • About Flow
    • Getting started
    • Flow dictionary
  5. Fotoware On-premises
    • Fotoware On-premises releases
    • Getting started
    • Index Manager
    • FotoWeb
    • Color Factory
    • Connect
    • Operations Center Guide
  6. Integrations and APIs
    • Fotoware Alto API
    • Fotoware Veloz and On-premises API
  7. Fotoware Mobile
    • User guide for Fotoware Mobile for iPhone and Android
    • User guide to FotoWeb for iPad (Legacy)
    • User guide to FotoWeb for iPhone and Android (Legacy)

Contact Us

If you still have questions or prefer to get help directly from an agent, please submit a request.
We’ll get back to you as soon as possible.

Please fill out the contact form below and we will reply as soon as possible.

Support

Table of Contents

Feature Upgrading from CMS 12 to CMS 13 Before you start Example Image Property and selection dialog from Fotoware How it works Installation Dependencies Registering the Selection Widget integration with Fotoware Registering the Server-to-Server integration Configuration Startup and appsettings.json: Configuring additional settings Add to your Tiny MCE configuration toolbar Decorate your Optimizely Property with the Fotoware UIHint attribute: Scheduled jobs Synchronizing metadata from Fotoware to Optimizely Controlling the structure of downloaded assets in Optimizely [Optional] Customize Tiny MCE HTML template [Optional] Event handling with Fotoware events Disabling the Fotoware plugin in the Optimizely Commerce Asset list Logging Fotoware.Veloz.Plugins.Optimizely Extras: code samples Troubleshooting Multi-site configuration Known issues Fotoware Optimizely/Episerver Plugin Change Log
  • Home
  • Integrations and APIs
  • Fotoware Veloz and On-premises API
  • Optimizely and Episerver plugin documentation

Optimizely Fotoware add-on (version 1) for Optimizely CMS 13 and .NET 10

Learn how to install, configure, and use the Optimizely Fotoware add-on for Optimizely CMS 13 and .NET 10.

20. May 2026

Elaine Foley

Table of Contents

Feature Upgrading from CMS 12 to CMS 13 Before you start Example Image Property and selection dialog from Fotoware How it works Installation Dependencies Registering the Selection Widget integration with Fotoware Registering the Server-to-Server integration Configuration Startup and appsettings.json: Configuring additional settings Add to your Tiny MCE configuration toolbar Decorate your Optimizely Property with the Fotoware UIHint attribute: Scheduled jobs Synchronizing metadata from Fotoware to Optimizely Controlling the structure of downloaded assets in Optimizely [Optional] Customize Tiny MCE HTML template [Optional] Event handling with Fotoware events Disabling the Fotoware plugin in the Optimizely Commerce Asset list Logging Fotoware.Veloz.Plugins.Optimizely Extras: code samples Troubleshooting Multi-site configuration Known issues Fotoware Optimizely/Episerver Plugin Change Log

Feature

This article explains how to install, configure, and use the Optimizely Fotoware Veloz add-on for Optimizely for CMS 13 .NET 10 and CMS 12 .NET 8. For a version that works with Optimizely CMS 12 and .NET 8, see Optimizely Fotoware add-on (version 5.5) for Optimizely CMS 12 and .NET 8.

The export widget will work without a Server API License, but will not synchronize metadata; it will only download the image to Optimizely. 
 

Upgrading from CMS 12 to CMS 13

Version 1 is an upgrade from the Fotoware.Plugins.Optimizely plugin version 5.5.

  • The admin URL might have changed. Update the Site Configuration > Integrations > Callback URL in Fotoware Veloz to the new URL, for instance, https://domain.com/*optimizely*/fotoware.veloz.plugins.optimizely/authentication/callback, where optimizely depends on your configuration. This is case-sensitive; use lowercase. 
     
  • Replace all Fotoware.Plugins.Optimizely namespaces and references with Fotoware.Veloz.Plugins.Optimizely in your solution. 
     

Before you start

This article is technical and requires knowledge of the Optimizely ecosystem. To set up and configure the add-on, we recommend getting assistance from someone experienced with Optimizely integrations.
 

Example Image Property and selection dialog from Fotoware

Example: TinyMce Toolbox button

How it works

When an asset is selected, the asset is imported into the default Optimizely asset management repository and used in an image property (of type ContentReference or Url) or the Rich Text editor. There is also an Optimizely scheduled job (to be enabled after installation), which ensures that the imported images and metadata are kept up to date in Optimizely if they change in Fotoware.

Key features of the integration:

  1. Easy to add to Optimizely solutions, both new and existing solutions.
  2. The integration can be removed without affecting the used assets.
  3. Used assets from Fotoware are synchronized into Optimizely's default asset management, making it easy for developers familiar with Optimizely to get started.
  4. It is possible to configure media to show only local assets, only assets from Fotoware, or both.
  5. Developers can configure their own media models containing the metadata to be synchronized with Fotoware.
  6. Since downloaded media become standard Optimizely media items, Optimizely keeps track of which media is used where in the solution.

Note: Versions 1, 2, and 3 only support importing static images, such as .jpg files. PDFs may work, but are not meant to. Video, .svg files, and animated gifs are not currently supported.

Installation

You can find information on Nuget.optimizely.com: https://nuget.optimizely.com/package/?id=Fotoware.Veloz.Plugins.Optimizely (external link)

Installing and configuring the add-on takes less than one hour.

Dependencies

This version of the add-on requires at least EPiServer.CMS.UI 12.
The add-on automatically adds support for Optimizely Commerce and works on version 14 and higher.
Version 3 of EPiServer.CMS.TinyMCE is needed for the Toolbox button in the editor.

Registering the Selection Widget integration with Fotoware

Before setting up the Optimizely integration, you must register the application in the Fotoware Site Configuration. 

From the Tools menu (cogwheel icon), go to Site Configuration > Integrations > Applications.

Select Add application to set up the integration for the Selection Widget.

Type: Select Web App / API and API (as in the example above).

Name: Enter the name of the application - for example, Optimizely integration

Redirect URIs: Here, you set the URI that the user should be returned to after authentication is completed. The redirect URI is usually in the form:

http(s)://domain.com/*episerver*/fotoware.veloz.plugins.optimizely/authentication/callback

Whether or not /episerver is part of the URI depends on how Optimizely has been configured. The redirect URI should be set in the Integrations settings above. Use small caps. In a multi-site scenario, one URI is needed per domain.

User consent: Use markdown syntax to add any custom information that should be displayed when the user uses the plugin for the first time. It's also possible to include a link to a privacy policy.

Access: This is used to control who has access to use the plugin.

Client ID / Client Secret: These values are auto-generated when you select Save (see the example below). Copy both values to a temporary location, such as a text file. Later, you must add these to the web.config file of the Optimizely plug-in, in Fotoware:ClientIdand Fotoware:ClientSecret value fields (See web.config section below).
Once you have done this, you can delete the text file. If you lose the client secret, you can generate a new one and update the web.config file.

Registering the Server-to-Server integration 

Next, you must register a server-to-server authentication to complete the integration. This can be obtained in the Fotoware Site Configuration: Log in to your Fotoware tenant, open the Tools menu (cogwheel), and select Site configuration. The integration settings are found in the Integrations node, under Applications.

Add a new application and set the Type to Non-interactive/script, as seen in the screenshot below.

Name the integration and select Save to generate the Client ID and Client secret values. Copy them to a working document and insert them in the Optimizely web.config file in the Fotoware:ServerApi:ClientId and Fotoware:ServerApi:ClientSecretvalue fields (see below).

Configuration

Startup and appsettings.json:

Add services.AddFotowarePlugin(); into your startup.cs

```
public void ConfigureServices(IServiceCollection services)

{
       //at the end

   services.AddFotowarePlugin();

}

```

```

"Fotoware": {

   <!-- all these data is to be obtained from Fotoware -->

   <!-- Documentation ClientId and Secret for Selection widget https://learn.fotoware.com/Integrati..._authorization -->

   "ClientId": "[Enter your Fotoware guid]",

   "ClientSecret": "[Enter your client secret string]",
   
   <!-- Documentation for ServerApi ClientID and Secret https://learn.fotoware.com/Integrati...with_OAuth_2.0 -->

   "ServerApi": {

     "ClientId": "[Enter your Fotoware guid]",

     "ClientSecret": "[Enter your client secret string]"

   },

   <!-- Leave RedirectUri empty or remove if nothing else is told to you. Domain is not required in Optimizely multisite solution,

   example https://domain.com/*episerver*/Fotow...ation/callback 

   or use default /episserver/Fotoware.Veloz.Plugins.Optimizely/authentication/callback

   where *episerver* is depending on your configuration. CASE SENSITIVE, use LOWER CASE  -->

   "RedirectUri": "/episerver/Fotoware.Veloz.Plugins.Optimizely/authentication/callback",

   "TenantUrl": "https://my.fotoware.cloud",

   <!-- which asset folder to import images to -->

   "RootFolderId": "[Enter an id to a media folder in Optimizely where you want downloaded assets, for instance 218]",

   
   <!-- presets is used to predefine a width of an image to download, can be used with Fotoware:PreferredDownloadWidth, presets are defined in Fotoware -->

   "PresetUrl": "/fotoweb/me/presets/export/[your presets guid]",

   <!-- these are optional -->

   <!-- EnableOnAllImages default is "true" -->

   /*"EnableOnAllImages": "false",*/

   /* ExportWidgetEnableOnAllImages default is "true" */

   /*"ExportWidgetEnableOnAllImages": "false",*/

   /* DisableEpiserverDefaultMediaSelector default is "false" */

   /*"DisableEpiserverDefaultMediaSelector": "true",*/

   "AllowedTypes": ".jpg,.jpeg,.jpe,.gif,.bmp,.png,.gif,.psd",

   /* PreferredDownloadWidth is important to be same or less than the presets width to work, zero is default and will den take the default presets width */

   "PreferredDownloadWidth": "1600",

   /*  Refresh token valid for days, then user need to login again, default is 14 */

   "RefreshToken": {

     "ValidDays": "1"

   }

   /*"ArchiveUrlsToSynchronize": "/fotoware/archives/5000-Archive,/fotoware/archives/5000-Archive-2",*/  }

   "ImportOriginalSelection": true, //Add dropdown value "Import Original" selection on Image Property, will always download the original image thru the Download API, bypassing the presets.

   "DisableAssetPane": false,//disabling right click in asset panel folders

```

It is also possible to implement and register an instance of the IFotowareSettings (or extended IFotowareCommerceSettings) interface to take full control of all settings, for instance, configuring which metadata to synchronize.

Configuring additional settings

You need to implement the IFotowareMedia interface on a content type that inherits from the Optimizely ImageData class in your solution. This will enable additional fields used by the add-on to keep assets in sync with the originals in Fotoware.

01

02

03

04

05

06

07

 

08

 

09

10

11

 

12

13

```

[ContentType(GUID = "73738b8b-d6f1-4995-ba01-212c32eef6a5")]

[MediaDescriptor(ExtensionString = "jpg,jpeg,jpe,ico,gif,bmp,png")]

public class ImageFile : ImageData, IFotowareMedia

{

[Editable(false)]

//Format: pipeseparated values. Example "internal fotoware href|download url|type of download url|site guid"

public virtual string FotowareUrl { get; set; } //Links back to Fotoware

 

[Editable(false)]

public virtual DateTime FotowareModifiedDate { get; set; } //for sync job to work

}

```

 

(The FotowareModifiedDate property is used to track when the asset was last changed in Fotoware. 

Note: An update to the metadata of an asset in Fotoware only adds 2 seconds to the modified date; therefore, we need to keep track of this date and time.

Add to your Tiny MCE configuration toolbar

The button is automatically plugged into Tiny MCE. If it doesn't show up, you probably already have a custom configuration. In startup.cs, add **fotoware-insert-media** to your toolbar.

Decorate your Optimizely Property with the Fotoware UIHint attribute:

1

2

3

4

5

6

7

8

```

//FotowareUiHint.FotowareImage only for ContentReference type

[UIHint(FotowareUiHint.FotowareImage)]

public virtual ContentReference ImageAsContentReference { get; set; }

//FotowareUiHint.FotowareImageUrl only for Episerver.Url type

[UIHint(FotowareUiHint.FotowareImageUrl)]

public virtual Url ImageAsUrl { get; set; }

```

This will replace Optimizely's built-in image editor with an extended editor that supports selecting images from Fotoware and local Optimizely images.

To disable the option to select local images in Optimizely, you can add another attribute to your property:

**FotowareConfigurationAttribute** is introduced in version 2. 
`[FotowareConfiguration(DisableDefaultEpiserverMedia = true, ExportWidgetEnabled = WidgetStatus.Disabled, /* only with XhtmlString, will use the export url from fotoware direct, instead of downloading the asset to Optimizely */ UseExportUrlOnly = false, QueryParameters = "crop=false&enhance=false&caption=false&action=false&publication=false&behaviour=false")]`

The attribute should be used in combination with FotowareUiHint. The parameters are documented here Integrati...gets#section_7.

Scheduled jobs

There are 2 jobs:

  • **Fotoware - Synchronize assets**: Normally enabled if you want to sync updates from Fotoware to Optimizely. This job will only update assets if the assets have been updated in Fotoware.
  • **Fotoware - Synchronize assets - Force**: As above, but will always download the latest image and metadata. Only to be run manually if needed.

![Fotoware_episerve_syncjob.png](/.attachments/Fotoware_episerve_syncjob-a9816ccc-4613-4afb-aebb-17102f7d6ce9.png)

Synchronizing metadata from Fotoware to Optimizely

The add-on supports synchronizing metadata between Fotoware and Optimizely through a mapping schema defined in your implementation of the **IFotowareSettings** interface. Implement your own **IFotowareSettings** and define the mapping schema for metadata that you want to get into the Optimizely assets.
Note: Some default metadata is included in Fotoware, but this can be extended for each client. 

The default mapping schema is set up as follows:

01

02

03

04

05

06

07

08

09

10

```

MetadataConfiguration = new NameValueCollection

{

{"5", "Name"},

{"25", "Keywords"},

{"80", "Photographers"},

{"116", "Copyright"},

{"120", "Description"}

};

```

The mapping schema has keys that match the metadata names in Fotoware, and the value is the property name in Optimizely.
Note: The types need to be the same when changing the configuration; for instance, Photographers is a list of strings. 

You can find the default keys here: Fotoware_...MP_field_codes

The following example shows how to add custom metadata to the synchronization:

01

02

03

04

05

06

07

08

09

10

11

```

MetadataConfiguration = new NameValueCollection

{

{"5", "Name"},

{"25", "Keywords"},

{"80", "Photographers"},

{"116", "Copyright"},

{"120", "Description"},

{"998", "OptimizelyCustomProp"} // set on imagetype

};

```

Controlling the structure of downloaded assets in Optimizely [Optional]

Since Fotoware stores assets in a flat list and Optimizely uses a hierarchical structure, assets imported to Optimizely are placed in a folder structure. This helps when browsing the imported assets and avoids a long list of assets in the same folder, which Optimizely does not handle well. It is possible to manage the folder structure for assets in Optimizely. By default, folders are created based on the year and month the asset was imported into Optimizely, but you can use other structures, for instance, based on metadata in the solution.

This is achieved by implementing the **IFolderResolver** interface.

If you want to save the image to "For this page", register this in startup.

services.AddScoped<IFolderResolver, ForThisPageFolderResolver>();

Customize Tiny MCE HTML template [Optional]

You can implement your own input HTML when inserting in Tiny MCE, for example, by filling the alt-text or adding some CSS classes. 

This is done by implementing and registering an implementation of **IFotowareTinyMceTemplateResolver** where you override GetHtml(ContentReference contentReference, string insertingToContentReference=null).

Event handling with Fotoware events

Available events are:

  • OnImageDownloading: Raised before downloading an asset with the possibility to cancel the action.
  • OnImageDownloaded: Raised after the asset has been downloaded.
  • OnImageDeleted: Raised in the synchronization job when an asset is deleted or revoked in Fotoware.

The following example shows how to register event handlers for these events in an InitializationModule:

1

2

3

4

5

6

7

8

9

```

public void Initialize(InitializationEngine context)

{

var events = context.Locate.Advanced.GetInstance<FotowareEvents>();

events.OnImageDownloaded += FotowareHttpClientOnImageDownloaded;

events.OnImageDownloading += EventsOnOnImageDownloading;

events.OnImageDeleted += FotowareHttpClient_FotowareImageDeleted;

}

```


Disabling the Fotoware plugin in the Optimizely Commerce Asset list

Implement and register IFotowareCommerceSettings.PreventCommerceEditorIntegration.

By default, this is enabled.

Logging Fotoware.Veloz.Plugins.Optimizely

The add-on has some logging information that can be used for information and debugging the integration. 

Extras: code samples

In the NuGet package under Tools, you can find some code samples of IFolderResolver, IFotowareSettings, and IFotowareTinyMceTemplateResolver implementations, as well as additional scheduled jobs for synchronizing entire archives from Fotoware.

Troubleshooting

Tip: Turn on Logging Fotoware.Veloz.Plugins.Optimizely.

Multi-site configuration

Starting with version 3.5, you can have separate Fotoware instances for different sites in Optimizely.
You must implement the IFotowareConfig interface. 

Example: For each site

1

2

3

 

 

4

 

5

public class ExampleFotowareSite1Config : IFotowareConfig

{

public IFotowareSettings Settings => new ExampleSiteOneFotowareSettings();//implement a concrete IFotowareSettings with all settings

public Guid SiteId => new Guid("b1c98de6-afbd-433c-bbde-97f873edbb12");//Get this guid from Episerver/admin/config/websites

}

It will revert to the default IFotowareSettings set globally if siteid is not found.

Known issues

An error occurred when sending the request - This is probably due to the handshake with the endpoint not working. Make sure you use Tls12. 

Note: The callback URL is case-sensitive. Check your URL. Best practice is to use lowercase. 

 

Fotoware Optimizely/Episerver Plugin Change Log 

### 1.0.0 - May 2026

Update: targeting .NET 10 and Optimizely CMS 13 

  1. The admin URL might have changed. Update the Site Configuration > Integrations > Callback URL in Fotoware Veloz to the new URL, for instance, https://domain.com/*optimizely*/fotoware.veloz.plugins.optimizely/authentication/callback, where optimizely depends on your configuration. This is case-sensitive; use lowercase. 
  2. Replace all Fotoware.Plugins.Optimizely namespaces and references with Fotoware.Veloz.Plugins.Optimizely in your solution. 
     
optimizely fotoware

Was this article helpful?

Yes
No
Give feedback about this article

Related Articles

  • Optimizely Fotoware add-on (version 5.5) for Optimizely CMS 12 and .NET 8
  • Episerver Addon for Fotoware: Installation, configuration, and use
eco-lighthouse-miljøfyrtårn

Company

  • About us
  • Resellers
  • Careers
  • Contact us

Help & support

  • Support center
  • Consultancy
  • Tech partners
  • Fotostation
  • System status

Trust Center

  • Legal
  • Security
  • Sustainability & ESG

Locations

Fotoware AS (HQ)
Tollbugata 35
0157 OSLO
Norway
Fotoware Switzerland AG
Brown Boveri Str.7
5400 Baden
Switzerland

Copyright 2026 Fotoware All rights reserved.

  • Terms of service
  • Privacy policy
  • Cookie policy

Knowledge Base Software powered by Helpjuice

Expand