---
title: Multiple external systems
slug: cms-12/docs/multiple-external-systems
docTags: 
createdAt: 2026-08-10T15:56:01.000Z
---

:::hint{type="info"}
**Note**
[Optimizely Forms](docId:3SbSlJZIS_3iFmghfQA3J) is only supported by MVC-based websites and HTML5-compliant browsers.
:::

From version 4.18.0, Optimizely Forms can support multiple external systems. Editors can choose one of the registered systems as a connected data source in the user interface.

![](https://api.archbee.com/api/optimize/BrbvVORKJ5iIeSMZye5kI/9YwonRWnof87MoBFFuiQC_b4306ec-multiple-external-systems.png)

To make Optimizely Forms support multiple Marketing Automation connectors:

1. Create an instance of `IExternalSystem` and register this with Forms.

```csharp
var efmService = ServiceLocator.Current.GetInstance<ExternalSystemService>();
var custom1 = new CustomExternalSystem("Custom_1");
custom1.Datasources = GetSomeDatasources(custom1);
var custom2 = new CustomExternalSystem("Custom_2");
custom2.Datasources = GetSomeDatasources(custom2);
efmService.RegisterExternalSystem(custom1);
efmService.RegisterExternalSystem(custom2);
```

2. Forms automatically activates `ExternalSystem` with the default constructor and registers this with Forms. You can override this default behavior.
3. Allow the display name of the `ExternalSystem` by ID. You can get the `DisplayName` localization resource from the XML path:

```xml
/episerver/forms/externalsystems/{system.Id}/displayname
```

If that resource does not exist, fallback to the default one (like previous versions):

```csharp
/episerver/forms/externalsystems/{system.GetType().FullName}/displayname
```

## API changes from version 4.18.0

1. A service, `ExternalSystemService`, is introduced for working with external systems:
   - `WorkingExternalSystem` – Get currently activated external systems.
   - `HasExternalSystems()` – Determine whether there is any implementation of `IExternalSystem`.
   - `ActivateFromTypes()` – Automatically try to create instances of `IExternalSystem` by scanning the assembly. This requires the default constructor of the `ExternalSystem`. If you do not want to activate your automatically`ExternalSystem`, override this method and do nothing or do not provide the default constructor for the `ExternalSystem`.
   - `RegisterExternalSystem` – Explicitly register an `ExternalSystem`. Each `ExernalSystem` must have a unique ID. The ID should not contain spaces or special characters.
   - `UnregisterExternalSystem` – Remove an `ExternalSystem`.
   - `GetExternalSystem` – Return instance of an `ExternalSystem` by ID.
   - `GetAllExternalSystems` – Return instances of `ExternalSystem` (activated, registered)
2. The property `IPostSubmissionActor.ActiveExternalFieldMappingTable` was obsoleted because the Actors should not know about the mappings. If you want to have a mapping table in Actors, you can use `IExternalFieldMappingService.GetActiveFieldMappingTables` to retrieve them.
