LUX LUX

Living User eXperience - LUX - the Marketing Automation tool for TYPO3 

LUX is an enterprise software solution that bridges the gap between your TYPO3 website and standalone marketing automation tools. LUX tracks, identifies and analyzes your leads while providing visitors with an improved user experience by showing relevant information at the right time.

In addition, with LUXenterprise you can use this data even more effectively by nurturing leads, running A/B tests and using URL shorteners.

Or see interesting information of your visitors by extending data automatically via a GDPR-conform solution from WiredMinds

LUX screenshot

Privacy documentation 

See some basic hints to respect visitors privacy and follow the rules of GDPR (General Data Protection Regulation) / DSGVO (Datenschutzgrundverordnung).

Marketing documentation 

We want to give you hints from time to time to get best results with your marketing automation tool.

Technical documentation 

A fully technical documentation how to install, configure and extend lux to your needs.

Developer documentation 

How to develop with LUX and LUXenterprise

LUX LUX

How to develop with LUX 

LUX 

Local test environment 

LUX ships its own testing environment based on docker. This can simply be started in the same folder as LUX with make install-project for the first time and then make stop to stop the container and make start to start it again

After that Backend is reachable under https://local.lux.de/typo3/

Login is possible with akellner as username and password.

Note Doing a make on CLI lists a bunch of useful commands (like clear caches, etc...) Note Docker and Dinghy should be installed on your unix system first

Run tests 

There are different tests that can be started locally. First of all, you have to login into the PHP-container with make login-php

After that, you can run different tests:

Test Command
Start code sniffer test composer test:php:cs
Start PHP linter composer test:php:lint
Start TypoScript linter composer test:ts:lint
Start unit tests composer test:unit

LUXenterprise 

If you clone LUXenterprise, you have basically the same possibilities as in LUX, but LUXenterprise will also install LUX of course.

Local test environment 

LUX ships its own testing environment based on docker. This can simply be started in the same folder as LUX with make install-project for the first time and then make stop to stop the container and make start to start it again

After that Backend is reachable under https://local.luxenterprise.de/typo3/

Login is possible with akellner as username and password.

Note Doing a make on CLI lists a bunch of useful commands (like clear caches, etc...) Note Docker and Dinghy should be installed on your unix system first

Run tests 

There are different tests that can be started locally. First of all, you have to login into the PHP-container with make login-php

After that, you can run different tests:

Test Command
Start code sniffer test composer test:php:cs
Start PHP linter composer test:php:lint
Start TypoScript linter composer test:ts:lint
Start unit tests composer test:unit

Features for testing 

This is just an internal lists of features and functions that have to be tested before a major release

LUX 

Backend 

  • TYPO3 Dashboard
  • Analysis module

    • Dashboard

      • Filter general functionality
    • Pages/Downloads

      • Pages: List
      • Pages: Preview
      • Pages: Detail
      • Downloads: List
      • Downloads: Preview
      • Downloads: Detail
      • CSV Download
      • Filter general functionality
    • News

      • List
      • Preview
      • Detail
      • CSV Download
      • Filter general functionality
    • Search

      • List
      • Preview
      • Detail
    • UTM

      • List
      • Preview
      • Detail
    • LinkListener

      • List
      • Preview
      • Detail
  • Leads module

    • Dashboard

      • Filter general functionality
    • Leads

      • List

        • Filter general functionality
        • Sorting
      • Preview
      • Detail

        • Delete
  • Company

    • Without Wiredminds Token

      • Add token functionality
    • With Wiredminds Token

      • List
      • Preview
      • Detail
  • Plugins

    • Privacy Plugin for Opt-in/Opt-out
  • Campaigns
  • Info module (i icon)
  • Render times
  • "Go enterprise" note
  • PageOverview im Backend

    • Analysis
    • Leads
  • RTE

    • Email4link
    • LinkListener Link
  • Commands
  • TYPO3 search

Frontend 

  • Page Request
  • Tracking

    • Page
    • News
    • Search
    • Scoring

      • Page visit
      • Download
    • Category Scoring

      • Page visit
      • Download
    • UTM parameters
  • Identification

    • Field mapping
    • Form mapping
    • Email4link (:white_check_mark:)

      • With redirect
      • With email
      • With "Powered by LUX"
    • Frontend login
    • LUXletter
  • LinkListener
  • Privacy Plugin for Opt-in/Opt-out

LUXenterprise 

Backend 

  • Campaign module

    • Workflows

      • List
      • New
      • Edit
      • Preview
      • Detail
    • A/B Testing

      • List
      • Preview
      • Detail
      • Page module overview (:white_check_mark:)
      • Download
    • URL Shortener

      • List

        • Copy to clipboard
        • QR-Code
        • Download
      • New
      • Edit
      • Preview
      • Detail
    • UTM Generator

      • New
      • Edit
      • Filter
  • Plugins

    • Contextual Content
    • Hidden Content
  • No "Go enterprise" note

Frontend 

  • URL Shortener
  • Workflows

    • Open popup on page
    • Send to slack on page
    • ... Further pages in Testparcours
  • Contextual Content Plugin
  • Hidden Content Plugin (for Workflows)
  • A/B Tests
  • Shortener
  • API/Interface
  • Commands
  • Email4link without "Powered by LUX"

LUX LUX

Marketing documenation 

We're going to update this documenation from time to time to give you some hints how to use LUX or a marketing automation tool to get best results.

Glossary 

First of all, let's define some terms in marketing automation and in LUX. This will help you with this manual and simplifies the work with marketing automation tools in general.

Term Description
Category-Scoring While a scoring tells us if a lead is hot, we still don't in which product or service the lead is interested in.Here comes the category scoring. You can have unlimited categories and a scoring related to category with Product A will tell us, if the lead is interested in the product.A category-scoring will not decrease, even if the visit was some time ago.
Cookie A cookie is an individual value that is saved in the visitors browser. LUX can be run without cookies.
LocalStorage A local storage is similar to a cookie but a bit of a newer technology.
DoNotTrack Browser support a DoNotTrack setting. This setting must be turned on from the user (it is not a default setting of the browser). If LUX recognize this setting, all tracking functions are disabled. We will respect this privacy setting!
Email4link Email4link is a LUX feature where you can ask your leads for their email if they want to download something.
Fingerprinting We can recognize visitors by their complete hard- and software usage - a values build from all this settings is an unique fingerprint. This is an anonymized hash that allows LUX to recognize the visitor by further visits in the future.
Identified Lead An identified lead means, that we know his/her email address.
Lead identification This is a virtual field of the lead and is used in the lead backend module and on some other places of LUX. Depending on the information that we have, we show the email or the first- and lastname or simply "Anonymous" if the lead is still not identified.
Link Listener Since version 9 LUX supports Link Listeners. You can listen to clicks on "call to action" buttons for an individual performance analysis. In addition clicks on Link Listeners can increase a category scoring of a visitor
Nurturing Lead-Nurturing means to develop a lead. Tell your leads relevant information and let them know how your business could help them. If you do this step by step, you will develop your leads - you will nurture your leads.
Lead A lead is a potential new customer for your business. No matter if you sell products or services.
LUX Living User eXperience - the Marketing Automation tool for TYPO3
Opt In LUX is disabled as long as a visitor accept a message (e.g. in a modal) or the privacy statement.
Opt Out LUX is enabled by default and can be disabled from a visitor over the opt out plugin.
Scoring A scoring is a value related to a lead, where we want to see how hot this lead is.This means: The more scoring the lead have, the more business-relevant is this lead.So, scoring is just a factor for us to see how interested the lead is - or if the lead wants to do business with us.A scoring can also decrease if the last visit from the lead was some time ago.
Slack Slack is a chat platform. Mainly used for team-communication and loved by developers. There is a Publish to a slack channel workflow action available in LUX.
Visitor A visitor is a website-visitor. This could be a lead or just someone who comes to your site and leaves at once because he/she was wrong
Workflow A workflow is a combination of one or more triggers and one or more actions to nurture your leads.
Workflow Action An action will be executed if a trigger fits. A known action could be to open a lightbox for the visitor.
Workflow Trigger A trigger is a point of action this will cause an action. A known trigger could be e.g. the second website visit.

Identification 

This part of the documentation describes different possibilities to identify your leads. Identification means that you are able to know the person behind the lead. And this needs an unique identification-property from the lead. E.g. firstname would be - of course - not a good property because this is not unique. Marketing Automation tools are going to use the email-address as unique property of the user. And... emails are great because, you can:

  • identify the lead
  • see the firstname as part of the email address (mostly given in business cases)
  • see the lastname as part of the email address (mostly given in business cases)
  • see the company as part of the email address (mostly given in business cases)
  • having an url (company) where you can simply find more interesting stuff of your lead
  • send marketing relevant information in newsletters

So, if email-addresses are great and we want to collect the email from our unknown leads - how can we do this? The answer is simple: We have to deal a bit with our visitors. Let them download an interesting asset (e.g. a whitepaper) but ask for their email address first. Another way would be to offer a callback-form where you offer to call the visitor - also ask for the email address here. Is there a form, where the visitor can get access to a software? You guessed it, ask for the email address.

A good percentual value would be an identification rate of 1% of all your visitors. So check the LUX dashboard and decide to make more deals if the value is too low.

See more technical details in documenation part ../Technical/Identification

Lead nurturing 

Think about the customer livecycle and try to develop your leads. There are a few possibilities of nurturing like storytelling (tell your visitors a story to let them understand the problems they have and the solution you are offering), contextual content (show only relevant content for the needs of your visitors) or open a lightbox with a special offer if the lead visits your product the second or third time.

Cold calling - tipps and tricks 

Understanding the diagrams 

When is the perfect time for a cold call? LUX will help you to show the relevant information you or yours sales need. In the following example you will see the scoring of a potential new customer. There are two visible peaks in the diagram. Every peak reflects a perfect time for a cold call because this is the time when the lead shows activity on your website and this means - he/she is interested in your company, your products or your service. The visible drop in the diagram reflects a time when the visitor is too busy or maybe not interested any more. So don't miss the perfect time.

The categoryscoring diagram shows you in which product the lead is interested in. So this will help you to offer your potential customer the right product.

Getting informed 

Via Email 

You can set up a lead summary mail (e.g. frequently every monday) with the last visitors and there companies. This means, you don't have to log in into TYPO3 and see the important information in your mail client (e.g. Outlook).

Via internal chat 

If you're using an internal tool like slack for your team-communication, you can set up an own workflow to get informed if there is an interesting lead on your website. Even if it is not identified it's possible to see relevant information like the companyname or the location.

LUX LUX

This part of the documentation gives you some information about privacy on websites in general.

Privacy documentation 

LUX respects the privacy protection of website visitors. Please follow our example.

First of all let your visitors know what kind of information you are collecting and why you are collection those information and where the information is stored (not on a third party companies server but on your server!). The best place for this explanation is the privacy site (Datenschutzerklärung). This will follow the rules of GDPR (General Data Protection Regulation) / DSGVO (Datenschutzgrundverordnung).

LUX LUX

User information 

Every visitor has the right to see every data that you've stored about him/her. In addition the right that all information must be removed.

Beside a Command to remove leads and all there data, there is a Remove completely button in the detail view of a lead. Both will result in a complete remove of all data of the lead.

Look at commands for more details to this topic.

LUX LUX

DoNotTrack Header 

Browsers support a (per default turned off) option to inform the website that the visitor don't wants to be tracked. This is the DoNotTrack or DNT setting. Even if this rare used feature of the browser is only a recommendation, LUX will respect this setting of course!

Note: While Firefox turns on the DNT by default for anonymous tabs, Chrome and Internet Explorer never turn this setting on by default.

LUX LUX

Introduction 

Whenever a lead visits your website, we want to track which pages have been seen or which document were downloaded. This makes it necessary to recognize the lead when leaving page a and entering page b or when the lead comes again on another day. To fulfill this requirement, there a basically two different possible technics available with LUX.

LUX LUX

IP addresses 

LUX recognizes visitor IP addreses and can use it for a transformation to a company by using a IP service API. In addition IP-addresses can be stored complete or anynomized. This small documentation shows you all configuration options related to IP-addresses in LUX.

Extension manager configuration 

  • Disable IP logging: You can turn off the basic storage of any IP address in your database here
  • Anonymize IP: Parts of the IP address are replaced with "***" before saving this value to your database

IP address services 

Via TypoScript you can configure if and which service interfaces are connected to convert a visitor IP address to a real company name.

Disabling this can be done via:

lib.lux.settings.ipinformation._enable = 1
Copied!

Configure which service should be used:

lib.lux.settings {
  # Layer to use own ip information service (convert IP address to visitor name)
  # More then one service can be registered. The first that deliver a result, will be used.
  ipinformation {
    # Main switch for using external IP services
    _enable = 1

    # Ip-API.com
    # detailed information (company information mostly better then other services)
    # with company details, geo coordinates, zip and region
    # but connection is limited to 45 requests/minute + to http only for free usage (see ip-api.com for premium access)
    1 {
      class = In2code\Lux\Domain\Factory\Ipinformation\IpApi
      configuration {
        url = http://ip-api.com/json/{ip}
      }
    }

    # iplist.cc
    # as a complete free provider service with https connection but information depth is worse then others
    # no company details, no geo coordinates, no zip and region
    2 {
      class = In2code\Lux\Domain\Factory\Ipinformation\Iplist
      configuration {
        url = https://iplist.cc/api/{ip}
      }
    }
  }
}
Copied!

Disabling Ip-API.com but keep iplist.cc could be done via:

lib.lux.settings.ipinformation.1 >
Copied!

Note: Take care that your lib.lux configuration is recognized by LUX (see FAQ section how to copy it to plugin.tx_lux_fe)

LUX LUX

Tracking Opt-Out and Opt-In 

Opt-In or Opt-Out functionality 

First of all you have to decide, if LUX should track by default (no extra Opt-In needed, but an Opt-Out for disabled tracking) or if your website visitor should allow the tracking (normally done in a cookie banner popup - so with Opt-In functionality).

Per default LUX tracks visitors without their explicit agreement and they have to Opt-Out if they don't want to be tracked any more (see some examples below how to Opt-Out). If you want to not automaticly track your visitors without their agreement, you can use the opt-in functionality of LUX.

In th first step, you have to disable the autoenable function via TypoScript constants:

plugin.tx_lux.settings.autoenable = 0
Copied!

Now, LUX will not track visits per default (you can double check if data-lux-autoenable="0" is set in your HTML source). In the next step, you can place an HTML-element anywhere on the page with data-lux-trackingoptin="true". A manual click on this element will allow the tracking (a local storage record luxTracking=true is set in the browser).

<span data-lux-trackingoptin="true">Opt-In for LUX analyses</span>
Copied!

This can also be disabled again with an element like:

<span data-lux-trackingoptin="false">Opt-Out for LUX analyses</span>
Copied!

As an alternative, you can directly access JavaScript functions to Opt-In or Opt-Out. This is helpful if you work with a cookie banner or a cookie lightbox like Usercentrics or a similar solution.

If you add the default JS before, what is normally automatically done via TypoScript setup in LUX (file EXT:lux/Resources/Public/JavaScript/Lux/Lux.min.js and if you have also installed LUXenterprise file EXT:luxenterprise/Resources/Public/JavaScript/Lux/LuxEnterprise.min.js), you can use this JavaScript:

# Opt-In
var Lux = LuxSingleton.getInstance();
Lux.optIn();

# Opt-Out
var Lux = LuxSingleton.getInstance();
Lux.optOut();

# Opt-Out and reload for a stop of all tracking mechanism at once
var Lux = LuxSingleton.getInstance();
Lux.optOutAndReload();
Copied!

Opt-Out Plugin 

As known from Matomo (former known as Piwik) also LUX offers a Plugin for an Opt-Out possibility for visitors. You can use it as a regulare editor.

DoNotTrack Header 

Browsers support a (per default turned off) option to inform the website that the visitor don't wants to be tracked. This is the DoNotTrack or DNT setting. Even if this rare used feature of the browser is only a recommendation, LUX will respect this setting of course!

Note: While Firefox turns on the DNT by default for anonymous tabs, Chrome and Internet Explorer never turn this setting on by default.

Note: Maybe you want to switch from fingerprint to local storage mode. See OptIn and OptOut

LUX LUX

Example part for your privacy page 

This could be an example for your German "Datenschutzerklärungsseite". This is not a legal binding declaration.

<h2>Verwendung des Marketing-Automation-Tools LUX</h2>

Diese Website benutzt das Marketing-Automation-Tool LUX.
Einige benutzerdefinierte Einstellungen, die keinen Rückschluss auf den Besucher zulassen, werden in den Bereich
"Localstorage" des Browsers zwischengespeichert und werden benötigt, um eine vollständige Funktionsweise zu garantieren.

LUX versucht Ihre erneuten Websitebesuche durch Ihr Verhalten und die von Ihnen benutzte Hardware wiederzuerkennen,
um Ihnen nach Ihren Vorlieben entsprechende Inhalte anbieten zu können und die Bedienbarkeit der Website zu
vereinfachen. Es wird lediglich ein anonymisierter Hash übertragen, aus dem keinerlei Rückschlüsse auf Ihren Computer,
Ihr Smartphone oder ähnliches zu schließen sind. Dieser Hash wird nicht weitergegeben und dient lediglich der Erkennung.

Gespeicherten Informationen jeglicher Art werden generell niemals an Dritte weitergegeben.
Sie können eine Wiedererkennung und das Ausspielen individueller Inhalte unterbinden, indem Sie beispielsweise
den "DoNotTrack" Header Ihres Browsers aktivieren. Wir weisen Sie jedoch darauf hin, dass Sie in diesem Fall
gegebenenfalls nicht sämtliche Funktionen dieser Website vollumfänglich werden nutzen können.

Wenn Sie mit der Speicherung und Nutzung Ihrer Daten nicht einverstanden sind, können Sie die Speicherung und Nutzung
hier deaktivieren. In diesem Fall wird in Ihrem Browser eine Opt-Out-Einstellung hinterlegt, die verhindert, dass LUX
Nutzungsdaten speichert.
Copied!

We would recommend to place an Opt-Out Plugin also nerby this explanation (see Plugins).

LUX LUX

Technical documenation 

This documentation is the interesting part for administrators and developers and should explain how lux can be installed, configured and how does it work. In addition we want to give you some hints how to extend lux with your own workflow triggers or workflow actions.

Introduction 

Lux is build to use asynchronical techniques and without the need of any USER_INT function to also use lux together with staticfilecache extension for high performance on your TYPO3 websites.

There is no need to use a JS framework like jQuery - Lux just uses vanilla JS - also for the lightbox implementation.

But TYPO3 should run in composer mode to allow the loading of additional packages (see Installation for more details).

Tracking and doing workflow stuff in frontend needs JavaScript to be enabled in the visitors browser. Some functions are disabled if the visitor is also logged in into backend at the same time (to avoid misleading data). It's possible for visitors to opt out (with the opt-out plugin) or to use the do not track settings in their browser. Lux will respect this settings in every case.

Every visitor has an individual fingerprint, based on his hard- and software. This anonymous hash is used to recognize the visitor in future visits. This hash will be used for tracking and identification.

There are some functional settings - saved to localstorage in browser which are:

  • luxDisableEmail4Link to disable email4link popups if a visitor is already identified
  • luxTracking for a tracking opt out or opt in

See more information in the chapters:

Installation 

Editor configuration 

Analysis 

Identification 

Scoring and Categoryscoring 

Leads 

Marketing campaigns 

Plugins and Pageoverview 

AI chatbot 

Finisher 

Commands & Scheduler Tasks 

API 

Events (PSR-14) 

FAQ 

LUX LUX

AI integration into LUX (with LUXenterprise) 

NOTE: This chatbot is only part of the enterprise version

Since LUXenterprise 46.0.0 we introduced an AI chatbot that helps you to create marketing campaigns and to improve page content in your TYPO3

We currently use the latest Mistral LLM. Mistral is located in France (EU) to meet all GDPR requirements.

Configuration 

First of all, you should get a Mistral API key. To get one, please visit https://mistral.ai/ and follow the process by clicking on "Try the API".

Once you have an API key, you could use an ENV variable MISTRAL_API_KEY.

Suggested ENV variable in a .env file:

MISTRAL_API_KEY=ExampleKey49tqy0Hs2qCs3xIl4js0y
Copied!

Alternatively, the extension configuration can be used to store an API key, if you don't want to use an ENV variable.

First steps 

The chatbot is visible in all LUX backend modules at the right bottom. By clicking on the LUX-Symbol the chat window will be visible. Now you can use it as you would use any chatbot like chatGPT. Try a first conversion by starting with a "Hello". If everything works as expected, the LLM should give you an answer.

documentation_screenshot_ai_chatbot.png

Example questions 

Because our prompt configures the LLM to a Marketing Automation expert with LUX, you can ask any marketing related questions like "How can marketing automation help to collect leads on my website?"

Default prompt:

You are an expert in marketing automation and the TYPO3 LUX extension.
You help users analyze their lead data and provide practical advice on marketing automation.
If you need data, use the available tools.
Copied!

Beside generally questions, you can also ask some LUX data related questions like:

  • "What are the 3 top leads?"
  • "Show me the 5 best visited pages"
  • "Show me 3 new leads"
  • "Fetch a list of pages without traffic of the last 3 months"
  • "Get pages with bounces"
  • "Who is currently online?"

documentation_screenshot_ai_topleads.png

Interaction buttons and screenshot feature 

Interaction buttons 

At the header there are 4 interaction buttons

  • Screenshot feature (see below)
  • Collapse window
  • Clear history
  • Close window

documentation_screenshot_ai_buttons.png

Screenshot feature 

The functions and data from LUX can quickly overwhelm and overwhelm an editor. This is where the chatbot's screenshot feature comes in. Clicking the first icon in the header bar creates a screenshot of the currently visible browser content and sends it to the LLM. The LLM then analyzes the data, explains it, and provides examples of how to tailor website content to target audiences, as well as other helpful marketing tips and tricks.

documentation_screenshot_ai_screenshot.png

FAQ 

Error: No connection to LLM (please check, if API-Key is defined and your network connection) 

Please check if you defined a Mistral API key. If this don't help, check if the server can establish a connection to URL api.mistral.ai. If not, maybe the firewall must be adjusted.

What is a tool? 

Tools are very helpful to offer data of your LUX database to the LLM. There are already some tools that enable data related questions like "How many leads are in the system?"

Upcoming features 

  • Following context: At the moment you cannot use the last question/answer for your next question.
  • Adjustable prompts: We want you to be able to extend the default prompt with individual site information.
  • Adjustable tools: Tools should be extended easily with own questions
  • Showing diagrams: We want that the chatbot is even more helpful by showing you helpful graphics.

LUX LUX

Tracking and Analysis 

This part of the documentation describes all configuration parts related to analysis and tracking of visitors and will be automaticly loaded if you choose the main LUX static template in the root template.

TypoScript Configuration 

The file ../../../Configuration/TypoScript/Lux/01_TrackingConfiguration.typoscript contains all relevant settings for the visitor tracking.

LUX basicly tracks every vistors page request with the current time. In addition, it's possible to also track asset downloads.

See the inline comments for a description in TypoScript:

lib.lux.settings {

    # All tracking settings
    tracking {
        pagevisits {
            # Toggle pagevisit tracking (on/off).
            # Switching this feature on will flood table tx_lux_domain_model_pagevisit but allow you to see a full pagefunnel of all of your visitors. Your decision :)
            _enable = {$plugin.tx_lux.settings.tracking.page}

            # Try to find a fe_user record when an email is given in visitor and build a relation to it
            autoconnectToFeUsers = 1
        }
        assetDownloads {
            # Toogle asset download tracking (on/off)
            _enable = {$plugin.tx_lux.settings.tracking.assetDownloads}

            # Allow only files with this extensions
            allowedFileExtensions = {$plugin.tx_lux.settings.tracking.assetDownloads.allowedExtensions}
        }
        search {
            # Toggle tracking of searchterms (on/off)
            _enable = {$plugin.tx_lux.settings.tracking.search.getParameters}

            # Define where the searchterm is given (e.g. "tx_solr[q]")
            getParameters = tx_solr[q],tx_indexedsearch[sword]
        }
    }
}
Copied!

Note: Take care that your lib.lux configuration is recognized by LUX (see FAQ section how to copy it to plugin.tx_lux_fe)

Constants to this TypoScript part:

plugin.tx_lux.settings {
    # cat=lux//0010; type=boolean; label= Activate page tracking: (De)Activate tracking of the users pagefunnel.
    tracking.page = 1

    # cat=lux//0020; type=boolean; label= Activate download tracking: (De)Activate tracking if the user downloads an asset.
    tracking.assetDownloads = 1

    # cat=lux//0020; type=text; label= Activate download tracking: (De)Activate tracking if the user downloads an asset.
    tracking.assetDownloads.allowedExtensions = pdf,txt,doc,docx,xls,xlsx,ppt,pptx,jpg,png,zip

    # cat=lux//0050; type=boolean; label= Activate searchterm tracking: (De)Activate tracking searchterms if user searched for someone on your website.
    tracking.search = 1
}
Copied!

Example page tracking request in browser console:

Backend Module Analysis 

Dashboard 

Now, if LUX is up and running, you should see information in the Analysis Backend Module in the dashboard view:

The dashboard view should give you a quick overview about the latest activities and some useful information:

  • How many recurring/unique leads
  • The latest page visits
  • The latest activities
  • Identified leads vs. unknown leads
  • Identifaction rate of the latest months
  • Hottest leads (orderings by scoring)
  • A world map for a basic visitor analysis
  • A basic statistics about the records that are stored in LUX

Clicking on a name/email/"anonymous" will open a detail page with some more information of the lead.

Note: You can filter the dashboard view to leads from this or from previous month or from this year with the filter select at the top

With a bit of TypoScript configuration it's possible to decide which activity status should be shown in activity log in dashboard view:

lib.lux.settings {
    backendview {
        analysis {
            activity {
                # Greater then 0 means to also have "LUX identified a new lead", greater 1 means to not have this kind of messages
                statusGreaterThen = 1
            }
        }
    }
}
Copied!

Note: Take care that your lib.lux configuration is recognized by LUX (see FAQ section how to copy it to plugin.tx_lux_fe)

Pagevisits and Downloads 

If you choose the content view (see top left to switch from dashboard to content), you will see the 100 most interesting pages and assets for your leads.

Clicking on an asset or a page will open a detail page to this item, where you can exactly see which lead was interested in this item.

Technical note: Page visits will be automatically be tracked with LUX on normal TYPO3 pages. In some rare scenarios you may want to push an interaction (event) to LUX. This can be helpful if you want to track accordion opens, multistep forms or other content changes without page reload and without a different URL. You can push such a visit via JavaScript:

const lux = LuxSingleton.getInstance();
lux.push('applicationProcess/step1', 'eventTrackRequest');
Copied!

News 

If you have installed the great news extension (georgringer/news), then you can also choose this view. You will see the 100 most interesting news to your leads.

Clicking on a news will open a detail page to this item, where you can exactly see which lead was interested in this item.

Urchin Tracking Modules (UTM) 

With the help of UTM parameters, you can track the performance of your online marketing campaigns. As soon as there is any tracking parameter available, LUX will save those parameters to a lead.

In addition to UTM parameters, you can now also use MTM parameters (compatible to Matomo) if this fits your needs more. Available parameters:

Title UTM key MTM key Description
Campaign &utm_campaign= &mtm_campaign= Name of your campaign
Campaign ID &utm_id= &mtm_cid= ID of your campaign (similar to utm_campaign - e.g. "campaign2023a")
Source &utm_source= &mtm_source= Source of this visit (e.g. "email", "google", "facebook", "linkedin", etc...)
Medium &utm_medium= &mtm_medium= The medium that led to the visit (e.g. "mail", "browser", "iphone app", "qr code", etc...)
Term &utm_term= &mtm_kwd= Optional: e.g. a search term for google ads
Content &utm_content= &mtm_content= Optional: e.g. the name of the google ad that was delivered

If there are parameters saved in your LUX, you can analyse the leads to them in this module. All diagrams are reacting to your filter settings. Of course, you can also use the CSV download if you want to.

Clicking on a lead will open a detail page to this lead.

TYPO3 Dashboard Module 

In addition to the build in dashboard, since TYPO3 10 it is possible to install another dashboard for system-wide diagrams in TYPO3. You could do this simply with composer require typo3/cms-dashboard. Once it is available, you can add some widgets from LUX.

This is a screenshot from default values:

Available widgets:

Title Type Size Description
Page visits bar chart medium Top page visits of the current year
Downloads bar chart medium Top downloads of the current year
News vists bar chart medium Top news visits of the current year
Searchterms bar chart medium Top search terms of the current year
Identified bar chart small Identified vs. anonymous leads
Identified by month bar chart medium Identified leads grouped by month
Recurring visitors doughnut chart small Recurring vs. unique visitors
Page visits week bar chart medium Page visits of the current week
Downloads week bar chart medium Downloads of the current week
Referrers bar chart medium Show external referrer domains
Browsers doughnut chart small Show visitor browsers
Hottest leads list view small Show hottest visitors
UTM campaign bar view medium Show best UTM campaigns
UTM sources doughnut chart small Show best UTM sources
UTM media doughnut chart small Show best UTM media

LUX LUX

API and Interface from LUX (only in luxenterprise) 

Since LUXenterprise 19.0.0 we introduced a proper interface with reading access as you may know from other REST APIs.

Configuration 

First of all you have to check the extension manager configuration of LUXenterprise, to turn on the API and to add an Api-Key and to define which IP-addresses are allowed to read from the API (optional)

Title Default value Description
api 0 Enable or disable the API of LUX
apiKey - You have to enter a random value that will be used then as API-KEY for authentication. Note: Minimum 128 characters are needed!
apiKeyIpAllowList - Define one or more IPs or ranges (optional) for allowing to read the API (e.g. 192.0.0.1,192.168.0.0/24,fc00::,2001:db8::567:89ab)

Note: Take care to add the typenum 1650897821 to your siteconfiguration (see FAQ for more details). In our example luxenterprise_api.json will be recognized from TYPO3 routing (see CURL examples below).

Endpoints 

The API works as most interfaces by selecting an endpoint and passing arguments as JSON. The result is also always a JSON output.

Available endpoints are:

FindByProperty to get a single lead 

FindAllByAnyProperties to get a list of leads 

LUX LUX

Endpoint "create" to write new or update existing leads into database (writing access) 

Note: This endpoint was introduced with LUXenterprise 38.0.0 and is not available before this version

The endpoint create can be used to add new visitor objects to LUX.

Note: If you pass an email address and there is already a visitor with same mail existing, both visitor objects are going to be merged to keep history by default

1. Usage 

A new lead with two attributes is created from API with one pagevisit and with a fingerprint record can be added via API with these arguments:

{
  "endpoint": "create",
  "properties": {
    "visitor": {
      "email": "new@email.org",
      "ipAddress": "127.0.0.1",
      "identified": "1",
      "scoring": "10",
      "visits": "1",
      "attributes": {
        "0": {
          "name": "firstname",
          "value": "Alex"
        },
        "1": {
          "name": "lastname",
          "value": "Kellner"
        }
      },
      "pagevisits": {
        "0": {
          "page": "12",
          "language": "0",
          "referrer": "https://lastdomain.org/page"
        }
      },
      "fingerprints": {
        "0": {
          "value": "abcdef123456789foobar",
          "domain": "mydomain.org",
          "userAgent": "Mozilla/5.0"
        }
      }
    }
  }
}
Copied!

CURL example:

curl -k -d 'tx_luxenterprise_api[arguments]={"endpoint":"create","properties":{"visitor":{"email":"new@email.org","ipAddress":"127.0.0.1","identified":"1","scoring":"10","visits":"1","attributes":{"0":{"name":"firstname","value":"Alex"},"1":{"name":"lastname","value":"Kellner"}},"pagevisits":{"0":{"page":"12","language":"0","referrer":"https://lastdomain.org/page"}},"fingerprints":{"0":{"value":"abcdef123456789foobar","domain":"mydomain.org","userAgent":"Mozilla/5.0"}}}}}' -H 'Api-Key: abc...' --url https://www.in2code.de/luxenterprise_api.json
Copied!

2. Merge by Fingerprint 

If you want to update an existing lead by its fingerprint, this example will help you out. In the following case we want to add the attribute "newsletter" with value 1 for a possible newsletter registration.

{
  "endpoint": "create",
  "merge": {
    "mergeByEmail": 0,
    "mergeByFingerprint": 1
  },
  "properties": {
    "visitor": {
      "attributes": {
        "0": {
          "name": "newsletter",
          "value": "1"
        }
      },
      "fingerprints": {
        "0": {
          "value": "abcdef123456789foobar"
        }
      }
    }
  }
}
Copied!

CURL example:

curl -k -d 'tx_luxenterprise_api[arguments]={"endpoint":"create","merge":{"mergeByEmail":0,"mergeByFingerprint":1},"properties":{"visitor":{"attributes":{"0":{"name":"newsletter","value":"1"}},"fingerprints":{"0":{"value":"abcdef123456789foobar"}}}}}' -H 'Api-Key: abc...' --url https://www.in2code.de/luxenterprise_api.json
Copied!

Note: If you want to get the fingerprint value of the current visitor via JavaScript, following example could help:

const lux = LuxSingleton.getInstance();
if (lux.getIdentification().isIdentificatorSet()) {
    const identificator = lux.getIdentification().getIdentificator();
    console.log(identificator);
}
Copied!

LUX LUX

Endpoint "findAllByAnyProperties" for getting a list of visitors (reading access) 

The endpoint findAllByAnyProperties can be used to search for all leads by given search terms. You can pass multiple arguments (also in related tables), limit and orderings.

Default arguments 

These arguments are used by default if not overwritten in your request:

'endpoint' => 'findAllByAnyProperties',
'properties' => [
    [
        'name' => 'uid',
        'value' => 0,
        'operator' => 'greaterThan'
    ]
],
'limit' => 100,
'depth' => 3,
'orderings' => [
    'uid' => 'DESC'
],
'defaultProperties' => [
    'uid',
    'scoring',
    'email',
    'email',
    'identified',
    'visits',
    'blacklisted',
    'attributes',
]
Copied!

Example usage 

In the example below, a search is triggered where tx_lux_domain_model_visitor.email like %in2code.de with these arguments:

{
  "endpoint": "findAllByAnyProperties",
  "properties": {
    "0": {
      "name": "email",
      "value": "%in2code.de",
      "operator": "like"
    }
  },
  "limit": 2,
  "depth": 2
}
Copied!

CURL example:

curl -d 'tx_luxenterprise_api[arguments]={"endpoint":"findAllByAnyProperties","properties":{"0":{"name":"email","value":"%in2code.de","operator":"like"}},"limit":2,"depth":2}' -H 'Api-Key: abc...' --url https://www.in2code.de/luxenterprise_api.json
Copied!

Example result:

{
  "arguments": {
    "endpoint": "findAllByAnyProperties",
    "properties": [
      {
        "name": "email",
        "value": "%in2code.de",
        "operator": "like"
      }
    ],
    "limit": 2,
    "depth": 2,
    "orderings": {
      "uid": "DESC"
    },
    "defaultProperties": [
      "uid",
      "scoring",
      "email",
      "email",
      "identified",
      "visits",
      "blacklisted",
      "attributes"
    ]
  },
  "data": [
    {
      "scoring": 647,
      "email": "alex@in2code.de",
      "identified": true,
      "visits": 13,
      "attributes": [
        [],
        []
      ],
      "blacklisted": false,
      "uid": 18855
    },
    {
      "scoring": 393,
      "email": "alexander.kellner@in2code.de",
      "identified": true,
      "visits": 10,
      "attributes": [
        [],
        []
      ],
      "blacklisted": false,
      "uid": 18802
    }
  ]
}
Copied!

You can also search in related tables: where tx_lux_domain_model_attribute.name = "email" and tx_lux_domain_model_attribute.value = "%in2code.de" with these arguments:

{
  "endpoint": "findAllByAnyProperties",
  "properties": {
    "0": {
      "name": "attributes.name",
      "value": "email",
      "operator": "equals"
    },
    "1": {
      "name": "attributes.value",
      "value": "%in2code.de",
      "operator": "like"
    }
  },
  "limit": 200,
  "depth": 2,
  "orderings": {
    "uid": "ASC"
  }
}
Copied!

Note: The attribute email es stored directly in visitor table but also in attribute table. A more useful query would be to search for property newsletter or lastname, etc...

Another example to search for property newsletter=1 within active users of the latest 7 days (in this documentation let's assume the unix timestamp 1650386396 is 7 days ago):

{
  "endpoint": "findAllByAnyProperties",
  "properties": {
    "0": {
      "name": "attributes.name",
      "value": "newsletter",
      "operator": "equals"
    },
    "1": {
      "name": "attributes.value",
      "value": "1",
      "operator": "equals"
    },
    "2": {
      "name": "pagevisits.crdate",
      "value": "1650386396",
      "operator": "greaterThan"
    }
  },
  "limit": 200,
  "depth": 2,
  "orderings": {
    "pagevisits.crdate": "DESC"
  }
}
Copied!

LUX LUX

Endpoint "findByProperty" for getting a single visitor (reading access) 

The endpoint findByProperty can be used to search for a single lead.

Default arguments 

These arguments are used by default if not overwritten in your request:

'endpoint' => 'findByProperty',
'propertyName' => 'uid',
'depth' => 3,
'defaultProperties' => [
    'uid',
    'scoring',
    'email',
    'email',
    'identified',
    'visits',
    'blacklisted',
    'attributes',
    'pagevisits',
    'newsvisits',
    'linkclicks',
    'categoryscorings',
    'downloads',
]
Copied!

Example usage 

In the example below, a search is triggered where tx_lux_domain_model_visitor.uid = 123 with these arguments:

{
  "endpoint": "findByProperty",
  "propertyValue": "123"
}
Copied!

CURL example:

curl -d 'tx_luxenterprise_api[arguments]={"endpoint":"findByProperty","propertyValue":"123"}' -H 'Api-Key: abc...' --url https://www.in2code.de/luxenterprise_api.json
Copied!

Example answer:

{
  "arguments": {
    "endpoint": "findByProperty",
    "propertyName": "email",
    "depth": 3,
    "defaultProperties": [
      "uid",
      "scoring",
      "email",
      "email",
      "identified",
      "visits",
      "blacklisted",
      "attributes",
      "pagevisits",
      "newsvisits",
      "linkclicks",
      "categoryscorings",
      "downloads"
    ],
    "propertyValue": "sandra.pohl@in2code.de"
  },
  "data": {
    "scoring": 102,
    "email": "sandra.pohl@in2code.de",
    "identified": true,
    "visits": 5,
    "pagevisits": [
      {
        "page": null,
        "language": 0,
        "crdate": "2019-07-25T12:46:52+02:00",
        "referrer": "",
        "domain": "",
        "uid": 49433,
        "pid": 0
      },
    ],
    "attributes": [
      {
        "name": "email",
        "value": "sandra.pohl@in2code.de",
        "uid": 543,
        "pid": 0
      }
    ],
    "downloads": [
      {
        "crdate": "2019-07-25T12:47:01+02:00",
        "href": "/fileadmin/content/downloads/whitepaper/DisasterRecovery.pdf",
        "page": null,
        "file": null,
        "domain": "",
        "uid": 549,
        "pid": 0
      },
      {
        "crdate": "2019-07-25T18:30:08+02:00",
        "href": "/fileadmin/content/downloads/whitepaper/IhrePerfekteInfrastruktur.pdf",
        "page": null,
        "file": null,
        "domain": "",
        "uid": 554,
        "pid": 0
      },
    ],
    "blacklisted": false,
    "uid": 13890
  }
}
Copied!

You can also change the property field. E.g. if you want to search for an email:

{
  "endpoint": "findByProperty",
  "propertyName": "email",
  "propertyValue": "sandra.pohl@in2code.de"
}
Copied!

LUX LUX

A/B testing 

This part of the manual describes how to use A/B testing in TYPO3.

Functionality 

This feature is based on page-wide A/B testing. This means that you have to add additional pages to a current existing page and configure that page A or B (the new one) should be delivered randomly.

So first of all choose a page that you want to test (this is A). Copy this page, hide it in Navigation and change only a few things on this page (this is B).

Tipp: For a meaningful test result you should consider not to change too much elements between two pages. If you want to learn if a green or a blue button is clicked more often, don't change anything else then the color of this specific button.

Configuration 

If you open page settings in page A for editing properties as an editor, you will see a new tab called "Marketing". In this tab you can check A/B testing enabled for this page to enable A/B tests.

After that you will see some more fields. Add a title, a description and two page records. Page record 1 with title A and select the current page, that you are editing. Add a title to page record 2 and also select page B. Read for your first test.

Field Description
A/B testing enabled for this page A/B testing for this page is turned on in general
Title Name this test like "Button test"
Description Add a description like "Test if button in blue is better then in green"
Start Optional: Choose a date if this test should start in the future
End Optional: Set an enddate if you want that this test stop automatically at a specific date
Conversion method Select which visitor action leads to a conversion (Click on defined HTML element will open another field)
Select a (or more) HTML element(s) on the page Select one ore more HTML elements like .class or #id or [data-foo="bar"]
Add some pages to test You need to add 2 up to 12 pages records here
Page/Title Add a name for this page - like "Page A"
Page/Page Select a page from the pagetree
Page/Limit If you want to limit the number of views of this test in frontend, you can add a limit here
Page/Incidence of this testing page If all testing pages are set to 100, all are delivered with the same probability (as long as starttime and endtime doesn't exclude the rendering). You can reduce the probability of single pages if you don't want to deliver them that ofen
Page/Starttime (optional) If this page should be shown in future only, select a date
Page/Endtime (optional) If delivering this page should be stopped automatically at a specific date, select a date
Results 

Once you have activated A/B tests in page properties, you will see a result in pageoverview:

Backend module 

In the backend module you will see all active A/B tests with a short overview about their performance. Buttons allows you to change to edit view of a page or to pageoverview module with that page.

Technical notes 
Enforce a variant 

You can simply add a new (or rename an existing) cookie with name LUXABTEST and set the value to A or B etc.

LUXABTEST=B

Backend User Sections or Frontend Authentication 

We already support also A/B Testing in "Backend User Sections" or on pages with "Frontend Authentication". If you want to use a Testing within such an area, the server itself will read the A or B target with a CURL-request. If session cookies for frontend or backend login is given, it will be passed in those requests.

Nevertheless the IP address of the user may be different to the server and this is checked from TYPO3 by default. You can disable this check if you need it:

# For calling pages of type "Backend User Sections"
$GLOBALS['TYPO3_CONF_VARS']['BE']['lockIP'] = 0;
$GLOBALS['TYPO3_CONF_VARS']['BE']['lockIPv6'] = 0;

# For calling pages of with a frontend authentication
$GLOBALS['TYPO3_CONF_VARS']['FE']['lockIP'] = 0;
$GLOBALS['TYPO3_CONF_VARS']['FE']['lockIPv6'] = 0;
Copied!

LUX LUX

URL shorteners 

This part of the manual describes how to manage URL shortener with lux.

URL shorteners help you to build individual short URL on your domain for your marketing campaigns. You can track visits of short URL usage per lead.

List view 

If you open the backend module campaigns you can switch to "URL shortener" by clicking the button on the top. A list view is shown.

This view works basicly like every other view in Lux. You can filter your shorteners per searchterm, category or per timeframe. Diagrams are showing you "overall usage", "top shortener" and visits from "socialmedia".

A click on an existing shortener will show you individual information about the leads that used this shortener.

Detail view 

If you click on the edit icon symbol, the edit view is opened. This view is similar to the view if you add a new shortener record.

Field Description
Enabled Toggle the status of this redirect.
From Contains your short url (without a domain). This code must be unique in your system.
To Select the internal or external target for the redirect
Lux category Choose a category for better management of your shorteners
Description You can add an internal description for what campaign this shortener is
QR code If you need a QR code for your marketing campaign, you can download this PNG
Creation date Note when was this record created
Author Note to see who was creating this record

LUX LUX

UTM generator 

UTM stands for Urchin Tracking Modules and is helpful to measure the performance of your online campaigns. This can be done with "UTM" GET parameters that are added to a target URL.

General used UTM parameters in marketing automation and analysis:

Parameter Description Example value
utm_campaign Name of the campaign Campaign 2023/2
utm_id Identifier of the campaign c23-3
utm_source Source newsletter
utm_medium Technical medium mail
utm_term Optional: Searchterm (mostly used in ads) productname
utm_content Optional: Description of the ad add1

Note: LUX tracks all of those GET parameters automatically and can be analysed in Analyse backend module. This means that you don't have to use the build in UTM generator or to add all possible options to your system. Tracking starts as soon as ANY UTM parameter is given to a page request.

So, if you want to boost a landing page or a product page, you have to create a lot of URIs with those parameters. We want to make marketeers life easier by creating an URI UTM generator tool, that can be used to create URIs for your campaigns.

List view 

If you open the backend module campaigns you can switch to "UTM Generator" by clicking the button on the top. Another list view is shown.

This view works basicly like every other list view in Lux. You can filter your URI records by adding a searchterm. Every table row shows the campaign name and the first available URI. By clicking on the plus symbol, all available URIS are shown.

Edit view 

If you click on the edit icon symbol or if you add a new record, the edit view is opened. This view is similar to the view if you add a new shortener record.

Note: You have to add records of type Campaign (UTM), Source (UTM) and Medium (UTM) first with the list view module of TYPO3 to any folder page. Those records can be then selected in the edit view.

Field Description
Link target Choose an internal page or external URL
Campaign Choose an existing campaign record
Description Add an internal description
Sources Choose one or more existing source records
Media Choose one or more existing medium records
Terms Add one or more terms (one per line)
Contents Add one or more content terms (one per line)

LUX LUX

Workflows 

This part of the manual describes how to manage workflows in lux backend module.

A workflow is a technique to nurture your leads. Let's say a lead that reaches a category scoring of 25 in a category Product A should see a special offer in a popup (lightbox)? Or maybe you want to redirect a lead to a different page if he/she visits the page the second time? Lux will help you to build your own and individual workflows.

List view 

If you open the backend module workflows and you have not added any workflows yet, the only interaction possibility for you is to add a new workflow. If you have already added one or more workflows, you will see a list of your existing workflows.

Existing workflows can be deleted or edited by clicking the buttons. If you edit an existing workflow or if you add a new workflow, you will see a form that is splitted into three different steps.

1 Title 

Define a title and an internal description for your new workflow:

After that you can choose next for step 2.

2 Trigger 

A trigger is a condition for a possible event or action. You can choose one or more triggers (and combine them logical with AND or OR or negotiate it) that should result in an action (see 3 Action).

Choose a trigger and click on the + button. Now a new trigger configuration was added. Depending on the trigger that you have chosen, it's possible to add values to the trigger itself. In this example, we choose the If a lead gets identified trigger - no values to add here:

Possible triggers by default are:

  • Lead properties: If a lead gets identified
  • Lead properties: When lead reaches a scoring
  • Lead properties: When lead reaches a categoryscoring
  • Lead properties: If lead is using a mobile device
  • Lead properties: If lead company is given
  • Lead properties: If any property value of a lead is given
  • Lead properties: Use your own expressions for doing even mor individual stuff (with Symfony Expression Language)
  • Lead properties: For a specific company branch (with WiredMinds integration)
  • Lead properties: For a specific company revenue (with WiredMinds integration)
  • Lead properties: For a specific company size (with WiredMinds integration)
  • Lead action: On entering a page
  • Lead action: On reading a news
  • Lead action: When lead enters a page or downloads an asset of a given category
  • Lead action: When lead enters a page in a given language
  • Lead action: When lead enters a page of a given site
  • Lead action: On any lead interaction (even tracking)
  • Lead action: When lead searches for a specific searchterm
  • Lead source: Check for a given referrer
  • Lead source: Check for a given UTM parameter
  • Lead source: Check for lead country
  • Lead source: Check for distance to a location
  • Miscellaneous: On a defined time
  • Miscellaneous: Limit to a start action (page visit, download, form submit, etc...)
  • Miscellaneous: TYPO3 context

After that you can choose next for step 3 or previous for step 1 again.

3 Action 

An action is when lux executes a workflow on given conditions (triggers). You can choose one or more actions. If you choose more actions, all actions will be executed.

Choose an action and click on the + button. Now a new action configuration was added. Depending on the action that you have chosen, it's possible to add values to the action itself. In this example, we choose the Notification: Sends an email action.

On the left there are specific settings for the chosen action. In this case you can configure a sender name and email, a receiver email (can also be the email of the lead), a subject and the bodytext for the mail. Of course you can use some variables in the bodytext. On the right there are general options. You can select of this action should only be executed once per lead or more often. Some actions are supporting also a delayed execution where you can specify a day and a time.

Possible actions by default are:

  • Content manipulation: Open a popup (lightbox) with a content element
  • Content manipulation: Load a content element and show it on the current page
  • Content manipulation: Hide or show an element of the current page
  • Content manipulation: Redirect visitor to another page
  • Content manipulation: Change page title
  • Content manipulation: Show lead property on current page
  • Notification: Sends an email
  • Notification: Publish a message to a slack channel
  • Notification: Send an SMS to a mobile number
  • Notification: Show a push message
  • Lead management: Sets a value for a visitor
  • Lead management: Sets a value after a double opt in confirmation for a visitor
  • Lead management: Add a visitor to a blacklist
  • Data handling: Save values to any table in database
  • Data handling: Send lead information to any interface (e.g. a CRM)

After that you can choose save or previous for step 2 again.

TypoScript Configuration 

There is a default TypoScript configuration that will be added if you add the Lux Static Template to your root template. Depending on the triggers and actions that you're using, you can enrich some of them with configuration in TypoScript. If you want to publish to a slack channel, a webhook URL is needed e.g.

Triggers:

lib.lux.settings {

  # All workflow settings
  workflow {

    ############################
    # Define individual triggers
    ############################
    triggers {

      # 100-399 LEAD PROPERTIES
      # If lead gets identified
      100 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:trigger.identified

        # Classname for implementation of the trigger itself
        className = In2code\Luxenterprise\Domain\Workflow\Trigger\IdentifiedTrigger

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Trigger/Identified.html

        # Additional configuration
        configuration {
          # Any configuration - available as array in Template File and Trigger class for some own magic
        }
      }

      # If lead reaches a scoring
      110 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:trigger.scoring

        # Classname for implementation of the trigger itself
        className = In2code\Luxenterprise\Domain\Workflow\Trigger\ScoringTrigger

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Trigger/Scoring.html

        # Additional configuration
        configuration {
          # Any configuration - available as array in Template File and Trigger class for some own magic
        }
      }

      # If lead reaches a categoryscoring
      120 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:trigger.categoryscoring

        # Classname for implementation of the trigger itself
        className = In2code\Luxenterprise\Domain\Workflow\Trigger\CategoryScoringTrigger

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Trigger/CategoryScoring.html

        # Additional configuration
        configuration {
          # Any configuration - available as array in Template File and Trigger class for some own magic
        }
      }

      # If lead is using a mobile device
      130 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:trigger.mobile

        # Classname for implementation of the trigger itself
        className = In2code\Luxenterprise\Domain\Workflow\Trigger\MobileTrigger

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Trigger/Mobile.html

        # Additional configuration
        configuration {
          # Any configuration - available as array in Template File and Trigger class for some own magic
        }
      }

      # If company of a lead is known (e.g. from IP-Information)
      140 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:trigger.company

        # Classname for implementation of the trigger itself
        className = In2code\Luxenterprise\Domain\Workflow\Trigger\CompanyTrigger

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Trigger/Company.html

        # Additional configuration
        configuration {
          # Any configuration - available as array in Template File and Trigger class for some own magic
        }
      }

      # If property of a lead matches with a given string
      150 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:trigger.property

        # Classname for implementation of the trigger itself
        className = In2code\Luxenterprise\Domain\Workflow\Trigger\PropertyTrigger

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Trigger/Property.html

        # Additional configuration
        configuration {
          # Any configuration - available as array in Template File and Trigger class for some own magic
        }
      }

      # Symfony Expression Trigger for doing individual magic stuff with lead properties (compare with GET params, check if visitor country is in a list, etc...)
      160 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:trigger.symfonyExpression

        # Classname for implementation of the trigger itself
        className = In2code\Luxenterprise\Domain\Workflow\Trigger\SymfonyExpressionTrigger

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Trigger/SymfonyExpression.html

        # Additional configuration
        configuration {
          # Any configuration - available as array in Template File and Trigger class for some own magic
        }
      }

      # Wiredminds Company: On branch
      170 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:trigger.company_branch

        # Classname for implementation of the trigger itself
        className = In2code\Luxenterprise\Domain\Workflow\Trigger\CompanyBranchTrigger

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Trigger/CompanyBranch.html

        # Additional configuration
        configuration {
          condition {
            typoscript = tracking.company._enable=1
          }
        }
      }

      # Wiredminds Company: On revenue
      180 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:trigger.company_revenue

        # Classname for implementation of the trigger itself
        className = In2code\Luxenterprise\Domain\Workflow\Trigger\CompanyRevenueTrigger

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Trigger/CompanyRevenue.html

        # Additional configuration
        configuration {
          condition {
            typoscript = tracking.company._enable=1
          }
        }
      }

      # Wiredminds Company: On size
      190 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:trigger.company_size

        # Classname for implementation of the trigger itself
        className = In2code\Luxenterprise\Domain\Workflow\Trigger\CompanySizeTrigger

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Trigger/CompanySize.html

        # Additional configuration
        configuration {
          condition {
            typoscript = tracking.company._enable=1
          }
        }
      }


      # 400-699 LEAD ACTION
      # If lead visits a defined page
      400 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:trigger.pagevisit

        # Classname for implementation of the trigger itself
        className = In2code\Luxenterprise\Domain\Workflow\Trigger\PageVisitTrigger

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Trigger/PageVisit.html

        # Additional configuration
        configuration {
          # Any configuration - available as array in Template File and Trigger class for some own magic
        }
      }

      # If lead visits a defined news
      410 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:trigger.newsvisit

        # Classname for implementation of the trigger itself
        className = In2code\Luxenterprise\Domain\Workflow\Trigger\NewsVisitTrigger

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Trigger/NewsVisit.html

        # Additional configuration
        configuration {
          # Any configuration - available as array in Template File and Trigger class for some own magic
        }
      }

      # If lead enters a page or downloads an asset with a relation to a lux category
      420 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:trigger.category

        # Classname for implementation of the trigger itself
        className = In2code\Luxenterprise\Domain\Workflow\Trigger\CategoryTrigger

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Trigger/Category.html

        # Additional configuration
        configuration {
          # Any configuration - available as array in Template File and Trigger class for some own magic
        }
      }

      # If page is in defined language
      430 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:trigger.language

        # Classname for implementation of the trigger itself
        className = In2code\Luxenterprise\Domain\Workflow\Trigger\LanguageTrigger

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Trigger/Language.html

        # Additional configuration
        configuration {
          # Any configuration - available as array in Template File and Trigger class for some own magic
        }
      }

      # If page is in defined site
      440 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:trigger.site

        # Classname for implementation of the trigger itself
        className = In2code\Luxenterprise\Domain\Workflow\Trigger\SiteTrigger

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Trigger/Site.html

        # Additional configuration
        configuration {
          # Any configuration - available as array in Template File and Trigger class for some own magic
        }
      }

      # Event tracking of any interation
      450 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:trigger.event

        # Classname for implementation of the trigger itself
        className = In2code\Luxenterprise\Domain\Workflow\Trigger\EventTrigger

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Trigger/Event.html

        # Additional configuration
        configuration {
          # Any configuration - available as array in Template File and Trigger class for some own magic
        }
      }

      # If lead searches for a term
      460 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:trigger.search

        # Classname for implementation of the trigger itself
        className = In2code\Luxenterprise\Domain\Workflow\Trigger\SearchTrigger

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Trigger/Search.html

        # Additional configuration
        configuration {
          searchParameters = {$plugin.tx_lux.settings.tracking.search.getParameters}
        }
      }

      # 600-699 SOURCE
      # Check for a given referrer
      600 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:trigger.referrer

        # Classname for implementation of the trigger itself
        className = In2code\Luxenterprise\Domain\Workflow\Trigger\ReferrerTrigger

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Trigger/Referrer.html

        # Additional configuration
        configuration {
          fields {
            # Show "is external" checkbox
            external = 1

            # Show "Referrer contains" field
            contains = 1
          }
        }
      }

      # Check for a given UTM parameter
      610 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:trigger.utmparameter

        # Classname for implementation of the trigger itself
        className = In2code\Luxenterprise\Domain\Workflow\Trigger\UtmParameterTrigger

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Trigger/UtmParameter.html

        # Additional configuration
        configuration {
          parameters {
            # Available parameters
            0 = utm_campaign
            1 = utm_id
            2 = utm_source
            3 = utm_medium
            4 = utm_term
            5 = utm_content
          }
        }
      }

      # Check for visitors country
      620 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:trigger.country

        # Classname for implementation of the trigger itself
        className = In2code\Luxenterprise\Domain\Workflow\Trigger\CountryTrigger

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Trigger/Country.html

        # Additional configuration
        configuration {
          # Any configuration - available as array in Template File and Trigger class for some own magic
        }
      }

      # Check for location by distance
      630 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:trigger.location

        # Classname for implementation of the trigger itself
        className = In2code\Luxenterprise\Domain\Workflow\Trigger\LocationTrigger

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Trigger/Location.html

        # Additional configuration
        configuration {
          # Any configuration - available as array in Template File and Trigger class for some own magic
          distance.values {
            10 = 10 km
            25 = 25 km
            50 = 50 km
            100 = 100 km
            150 = 150 km
            200 = 200 km
            250 = 250 km
            300 = 300 km
            400 = 400 km
            500 = 500 km
            750 = 750 km
            1000 = 1000 km
          }
        }
      }

      # 700-999 MISCELLANEOUS
      # At a defined time (start to stop)
      700 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:trigger.timeframe

        # Classname for implementation of the trigger itself
        className = In2code\Luxenterprise\Domain\Workflow\Trigger\TimeFrameTrigger

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Trigger/TimeFrame.html

        # Additional configuration
        configuration {
          # Any configuration - available as array in Template File and Trigger class for some own magic
        }
      }

      # Define the initial action for triggering (page visit or download or form submit, etc...)
      710 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:trigger.startaction

        # Classname for implementation of the trigger itself
        className = In2code\Luxenterprise\Domain\Workflow\Trigger\StartactionTrigger

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Trigger/Startaction.html

        # Additional configuration
        configuration {
          actions {
            0 = pageRequestAction
            1 = fieldListeningRequestAction
            2 = formListeningRequestAction
            3 = email4LinkRequestAction
            4 = downloadRequestAction
            5 = linkListenerRequestAction
            6 = error
          }
        }
      }

      # Define TYPO3 context (e.g. to use workflows only on production)
      720 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:trigger.context

        # Classname for implementation of the trigger itself
        className = In2code\Luxenterprise\Domain\Workflow\Trigger\ContextTrigger

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Trigger/Context.html

        # Additional configuration
        configuration {
          contexts {
            0 = Production
            1 = Development
            2 = Testing
          }
        }
      }
    }
  }
}
Copied!

Note: Take care that your lib.lux configuration is recognized by lux (see FAQ section how to copy it to plugin.tx_lux_fe)

Actions:

lib.lux.settings {

  # All workflow settings
  workflow {

    ###########################
    # Define individual actions
    ###########################
    actions {

      # 100-199 CONTENT MANIPULATION
      # Action for showing an individual content element in a lightbox to the lead
      100 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:action.popupcontentelement

        # Classname for implementation of the action itself
        className = In2code\Luxenterprise\Domain\Workflow\Action\PopupContentElementAction

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Action/PopupContentElement.html

        # Additional configuration
        configuration {
          # Any configuration - available as array in Template File and Action class for some own magic
        }
      }

      # Action for loading an individual content element into the current HTML page
      120 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:action.ajaxcontent

        # Classname for implementation of the action itself
        className = In2code\Luxenterprise\Domain\Workflow\Action\AjaxContentElementAction

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Action/AjaxContentElement.html

        # Additional configuration
        configuration {
          # Any configuration - available as array in Template File and Action class for some own magic
        }
      }

      # Show or hide any element on a HTML page
      130 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:action.showOrHide

        # Classname for implementation of the action itself
        className = In2code\Luxenterprise\Domain\Workflow\Action\ShowOrHideAction

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Action/ShowOrHide.html

        # Additional configuration
        configuration {
          # Any configuration - available as array in Template File and Action class for some own magic
        }
      }

      # Action for doing a redirect to another URI
      140 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:action.redirect

        # Classname for implementation of the action itself
        className = In2code\Luxenterprise\Domain\Workflow\Action\RedirectAction

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Action/Redirect.html

        # Additional configuration
        configuration {
          # Any configuration - available as array in Template File and Action class for some own magic
        }
      }

      # Action to change website title
      150 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:action.title

        # Classname for implementation of the action itself
        className = In2code\Luxenterprise\Domain\Workflow\Action\TitleAction

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Action/Title.html

        # Additional configuration
        configuration {
          # Any configuration - available as array in Template File and Action class for some own magic
        }
      }

      # Show lead information on the website
      160 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:action.leadproperty

        # Classname for implementation of the action itself
        className = In2code\Luxenterprise\Domain\Workflow\Action\LeadPropertyAction

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Action/LeadProperty.html

        # Additional configuration
        configuration {
          # Any configuration - available as array in Template File and Action class for some own magic
        }
      }


      # 200-299 SEND MESSAGES
      # Action for sending a notification email
      200 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:action.email

        # Classname for implementation of the action itself
        className = In2code\Luxenterprise\Domain\Workflow\Action\EmailAction

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Action/Email.html

        # Additional configuration
        configuration {
          emailOverrides {
            # Override sender settings for SPF-defiance settings (affected only the sender settings - not the reply to settings)
            senderName = {$plugin.tx_lux.settings.email.defaultSenderName}
            senderEmail = {$plugin.tx_lux.settings.email.defaultSenderEmail}
          }
        }
      }

      # Action for publishing to a slackchannel
      210 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:action.slack

        # Classname for implementation of the action itself
        className = In2code\Luxenterprise\Domain\Workflow\Action\SlackAction

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Action/Slack.html

        # Additional configuration
        configuration {

          # Define multiple configurations - one per slack channels or slack domain
          1 {
            # Add a name for a selection in workflow backend module
            name = Slack Channel "Sales"

            # Add your webhook Url like https://hooks.slack.com/services/token
            webhookUrl = https://hooks.slack.com/services/TOKENabcdefghi123456/789123456/7891

            # Username for this webhook
            username = lux

            # Set an emoji for all this publishings (can be empty, if you already set an image to your webhook in slack)
            emoji = :fire:
          }
        }
      }

      # Sending SMS (through twilio.com - a registration on the platform is required first)
      220 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:action.sms

        # Classname for implementation of the action itself
        className = In2code\Luxenterprise\Domain\Workflow\Action\SmsAction

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Action/Sms.html

        # Additional configuration
        configuration {

          # Define multiple configurations - one per twilio account
          1 {
            # Add a name for a selection in workflow backend module
            name = Twilio Account #1

            # Account SID - used as endpoint in API requests
            accountSid = ACe5b11cd9ff0abcdef123456789abcd

            # Authorization token
            authToken = d78cd5d34f9ab123456789abcdef

            # Phone number given from twilio (e.g. +150712345678)
            from = +150712345678

            # Use this prefix if number is is not given in E.123 format (to convert number automatically)
            defaultPrefix = +49

            to {
              # Send only SMS if phone matches this prefix (per default: mobile numbers in germany)
              0 = +4915
              1 = +4916
              2 = +4917
            }
          }
        }
      }

      # Sending push notifications
      230 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:action.push

        # Classname for implementation of the action itself
        className = In2code\Luxenterprise\Domain\Workflow\Action\PushAction

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Action/Push.html

        # Additional configuration
        configuration {
          # Icon for push notification
          icon = EXT:lux/Resources/Public/Icons/lux.svg
        }
      }


      # 300-399 MANIPULATION OF VALUES
      # Set a value for a visitor
      300 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:action.property

        # Classname for implementation of the action itself
        className = In2code\Luxenterprise\Domain\Workflow\Action\PropertyAction

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Action/Property.html

        # Additional configuration
        configuration {
          # Any configuration - available as array in Template File and Action class for some own magic
        }
      }

      # Double Opt-In for visitors
      310 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:action.doubleoptin

        # Classname for implementation of the action itself
        className = In2code\Luxenterprise\Domain\Workflow\Action\DoubleOptInAction

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Action/DoubleOptIn.html

        # Additional configuration
        configuration {
          emailOverrides {
            # Override sender settings for SPF-defiance settings (affected only the sender settings - not the reply to settings)
            senderName = {$plugin.tx_lux.settings.email.defaultSenderName}
            senderEmail = {$plugin.tx_lux.settings.email.defaultSenderEmail}
          }
        }
      }

      # Set a blacklisted status
      320 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:action.blacklist

        # Classname for implementation of the action itself
        className = In2code\Luxenterprise\Domain\Workflow\Action\BlacklistAction

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Action/Blacklist.html

        # Additional configuration
        configuration {
          # Any configuration - available as array in Template File and Action class for some own magic
        }
      }


      # 400-499 WORKING WITH LEAD VALUES (THIRD PARTY API AND TABLES)
      # Save values to a local table
      400 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:action.saveToTable

        # Classname for implementation of the action itself
        className = In2code\Luxenterprise\Domain\Workflow\Action\SaveToTableAction

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Action/SaveToTable.html

        # Additional configuration
        configuration {
          1 {
            # Any title for this table save action
            name = Save as Frontend User

            # Table name to save in
            table = fe_users

            # If identifierField is filled and there is already a record with the same value, it will be updated instead of inserted (twice). NOTE: This fieldname must be defined in mapping!
            identifierField = email

            # Map: fe_users.fieldname = value
            mapping {
              pid = 190
              tstamp = {f:format.date(date:'now',format:'U')}
              crdate = {f:format.date(date:'now',format:'U')}
              username = {visitor.email}
              password = {lux:string.getRandomValue()}
              usergroup = 1,2
              name = {visitor.fullName}
              first_name = {lux:visitor.getAnyProperty(visitor:visitor,property:'firstname')}
              last_name = {lux:visitor.getAnyProperty(visitor:visitor,property:'lastname')}
              telephone = {lux:visitor.getAnyProperty(visitor:visitor,property:'telephone')}
              email = {visitor.email}
              company = {visitor.company}
            }
          }
        }
      }

      # Send to interface action for any kind of exports to a CRM
      410 {
        # Title to show in workflow backend module
        title = LLL:EXT:luxenterprise/Resources/Private/Language/locallang_db.xlf:action.sendtointerface

        # Classname for implementation of the action itself
        className = In2code\Luxenterprise\Domain\Workflow\Action\SendToInterfaceAction

        # Templatefile for implementation of the form in workflow module
        templateFile = EXT:luxenterprise/Resources/Private/Templates/Workflow/Action/SendToInterface.html

        # Additional configuration
        configuration {
          1 {
            # Any title for this interface connection
            name = Send lead to my CRM

            # Send to this url
            url = https://mycrm.net

            values {
              # build a string like &email=email@address.net&name=Alex&scoring=123 ...
              email = {visitor.email}
              name = {visitor.fullName}
              scoring = {visitor.scoring}
              country = {visitor.country}
              company = {visitor.company}
              anyattribute = {lux:visitor.getPropertyFromAttributes(attribute:'firstname',visitor:visitor)}
              anyvalue = any static value
            }
          }
        }
      }
    }
  }
}
Copied!

Note: Take care that your lib.lux configuration is recognized by lux (see FAQ section how to copy it to plugin.tx_lux_fe)

Extending Triggers and Actions 

Of course we wanted to build a very flexible Marketing Automation tool that can be extended to your needs. So we don't know all the triggers and actions that you need. But we made it very easy for you to extend the existing list with your own triggers and actions.

The following examples would require an additional extension and we call it luxextension.

Add an individual trigger 

Let's say you want to add an individual trigger If a frontend user adds a page, you should register it via TypoScript first:

lib.lux.settings {

   # All workflow settings
   workflow {

       triggers {

           # Trigger if a frontend user enters a page
           1000 {
               # Title to show in workflow backend module
               title = LLL:EXT:luxextension/Resources/Private/Language/locallang_db.xlf:trigger.frontenduser

               # Classname for implementation of the trigger itself
               className = Vendor\Luxextension\Domain\Trigger\FrontendUserTrigger

               # Templatefile for implementation of the form in workflow module
               templateFile = EXT:luxextension/Resources/Private/Templates/Workflow/Trigger/FrontendUser.html

               # Additional configuration
               configuration {
                   # If a frontenduser is registered in this fe_group
                   group = 1
               }
           }
       }
   }
}
plugin.tx_lux_fe.settings < lib.lux.settings
module.tx_lux.settings < lib.lux.settings
Copied!

A template file will help you to ask the marketing editors for configuration. In our example the trigger should only work for a selected page. So we need an input field where the editor can add a PID and we name it page.

EXT:luxextension/Resources/Private/Templates/Workflow/Trigger/FrontendUser.html:

<f:spaceless>
    <f:comment>
        Available variables:
        {index} Index variable for fieldnames
        {triggerSettings.title} Trigger title from TypoScript
        {triggerSettings.description} Trigger description from TypoScript
        {triggerSettings.className} Trigger className from TypoScript
        {triggerSettings.templateFile} Trigger templateFile from TypoScript
        {triggerSettings.configuration.foo} Trigger configuration from TypoScript
    </f:comment>


    <div class="row form-group lux-trigger lux-trigger-conjunction{trigger.conjunction}{f:if(condition:trigger.not,then:' lux-trigger-not')}">
        <button data-lux-action-trigger="delete" class="close" type="button">delete</button>

        <div class="col-md-12">
            <label for="trigger_{index}_page" class="lb-lg">
                <f:translate key="LLL:EXT:luxextension/Resources/Private/Language/locallang_db.xlf:trigger.frontenduser.page">PID</f:translate>
            </label>
            <input
               type="number"
               name="trigger[{index}][configuration][page]"
               class="form-control"
               id="trigger_{index}_page"
               placeholder="123"
               value="{configuration.page}" />
        </div>

        <f:render partial="Trigger/HiddenFields" arguments="{_all}"/>
    </div>
</f:spaceless>
Copied!

Two additional hiddenfields at the end will store the chosen conjunction and the className into database.

Now it's time for some own PHP-magic in the class Vendor\Luxextension\Domain\Trigger\FrontendUserTrigger. EXT:luxextension/Classes/Domain/Trigger/FrontendUserTrigger.php:

<?php
declare(strict_types=1);
namespace Vendor\Luxextension\Domain\Trigger;

use \In2code\Lux\Domain\Trigger\AbstractTrigger;
use \In2code\Lux\Domain\Trigger\TriggerInterface;

class FrontendUserTrigger extends AbstractTrigger implements TriggerInterface
{
    public function initialize()
    {
        if ((int)$this->getConfigurationByKey('page') === 0) {
            throw new \Exception('No page configuration given', 1522680218);
        }
        if ($this->getSettingsByPath('group') === '') {
            throw new \Exception('No fe_group uid given in TypoScript', 1522680425);
        }
    }

    /**
     * Check if
     * - the current visitor enters the configured page
     * - and if the visitor is logged in as fe_user
     * - and if he/she is logged in in a given fe_group
     *
     * @return bool
     */
    public function isTriggered(): bool
    {
        if ((int)$GLOBALS['TSFE']->id === (int)$this->getConfigurationByKey('page')) {
            $userGroupUid = (int)$this->getSettingsByPath('group');
            $userGroupsFeLogin = explode(',', $GLOBALS['TSFE']->fe_user->user['usergroup']);
            if (!empty($userGroupsFeLogin)) {
                return in_array($userGroupUid, $userGroupsFeLogin);
            }
        }
        return false;
    }
}

Copied!

Your PHP trigger class must implement TriggerInterface and should extend the AbstractTrigger. Last class offers you useful methods (like getWorkflow(), getTrigger() and getVisitor(), getConfigurationByKey() or getSettingsByPath()) to get helpful information.

The method initialize() is called before isTriggered() and the method afterTrigger() at last. While you have to add a boolean method isTriggered() the others are optional.

Last but not least, you should add a locallang file with the keys that you've used in TypoScript and in your Trigger HTML file.

Add an individual action 

Let's say you want to add an individual action Send lead values via CURL, you should register it via TypoScript first:

lib.lux.settings {

    # All workflow settings
    workflow {

        actions {

            # Action to send some details via CURL to a thirdparty software
            1000 {
                # Title to show in workflow backend module
                title = LLL:EXT:luxextension/Resources/Private/Language/locallang_db.xlf:action.curl

                # Classname for implementation of the action itself
                className = Vendor\Luxextension\Domain\Action\CurlAction

                # Templatefile for implementation of the form in workflow module
                templateFile = EXT:luxextension/Resources/Private/Templates/Workflow/Action/Curl.html

                # Additional configuration
                configuration {
                    uri = https://www.thirdpartycrm.org/api/
                }
            }
    }
}
plugin.tx_lux_fe.settings < lib.lux.settings
module.tx_lux.settings < lib.lux.settings
Copied!

A template file will help you to ask the marketing editors for configuration. In our example we just ask for the URI to send the values to. Per default TypoScript configuration should work but the URI could be overwritten by a configuration from the marketing editor. So we need an input field where the editor can add a URI for overwriting and we name it uri.

EXT:luxextension/Resources/Private/Templates/Workflow/Action/Curl.html:

<f:spaceless>
    <f:comment>
        Available variables:
        {index} Index variable for fieldnames
        {actionSettings.title} Action title from TypoScript
        {actionSettings.description} Action description from TypoScript
        {actionSettings.className} Action className from TypoScript
        {actionSettings.templateFile} Action templateFile from TypoScript
        {actionSettings.configuration.foo} Action configuration from TypoScript
    </f:comment>

    <div class="lux-action">
        <button data-lux-action-trigger="delete" class="close" type="button">delete</button>

        <h1><f:translate key="LLL:EXT:luxextension/Resources/Private/Language/locallang_db.xlf:action.curl" /></h1>

        <div class="row form-group">
            <div class="col-md-3">
                <label for="trigger_{index}_recurring" class="lb-lg">
                    <f:translate key="LLL:EXT:lux/Resources/Private/Language/locallang_db.xlf:action.label.recurring">
                        Recurring/Single
                    </f:translate>
                </label>
                <select name="actions[{index}][configuration][recurring]" class="form-control" id="trigger_{index}_recurring">
                    <option value="single"{f:if(condition:'{configuration.recurring} == "single"',then:' selected="selected"')}>{f:translate(key:'LLL:EXT:lux/Resources/Private/Language/locallang_db.xlf:action.label.recurring.single')}</option>
                    <option value="recurring"{f:if(condition:'{configuration.recurring} == "recurring"',then:' selected="selected"')}>{f:translate(key:'LLL:EXT:lux/Resources/Private/Language/locallang_db.xlf:action.label.recurring.recurring')}</option>
                </select>
            </div>
            <div class="col-md-9">
                <label for="action_{index}_uri" class="lb-lg">
                    <f:translate key="LLL:EXT:luxextension/Resources/Private/Language/locallang_db.xlf:action.curl.uri">
                        URI to send request to (optional)
                    </f:translate>
                </label>
                <input
                    type="text"
                    name="actions[{index}][configuration][uri]"
                    class="form-control"
                    value="{configuration.uri}"
                    id="action_{index}_uri" />
                <span class="help-block">
                     <f:translate key="LLL:EXT:luxextension/Resources/Private/Language/locallang_db.xlf:action.curl.uri.help">
                        Any helptext for the marketing editors
                     </f:translate>
                </span>
            </div>
        </div>

        <input type="hidden" name="actions[actions][{index}][className]" value="{actionSettings.className}" />
    </div>
</f:spaceless>
Copied!

One additional hiddenfield at the end will store the chosen className into database.

Now it's time for some own PHP-magic in the class Vendor\Luxextension\Domain\Action\CurlAction. EXT:luxextension/Classes/Domain/Action/CurlAction.php:

<?php
declare(strict_types=1);
namespace Vendor\Luxextension\Domain\Action;

use \In2code\Lux\Domain\Action\AbstractAction;
use \In2code\Lux\Domain\Action\ActionInterface;

class CurlAction extends AbstractAction implements ActionInterface
{
    public function doAction(): bool
    {
        $uri = $this->getSettingsByPath('uri');
        if ($this->getConfigurationByKey('uri') !== '') {
            $uri = $this->getConfigurationByKey('uri');
        }
        return $this->sendToUri($uri);
    }

    protected function sendToUri(string $uri): bool
    {
        $resource = curl_init($uri);

        $values = [
            'email' => $this->getVisitor()->getEmail()
        ];

        curl_setopt_array(
            $resource,
            [
                CURLOPT_POST => true,
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
                CURLOPT_POSTFIELDS => json_encode($values),
            ]
        );
        $result = curl_exec($resource);
        if ($result === false) {
            throw new \DomainException('Could not connect to given URI.', 1522680965);
        }
        return $result !== false;
    }
}
Copied!

Your PHP action class must implement ActionInterface and should extend the ActionTrigger. Last class offers you useful methods (like getWorkflow(), getAction() and getVisitor(), getConfigurationByKey() or getSettingsByPath()) to get helpful information.

The method initialize() is called before doAction() and the method afterAction() at last. While you have to add a boolean method doAction() the others are optional.

Note: There are some entry points in lux, that can call actions (e.g. a page visit or if a visitor submits a email4link form). Per default actions are only called by page visits. But maybe it is useful to also start an action if a form was submitted. You can define the starting actions with the variable $controllerActions in your Action class. Have a look into AbstractAction class for some examples and the default value.

Last but not least, you should add a locallang file with the keys that you've used in TypoScript and in your Trigger HTML file.

LUX LUX

Scoring and Categoryscoring 

This part of the documentation tells us a bit about scoring and categoryscoring and how to configure lux for that.

While scoring reflects how hot a lead is in general, category scoring shows which product/service is the right choice for different leads (see glossary at Marketing Information).

Scoring 

A basic scoring tells us how interested a lead is in general. So page visits and downloads are the key.

The default scoring calculation is stored in the Extension Manager settings of lux (see part Installation) and is:

(10 * numberOfSiteVisits) + (1 * numberOfPageVisits) + (20 * downloads) - (1 * lastVisitDaysAgo)
Copied!

Note: If you're using lastVisitDaysAgo you want to decrease scoring if the last page visit of the lead was a while ago. That means that you have to call a CommandController once a day (or night) for a calculation.

The general scoring is visible on different views in Lux. Mostly beside the lead identification. The value in the grey badge reflects the general scoring. The value in the blue badge reflects the hottest category scoring:

Categoryscoring 

You know your business much better than us. So you have to think about, which categories reflect which part of your business in your TYPO3 installation. In our case, we could use a category for this product lux another for our product Content Publisher and probably a third for carreer to find new collegues who wants to help us with lux and TYPO3. Of course a download or a page visit of an asset/page of a lux category should increase a category scoring.

What can we do with the knowledge about leads and their category scoring? Lux is able to execute workflow actions (see Workflow) based on category scoring or show contextual content (also based on category scoring - see Plugins).

Configuration 

You can simply define some lux-categories in your TYPO3. A lux-category is just a sys_category record in TYPO3. Don't forget to check the checkbox "lux-category".

After you added some lux-categories to your system, you can mark pages and files with that categories.

Calculation 

Per default every visit of a page of a lux-category will increase category-scoring with factor 10 while a download will increase the value by 20 (a download is a larger action then a simple pagevisit - this results in more scoring points of course).

If you want to change the factors, you can do this in the Extension Manager in the settings of lux (see part Installation).

Analysis 

Just open a lead detail-view. You will see all relevant information about category scorings to this lead.

LUX LUX

Changelog and breaking changes 

Note: See breaking changes table after changelog

Changelog 

Version Date State TYPO3 Description
40.0.1 2025-12-04 Bugfix 12.4 + 13.4 Don't add events on a-tags with downloads if there is already an linklistener event given
40.0.0 !!! 2025-11-12 Feature 12.4 + 13.4 Use FluidEmail instead of MailMessage for email4link mails - use your own layout now, show also unused linklisteners in backend
39.1.2 2025-10-24 Bugfix 12.4 + 13.4 Fix a possible SQL error on company view together with sql mode only_full_group_by
39.1.1 2025-10-16 Bugfix 12.4 + 13.4 Fix bugs and performance issue in the backend source view
39.1.0 2025-09-13 Task 12.4 + 13.4 Add AI documentation
39.0.0 2025-08-08 Feature 12.4 + 13.4 Preparations for source view in backend, add some more unit tests, update DisallowedMailProvider list
38.7.2 2025-07-18 Bugfix 12.4 + 13.4 Fix outdated call of function getTwoLetterIsoCode()
38.7.1 2025-07-16 Bugfix 12.4 + 13.4 Fix PHP 8.4 deprecations
38.7.0 2025-07-16 Task 12.4 + 13.4 Fix pagebrowser in TYPO3 12, Prevent possible exception in demo backend modules, Added more unit tests, Small label changes, Update demodata, Small improvements for local development
38.6.0 2025-07-02 Feature 12.4 + 13.4 Support multiple referrers in page funnel, small update to DisallowedMailProvider list, add some AI sources for referrers
38.5.1 2025-04-15 Bugfix 12.4 + 13.4 Prevent false positive blocked emails in email4link
38.5.0 2025-04-09 Feature 12.4 + 13.4 Demodata command introduced to community version, small code updates
38.4.0 2025-02-18 Task 12.4 + 13.4 Improvement in cooperation with LUXletter (please also update LUXletter to the latest version)
38.3.1 2025-02-07 Bugfix 12.4 + 13.4 Prevent exceptions in AJAX request if no frontenduser is logged in
38.3.0 2025-01-16 Task 12.4 + 13.4 Update documentation to be rendered on docs.typo3.org
38.2.0 2025-01-14 Task 12.4 + 13.4 Small bugfix for command cleanup:deletedrecods, added first codeception test and framework, removed unneeded files, documentation update
38.1.0 2024-12-08 Task 12.4 + 13.4 Fix identification of logged in frontendusers, update some LUXletter related stuff (if LUX + LUXletter is in use), code cleanup
38.0.1 2024-11-26 Bugfix 12.4 + 13.4 Update TYPO3 dependencies in old ext_emconf file
38.0.0 2024-11-25 Feature 12.4 + 13.4 Add TYPO3 13 support, drop TYPO3 11 support, add darkmode styling, add LUX to TYPO3 livesearch in backend
37.1.0 2024-10-30 Task 11.5 + 12.4 Bing is used for preview images instead of google (if feature is turned on for leads and companies)
37.0.0 !!! 2024-10-25 Feature 11.5 + 12.4 Use IP-address in fingerprint hash to get a more unique hash, add sorting for lead list
36.5.1 2024-10-17 Bugfix 11.5 + 12.4 Prevent sql exception in MySQL (not MariaDB) when filtering for a category in lead list
36.5.0 2024-10-01 Bugfix 11.5 + 12.4 Prevent exceptions when configuration is missing, fix typo in configuration, add mail provider to disallowed mail provider list
36.4.0 2024-09-16 Feature 11.5 + 12.4 Add a Modern.js file to add frontend JS with a basic bot detection (this file is not yet added per default in TypoScript and only for testing reasons available at the moment)
36.3.1 2024-08-20 Task 11.5 + 12.4 Fix a crosslink from lead detail view in Analysis module back to companies view
36.3.0 2024-08-16 Task 11.5 + 12.4 Add more KI user agents to blocklist, fix company scoring value in list view
36.2.0 2024-08-05 Task 11.5 + 12.4 Add main configuration to stop/enable exception logging, extend lists of bots/spider user agent to prevent unneeded tracking
36.1.1 2024-08-01 Bugfix 11.5 + 12.4 Use site.identifier instead of websiteTitle in all filters, fix possible exception on CLI commands, increase field size of attribute.value, fix small typo in docs
36.1.0 2024-07-31 Task 11.5 + 12.4 Add a bunch of onetime mail domains to configuration, rename virtual page request to event tracking requests
36.0.0 2024-07-28 Feature 11.5 + 12.4 Add push service for virtual page visits or search usage (via JavaScript)
35.11.0 2024-07-25 Feature 11.5 + 12.4 Add {file} variable in Email4LinkMail.html email template for a better extendability
35.10.0 2024-07-24 Feature 11.5 + 12.4 Add quarter interval support in FilterDto to allow quarterly evaluation, added some unit tests
35.9.0 2024-07-22 Task 11.5 + 12.4 Extend available views for A/B testing controller, add new TypoScript constants settings to be able to set additional TypoScript only if LUX TS is loaded
35.8.0 2024-07-18 Feature 11.5 + 12.4 Add new event to extend ReadableReferrer class, bugfix for additional checkboxes in email4link popup
35.7.0 2024-07-12 Feature 11.5 + 12.4 Extend readable referrer list with Google AdSense and some other platforms
35.6.0 2024-07-03 Task 11.5 + 12.4 Use a typoscript constant now for default sender email and name, documentation update
35.5.0 2024-07-02 Feature 11.5 + 12.4 Add new getter to visitor model to get latest A/B test, some small CSS improvements, bugfix to always use pagevisit data for pagevisit timestamps
35.4.0 2024-06-14 Feature 11.5 + 12.4 Make formListening/fieldListening available for forms loaded via AJAX
35.3.0 2024-05-27 Feature 11.5 + 12.4 Show also first page visit and referrer in CSV downloads of lead list
35.2.1 2024-05-16 Bugfix 11.5 + 12.4 Fix lead search with space character in searchterm in lead list, small fix in API documentation
35.2.0 2024-04-27 Feature 11.5 + 12.4 Extend frontend JS for another callback function for adding text anywhere in the DOM
35.1.0 2024-04-22 Feature 11.5 + 12.4 Add possibility to use an existing event in own JS after an action was performed
35.0.2 2024-04-17 Bugfix 11.5 + 12.4 Fix scoring calculation in frontend requests
35.0.1 2024-04-11 Bugfix 11.5 + 12.4 Prevent possible exception when opening A/B Testing module on an empty installation, update disallowed mail provider list
35.0.0 !!! 2024-03-26 Feature 11.5 + 12.4 Support multiclient usage now, small performance improvements, update social media resources, unify filters in backend modules
34.3.3 2024-03-04 Bugfix 11.5 + 12.4 Harden curl requests against ip services to prevent exceptions
34.3.2 2024-02-20 Task 11.5 + 12.4 Update disallowed mail provider list, small code improvement
34.3.1 2024-02-16 Task 11.5 + 12.4 Reduce length of pagebrowser items in company list view
34.3.0 2024-02-01 Feature 11.5 + 12.4 Preparations for writing API in LUXenterprise
34.2.0 2024-01-25 Feature 11.5 + 12.4 Support MTM-Parameters in addition to UTM-Parameters now
34.1.0 2024-01-16 Task 11.5 + 12.4 Small style bugfix in summary mails, update documentation
34.0.3 2023-11-21 Bugfix 11.5 + 12.4 Prevent db compare error in UTM table
34.0.2 2023-09-29 Bugfix 11.5 + 12.4 Fix some typos for CKEditor plugin functionality in TYPO3 12
34.0.1 2023-09-20 Bugfix 11.5 + 12.4 Small fixes of the hottest leads box and the world map box
34.0.0 2023-09-20 Feature 11.5 + 12.4 Better performance through AJAX loading of diagrams in dashboards or pageoverview, get rid of the minimum-stability warning when installing via composer
33.3.1 2023-09-14 Bugfix 11.5 + 12.4 Fix open/close status for pageoverview with leads in backend
33.3.0 2023-09-07 Feature 11.5 + 12.4 Update diagram of existing leads to a double bar chart diagram for better readability
33.2.1 2023-08-20 Bugfix 11.5 + 12.4 Toggle page overview diagrams: Should also save status when clicking on the small arrow icon
33.2.0 2023-08-20 Feature 11.5 + 12.4 Make toggle function in backend more generic, so it can be used for more functions in future
33.1.1 2023-08-20 Bugfix 11.5 + 12.4 Show pagetree in link wizard for LinkListeners, to select a page if storage PID != 0, allow to store LinkListener records on normal pages
33.1.0 2023-08-19 Feature 11.5 + 12.4 New diagram in lead list shows number of new or all leads within a timeframe
33.0.1 2023-08-19 Bugfix 11.5 + 12.4 Fix backend module configuration for TYPO3 12 (to set correct editor permissions)
33.0.0 2023-08-14 Feature 11.5 + 12.4 Color adjustments of LUX for a better readability, small improvements of readabledate viewhelper, don't show empty values in UTM diagrams
32.2.3 2023-08-10 Bugfix 11.5 + 12.4 Fix socialmedia diagram in analysis dashboard
32.2.2 2023-08-07 Bugfix 11.5 + 12.4 Don't use table "sys_language" any more because it was removed in TYPO3 12
32.2.1 2023-07-24 Bugfix 11.5 + 12.4 Prevent error "Unable to generate a URL for the named route" when a module should be hidden by configuration
32.2.0 2023-07-21 Task 11.5 + 12.4 Prevent refindex records of LUX or LUXenterprise records, Fix empty options in UTM filter, Don't show empty pagevisits in page funnel diagram, Allow null value of metadata objects
32.1.1 2023-07-14 Task 11.5 + 12.4 Change label of privacy notice in email4link to take care of latest GDPR recommendations
32.1.0 2023-07-07 Task 11.5 + 12.4 Use a better close button and responsive view for lightboxes now in frontend, add defer attribute to formmapping.js and fieldmapping.js
32.0.0 2023-06-27 Feature 11.5 + 12.4 Add WiredMinds integration with new company views, information view and convert command, fix image grabber from google, update doughnut colors, anonymize also IPv6 IPs if wanted
31.2.4 2023-05-23 Bugfix 11.5 + 12.4 Linklistener performance should not be greater then 100%, Updated disallowed mail provider list
31.2.3 2023-05-19 Bugfix 11.5 + 12.4 Prevent error in analysis dashboard if there is no news table
31.1.2 2023-05-15 Task 11.5 + 12.4 Fix minimum stability error by changing requirements from branch to tag for package "buzz/which-browser-parser"
31.1.1 2023-05-15 Task 11.5 + 12.4 Add UTM table to truncateAll() function, Show correct "latest visit" time if there is no related log record
31.1.0 2023-05-13 Feature 11.5 + 12.4 Allow formFieldListening with "typo3/cms-form" by supporting data-lux-form-identification="submitButton"
31.0.0 2023-05-12 Feature 11.5 + 12.4 Add relevant arguments to excluded cHash params, add local docker testing environment for TYPO3 12, update Tests for TYPO3 12, fix some open issues in email4link for TYPO3 12
30.1.0 2023-05-06 Feature 11.5 + 12.4 Allow search for visitor hash values, introduce country and geolocation service classes
30.0.0 2023-05-05 Feature 11.5 + 12.4 Add some more SQL indices to improve performance, Improve LinkListener list view by loading performance via AJAX
29.0.0 2023-04-29 Feature 11.5 + 12.4 Performance upgrade of AnonymousService, add 3 new TYPO3 dashboard widgets for UTM analysis, allow PHP 7.4 again, shrink size of Module.js, preparations for LUXenterprise 34
28.3.3 2023-04-27 Bugfix 11.5 + 12.4 Fix link to info module, fix pagebrowser functionality in TYPO3 12
28.3.2 2023-04-26 Bugfix 11.5 + 12.4 Fix some optical issues for bootstrap 5 in workflow module under Chrome
28.3.1 2023-04-21 Bugfix 11.5 + 12.4 Prevent Formfieldmapping.js and Fieldmapping.js from indexed in indexed_search
28.3.0 2023-04-19 Feature 11.5 + 12.4 Allow generic variables in email4link lightbox now
28.2.0 2023-04-11 Feature 11.5 + 12.4 Increase categoryscorings also if a file with a LUX category is downloaded via email4link now
28.1.1 2023-04-11 Task 11.5 + 12.4 Prevent exception in TYPO3 12.3 with $_languageUid
28.1.0 2023-03-30 Task 11.5 + 12.4 Added a switch for frontend functionality, add identificator format check, show exceptions in AJAX requests only if logged in to backend at the same time
28.0.0 !!! 2023-03-29 Feature 11.5 + 12.4 Email4link html template is now loaded via AJAX instead of keeping it in invisible in DOM on every page.
27.2.0 2023-03-24 Task 11.5 + 12.4 Change blacklisted behaviour: We now keep the email address, so re-identified visitors with the same email but different fingerprints are automatically blacklisted again.
27.1.7 2023-03-23 Bugfix 11.5 + 12.4 Support special characters in form and email4link request now
27.1.6 2023-03-06 Task 11.5 + 12.4 Prevent exception in log undefined property Browser::name, Update to chart.js 2.9.4 for security reasons
27.1.5 2023-02-24 Bugfix 11.5 + 12.4 Fix link on i-icon in backend modules in TYPO3 11 (again and on all places)
27.1.4 2023-02-23 Bugfix 11.5 + 12.4 Fix link on i-icon in backend modules in TYPO3 11, small documentation update
27.1.3 2023-02-23 Bugfix 11.5 + 12.4 Fix for ajax loading of default visitor images and CSS in workflow backend module (when extension is located in vendor folder instead of typo3conf/ext)
27.1.2 2023-02-20 Bugfix 11.5 + 12.4 Small fix for possible SQL exceptions in Lead dashboard, updated disallowed mail provider list
27.1.1 2023-02-17 Bugfix 11.5 + 12.4 Fix "Property lastLogin must not be accessed before initialization" in FrontendUser model
27.1.0 2023-02-15 Bugfix 11.5 + 12.4 Updated disallowed mail provider list, Fixed PHP 8.2 issue with package whichbrowser/parser, small code cleanup
27.0.0 !!! 2023-02-12 Task 11.5 + 12.4 Support TYPO3 11+12 and drop support for TYPO3 10. Add id to anonym names. Track referrer with UTM tracking. A/B testing with a cleanup function now. Make linklisteners selectable in backend again.
26.10.0 2024-10-25 Feature 10.4 + 11.5 Backport: Use IP-address in fingerprint hash to get a more unique hash, add sorting for lead list
26.9.1 2024-06-13 Bugfix 10.4 + 11.5 Backport: Use latest pagevisit and latest log entry to show date of latest visit
26.9.0 2024-05-27 Feature 10.4 + 11.5 Show also first page visit and referrer in CSV downloads of lead list
26.8.0 2024-04-11 Feature 10.4 + 11.5 Extend Lead CSV download with country, last visit and last download
26.7.0 2024-03-19 Feature 10.4 + 11.5 Remove all domains from referrer diagram where referrers are from local instance
26.6.0 2024-03-18 Feature 10.4 + 11.5 Add domain selection for Lead list, use imagegrabber fork to prevent problems while loading images from google search
26.5.2 2024-01-12 Bugfix 10.4 + 11.5 Fix module links on some TYPO3 10 installations
26.5.1 2023-06-27 Bugfix 10.4 + 11.5 Added missing argument when instantiating the class
26.5.0 2023-05-13 Feature 10.4 + 11.5 Allow formFieldListening with "typo3/cms-form" by supporting data-lux-form-identification="submitButton"
26.4.2 2023-02-07 Bugfix 10.4 + 11.5 Make linklisteners selectable for editors again
26.4.1 2023-02-02 Bugfix 10.4 + 11.5 Prevent php exception attempt to read property on null
26.4.0 2022-11-25 Task 10.4 + 11.5 Remove config.no_cache=1, updated documentation, fix typo in label
26.3.1 2022-11-19 Bugfix 10.4 + 11.5 Ensure backward compatibility for older LUXenterprise versions (where workflow actions didn't have delay function name)
26.3.0 2022-11-19 Task 10.4 + 11.5 Preparation for new delay functions in content manipulation workflow actions, documentation update
26.2.1 2022-11-12 Task 10.4 + 11.5 Documentation update, label improvement in UTM filter
26.2.0 !!! 2022-11-04 Task 10.4 + 11.5 Very small breaking change: Name of lcoal storage keys changed a bit (see breaking changes note). Bugfix: No more duplicated eventhandlers on email4link links
26.1.0 2022-11-03 Feature 10.4 + 11.5 Hide nearly all LUX tables in list view, preparations for UTM generator view in LUXenterprise
26.0.0 2022-10-31 Feature 10.4 + 11.5 Adding of Urchin Tracking Modules (UTM parameters) tracking and analysis
25.3.0 2022-10-20 Feature 10.4 + 11.5 Prevent email4link links to be downloaded with rightclick or middle mouse key
25.2.0 2022-10-19 Task 10.4 + 11.5 Extend page and news tracker events with direct models for a better extending
25.1.0 2022-09-27 Feature 10.4 + 11.5 Support target="_blank" for email4link links now
25.0.0 2022-09-03 Feature 10.4 + 11.5 Time period filter for dashboards (small performance feature), Async load of visitor image (big performance feature), code cleanup, updated DisallowedMailProvider list
24.2.0 2022-08-11 Task 10.4 + 11.5 Replace deprecated frontend build tools, prevent possible exception on longer user_agent strings
24.1.0 2022-07-23 Task 10.4 + 11.5 Update for a better workflow management in luxenterprise
24.0.2 2022-07-11 Security 10.4 + 11.5 Harden SQL queries against possible SQL injection
24.0.1 2022-07-06 Bugfix 10.4 + 11.5 Hide page overview rendering when it is turned off via extension manager configuration (even if luxenterprise comes along with A/B testing)
24.0.0 2022-06-09 Feature 10.4 + 11.5 Add CSV download possibilities for all analysis views, Allow to search for company name (when given from IP address), Prevent duplicated visitor records on A/B testing
23.3.0 2022-06-07 Feature 10.4 + 11.5 Small css update for NOT triggers in luxenterprise, small bugfix in loading order with dashboard, documentation update
23.2.1 2022-05-25 Bugfix 10.4 + 11.5 Update disallowedMailProvider list, prevent exception "isPackageActive() on null" in TYPO3 11
23.2.0 2022-05-15 Task 10.4 + 11.5 Preperation for delayed workflows in luxenterprise
23.1.0 2022-05-15 Task 10.4 + 11.5 Harden frontend requests, small optical improvements for workflows, adding a phone getter in visitor model, documentation update
23.0.0 !!! 2022-05-08 Feature 10.4 + 11.5 Migrate all existing signalslots to PSR-14 eventdispatchers (to reduce technical dept and to simplify TYPO3 12 support in future)
22.6.0 2022-04-26 Feature 10.4 + 11.5 Extend API for a new endpoint
22.5.0 2022-04-25 Feature 10.4 + 11.5 Preperation for a proper API
22.4.0 2022-04-04 Feature 10.4 + 11.5 Show email addresses in luxletter receiver list.
22.3.3 2022-04-04 Bugfix 10.4 + 11.5 Clean internal SVG files from id and class attributes.
22.3.2 2022-03-23 Bugfix 10.4 + 11.5 Prevent SQL exception in page visit module on some cases.
22.3.1 2022-03-16 Bugfix 10.4 + 11.5 Prevent egg-formed lead images in backend. Harden lead list filter (search in timeframe or search only with a searchterm)
22.3.0 2022-03-09 Feature 10.4 + 11.5 Add close button to lightboxes. Allow interaction in lightboxes.
22.2.0 2022-03-05 Task 10.4 + 11.5 Show only identified leads in hottest box in dashboard. Make TYPO3 wizard with hottest leads more usable by always showing the email address.
22.1.0 2022-03-07 Feature 10.4 + 11.5 General performance update
22.0.0 2022-02-20 Feature 10.4 + 11.5 Reworked cache layer and warmup commands for a performance boost, rendering times for admins, readable numbers, some smaller performance optimizations, fix font problem in TYPO3 10
21.4.0 2022-02-12 Feature 10.4 + 11.5 Small performance improvement for lead list
21.3.0 2022-02-10 Feature 10.4 + 11.5 Show only identified leads in hottest leads list, Make lead image service adjustable, Bugfix of orientation of enterprise link in page module
21.2.0 2022-02-04 Feature 10.4 + 11.5 Increase category scorings on news visits, Bugfixes: Show all categoryscorings in lead detail view (even if the scoring is identically), class name correction in signals
21.1.0 2022-01-31 Feature 10.4 + 11.5 Add parameter which caches should be warmed up on CLI command
21.0.0 !!! 2021-12-17 Feature 10.4 + 11.5 Support QR codes for shortener, marker names in email4download changed to reduce possible conflicts with core functionality
20.2.2 2021-12-15 Bugfix 10.4 + 11.5 Don't include JS for lightbox twice
20.2.1 2021-12-14 Bugfix 10.4 + 11.5 Frontend toolchain updated for better usage with require.js
20.2.0 2021-12-09 Bugfix 10.4 + 11.5 Harden tracking of formListening events, add some more unit tests
20.1.0 2021-11-24 Feature 10.4 + 11.5 Add wildcard telecommunication provider list, support multiple telecom lists, add pagination for linklisteners, add database indices for better performance
20.0.1 2021-11-17 Bugfix 10.4 + 11.5 Fix linklistener tracking in some cases
20.0.0 2021-11-04 Feature 10.4 + 11.5 Add a cache layer for dashboards and pageoverview view, add a cache warmup command, add noindex,nofollow to shortener link requests
19.0.3 2021-11-04 Task 10.4 + 11.5 Adjust requirements for google-image-grabber package to allow stable configuration for minimum-stability in composer.json file
19.0.2 2021-11-03 Bugfix 10.4 + 11.5 Also find leads in list view without any pagevisits now
19.0.1 2021-11-02 Bugfix 10.4 + 11.5 Prevent exception in dashboards if TypoScript is not available in Lux backend modules (for some reason)
19.0.0 2021-10-26 Feature 10.4 + 11.5 Prepare A/B tests for EXT:luxenterprise
18.1.1 2021-10-22 Bugfix 10.4 + 11.5 Fix a typo when rendering the star icon in all lux backend modules
18.1.0 2021-10-17 Task 10.4 + 11.5 Add a "go enterprise" to backend layouts, Update input field height for bootstrap 5, Small code cleanup
18.0.0 2021-10-16 Task 10.4 + 11.5 Support TYPO3 11 (and 10) and drop support for version 9
17.7.1 2022-10-27 Bugfix 9.5 + 10.4 Backport: Find also leads without pagevisit relations
17.7.0 2022-07-12 Feature 9.5 + 10.4 Backport: Add close button to default lightbox
17.6.1 2022-07-11 Security 9.5 + 10.4 Harden SQL queries against possible SQL injection
17.6.0 2022-03-07 Feature 9.5 + 10.4 General performance update
17.5.0 2022-02-22 Bugfix 9.5 + 10.4 Backport: New cachelayer to cache HTML output from dashboards
17.4.1 2022-02-04 Bugfix 9.5 + 10.4 Fix missing constructor DI in TYPO3 9
17.4.0 2022-01-26 Feature 9.5 + 10.4 Backport: Add parameter to warmup specific caches via CLI command
17.3.0 2022-01-26 Feature 9.5 + 10.4 Backport: Show rendering time, add caching layer
17.2.3 2021-12-15 Bugfix 9.5 + 10.4 Don't include JS for lightbox twice
17.2.2 2021-12-14 Bugfix 9.5 + 10.4 Frontend toolchain updated for better usage with require.js
17.2.1 2021-11-17 Feature 9.5 + 10.4 Backport: Fix linklistener tracking in some cases
17.2.0 2021-09-26 Feature 9.5 + 10.4 Add description, createdate, author to linklisteners list and edit view for a better organisation, add creationdate and author for news list, small TCA bugfixes
17.1.2 2021-09-24 Bugfix 9.5 + 10.4 Make lightbox responsive (Workflow action content in lightbox)
17.1.1 2021-09-20 Bugfix 9.5 + 10.4 TYPO3 9 bugfix for new handler
17.1.0 !!! 2021-09-16 Feature 9.5 + 10.4 Interface added to register own IP service API, harden pagevisit model against exceptions
17.0.2 2021-09-07 Bugfix 9.5 + 10.4 Remember toggle status in page overview
17.0.1 2021-09-06 Bugfix 9.5 + 10.4 Fix queries for TYPO3 9 in page module
17.0.0 2021-09-05 Feature 9.5 + 10.4 Add a complete new page overview layout with important information to improve content.
16.0.2 2021-08-20 Task 9.5 + 10.4 Update disallowed mail providers, update documentation.
16.0.1 2021-08-20 Task 9.5 + 10.4 Adjust lux icon size in frontend for email4link lightbox to a smaller variant.
16.0.0 2021-08-16 Feature 9.5 + 10.4 Add a search view for a websearch analysis. Harden RTE default configuration.
15.3.1 2021-08-16 Bugfix 9.5 + 10.4 Fix SQL error "Expression #1 of ORDER BY clause is not in SELECT list" on some circumstances.
15.3.0 2021-08-12 Task 9.5 + 10.4 Show a "powered by Lux" in email4link if luxenterprise is not installed. Also show a "go enterprise" in page module.
15.2.2 2021-08-10 Bugfix 9.5 + 10.4 Allow more then 255 characters for pagevisit.referrer now, simplify start/endtime TCA configuration, hide searchterm table in list view.
15.2.1 2021-08-06 Bugfix 9.5 + 10.4 Add dashboard resources only if typo3/cms-dashboard is installed.
15.2.0 2021-07-27 Feature 9.5 + 10.4 Add GET param configuration for a search with extension ke_search by default in addition to solr and indexed_search.
15.1.0 2021-07-11 Feature 9.5 + 10.4 Continous integration update: Test for code quality and run unit tests on every push and pull request now.
15.0.3 2021-07-06 Task 9.5 + 10.4 Remove outdated JS function for registering third party functions that can be called after fingerprint is ready calculated.
15.0.2 2021-07-06 Bugfix 9.5 + 10.4 Fix possible exception if browser version is not readable. Fix getAnyPropertyByName() function in visitor model.
15.0.1 2021-06-30 Task 9.5 + 10.4 Manual OptIn hardened. Now it can be called multiple times (if called twice from cookie banner). See privacy documentation for a manual OptIn (with fingerprint or with localstorage).
15.0.0 2021-06-28 Feature 9.5 + 10.4 Decide if you want to use fingerprint or localstorage as basic tracking method now. Localstorage is interesting for b2c while fingerprint is more for b2b (see installation documenation).
14.4.2 2021-06-24 Bugfix 9.5 + 10.4 Show correct number of newsvisits in dashboard and news module
14.4.1 2021-06-23 Task 9.5 + 10.4 Define which error should not be logged now. Per default a bot recognition (e.g.) should not be logged.
14.4.0 2021-06-22 Feature 9.5 + 10.4 Add exception/error logging for frontend requests
14.3.2 2021-06-17 Bugfix 9.5 + 10.4 Fix possible sql exception in additional modules (news and linkclick analysis) together with SQL strict mode
14.3.1 2021-06-15 Bugfix 9.5 + 10.4 Fix possible sql exception in modules together with SQL strict mode
14.3.0 2021-06-07 Feature 9.5 + 10.4 Performance update for lead list in backend
14.2.0 2021-05-26 Feature 9.5 + 10.4 Preperation for push messages in frontend
14.1.0 2021-05-26 Feature 9.5 + 10.4 Performance update: To allow handling of more pagevisits data (in all three dashboards)
14.0.3 2021-05-12 Bugfix 9.5 + 10.4 Don't minify already minified JS (to prevent errors - e.g. with EXT:min), Really show the latest visitors in PageOverview
14.0.2 2021-05-11 Bugfix 9.5 + 10.4 Respect if EXT:news is not present. Update disallowedEmailProvider list.
14.0.1 2021-05-10 Bugfix 9.5 + 10.4 Prevent errors in log related to image grabber. Update documentation. Default status for PageOverview switched.
14.0.0 2021-05-08 Feature 9.5 + 10.4 Rework of the pageoverview layout. Now it can be shown or hidden by each editor.
13.4.2 2021-05-07 Bugfix 9.5 + 10.4 Fix TCA for linkclick records
13.4.1 2021-05-04 Task 9.5 + 10.4 Add a css class for closing icons in backend context
13.4.0 2021-05-01 Feature 9.5 + 10.4 Add two news viewhelpers that can be used now, update documentation
13.3.0 2021-04-30 Feature 9.5 + 10.4 Unify all analysis detail views now with cropped titles and with fingerprint and location values
13.2.0 2021-04-26 Feature 9.5 + 10.4 New getter for any property, Add relation to fe_users automatically, Fe_users relation command, Email4Link more general with any fields, Documentation update
13.1.0 2021-04-25 Feature 9.5 + 10.4 Show news title beside page title (if news), add relation between news- and pagevisit to save to store domain in newsvisit, small bugfix in backlink
13.0.0 2021-04-12 Feature 9.5 + 10.4 Add a complete new view to analyse news visitors (if extension news is installed)
12.0.0 2021-04-08 Feature 9.5 + 10.4 Filter by domain in analysis module now, more debugging information in browser console
11.8.0 2021-03-25 Feature 9.5 + 10.4 Show language after page title in all diagrams in backend
11.7.1 2021-03-17 Task 9.5 + 10.4 Add extension name to composer.json
11.7.0 2021-03-11 Feature 9.5 + 10.4 Show full userAgent on hover, ignore "HeadlessChrome" visits, small improvements of stopTacking function, small documentation update, bugfix on page detail view for ajax links
11.6.0 2021-03-10 Feature 9.5 + 10.4 Ignore browsers with user agent "cookieradar" - so our product (see https://www.in2code.de/produkte/cookie-managment-suite/) is not tracked any more
11.5.0 2021-03-01 Feature 9.5 + 10.4 Add new getters in fingerprint model for specific user agent properties (that can be used in workflow fluid templates)
11.4.0 2021-02-26 Feature 9.5 + 10.4 Don't add fieldlistener events to uninteresting fields (hidden, submit), update documentation FAQ
11.3.2 2021-02-16 Task 9.5 + 10.4 Updated telecommunication provider list
11.3.1 2021-02-12 Bugfix 9.5 + 10.4 Remove also related search words if a visitor gets removed
11.3.0 2021-01-28 Feature 9.5 + 10.4 Add "identified only" checkbox to lead list, add number of results to lead list, save searchterms only lowercase (for better comparing)
11.2.1 2021-01-15 Bugfix 9.5 + 10.4 Prevent exception when filtering in backend
11.2.0 2021-01-04 Feature 9.5 + 10.4 Add a configuration for auto-publishing new tags to TER, updated telecommunication provider list
11.1.0 2020-12-16 Feature 9.5 + 10.4 Add wizards for top news and top search terms to TYPO3 dashboard, better bot detection (to stop tracking)
11.0.0 2020-12-14 Feature 9.5 + 10.4 Track and show searchterms on your website now (solr or indexed search)
10.3.3 2020-12-03 Bugfix 9.5 + 10.4 Fix a copy and paste failure in TS configuration for formMapping settings
10.3.2 2020-11-26 Bugfix 9.5 + 10.4 Four different bugfixes related to backend view filtering, scoring calculation and output for "last page visit"
10.3.1 2020-11-11 Bugfix 9.5 + 10.4 Add a missing log status translation
10.3.0 2020-11-11 Feature 9.5 + 10.4 Allow a bcc setting for email4link
10.2.0 2020-11-05 Feature 9.5 + 10.4 Show complete fingerprint in debug mode in browser console. Fix randomized fingerprints in email4link function.
10.1.0 2020-10-01 Feature 9.5 + 10.4 Allow email4link without optin or with doNotTrack headers, Show helpful console outputs in debug mode.
10.0.2 2020-08-07 Bugfix 9.5 + 10.4 Fix else statements in TypoScript conditions
10.0.1 2020-08-07 Bugfix 9.5 + 10.4 Don't cache redirect view
10.0.0 2020-07-10 Feature 9.5 + 10.4 Social media performance diagram, add internal redirect service, update disallowed provider list, preperations for URL shortener (part of the enterprise version)
9.1.2 2020-06-24 Bugfix 9.5 + 10.4 Fix type for linkclick configuration in TCA and Model
9.1.1 2020-06-22 Task 9.5 + 10.4 Reduce requirements for symfony/expression-language to allow TYPO3 9 and form extension
9.1.0 2020-06-19 Feature 9.5 + 10.4 Don't track some more bots
9.0.0 2020-05-31 Feature 9.5 + 10.4 Introduce Link Listeners
8.2.2 2020-05-25 Bugfix 9.5 + 10.4 Don't create new visitor records when unneeded in additional languages, don't show empty log entry when merging visitors
8.2.1 2020-05-17 Bugfix 9.5 + 10.4 Broken table definition of the not yet needed table tx_lux_domain_model_linkclick causes some trouble on database compare
8.2.0 2020-05-13 Feature 9.5 + 10.4 Show content diagrams per hour if timeframe is maximum 1 day, Performance update for Analysis/Content/PageDetail view
8.1.1 2020-05-13 Bugfix 9.5 + 10.4 Don't track image views as downloads, Define wich log status should be shown in backend
8.1.0 2020-05-12 Feature 9.5 + 10.4 Static CSV with IP2Company list possible, Merge visitors with same fingerprint, Take oldest visitor record on duplicates
8.0.1 2020-05-11 Bugfix 9.5 + 10.4 Fix some typehint exceptions with empty filter in Analysis/Content
8.0.0 !!! 2020-05-10 Task 9.5 + 10.4 A basic UX update, store news views, languages and domains now.
7.3.0 2020-04-27 Task 9.5 + 10.4 Ignore browser version when calculating a fingerprint. Small bugfix with deleting old cookies.
7.2.3 2020-04-22 Bugfix 9.5 + 10.4 Add css class in backend modules to fix view in TYPO3 10.4.
7.2.2 2020-04-21 Bugfix 9.5 + 10.4 Change mimetypes of dynamically generated Javascript from application/javascript to text/javascript for older browsers.
7.2.1 2020-04-20 Bugfix 9.5 + 10.4 Support content in popups also with typenum in siteconfiguration (only relevant for in2code/luxenterprise). Small cleanup.
7.2.0 2020-04-17 Task 9.5 + 10.4 Update for TYPO3 10.4 LTS and it's dashboard breaking changes.
7.1.0 2020-04-03 Feature 9.5 + 10.4 Allow errorhandling in workflows and finishers now.
7.0.2 2020-04-03 Bugfix 9.5 + 10.4 In some cases fingerprints are not calculated in time: Extend time and don't track if there is an empty fingerprint.
7.0.1 2020-03-27 Bugfix 9.5 + 10.4 Version of luxletter could not detected correctly. Only relevant if lux was used with luxletter.
7.0.0 !!! 2020-03-21 Task 8.7 + 9.5 Support TYPO3 10 and new dashboard module. Don't set cookies any more. Recognize visitors by fingerprinting now. Performance update.
6.3.0 2019-09-14 Task 8.7 + 9.5 Small update of the telecommunication provider list
6.2.0 2019-08-27 Feature 8.7 + 9.5 Updated disallowed mail provider list and updated telecommunication provider list
6.1.0 2019-08-14 Feature 8.7 + 9.5 Stop tracking of google bots before records get persisted, add some new signals, small cleanup
6.0.0 2019-08-10 Feature 8.7 + 9.5 New dashboard views: Add identified leads per month, add overall statistics, Html refactoring, Don't show wrong default image for leads, New VH for luxenterprise, Documentation update
5.1.0 2019-08-08 Task 8.7 + 9.5 Performance update lead list, Keep filter, Don't show duplicates in page content, Add new task to delete a visitor by any property, Disallowed mail providers update, Cleanup tasks bugfix
5.0.0 2019-07-31 Task 8.7 + 9.5 Opt-in functionality, Luxletter support, Identification via frontend-login
4.1.2 2019-07-25 Bugfix 8.7 + 9.5 Fix email4link email sending functionality on some edge cases
4.1.1 2019-07-13 Bugfix 8.7 + 9.5 Bugfix for PHP 7.3 - Fluid errors in backend modules
4.1.0 2019-07-07 Task 8.7 + 9.5 Toggle ckeditor configuration, don't add if ckeditor is not installed, fix typo
4.0.0 2019-06-14 Task 8.7 + 9.5 Include concept of finishers, don't ask again if identified with email4download
3.0.0 !!! 2019-06-10 Task 8.7 + 9.5 Multi device tracking, form listening, show browser and os information of leads
2.5.0 2019-06-04 Task 8.7 + 9.5 Some preperations for luxenterprise
2.4.0 2019-06-03 Feature 8.7 + 9.5 Replace eos with expression-language, Add url f. workflows, doc update, php cleanup
2.3.1 2019-05-20 Bugfix 8.7 + 9.5 Show correct last visited date in lead list in backend
2.3.0 2019-04-17 Feature 8.7 + 9.5 Move client to serverside check for disallowed mail providers, small fixes
2.2.0 2019-03-07 Feature 8.7 + 9.5 Show status in extension manager settings, Show lead name of unidentified leads
2.1.0 2019-03-07 Task 8.7 + 9.5 Small cleanup, Update and use case-insensitive search in telecom provider list
2.0.3 2019-02-26 Bugfix 8.7 + 9.5 Show module action switcher in T3 9.5, remove unneeded stuff from former releases
2.0.2 2019-02-25 Bugfix 8.7 + 9.5 Small bugfix for TER uploads
2.0.1 2019-02-25 Bugfix 8.7 + 9.5 Small fixes with default values if configuration is missing
2.0.0 2019-02-24 Task 8.7 + 9.5 Publish lux as community version (without Workflows), removeAll CommandController
1.24.0 2018-11-07 Task 8.7 + 9.5 Update disallowed telecommunication provider list
1.23.0 2018-08-17 Task 8.7 + 9.5 Update disallowed mail provider and telecommunication list
1.22.0 2018-07-23 Task 8.7 + 9.5 Update disallowed mail provider list
1.21.1 2018-06-28 Task 8.7 + 9.5 Code cleanup, update telecommunication provider list, performance improvement
1.21.0 2018-06-28 Task 8.7 + 9.5 Add blacklist function for onetime-email-accounts in email4link functionality
1.20.3 2018-05-24 Task 8.7 + 9.5 Update privacy link in a new tab.
1.20.2 2018-05-24 Task 8.7 + 9.5 Small locallang update.
1.20.1 2018-05-24 Bugfix 8.7 + 9.5 Small documentation update.
1.20.0 2018-05-24 Feature 8.7 + 9.5 Bugfixes, Privacy checkbox in email4link, Manual blacklisting.
1.19.0 2018-04-24 Task 8.7 + 9.5 Documentation update. Telecommunication provider list update.
1.18.0 2018-04-21 Feature 8.7 + 9.5 Introduce summary-mails in command controller.
1.17.0 2018-04-12 Feature 8.7 + 9.5 Publish to multiple slack channels now.
1.16.1 2018-04-12 Bugfix 8.7 + 9.5 Fix for chrome select boxes in workflow module, fix filter select in content view.
1.16.0 2018-04-12 Feature 8.7 + 9.5 Show company from IP-address on different places. Add company trigger.
1.15.1 2018-04-04 Bugfix 8.7 + 9.5 Allow links in lightboxes now.
1.15.0 2018-04-04 Task 8.7 + 9.5 Add documentation, Dashboard: Show percentual values. Performance in content view.
1.14.0 2018-03-26 Bugfix 8.7 + 9.5 Small bugfixes (CKeditor Plugin, Dateformat)
1.13.2 2018-03-18 Bugfix 8.7 + 9.5 Small bugfixes.
1.13.1 2018-03-15 Bugfix 8.7 + 9.5 Small bugfixes.
1.13.0 2018-03-14 Task 8.7 + 9.5 Add css grid for dashboard. Small bugfixes.
1.12.0 2018-03-13 Feature 8.7 + 9.5 Disable tracking if be-user is logged in. Small bugfixes.
1.11.0 2018-03-12 Feature 8.7 + 9.5 Some privace features. Some brush up. Add contextual content plugin.
1.10.0 2018-03-10 Task 8.7 + 9.5 Some small improvements. Add a opt-out plugin.
1.9.0 2018-03-08 Task 8.7 + 9.5 Some changes to see categoryscorings.
1.8.0 2018-03-07 Feature 8.7 + 9.5 Optical refactoring of pageoverview. Bugfix in category scoring.
1.7.0 2018-03-07 Feature 8.7 + 9.5 Add identified trigger and slack action.
1.6.0 2018-03-06 Task 8.7 + 9.5 Add categoryscoring. Bugfix: Don't track downloads with email4link twice.
1.5.1 2018-03-05 Bugfix 8.7 + 9.5 Prevent exception in backend.
1.5.0 2018-03-05 Task 8.7 + 9.5 Finish workflow modules with initial triggers/actions. Small bugfixes.
1.4.0 2018-03-04 Task 8.7 + 9.5 Split backend modules, add content analysis, integrate nearly complete workflow
1.3.0 2018-03-02 Task 8.7 + 9.5 Don't show full download path in frontend with email4download
1.2.0 2018-03-01 Task 8.7 + 9.5 Some small fixes in backend analysis show identified and recurring.
1.1.1 2018-02-27 Bugfix 8.7 + 9.5 Some small fixes in backend analysis and email4link functionality.
1.1.0 2018-02-26 Task 8.7 + 9.5 Show more relevant information in detail view. Small fixes.
1.0.1 2018-02-26 Bugfix 8.7 + 9.5 Fix some smaller bugs that occurs with live data
1.0.0 2018-02-26 Task 8.7 + 9.5 Initial Release with a stable tracking, identification and analyses

Breaking changes and useful information !!! 

Double check if you have cleared all caches after installing a new LUX version to be sure to have no side effects.

Version Situation Upgrade instructions
From former versions to 40.0.0 Email4link mails are using styled FluidEmail now New template files (HTML+TXT) are introduced for the email4link mails. Those templates must be updated. In addition: If you didn't change the mail layout yet, email4link mails are styled in TYPO3-layout by default. See update instructions below for more details.
From former versions to 37.0.0 IP-address will be used for creating fingerprint hashes There is nothing to do for your, just a note that old fingerprints may not be recognized any more because we added IP-address to the fingerprint hash to be more unique now
From former versions to 36.5.0 Typo in extension configuration Changed option from enbaleExceptionLogging to enableExceptionLogging if you turned on exception logging, you have to update your configuration
From former versions to 35.0.0 Multiclient usage on some records need some time to work Nothing to do for you - just a note: Some records have to be extended with site information, but this can only be done with new records - not with existing (affected tables: Logs, Search, Fingerprint and some boxes on Lead Dashboard). To ensure that privacy is guaranteed, you need to remove all existing LUX data in a multiclient environment.
From former versions to 35.0.0 Define storage pid for editors (linklistener, shortener, utmgenerator) Records of different tables (tx_lux_domain_model_linklistener, tx_luxenterprise_domain_model_shortener, tx_luxenterprise_domain_model_utmgenerator_uri) can be stored on different pids depending on the backend user - see Editors configuration for details.
From former versions to 35.0.0 Add sites data to existing records to allow multiclient usage Run upgrade wizard addSitesUpgradeWizard to add site information on various tables. Recommendation: We strongly recommend you to run the wizard on CLI to prevent timeouts on larger databases.
From former versions to 35.0.0 Modify relations between visitor and fingerprint table for a better performance Run upgrade wizard updateFingerprintRelationsUpgradeWizard to improve relations. Recommendation: We strongly recommend you to run the wizard on CLI to prevent timeouts on larger databases.
From former versions to 32.0.0 Old Flashmessages could be visible in backend views after update Nothing to do or to worry about. In the past there were flashmessages like "lead deleted" stored to a backend editor, but there was no output. If you upgrade now to LUX 32 it could happen that all old flashmessages are visible for the editors. Once those messages are shown, they will be deleted - everything is fine again after a reload or switch to a different view.
From former versions to 28.0.0 Email4link HTML template via AJAX - overwrite Email4link.html If you have modified the Email4Link.html, this is now done in a similar way. 1. You have to set a template path to your sitepackage like plugin.tx_lux_email4link.view.templateRootPaths.1 = EXT:mysitepackage/Resources/Private/Templates/Extensions/Lux/ 2. Copy the original file from EXT:lux/Resources/Private/Templates/Frontend/Email4link.html to your sitepackage in EXT:mysitepackage/Resources/Private/Templates/Extensions/Lux/Frontend/Email4link.html and modify it to your needs. Please keep in mind that the filename has changed from Email4Link.html to Email4link.html (lowercase 'l' character)
From former versions to 28.0.0 Email4link HTML template via AJAX - set privacy PID If you used TypoScript settings for setting a privacy PID instead of TypoScript constants, the place has changed. Privacy PID can be set in TypoScript setup via luxEmail4LinkAjax.10.settings.pidPrivacyPage = 123
From former versions to 28.0.0 Email4link HTML template via AJAX - typenum in site configuration You should extend your siteconfiguration under routeEnhancers.PageTypeSuffix.map with typenum 1680114177 and (e.g.) email4link.json
From former versions to 27.0.0 JS loading changed a bit While JS was loaded via page.includeJSFooter.lux in the past, now page.includeJSFooterlibs.lux is used. If you removed JS including, you have to update your TypoScript.
From former versions to 27.0.0 CKeditor plugin js folder changed for TYPO3 11 While TYPO3 12 is using CKeditor 5 (instead of 4) we need 2 different JS Folders for the email4link functionality. Adjust your CKeditor configuration from resource: 'EXT:lux/Resources/Public/JavaScript/Static/CkEditorPlugins/luxEmail4Link/plugin.js' to resource: 'EXT:lux/Resources/Public/JavaScript/Static/CkEditorPlugins/luxEmail4LinkOld/plugin.js'
From former versions to 26.10.0 IP-address will be used for creating fingerprint hashes There is nothing to do for your, just a note that old fingerprints may not be recognized any more because we added IP-address to the fingerprint hash to be more unique now
From former versions to 26.2.0 Name of localStorage settings changed Nothing to code, but maybe you have to adjust your privacy note: Local storage settings luxTrackingOptOut + luxTrackingOptIn were removed. A new name is given luxTracking
From former versions to 23.0.0 Signals are migrated to PSR-14 events If you have extended LUX via slots (based in signals), you have to migrate your slots to eventlisteners - see Events documentation for details
From former versions to 21.0.0 Small change: Marker names in email4link template changed If you have overwritten the Email4Link template file, take care to use the "EMAIL4LINK_" prefix now for the 3 variables/markers (###TITLE### => ###EMAIL4LINK_TITLE###)
From former versions to 17.1.0 Small change: Disable IP-API.com via Typoscript now If you turned off connection to IP-API.com via extension manager settings, you have to do this now via TypoScript - see documentation
From former versions to 8.x Referrers are stored on a different place now Call your TYPO3 upgrade wizard. There will be one more step that will copy values from _visitor.referrer to _pagevisit.referrer table.
From former versions to 7.x Cookie-Table was replaced with a Fingerprint-Table Call your TYPO3 upgrade wizard. There will be one more step that will copy values from _idcookie to _fingerprint table. Note that CommandControllers are replaced by Symfony Commands!
From former versions to 3.x The visitor object can handle more cookies now After updating use the update button in extension manager of if you have a lot of data stored, you can also use the LuxUpdateCommandController to prevent timeouts

Update instruction 

From former versions to 40.0.0 

Before this version, the path to the email template and subject was defined in TypoScript. Now, you have to define the template in your ext_localconf.php file of your sitepackage like:

// Number must be higher then 1762935800
$GLOBALS['TYPO3_CONF_VARS']['MAIL']['templateRootPaths'][1762935801] = 'EXT:sitepackage/Resources/Private/Templates/Mail/';
Copied!

After that you can copy the exixting files Email4Link.html and Email4Link.txt (yes, plaintext is now supported) from EXT:lux/Resources/Private/Templates/Mail/ to the new path of your sitepackage and modify it to your needs.

Subject is defined in the template files - example Email4Link.html file:

<f:layout name="SystemEmail" />

<f:section name="Subject">
    Your subject
</f:section>

<f:section name="Main">
    <h2>Your whitepaper</h2>

    <p>
        We’ve attached the requested whitepaper to this message.
        <f:if condition="{file}">
            Alternatively, you can <f:link.typolink parameter="{file.publicUrl}" absolute="1">download it directly</f:link.typolink>.
        </f:if>
    </p>

    <p>
        --<br /><br />

        John Doe<br />
        Marketing
    </p>
</f:section>
Copied!

If you also want to change the wrapping layout of your mails in general, you could do it like: $GLOBALS['TYPO3_CONF_VARS']['MAIL']['layoutRootPaths'][1762935801] = 'EXT:sitepackage/Resources/Private/Layouts/Mail/'; After that you need to copy files SystemEmail.* from TYPO3 to the new path and update the files.

Note: Old TypoScript setup related to template and subject can be removed

lib.lux.settings {
  identification {
    email4link {
      mail {
        mailTemplate = old definition...
        subject = old subject...
      }
    }
  }
}
Copied!

LUX LUX

Symfony Commands (Scheduler Tasks) 

This part of the documentation shows you all available Commands in Lux.

Most of the Commands can be called via CLI or via Scheduler Backend Module (directly or via cronjob).

Overview

  • Data protection

    • Anonymize leads (e.g. for local development)
    • Demo data (truncate all leads and add some demonstration records)
  • Cleanup commands (to really erase data from database)

    • Remove all visitors
    • Remove all visitors by age
    • Remove unknown visitors by age
    • Remove a defined visitor by uid
    • Remove visitors by a given property
  • Lead commands to get a summary mail for your sales team

    • Send an overall summary
    • Send a summary mail with known companies
    • Send a summary mail by a lux category
  • Service commands

    • Calculate scoring for all leads
    • Cache warmup for cache layer
    • Execute delayed workflow actions

Anonymize Leads Command 

\In2code\Lux\Command\LuxAnonymizeCommand 

Will anonymous all recorded data related to Lux in your database. This is only a function if you want to present your Lux information to others. Because this function cannot be reverted, please do this only on test systems.

Note: This Command can be started from CLI only (not from Scheduler).

Example usage:

./vendor/bin/typo3 lux:anonymize
Copied!
\In2code\Luxenterprise\Command\LuxDemoDataCommand 

This command truncates all visitor data and adds a couble of demo visitors for presentations

Example usage:

./vendor/bin/typo3 lux:demodata
Copied!

Cleanup Commands 

\In2code\Lux\Command\LuxCleanupAllVisitorsCommand 

Removes all visitors by truncating all lux tables. Can be used for some kind of content updates to a development server.

Example usage:

./vendor/bin/typo3 lux:cleanupAllVisitors
Copied!
\In2code\Lux\Command\LuxCleanupVisitorsByAgeCommand 

Removes all visitors (identified and anonymous) where the last visit is older then the given Timestamp (in seconds). Remove means in this case not deleted=1 but really remove from database.

Example usage:

# Remove unknown visitors (and all there related data) older than the given timestamp
# (1640995200 = 2022/01/01 00:00)
./vendor/bin/typo3 lux:cleanupVisitorsByAge 1640995200
Copied!
\In2code\Lux\Command\LuxCleanupUnknownVisitorsByAgeCommand 

Removes not identified visitors where the last visit is older then the given Timestamp (in seconds). Remove means in this case not deleted=1 but really remove from database.

Example usage:

# Remove unknown visitors (and all there related data) older than the given timestamp
# (1640995200 = 2022/01/01 00:00)
/vendor/bin/typo3 lux:cleanupUnknownVisitorsByAge 1640995200
Copied!
\In2code\Lux\Command\LuxCleanupVisitorByUidCommand 

Removes a single visitor (identified or anonymous) by a given uid. Remove means in this case not deleted=1 but really remove from database.

Example usage:

# Remove visitors (and all there related data) with uid=123
/vendor/bin/typo3 lux:cleanupVisitorByUid 123
Copied!
\In2code\Lux\Command\LuxCleanupVisitorsByPropertyCommand 

Removes visitors by given attributes (identified or anonymous). Could be used to remove e.g. bots from your system from time to time.

Example usage:

# Remove visitor by email address (1 = exact match)
./vendor/bin/typo3 lux:cleanupVisitorsByProperty email name@mail.org 1

# Remove visitors with userAgents "Googlebot" (0 = like)
./vendor/bin/typo3 lux:cleanupVisitorsByProperty fingerprints.userAgent Googlebot 0

# Remove visitors with referrer from a testdomain (0 = like)
./vendor/bin/typo3 lux:cleanupVisitorsByProperty pagevisits.referrer "test.in2code.de" 0
Copied!

Lead Commands 

All commands in this class allows you to frequently receive a summary of leads via email (e.g. for your sales team).

\In2code\Lux\Command\LuxLeadSendSummaryCommand 

To get all leads: You can specify the receiver email addresses, the timeframe in which you are interested (e.g. "give me all leads of the last 24h"), if lux should send you only identified leads and a minimum scoring.

Example usage:

# Send a summary email within the last week (604800 seconds) to 2 email addresses but only identified leads with a minimum scoring of 10
./vendor/bin/typo3 lux:leadSendSummary alex@mail.org,alex2@mail.org 604800 1 10
Copied!
\In2code\Lux\Command\LuxLeadSendSummaryOfLuxCategoryCommand 

To get all leads of a lux category: You can specify the receiver email addresses, the timeframe in which you are interested (e.g. "give me all leads of the last 24h"), if lux should send you only identified leads and a scoring of a category must be higher then 0.

Example usage:

# Send a summary email within the last week (604800 seconds) to an email address but only identified leads with any scoring in category 123
./vendor/bin/typo3 lux:leadSendSummaryOfLuxCategory alex@mail.org 604800 1 123
Copied!
\In2code\Lux\Command\LuxLeadSendSummaryOfKnownCompaniesCommand 

To get all leads and companies (even anonymous): You can specify the receiver email addresses, the timeframe in which you are interested (e.g. "give me all leads of the last 24h"), a minimum scoring and if there must be a scoring in a lux category (higher then 0).

Example usage:

# Send a summary email within the last week (604800 seconds) to an email address even with unidentified leads with any scoring in category 123
./vendor/bin/typo3 lux:leadSendSummaryOfKnownCompanies alex@mail.org 604800 0 123
Copied!

Example summary mail for sales with activities of identified and unknown leads of a given timeframe (e.g. the last day):

Service Commands 

\In2code\Lux\Command\LuxServiceRecalculateScoringCommand 

This command will calculate the scoring of all leads. Normally used if the calculation changes or if you are using the variable lastVisitDaysAgo in Extension Manager configuration of the extension Lux. In the last case it's recommended to run the calculation once per night.

Example usage:

./vendor/bin/typo3 lux:serviceRecalculateScoring
Copied!
\In2code\Lux\Command\LuxAutorelateToFrontendUsersCommand 

If you have frontenduser records with email addresses, you can create relations between visitor and fe_users records

Example usage:

./vendor/bin/typo3 lux:autorelateToFrontendUsers
Copied!
\In2code\Lux\Command\LuxCacheWarmupCommand 

If you are using a cache layer for some views (must be turned on in general extension configuration), you can warm up those caches via this command.

Example usage:

./vendor/bin/typo3 lux:cachewarmup

# Warmup specific views
./vendor/bin/typo3 lux:cachewarmup lux_LuxAnalysis,lux_LuxLead
Copied!

Note: Every call of this command will clean all LUX cachelayer caches at the beginning of the task. Note2: This command can only be executed from CLI only

\In2code\Luxenterprise\Command\LuxWorkflowActionDelayCommand 

Only for luxenterprise: This command executes delayed workflow actions - like emails or sms that should be send some days later.

Example usage:

./vendor/bin/typo3 lux:workflowactiondelay
Copied!

LUX LUX

Settings for editors 

While administrators have access to all data in LUX and LUXenterprise, editors have only limited access to guarantee privacy in a multiclient installation.

Access per Site 

Data is recorded now with site identifiers. This ensures to split information by site identifiers. If an editor needs access to LUX data in a site, take care that this user has reading access to the root page of a site.

This means, that if an editor needs access to all LUX data, ensure that this editor has reading access to all root pages.

Access to categories 

Basically there are three different category types that are used in LUX:

  • Category Scoring is calculated on page access or downloads
  • Company Categories are used to segment companies (Wiredmind integration into LUX)
  • Workflow Categories are used to group workflows for a better management (Part of LUXenterprise)

Take care that your editors have reading access to the page where relevant categories are stored.

Storage PID for linklistener, shortener and utm generator records 

Since version 35.0.0 you can define where to store those types of records depending on the backend user. There is now more flexibility via User TSConfig (in backend user or backend usergroup records):

tx_lux {
    defaultPage {
        tx_lux_domain_model_linklistener = 1
        tx_luxenterprise_domain_model_shortener = 2
        tx_luxenterprise_domain_model_utmgenerator_uri = 3
    }
}
Copied!

LUX LUX

Events (PSR-14) 

Lux offers a lot of EventDispatchers - a technique to hook into Lux runtime with your extension to extend the existing functionality. Contact us if you need further events.

List of events 

Dispatcher located in Event Name Description
AttributeTracker::addAttribute() \In2code\Lux\Events\AttributeCreateEvent This event can be used when an attribute is added to a visitor
AttributeTracker::addAttribute() \In2code\Lux\Events\Log\LogVisitorIdentifiedByFieldlisteningEvent Do something when a visitor was just identified by method "Fieldlistening"
AttributeTracker::addAttribute() \In2code\Lux\Events\Log\LogVisitorIdentifiedByFormlisteningEvent Do something when a visitor was just identified by method "Formlistening"
AttributeTracker::addAttribute() \In2code\Lux\Events\Log\LogVisitorIdentifiedByEmail4linkEvent Do something when a visitor was just identified by method "Email4link"
AttributeTracker::addAttribute() \In2code\Lux\Events\Log\LogVisitorIdentifiedByLuxletterlinkEvent Do something when a visitor was just identified by method "Luxletterlink"
AttributeTracker::addAttribute() \In2code\Lux\Events\Log\LogVisitorIdentifiedByFrontendauthenticationEvent Do something when a visitor was just identified by method "Frontendauthentication"
EventTracker::track() \In2code\Lux\Events\Log\EventTrackerEvent Hook into pushes for event tracks
AttributeTracker::getAndUpdateAttributeFromDatabase() \In2code\Lux\Events\AttributeOverwriteEvent This event can be used when an attribute of a visitor is updated
DownloadTracker::addDownload() \In2code\Lux\Events\Log\DownloadEvent This event can be used when a visitor downloads a file
FrontendController::afterAction() \In2code\Lux\Events\AfterTrackingEvent This event is used for every kind of frontend/tracking/ajax request in the Frontend Controller
FrontendController::getError() \In2code\Lux\Events\AfterTrackingEvent Same as afterAction() but called when an error came up while tracking
LinkClickTracker::addLinkClick() \In2code\Lux\Events\Log\LinkClickEvent This event can be used when a linkclick is tracked from LUX
NewsTracker::track() \In2code\Lux\Events\NewsTrackerEvent This event can be used when a news visit is tracked from LUX
PageTracker::trackPage() \In2code\Lux\Events\PageTrackerEvent This event can be used when a pagevisit is tracked from LUX
Readable::__construct \In2code\Lux\Events\ReadableReferrersEvent This event can be used to extend the readable referrer list
SearchTracker::track() \In2code\Lux\Events\Log\SearchEvent This event can be used when a visitor searches with a searchterm that would be tracked from LUX
SendAssetEmail4LinkService::sendMail() \In2code\Lux\Events\Log\LogEmail4linkSendEmailEvent This event can be used when email4link function sends an email to the visitor
SendAssetEmail4LinkService::sendMail() \In2code\Lux\Events\Log\LogEmail4linkSendEmailFailedEvent This event can be used when email4link function fails to send an email to the visitor (e.g. file is not allowed, file is not existing, etc...)
SendAssetEmail4LinkService::send() \In2code\Lux\Events\SetAssetEmail4LinkEvent This event can be used to manipulate the MailMessage object just before sending email4link mail
VisitorFactory::__construct() \In2code\Lux\Events\StopAnyProcessBeforePersistenceEvent This event can be used to stop the persistence process by throwing an exception (e.g. if a UserAgent does not fit, etc...)
VisitorFactory::getVisitor() \In2code\Lux\Events\VisitorFactoryBeforeCreateNewEvent This event can be used just before a new visitor object will be build
VisitorFactory::getVisitor() \In2code\Lux\Events\VisitorFactoryAfterCreateNewEvent This event can be used just after a new visitor object was build
VisitorFactory::createNewVisitor() \In2code\Lux\Events\Log\LogVisitorEvent This event can be used when a new visitor is persisted
VisitorMergeService::merge() \In2code\Lux\Events\VisitorsMergeEvent This event can be used when visitors were merged (re-identified)

Usage of SignalSlots in your extension 

Look at the official documentation how to work with PSR-14 events in TYPO3 in general: https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/Events/EventDispatcher/Index.html

Note: Sometimes it's easier to use a finisher instead of dealing with events (see Finisher)

LUX LUX

FAQ 

How can I identify visitors? 

Basicly there are 5 different ways at the moment:

  • Use fieldMapping to map single fields of any forms on your website and animate visitors to fill out those fields
  • Use formMapping to map complete forms on your website and animate visitors to fill out those forms
  • Use email4link feature in CKEditor and offer whitepapers or other links and get the visitors email address
  • If a user logs in into your TYPO3 frontend
  • If a newsletter receiver opens a link from the newsletter (needs free extension luxletter)

see Identification for more information.

How to track downloads with an extension like fal_securedownload or secure_downloads 

LUX automatically tracks downloadable files (if file extensions are properly configured in TypoScript setup) even if those files are related anywhere else then on the own website. Nevertheless, we need to have real filenames to download (like filename.pdf). So we would recommend to use the extension fal_protect. This extension allows to set permissions on files within file storages (like fileadmin) but doesn't replace the URL.

Debugging in JavaScript or why is Lux not working? 

There is a debug output in browser console. This is helpful to find problems with lux on your website. E.g. it shows if tracking is disabled and why. In addition fingerprint values are shown.

Two possibilities to turn on debug mode:

  • Add a new cookie in your browser console (e.g. by clicking + at tab web storage in Firefox) with name ENABLELUXDEBUG and any value (e.g. 1)
  • Simply add the string ENABLELUXDEBUG anywhere on your website

How to enable tracking even if I'm logged in into backend? 

With a single line of TypoScript constants: plugin.tx_lux.settings.disableTrackingForBackendUsers = 0

I change lib.lux.settings but nothing happens? 

If you change/overwrite lib.lux, it is maybe not recognized in lux itself. This is caused by building a lib object in lux and copying to plugin.tx_lux_fe and other parts before your sitepackage is included. If you want to change also plugin.tx_lux_fe and other parts, you also have to copy your settings like described below.

Example TypoScript setup in your sitepackage:

lib.lux.settings {
    identification {
        # Define your own fieldmapping configuration
        _enable = 1
        fieldMapping {
            email {
                0 = *[email]
                1 = *[e-mail]
            }
        }

        # Define your own email4link configuration
        email4link.mail {
            _enable = 1
            fromName = Service
            fromEmail = service@yourcompany.com
            bccEmail = bcc@yourcompany.com
        }
    }

    # Define your own workflow configuration (part of luxenterprise)
    workflow.actions.6.configuration.1 {
        name = Slack Channel "_leads"
        webhookUrl = https://hooks.slack.com/services/X0287F3BJ/A9JJE587Y/rKIXTPbVEVnIPPNUQxFb98RO
        emoji =
    }
}

# Frontend functionality
plugin.tx_lux_fe.settings < lib.lux.settings

# Backend module
module.tx_lux.settings < lib.lux.settings

# Take care of your fieldMapping and formFieldMapping configuration
luxConfigurationFieldIdentification.10.settings < lib.lux.settings
luxConfigurationFormIdentification.10.settings < lib.lux.settings
Copied!

CKEditor seems to be broken 

Per default LUX ships a configuration in YAML for CKEditor configuration to enable email4link feature. This should help even beginners to make this feature work. Nevertheless this configuration can break your individual configuration for the RTE. You can simply disable the configuration from LUX via Extension Manager configuration.

Lux does not work - any hints? 

  • Did you clean all caches after installation (in Install Tool)?
  • Please use a second browser (where you are not logged in into backend) for your tests (or enable tracking for BE-users via TypoScript)
  • Please check if your browser does not use the doNotTrack settings (FireFox anonymous tab automaticly turns this function on)
  • Please check if there is no local storage value false for entry luxTracking in your browser

How to add own workflow triggers? 

This is very simple - see Workflows for more information.

How to add own workflow actions? 

This is very simple - see Workflows for more information.

How can I remove the annoying google bot from lux? 

There is a cleanup command controller that can be used for this kind of task.

Example CLI call:

./vendor/bin/typo3cms luxcleanup:removevisitorbyproperty fingerprints.userAgent Googlebot 0
Copied!

See ../CommandController/Index for more information.

How to use opt-in instead of opt-out for cookies on my website? 

If you want to use opt-in instead of opt-out functionality, there is a possibility for this - see Privacy for more information.

How to increase performance? 

All data is stored on your server. The upside is quite clear in time of GDPR/DSGVO: You don't have to pass data to third party companies. The downside could be, that a lot of data is stored within your TYPO3 database. There a some possibilities to increase performance.

2. Turn on caches for dashboards and page overview view 

We added a caching layer that, can speedup dashboard times with factor 100. Just turn it on in extension configuration. Of course there is a comand that helps you to warmup caches (e.g. 1 time per night).

3. Clean outdated data from time to time 

Remove all visitor data that is older then three years:

./vendor/bin/typo3 lux:cleanupVisitorsByAge 94608000

Remove only unknown visitors and their data that is older then one year:

./vendor/bin/typo3 lux:cleanupUnknownVisitorsByAge 31536000

4. memory_limit and max_execution_time in Apache settings 

Depending on the settings of your server it could happen that some backend modules are crashing when open it. While it is best practice to keep Apache settings for memory_limit and max_execution_time quite small to prevent unneeded load in frontend, it would be nice to have some higher settings for all backend requests. A possible solution for such a scenario would be to use PHP FPM and different domains for backend and frontend. So https://backend.yourdomain.org could have a (e.g.) memory_limit of 512M and a max_execution_time of 120.

5. Extract lux data into a different database 

Untested In TYPO3 you have the possibility to separate tables into different databases like:

<?php
$GLOBALS['TYPO3_CONF_VARS']['DB']['Connections'] = [
    'Default' => [
        'charset' => 'utf8',
        'driver' => 'mysqli',
        'dbname' => 'typo3',
        'host' => '127.0.0.1',
        'user' => 'typo3',
        'password' => 'anypassword'
    ],
    'Lux' => [
        'charset' => 'utf8',
        'driver' => 'mysqli',
        'dbname' => 'typo3lux',
        'host' => '127.0.0.1',
        'user' => 'typo3lux',
        'password' => 'anypassword'
    ],
];
$GLOBALS['TYPO3_CONF_VARS']['DB']['TableMapping'] = [
      'tx_lux_domain_model_visitor' => 'Lux',
      'tx_lux_domain_model_fingerprint' => 'Lux',
      'tx_lux_domain_model_attribute' => 'Lux',
      'tx_lux_domain_model_pagevisit' => 'Lux',
      'tx_lux_domain_model_ipinformation' => 'Lux',
      'tx_lux_domain_model_download' => 'Lux',
      'tx_lux_domain_model_categoryscoring' => 'Lux',
      'tx_lux_domain_model_log' => 'Lux'
];
Copied!

6. Help from in2code 

We offer help for users with in2code/luxenterprise. Just call us.

AJAX requests don't work as expectded 

TypeNum declaration in site configuration 

If you define any type-parameters in your site configuration, you have to define also all types for lux:

Type Explanation Extension
1518815717 Pagevisit request in2code/lux
1517985223 Fieldmapping configuration in JavaScript in2code/lux
1560095529 Formmapping configuration in JavaScript in2code/lux
1680114177 Email4link template file in2code/lux
1591948099 Url shortener in2code/luxenterprise
1520192598 Render content in a lightbox in2code/luxenterprise
1560175278 Render content via AJAX in2code/luxenterprise
1520796480 Render content via contextual content plugin in2code/luxenterprise
1634676765 Needed for A/B testing in2code/luxenterprise
1639660481 Linkhandler typolink configuration in2code/luxenterprise
1650897821 API of luxenterprise in2code/luxenterprise

Example configuration:

...
rootPageId: 1
routes:
  -
    route: robots.txt
    type: staticText
    content: "Disallow: /typo3/\r\n"
routeEnhancers:
  PageTypeSuffix:
    type: PageType
    default: /
    index: ''
    suffix: /
    map:
      pagevisit.json: 1518815717
      fieldmapping.js: 1517985223
      formmapping.js: 1560095529
      email4link.json: 1680114177
      redirect.php: 1591948099
      contentLightbox.html: 1520192598
      contentAjax.html: 1560175278
      contentContextualContent.html: 1520796480
      abtesting.html: 1634676765
      resolveTypolink.json: 1639660481
      leadapi.json: 1650897821
...
Copied!

How to track accordion opens or other content changes without page reload? 

Page visits will be automatically be tracked with LUX on normal TYPO3 pages. In some rare scenarios you may want to push an event after an interaction to LUX. This can be helpful if you want to track accordion opens, multistep forms or other content changes without page reload and without a different URL. You can simply push such a visit via JavaScript:

const lux = LuxSingleton.getInstance();
lux.push('accordion 1 just opened', 'eventTrackRequest');
Copied!

How to switch off the extension? 

If you want to turn off the frontend functionality (e.g. in case of DoS attacks...), you could use TypoScript constants:

# All frontend functionalities can be toggled for testing or against flooding
plugin.tx_lux.settings.enableFrontendController = 0
Copied!

LUX LUX

Finisher 

This part of the manual describes how you can add own finishers to lux.

A finisher is a technique to start some individual magic after lux has done anything like tracking a pagerequest or identifying a lead. It's a bit like a workflow (part of EXT:luxenterprise) but it cannot be configured by an editor. Finishers are configured by TypoScript and PHP.

An usual example for a finisher is if you want to send some lead-data to a third-party-software like a CRM (salesforce, etc...).

TypoScript Configuration 

You can extend lux with own finishers with just some lines of TypoScript:

lib.lux.settings {
    # Add finishers classes for your own actions (e.g. pass values to a third party tool like a crm)
    finisher {

        # Example: Send an email to me if a visitor gets identified
        100 {
            class = Vendor\Luxextension\Domain\Finisher\SendNotificationEmailFinisher
            configuration {
                receiver = my@email.org
                subject = New visitor just identified on domain.org
            }
        }
    }
}
Copied!

Note: Take care that your lib.lux configuration is recognized by lux (see FAQ section how to copy it to plugin.tx_lux_fe)

A small PHP file will do the trick for you:

<?php
declare(strict_types=1);
namespace Vendor\Luxextension\Domain\Finisher;

use In2code\Lux\Domain\Finisher\AbstractFinisher;
use In2code\Lux\Domain\Finisher\FinisherInterface;

/**
 * Class SendNotificationEmailFinisher
 */
class SendNotificationEmailFinisher extends AbstractFinisher implements FinisherInterface
{
    /**
     * Decide if start() should be called or not by returning a boolean value
     *
     * @return bool
     */
    public function shouldFinisherRun(): bool
    {
        return $this->getVisitor()->isIdentified();
    }

    /**
     * Function start() is called if shouldFinisherRun() returns true.
     *
     * @return array Could handle instructions for the frontend (opening popups, etc...). Empty for backend logic only.
     */
    public function start(): array
    {
        mail(
            $this->getConfigurationByKey('receiver'),
            $this->getConfigurationByKey('subject'),
            'New visitor identified: ' . $this->getVisitor()->getEmail()
        );
        return [];
    }
}

Copied!

Your PHP finisher class must implement FinisherInterface and should extend the AbstractFinisher. Last class offers you useful methods like $this->getVisitor(), $this->getConfigurationByKey(), $this->getConfigurationByPath() or $this->getEvent() can help you to get useful information.

Your class must have a start() function where your logic is implemented. The method shouldFinisherRun() is optional and if you don't add this to your finisher, it will return true by default.

Because there are some actions that are called in lux, you can decide which of this action should start your finisher by setting the class property $startWithControllerActions (look at AbstractFinisher.php for some examples).

Now, feel free to extend Lux for your needs.

LUX LUX

Identification 

This part of the documentation describes different possibilities to identify your leads. Identification means that you are able to know the person behind the lead. And this needs a unique identification-property from the lead. E.g. firstname would be - of course - not a good property because this is not unique. Marketing Automation tools are going to use the email-address as unique property of the user. And... emails are great because, you can:

  • identify the lead
  • see the firstname as part of the email address (mostly given in business cases)
  • see the lastname as part of the email address (mostly given in business cases)
  • see the company as part of the email address (mostly given in business cases)
  • having an url (company) where you can simply find more interesting stuff of your lead
  • send marketing relevant information in newsletters

So, if email-addresses are great, and we want to collect the email from our unknown leads - how can we do this? The answer is simple: We have to deal a bit with our visitors. Let them download an interesting asset (e.g. a whitepaper) but ask for their email address first. Another way would be to offer a callback-form where you offer to call the visitor - also ask for the email address here. Is there a form, where the visitor can get access to a software? You guessed it, ask for the email address.

Going back to the technical part - forms will help us on lead identification.

The possibilities to identify a lead in lux:

  • Identify via field mapping configuration (any single form field in TYPO3)
  • Identify via form mapping configuration (any form in TYPO3)
  • Identify via Email4link CKEditor plugin
  • Identify via Frontend login
  • Identify via Luxletter extension

1. Field mapping 

The easiest way for an identification is to offer some forms on your website where you listen to the values that your visitors add there. Lux will help you to listen on any webform (no matter if it is powermail, femanager, form, formhandler, felogin or a static html content). The technique behind is simple. You can map field names to lead properties via TypoScript.

The default mapping will e.g. map a field with name tx_powermail_pi1[field][e-mail] to the lead property email (see TypoScript below).

lib.lux.settings {

    # All identification settings
    identification {
        # En- or Disable field and form identification
        _enable = {$plugin.tx_lux.settings.fieldandformidentification}

        # Auto identify with EVERY input field of your website.
        # Disabled for forms with [data-lux-form-identification] and also disabled for fields with [data-lux-disable]
        # Using a * as wildcard will search for a string in a string while using a key without * will search for the exact match.
        fieldMapping {
            # "email" is the key-field for visitor identification and merging.
            email {
                0 = *[email]
                1 = *[e-mail]
                2 = *[e_mail]
            }
            firstname {
                0 = *[firstname]
                1 = *[first-name]
                2 = *[first_name]
                3 = *[firstName]
                4 = *[vorname]
            }
            lastname {
                0 = *[lastname]
                1 = *[last-name]
                2 = *[last_name]
                3 = *[lastName]
                4 = *[surname]
                5 = *[sur-name]
                6 = *[sur_name]
                7 = *[name]
                8 = *[nachname]
            }
            company {
                0 = *[company]
                1 = *[firma]
            }
            phone {
                0 = *[phone]
                1 = *[telefon]
                2 = *[tel]
            }
            username {
                0 = username
                1 = user
                2 = benutzername
                3 = benutze
            }
        }
    }
}

Copied!

Note: Take care that your lib.lux configuration is recognized by lux (see FAQ section how to copy it to plugin.tx_lux_fe)

You can test the field mapping by adding a simple form to your frontend. Open a second browser and fill out the form. As soon as you enter an email and leave the field (on blur), the values are sent asynchronical to Lux. You don't have to submit the form. Just go into the backend and check if the lead gets identified.

Note: Password fields are ignored for this function

Example powermail form in frontend:

Example lead identification in dashboard:

Note: Re-Initialization for forms, loaded via AJAX can also be done with a script like:

const lux = LuxSingleton.getInstance();
lux.addFieldListeners();
Copied!

2. FormFieldMapping 

Another way for identifications is to listen to complete form submits of any forms on your website. If you want to send all field information of a form to lux, just add a data-lux-form-identification attribute to the form-tag itself. See table for data-attribute value:

Field Description Explanation
data-lux-form-identification="true" Catch submit, track values and do a form.submit() at the end Default usage
data-lux-form-identification="submitButton" Catch submit, track values and do a lastSubmitButton.click() at the end Important if submit button click is needed (e.g. for "typo3/cms-form")
data-lux-form-identification="preventDefault" Catch submit, track values and don't submit When you don't need a submit (e.g. for LUXenterprise workflows)

There some different things when comparing FormFieldMappinng with FieldMapping (see above):

  • The data will be sent to lux when the visitor submits the form and not before
  • The complete form will be sent to lux (but only the fields that are defined in mapping configuration)
  • You have to change the markup of the forms with a data-attribute to the form tag

The default field-mapping is similar to the FieldMapping: E.g. map a field with name tx_form_formframework[e-mail] to the lead property email (see TypoScript below).

Note: A * as wildcard character symbols a placeholder for any string so *[email] is matching for fieldnames like tx_form_formframework[test-99][email], tx_powermail_pi1[field][email] and also tx_femanager_pi1[email]

lib.lux.settings {

    # All identification settings
    identification {
        # En- or Disable field and form identification
        _enable = {$plugin.tx_lux.settings.fieldandformidentification}

        # Identify by complete form submits with '<form data-lux-form-identification="true">'
        # - data-lux-form-identification="true" will catch submit, track values and does a form.submit()
        # - data-lux-form-identification="submitButton" will catch submit, track values and does a submitButton.click(). This is needed for "typo3/cms-form"
        # - data-lux-form-identification="preventDefault" will catch submit and track values without a further submit
        # Using a * as wildcard will search for a string in a string while using a key without * will search for the exact match.
        formFieldMapping {
            email {
                0 = email
                1 = *[email]
                2 = *[e-mail]
                3 = *[e_mail]
            }
            firstname {
                0 = firstname
                1 = *[firstname]
                2 = *[first-name]
                3 = *[first_name]
                4 = *[firstName]
                5 = *[vorname]
            }
            lastname {
                0 = lastname
                1 = *[lastname]
                2 = *[last-name]
                3 = *[last_name]
                4 = *[lastName]
                5 = *[surname]
                6 = *[sur-name]
                7 = *[sur_name]
                8 = *[name]
                9 = *[nachname]
            }
            company {
                0 = company
                1 = *[company]
                2 = *[firma]
            }
            phone {
                0 = phone
                1 = *[phone]
                2 = *[telefon]
                3 = *[tel]
            }
            product {
                0 = product
                1 = *[product]
                2 = *[produkt]
            }
            message {
                0 = message
                1 = *[message]
                2 = *[nachricht]
            }
        }
    }
}

Copied!

Note: Take care that your lib.lux configuration is recognized by lux (see FAQ section how to copy it to plugin.tx_lux_fe)

Note: If you want to stop the submit process, because lux had a workflow for the submit action (show text on form submit, etc..), you can use data-lux-form-identification="preventDefault" instead of data-lux-form-identification="true"

Note: If you are using a JavaScript based validation in your form, it's possible that there are conflicts with FormFieldMapping

Example form (added via content element html):

<form data-lux-form-identification="preventDefault" action="#">
	<div class="form-group">
		<label for="email">Ihre E-Mail-Adresse</label>
		<input type="email" class="form-control" id="email" name="test[email]">
	</div>
	<div class="form-group">
		<label for="firstname">Vorname</label>
		<input type="text" class="form-control" id="firstname" name="firstname">
	</div>
	<div class="form-group">
		<label for="lastname">Nachname</label>
		<input type="text" class="form-control" id="lastname" name="lastname">
	</div>
	<div class="form-group">
		<label for="company">Firma</label>
		<input type="text" class="form-control" id="company" name="company">
	</div>
	<div class="form-group">
		<label for="phone">Phone</label>
		<input type="text" class="form-control" id="phone" name="phone">
	</div>
	<div class="form-group">
		<label for="product">Zu welchem Produkt können wir Ihnen helfen?</label>
		<select class="form-control" id="product" name="product">
			<option>Lux</option>
			<option>Content Publisher</option>
			<option>Schulpaket</option>
			<option>CERMAT</option>
			<option>Personendatenbank</option>
		</select>
	</div>
	<div class="form-group">
		<label for="message">Ihre Nachricht an uns</label>
		<textarea class="form-control" id="message" rows="3" name="message"></textarea>
	</div>
	<div class="form-check">
		<label class="form-check-label">
			<input type="checkbox" class="form-check-input" value="1" name="agb" required>
			<a href="/privacy/">Datenschutzerklärung</a> gelesen und akzeptiert
		</label>
	</div>
	<button type="submit" class="btn btn-primary">Nachricht versenden</button>
</form>
Copied!

Form in frontend:

Example lead identification in dashboard:

Note: Re-Initialization for forms, loaded via AJAX can also be done with a script like:

const lux = LuxSingleton.getInstance();
lux.addFormListeners();
Copied!

4. Frontend login of a frontend user 

If a frontend user logs in into TYPO3, lux automatically creates a relation to this user. If the field fe_users.email is filled, lux take over this field property and identification is resolved.

5. Luxletter 

The extension Extension luxletter is a email marketing extension that allows you to send newsletters to your users. If a user clicks on a link in this newsletter, lux identifies who has clicked the link. See documentation of luxletter for more details to this extension.

LUX LUX

Installation 

This part of the documentation describes how to install lux to your TYPO3 instance.

1. Requirements (of the latest version) 

  • TYPO3 12 or 13
  • PHP 8.1 or higher
  • TYPO3 must run in composer mode

2. Installation via composer 

Example composer.json file:

{
  "require": {
    "php": "^8.1",
    "typo3/cms": "^13.4",
    "in2code/lux": "^38.0",
  }
}
Copied!

Because lux is registered at packagist.org, you can simply do a composer req in2code/lux for example to install the package. Don't forget to activate (e.g. in the extension manager) the extension once it is installed.

Note: You need access to our private packagist for an installation of EXT:luxenterprise

Note: Lux itself will also load some other php packages:

  • symfony/expression-language for a calculating magic
  • whichbrowser/parser to show some information about the user agent
  • in2code/google-image-grabber to show an image by email address from google images

Extension Manager settings 

If you click on the settings symbol for extension lux, you can change some basic settings in lux extension.

Setting Description
Overview: Extension status Just a small overview over the extension.
Basic: Scoring Calculation Define a calculation model for the basic lead scoring.Available variables are - numberOfSiteVisits, numberOfPageVisits, downloads, lastVisitDaysAgo.Note - you should run a commandController (e.g. every night) and calculate the scoring again, if you are using the variable "lastVisitDaysAgo".
Basic: Add on page visit Categoryscoring: Add this value to the categoryscoring if a lead visits a page of a lux-category
Basic: Add on news visit Categoryscoring: Add this value to the categoryscoring if a lead visits a news page (tx_news)
Basic: Add on download Categoryscoring: Add this value to the categoryscoring if a lead downloads an asset of a lux-category
Basic: Add on click on Link Listener Categoryscoring: Add this value to the categoryscoring if a lead clicks on a Link Listener link
Basic: PID to save Link Listener records Define a PID where the link listener records should be stored (relevant for the editors user rights)
Module: Disable analysis module Toggle the backend module Analysis in general
Module: Disable lead module Toggle the backend module Leads in general
Module: Disable workflow module Toggle the backend module Workflows in general
Advanced: Disable lux in page overview module Toggle the lux analysis or leads box in page module in general
Advanced: Pageoverview mode If not disabled, choose between classic leads view or the new analysis view
Advanced: Disable ckeditor configuration Toggle if an automatic ckeditor configuration should be added or not (for email4link feature)
Advanced: Disable ip logging Disable the logging of the visitors IP address
Advanced: Anonymize IP As an alternative to disableIpLogging, you can anonymize the visitors IP-address when saving. The last part of the IP will be anonymized with "***"
Advanced: Lead picture Decide if TYPO3 should try to find an image of a lead by searching on gravatar.com (with hashed email) or on bing image search by given email domain (not full address).
Advanced: Show render time For an easier debugging all views in backend can be shown with render times. This is only visible for backend administrators.
Advanced: Use cache layer If you are facing performance issues with lux backend modules or with the page overview view (quick analysis), you can cache views (e.g. for 24h) when turning the feature on. In addition there is a command that can be executed via scheduler task to warmup caches (e.g. every night).

3. Add TypoScript 

If you have already activated lux in your TYPO3 instance, you can add the static TypoScript file Main TypoScript (lux) in your root template. Most of the TypoScript configuration is used for frontend and for backend configuration.

3a Constants 

Look at the default settings of your lux in TypoScript constants. At least the sender email address needs to be modified from you.

plugin.tx_lux.settings {
  # cat=lux//0010; type=boolean; label= Activate frontend functionality: All frontend functionalities can be toggled for testing or against flooding
  enableFrontendController = 1

  # cat=lux//0020; type=boolean; label= Activate autoenable: Decide if user tracking is turned on by default (no opt-in needed here). If you turn autoenable off, you have to build an opt-in.
  autoenable = 1

  # cat=lux//0030; type=options[0,2]; label= Identification method: Decide if fingerprinting (0) or local storage (2) method should be used for tracking your leads. Both methods have their ups and downs (see documentation for details).
  identificationMethod = 0

  email {
    # cat=lux//0100; type=text; label= Default sender name: Default sender name for mails
    defaultSenderName = Marketing

    # cat=lux//0110; type=text; label= Default sender email: Default sender email address for mails
    defaultSenderEmail = marketing@website.org
  }

  tracking {
    # cat=lux//0200; type=boolean; label= Activate page tracking: (De)Activate tracking of the users pagefunnel.
    page = 1

    # cat=lux//0210; type=boolean; label= Activate download tracking: (De)Activate tracking if the user downloads an asset.
    assetDownloads = 1

    # cat=lux//0220; type=text; label= Activate download tracking: (De)Activate tracking if the user downloads an asset.
    assetDownloads.allowedExtensions = pdf,txt,doc,docx,xls,xlsx,ppt,pptx,zip

    search {
      # cat=lux//0230; type=boolean; label= Activate searchterm tracking: (De)Activate tracking searchterms if user searched for someone on your website.
      enable = 1

      # cat=lux//0240; type=text; label= search GET parameters: Listen for searchterms in available GET parameters
      getParameters = q,tx_solr[q],tx_indexedsearch[sword],tx_indexedsearch_pi2[search][sword],tx_kesearch_pi1[sword]
    }

    company {
      # cat=lux//0300; type=boolean; label= Activate tracking via wiredminds: (De)Activate tracking enrichment of lead data via wiredminds.com
      enable = 0

      # cat=lux//0310; type=text; label= Wiredminds token: Add token from Wiredminds
      token =

      # cat=lux//0320; type=text; label= Wiredminds limit per month: Define a limit for requests per month (for best cost control)
      connectionLimit = 5000

      # cat=lux//0330; type=text; label= Wiredminds limit per hour: This limit is a safety function to prevent unwanted number of requests to interface (e.g. on a DoS attack)
      connectionLimitPerHour = 150

      autoConvert {
        # cat=lux//0340; type=boolean; label= Activate automatic tracking: (De)Activate tracking of new and unknown leads
        enable = 0

        # cat=lux//0350; type=int+; label= Scoring for automatic tracking: Start automatic tracking only of lead has a minimum scoring of this value
        minimumScoring = 0
      }
    }
  }

  # cat=lux//0400; type=boolean; label= Activate field and form identification: (De)Activate identification by filling out web forms.
  fieldandformidentification = 1

  # cat=lux//0400; type=boolean; label= Disable for identified: Disable email4link lightbox in frontend if the visitor is already identified.
  disableEmail4DownloadForIdentifiedVisitors = 1

  # cat=lux//0500; type=boolean; label= Disable for backend users: Disable lux tracking in frontend if you are also logged in into backend.
  disableTrackingForBackendUsers = 1

  # cat=lux//0600; type=int+; label= PID privacy page: Set the pid of the privacy page for links in lux forms.
  pidPrivacyPage = 11
}
Copied!

Note: For a first testing, you may want to be logged in into backend and also track your page visits. This can be done with this constants: plugin.tx_lux.settings.disableTrackingForBackendUsers=0

3b Fingerprint or LocalStorage 

With the constant identificationMethod (see above) you can decide if lux should work in fingerprint or in localstorage mode. While a fingerprint can be calculated by hardware details automatically, a localstorage mode is similar to a cookie. We would also don't use autoenable if you want to go for local storage and ask your visitors for an opt-in.

TypoScript 

If you want to see in detail what kind of TypoScript will be included and how to overwrite some parts, look at ../../../Configuration/TypoScript/Lux

4. Ready to go 

lux is now up and running. If you go into the frontend of your webpage and open the browser console, you should see an asynchronical request to every page request.

Note: Take care to be not logged in into your TYPO3-backend at the same time with the same browser or turn on tracking for BE-Users via TypoScript.

Note2: Take care that your browser does not have activated the DoNotTrack (DNT) setting (Default for FireFox Anonymous Tab)

LUX LUX

Backend Module Leads/Dashboard 

A dashboard helps to give you an overview about your lead activities on your website.

Dashboard 

Leads 

LUX LUX

Backend Module Leads/Companies 

Change the view to companies module by clicking on "Companies".

We offer a valuable Wiredminds integration into TYPO3 via LUX. Wiredminds is able to convert an IP-address to company detail information. This B2B solution takes your website to a whole new level. Possible information from API is:

  • Company name
  • Branch
  • Revenue
  • Size
  • Address
  • Domain
  • Contacts

Wiredminds usage needs to be payed per Request. Look at our website (How to get a token) for details about prices and packages and how to get a working token.

Note: Not every IP-address can be converted to a company because not every visitor is a business visitor and part of a company. Note: IP-addresses are only delivered to Wiredminds via server-to-server connection.

Company Detection not yet enabled 

If you enter the page on your first time, there is a note, that a token is missing. Once you add a Wiredminds token, some TypoScript constants are set and company detection is activated.

Enabled company detection 

Once you added a valid token, you are able to convert visitors to companies.

Configuration 
  1. Ensure that server is able to reach the Interface URL https://ip2c.wiredminds.com (maybe firewall settings needs to be adjusted).
  2. Add a basic API configuration via TypoScript constants:
Constant Description
{$plugin.tx_lux.settings.tracking.company.enable} Enable or disable Wiredminds connection in general.
{$plugin.tx_lux.settings.tracking.company.token} Add a valid and working wiredmind token.
{$plugin.tx_lux.settings.tracking.company.connectionLimit} Define a limit for monthly requests against wiredmind for full cost control.
{$plugin.tx_lux.settings.tracking.company.connectionLimitPerHour} Define a limit for hourly requests against wiredmind for savety reasons (e.g. to prevent unneeded requests in case of a DoS attack)
{$plugin.tx_lux.settings.tracking.company.autoConvert.enable} Turn on, that visitors are automatically extended with company information. So, the first visit of a visitor will call the Wiredminds interface and ask for company information.
{$plugin.tx_lux.settings.tracking.company.autoConvert.minimumScoring} Use autoConvert only for visitors with a minimum scoring value.
User Interface 
Filter 

As you may already know from other filters in LUX, you can filter the list to your needs.

Note Category can only be used if you have added some sys_category records to your system.

List 

Companies are listed with name, scoring (cumulative scoring of all related leads), category scoring (cumulative scoring of all related leads), Branch name, Country, The Latest visit, Number of all visits and amount of related leads.

Right side 

A revenue diagram helps you to get a feeling about the average revenue of the listed companies

Another diagram shows you the development of saved companies in your system

A third box shows you the newest companies in your system

The last box gives you a feedback about how many requests already been sent to Wiredminds interface and how much is left before the monthly limit is reached. The limit can be adjusted via TypoScript and is also related to the token limit itself.

Company Preview 

By selecting a line in the list view, you will see a company preview on the right side. Some basic information like Revenue, Size or Founding year is shown.

If you have added some sys_category records, you can set a category for the company. You can also add an internal description to the company.

An additional box will show you a basic contact information about the company.

The third box will show you the newest leads of the company.

Company Detail View 

By clicking "Show company" a detail view will show up. There are similar information in this view as you may already know from the lead detail view.

An information box will show you interesting information about the company itself. Beside that an activity log and a lead list will appear. In the line below there are 3 boxes with scoring, category scoring and pagevisit information.

By clicking "Remove company" the company will be deleted in database. If you are clicking "Remove company and visitors", also related leads are deleted.

Statistics 

By clicking the i-Icon in the navigation bar, a basic statistic is visible.

In the third column you will have full control about how many requests are already sent to Wiredminds interface and how many requests are left.

Note Not every IP-address can be converted into a company (see IP hits vs. IP misses)

LUX LUX

Backend Module Leads/Leads 

Change the view to List module by clicking on "Leads".

The backend module Leads show you all identified (and anonymous) leads.

See all your leads in a listview on the left side. While - on the right side - you can see useful information (number of page visits and hottest leads). The left side itself is split into a filter area and the table-list-view below.

Filter 

Field Description
Searchterm Use this fulltext search field for filtering (name, email, company, fingerprint, etc...)
Scoring Search for leads with a minimum scoring
Category-Scoring Show only leads that have a category-scoring of a given category (Table columns change - Categoryscoring will be available)
Time-From Search for leads that are only known since a defined date and time
Time-To Search for leads that are only active until a defined date and time
Identified only List only identified leads in the table below

Filter Buttons Filter now: Let's filter the table with our properties Reset filter: Let's reset the table to original list view Download button: The download button let you download the lead table in format CSV

Table 

The table will show you your website leads.

Column Description
Lead identification Use this fulltext search field for filtering (name, email, company, fingerprint, etc...)
Lead scoring Show only leads that visited a page (Table rows change - pagevisits available now)
Email Search for leads with a minimum scoring
Company Show only leads that have a category-scoring of a given category (Table rows change - Categoryscoring will be available)
Last visit Search for leads that are only known since a defined date and time
Number of visits Search for leads that are only active until a defined date and time
Pagevisits Only viewable if you filter for a page (will replace column Number of visits)
Categoryscoring Only viewable if you filter for a scoring of a category

Orderings: Per default the orderings is identified leads first and after that sort by scoring. The orderings can change if you are using a special filter.

Detail Preview 

If you click in a table row, a small lead preview will be loaded via AJAX. Both diagrams on the right side will be replaced with a preview box and a scoring box.

  • If you are using company detection via Wiredminds (see Companies), you can change the related company manually.
  • If you add a text into the textarea Internal description, this notice is saved automatically if the focus gets lost on the field (on blur).

Clicking on Show lead details will open the detail page.

Detail View 

The detail view will give you a couple of information of the chosen lead. The view is splitted into 7 boxes:

  • Lead information overview
  • Activity log
  • Conversion funnel / Page visits
  • Lead scoring
  • Categoryscoring
  • Pagevisits
  • Properties
  • Profiles
Lead information 

See all relevant lead information.

It starts with the Lead identification. Depending on the information we have, this will show the email or the first- and lastname or simply "Anonymous". Beside this, you will see the general scoring and the hottest category scoring (if there is one). A click on the google icon will open a new tab with google and let you search for the lead.

After the first line, there are information that came from field mapping, meta information (first and last visit) and information enriched by the visitors IP-address. The description field is also shown and can be used in the same way as described in Detail Preview.

Activity log 

See the most interesting activities of this lead related to lux. You will see information like Lead gets identified, *Lead gets identified by email4link" or "Lead downloads an asset". Also every workflow that takes action on this lead is listed here.

Conversion funnel / Page visits 

See from which referrer your lead start to visit your website and follow page by page.

Lead scoring 

See the lead scoring of the lead in the last 6 weeks. That gives you the possibility to decide, how your nurturing workflows are running.

Note: The scoring calculation can be done in the Extension Manager settings of the extension. If you are using the value lastVisitDaysAgo, you should use a CommandController to calculate the lead scoring one time a day.

Tipp: Use your mousecursor for getting a date and time in a tooltip to every activity.

Categoryscoring 

See a diagram with all available categoryscorings for this lead.

Note: The calculation can be influenced by the Extension Manager settings of the extension. Note: See Categoryscorings how to use category scoring in lux.

Pagevisits 

See the number of page visits of the last weeks.

Properties 

If you collect more data than just email, firstname, lastname and company (see identification part of the documenation) You need also to see this information. And this view shows you all collected attributes from the visitor.

Profiles 

Because your lead could use more than just one device, all fingerprints + legacy cookies and devices are listed here with some additional information.

Interaction Buttons 

On the bottom of the detail view, you will find three buttons.

  • Go back: Browser will show the previous page
  • Blacklist: This lead will be blacklisted. This means, the lead is not visible in any view anymore. This is helpful, if you identify a searchengine crawler (maybe with a high scoring). In addition, all properties and related tables are cleaned!
  • Remove completely: This will remove all information about this lead from your system. Remove means that the records are really remove - not only a deleted=1!

LUX LUX

Plugins and Pageoverview 

This part of the documentation describes all lux plugins and the pageoverview view in backend.

Pageoverview 

If you have activated pageoverview in Extension Manager settings of extension lux, you and your editors will get important information about your visitor and leads.

You can decide what view should be rendered via Extension Manager settings.

Analysis 

If your installation is configured to show a analysis overview, you will see how this page is performing in this week compared to the week before.

By clicking on the title you can show or hide (toggle) this information for the current backend user. Of course this status is saved if you change the page or logout and login later again.

Leads 

If your installation is configured to show the latest leads, you will see visitors of the current page (Identified and Anonymous) in page module.

By clicking on "Latest Leads" you can show or hide (toggle) this information for the current backend user. Of course this status is saved if you change the page or logout and login later again.

Plugins 

Plugin 1: Opt out 

The first plugin in lux fits ideally to your privacy notes page. As you may not from Matomo (former known as Piwik) Lux also offers a checkbox in frontend where visitors can de-check if they don't want to be tracked.

If the browser has a DoNotTrack setting enabled, the view changes a bit.

You can simply add a Plugin Pi1 trackingOptOut to a page and add some content to it.

Note: If you want to use opt-in instead of opt-out functionality, there is a possibility for this (see Privacy).

Plugin 2: Contextual content 

NOTE: This plugin is only part of the enterprise version: Look at in2code.de for more information

Another possibility beside workflow actions to nurture leads is to use a contextual content plugin. If you add this to a page, you can define a default content element and you can define one or more content elements per lux-category. An asynchronous request (AJAX of course for high performance website not a USER_INT) will show the most relevant content element - related to the category scoring of the current visitor.

If you have added more then only one content element per category, the content element is selected randomly.

Plugin 3: Hidden content 

NOTE: This plugin is only part of the enterprise version: Look at in2code.de for more information

This plugin allows you to add invisible content elements on your page. Those can be shown via workflow action.