Adobe Campaign Classic has an N-tier architecture called by many sources (client console, recipients emails, web apps..) that follow the same path: load balancer β†’ web server (Apache/IIS) β†’ Tomcat (Java JSP) β†’ nlserver (C++, JavaScript, JSSP) β†’ database.

Knowing that path is the quickest way to tell where to look when something breaks, this article maps the 4 tiers to their public URLs and the configuration files each one resolves to.

Production setups usually follow the stack Recipients > Load Balancer > Tomcat/nlserver/JS > PostgreSQL:

PRESENTATION     ─▢ FRONT                   ─▢ APPLICATION                  ─▢ PERSISTENCE

Recipients     ─┐
Client Console ─┼─▢ Load Balancer > Web     ─▢ Application                  ─▢ Database
SOAP APIs      ──   :443            Apache      Linux Tomcat:8080               PostgreSQL
Web Portal     ──                   IIS         nlserver                        MS SQL
Web Apps       ──                               β”œβ”€ wfserver stat inMail         Oracle
JSSP           β”€β”˜                               └─ mta > SMTP > Recipients

While local setups usually follow the simple stack Local > Tomcat/nlserver/JS > PostgreSQL (no front!):

PRESENTATION                                ─▢ APPLICATION                  ─▢ PERSISTENCE
Local computer                              ─▢ Windows Tomcat:8080          ─▢ Windows PostgreSQL

3-tier architecture of local Adobe Campaign architecture

Need to install a local instance? Read How to install AC on Windows. Want to explore the JS engine? Follow the JS Environments

Presentation layer

The presentation layer is everything that publicly connects to Adobe Campaign:

  • The emails received by recipients displayed in a mirror page, and the redirection links
  • The web apps browsed by recipients
  • The administrators access to the Web Portal and the Client Console
  • The APIs via SOAP or custom JSSP

Common Application Server URLs

Production servers are usually hosted at https://instance-mkt-prod1.campaign.adobe.com and local at http://localhost:8080:

Public URL Description
/view/home Homepage of the Adobe Campaign Web Portal. Redirects to logon if not authenticated.
/nl/jsp/logon.jsp Logon page, redirects to Client Console download page at completion page
/nl/jsp/install.jsp Client Console download page
/webApp/{internalName} Web Apps, see the Web Apps Tutorial
/{namespace}/{name}.jssp JSSP pages, see the πŸ“• JSSP Reference or the JSSP Tutorial
/nl/jsp/soaprouter.jsp SOAP APIs for Client console and SOAP web services
/nl/jsp/m.jsp Mirror page

Default URL Mappings

Adobe Campaign maps URLs to local installation directories for serving static resources (images, JSP, XSL). Here’s a summary of the most common mappings:

Public URL Description Install directory
/nl/*,
i.e. /nl/webForms/defaultWebApp.css
Static web resources /web/*
/*/img/*,
i.e. /nms/img/nms-logo-01.png
Datakit images for Neolane Marketing Server (NMS) /datakit/*/eng/img/*
/*/xsl/* Datakit XSL /datakit/*/eng/xsl/*
/*/jsp/* JSP exposition /datakit/*/eng/jsp/*
/res/* Resources /var/res/*
/cus/* Other ../customers/*

Front layer

The front layer is built for performance, security and scale with 2 sub-layers:

  • Load balancer to distribute the calls between containers, managed by Adobe
  • Web server to serve static files and proxy dynamic requests to Tomcat (Apache or IIS on port 443)

It is optional for local development, where calls hit Tomcat on port 8080 directly.

Health check - Front

  • /r/test -> test page, returns XML <redir status='OK' localHost='' .../>

Resource Server (CDN)

Adobe Campaign uses a resource server (CDN) to serve public resources, such as images and files uploaded via the client console. Example URLs:

  • /res/<instanceName>/ -> Public resource files

Application layer

The application layer is the core of Adobe Campaign, split into 3 sub-layers:

  • Tomcat to handle authentication (session, cookies) and serve high-performances pages (JSP), called by port 8080
  • The C++ binary nlserver to run core business logic & database access, called by Tomcat (via JNI)
  • The SpiderMonkey JavaScript engine for custom developments, called by nlserver

Health check: Application

  • /nl/jsp/ping.jsp -> ping

Installation directory

Adobe Campaign server can be installed on Linux (nlserver) and Windows (nlserver.exe). To verify its installation directory on Linux, run:

$ cat /etc/passwd | grep neolane
# neolane:x:1001:1001::/usr/local/neolane:/bin/bash
$ echo $DIR_NEOLANE
# /usr/local/neolane/nl6

And on Windows:

PS> Get-Service nlserver6
# Running  nlserver6          Adobe Campaign - Application Server...
PS> sc.exe qc nlserver6
# SERVICE_NAME: nlserver6
#        BINARY_PATH_NAME   : "C:\Program Files\Adobe\Adobe Campaign Classic v7\bin\nlserver" watchdog -svc -noconsole

Cross-platform

Most of an Adobe Campaign install is OS-agnostic: the server configuration, the Tomcat container, the Java libraries, and the JavaScript engine are identical on Linux and Windows. Every path is resolved through the $(XTK_INSTALL_DIR) template that nlserver initiates.

Only a small integration layer is OS-specific:

  • the main startup (Linux env.sh + lib/*.so vs Windows bin\*.dll)
  • the web stack (Apache apache_neolane.conf vs IIS iis_neolane_setup.vbs)
  • the monitoring script (indicators.sh vs indicators.vbs)
        LINUX host                     WINDOWS host          ┐
   ────────────────────          ─────────────────────       β”‚  OS-specific
   lib/*.so + env.sh             bin/*.dll                   β”‚  integration
   Apache: apache_neolane.conf   IIS: iis_neolane_setup.vbs  β”˜
            β”‚                             β”‚
            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                           β–Ό
   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”           ┐
   β”‚   conf/  java/  tomcat/  logs/  var/        β”‚           β”‚ Cross-platform
   β”‚   datakit:  *.js   *.jsp                    β”‚           β”‚ JVM + SpiderMonkey
   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜           β”˜

Installation subdirectories

Adobe Campaign’s installation directory contains several key subdirectories:

Adobe Campaign installation subdirectories on Windows

$(XTK_INSTALL_DIR)
β”œβ”€β”€ bin/            # Server binary (nlserver), spamcheck.pl, phantomjs, tools/traceview.exe, htmlToPdf
β”œβ”€β”€ conf/           # Configuration files
    └── serverConf.xml config-default.xml config-<instanceName>.xml
β”œβ”€β”€ customers/      # Customer-specific configurations
β”œβ”€β”€ datakit/        # Core application data and resources
β”œβ”€β”€ deprecated/     # Legacy files (v6.0)
β”œβ”€β”€ examples/       # Sample files and templates
β”œβ”€β”€ java/           # Java libraries
β”œβ”€β”€ lang/           # Language packs
β”œβ”€β”€ migration/      # Migration scripts
β”œβ”€β”€ rsetup/         # Setup and deployment scripts
β”œβ”€β”€ tomcat-7/       # Tomcat server files
    └── conf/       # i.e. apache_neolane.conf server.xml
β”œβ”€β”€ web/            # Web application files
β”œβ”€β”€ zoneinfo/       # Timezone data
β”œβ”€β”€ logs/           # Server logs, i.e. Tomcat catalina.YYYY-MM-DD.log
└── var/            # Runtime and workflow data
    β”œβ”€β”€ res/        # Instance-specific resources
    β”‚   └── <instanceName>/
    └── <instanceName>/  # Instance-specific directories
        β”œβ”€β”€ billing/
        β”œβ”€β”€ export/
        β”œβ”€β”€ incoming/
        β”œβ”€β”€ log/    # Instance logs, i.e. inMail.log mta.log runwf.log stat.log wfserver.log
        β”œβ”€β”€ mta/
        β”œβ”€β”€ postupgrade/
        β”œβ”€β”€ redir/
        β”œβ”€β”€ upload/
        β”œβ”€β”€ workflow/  # Workflow execution files
        β”‚   └── wf-<internalName>/
        β”‚       └── httpTransfer/
        β”‚           └── xxx.xml
        └── logins.log

Adobe Campaign Namespaces

In Adobe Campaign, namespaces are prefixes used to organize schemas, tables, and APIs. They help avoid naming conflicts and logically group related functionalities. Below are the core namespaces and their purposes.

NMS: Neolane Marketing Server

Covers marketing-related schemas and tables, such as:

  • Recipients (nms:recipient): The main table for storing customer profiles.
  • Deliveries (nms:delivery): Tables for email, SMS, and other campaign deliveries.
  • Campaigns (nms:operation): Tables for managing marketing campaigns.
  • Lists (nms:group): Tables for managing recipient groups.
  • Templates (nms:template): Templates for deliveries and campaigns.

XTK: eXtended ToolKit

Covers low-level operations, technical and system-level functionalities, such as:

  • Workflows (xtk:workflow): Workflow schemas and execution.
  • JavaScript APIs (xtk:javascript): Server-side JavaScript APIs.
  • Session management (xtk:session): Authentication and session handling.
  • Data schemas (xtk:srcSchema): Base schemas for extending data models.

CRM: Customer Relationship Management

CRM connector functionalities, such as integrating with external CRM systems (e.g., Salesforce, Microsoft Dynamics):

  • CRM connectors (crm:connector): Configuration for CRM integrations.
  • Synchronization (crm:sync): Data synchronization between Adobe Campaign and CRM systems.

Persistence layer

The persistence layer is the relational database (PostgreSQL, Oracle or Microsoft SQL Server) holding all recipient, delivery and campaign data. Adobe Campaign never exposes it directly: the native nlserver engine owns every connection and translates the XML queryDef built in server-side JavaScript into SQL. How schemas map to physical tables is detailed in the πŸ“• Database reference.

Notes on Client Console

The Client Console is part of the presentation layer and can be downloaded from the Adobe Experience Cloud Download Center. It is then started with nlclient.exe (Windows only). It is used by business users to send campaigns (via workflows) and admins to configure the instance (via the built-in IDE). Details:

  • Can be installed anywhere but default to C:\Program Files\Adobe\Adobe Campaign Client. Installing in Program Files require Administrator rights. To avoid Administrator rights requirement, install it in your User folder C:\Users\<user>\Adobe\Adobe Campaign Client
  • Stores configuration and cache in C:\Users\<user>\AppData\Roaming\Neolane\NL_6. Access the folder via shortcut %AppData%
%AppData%\Neolane\NL_6
 └─ nlclient\                             # stores cache for each instance in cache-en[instanceid]/
    β”œβ”€ nlclient_cnx.xml                   # stores credentials to instances in <connections> with default <cnx id="1" label="localhost" url="http://localhost:8080"/>
    └─ nlclient-config-[instanceid].xml   # stores instance-specific settings, such as <lastPosition>, <urlViewer> and schema <nmsRecipient>, <xtk_queryDef>
  • SOAP calls to the instance (request + response) can be debugged by starting the Traceview module: Shift F3 in the Client Console (status bar will show β€œTraces ON”). Not working? Use Fiddler to debug SOAP requests/responses without Traceview
  • Passwords and UI state (columns size, last searches) are saved in the Windows registry under HKEY_CURRENT_USER\Software\Neolane\NL_5 and can be debugged with:
Get-ChildItem "HKCU:\Software\Neolane\NL_5\nlclients" | Select-Object Name
Get-ChildItem "HKCU:\Software\Neolane\NL_5\XtkLogon" | Select-Object Name
Get-ChildItem -Recurse "HKCU:\Software\Neolane\NL_5\nlclient"
  • the built-in IDE can be configured with bin/editor.cfg such as
    • showlinesno=1 to show the line number
    • guides=76 for the max characters per line
    • keywords JAVASCRIPT = break else new var case finally return void catch for switch while continue function this with default if throw delete in try do instanceof typeof for the reserved keywords
    • Default colors sample:
const labels = ["Hello", "world"];
labels.forEach(function(l){ 
    logInfo(l); // comment here
});

Sources

Going further

As most of the Adobe Campaign customizations are done in the JavaScript runtime, visit the πŸ“• JS Environments.