# Introduction

![](/files/EnxjPqmY8Ej2Y1vXVnL3)

{% hint style="info" %}
**UXWizz has been recently rebranded from "userTrack".**

**You might still find references to the old "userTrack" name in this documantation or in the product itself.**
{% endhint %}

## What is UXWizz?

UXWizz is a self-hosted website analytics platform. \
\
Thousands of website owners and web agencies use UXWizz to privately get insights into their traffic and improve their websites. \
\
View stats, heatmaps and session recordings, track events, run A/B tests and increase conversion rates without sending your data to third-party companies.

## Quick links

* [Requirements](/installation/requirements)
* [Installation](/installation/installation)
* [Changelog](/about/changelog#changelog)
* [Support](/guides/support)

## Get

If you have not yet purchased UXWizz, you can view the [prices here](https://www.usertrack.net/pricing). \
If you have already purchased a UXWizz license: **THANK YOU**, every purchase increases the [updates frequency](/about/changelog), documentation and [support](/guides/support).

## Install

To get started with UXWizz you first have to install it. \
After reading the [requirements](/installation/requirements) you can go directly to the [installation section](/installation/installation).

## Use

Have you already installed UXWizz and have recorded data but you are not sure how to interpret it? Read the [usage tips](/guides/usage-tips) to see the recommended ways to take advantage of the recorded data.


# Requirements

&#x20;[Installing UXWizz](/installation/installation) on a server should take under 5 minutes if you know how to:&#x20;

* **Upload files to your server**
* **Create a database**
* **Include a JavaScript snippet on your website**

If you don't know how to do any of those steps, don't worry as they are explained in the installation guide. You can also always contact [support](/guides/support) for help.

## Server requirements

{% hint style="info" %}
**UXWizz is self-hosted.**

You must use your own server/hosting (either shared, VPS or dedicated).&#x20;
{% endhint %}

UXWizz runs on the LAMP stack (Linux/Apache/MySQL/PHP):

* **PHP ≥ 8.0** (pdo\_mysql, zip extensions enabled)
* **MySQL ≥ 8.0** or **MariaDB ≥ 10.7**
* Web server (**Apache**, LiteSpeed, NGINX, etc.)
* Access to create a database and upload files to the server.

You can use the following guidelines to decide on your server configuration depending on the amount of traffic that your website gets:

{% content-ref url="/pages/-MPt3uLnHa\_CZx4PLHsi" %}
[Server specs (CPU, RAM)](/installation/requirements/server-specs-cpu-ram)
{% endcontent-ref %}

## Website requirements

* UXWizz's **ust.min.js** JavaScript tracker must be included on your website(s).
  * You need access to include a JavaScript file or to edit files on your website.


# Limitations

{% hint style="info" %}
**Before purchasing you should know what are the most important limitations of UXWizz**\
While UXWizz is regularly updated, some of those limitations are browser-imposed and are not likely to be solved in the near future.
{% endhint %}

**Recording/Session Playback limitations**

{% hint style="info" %}
**🎉 NEW -** A secondary session recording system to address this issue has already been implemented since version 4.0.0.\
[Read more about the session recording systems](/api/session-recording).
{% endhint %}

The default playback is recommended for landing pages or pages that don't contain a lot of dynamic content. The [**default recording system**](https://docs.uxwizz.com/installation/requirements/pages/-MlFhp-p5VUf_FwF-x-1#a.-default-page-recording) is very well optimized, but has some limitations:

* **Interactions over or inside iframes are not recorded** *(browsers do not propagate events from iframes to the parent document)*
* **Recorded pages content, versions or updates are not stored.** This happens because the default tracking system only stores the URL of the recorded pages, this means that the page content is only loaded when the record is being played and it is always the latest/current version of the page at that URL.
* As a consequences of the previous point: if a user has to **log-in** in order to **access** a specific area of the website you will **not** be able to view recordings on that area as long *as you are not logged in as well*. Also, if you are logged in as a different user you may see their actions done on your user panel.
* Web components and shadow-DOM or frameworks that use those technologies (like Polymer) might not be properly recorded. This happens because encapsulated elements do not correctly respond to external artificially triggered events (eg: click).
* As all actions done by the user are actually replayed on your site, you should add the class ***UST\_noClick*** on the HTML elements that lead to a final action (eg. finalizing an order), so that the click will be shown but the action will not be executed.

All limitations, apart from the iframe-recording are solved when using the [full recording system](https://docs.uxwizz.com/installation/requirements/pages/-MlFhp-p5VUf_FwF-x-1#b.-full-page-recording).

**Heatmap limitations**

* Heatmap data is displayed over an iframe of the given website URL. Because of this, the tracked website must allow for it to be displayed within an iframe on your dashboard domain.
* Heatmaps record data points relative to the page container. Because of this, interactions over dynamic elements (such as dropdowns, pop-ups) would show as activity when viewing the heatmap regardless of their visibility (you still see heatmap activity in the region the pop-up was shown, even though the pop-up is currently not visible).

{% hint style="warning" %}
**NOTE**&#x20;

Because *UXWizz* is self-hosted the **maximum number of recordings stored depends on your server configuration**.&#x20;

You can easily track 30k-50k monthly sessions on a cheap $5/mo VPS. It's a good idea to limit data storage to store only the latest 50k-200k recordings on low-spec servers. \
\
For more details see the [server specifications guidelines](/installation/requirements/server-specs-cpu-ram).
{% endhint %}


# Server specs (CPU, RAM)

A lot of effort has been put into making the tracking and dashboard as fast as possible. \
UXWizz should run well on most servers, but depending on the amount of traffic you get and the total database size you should consider the following suggestions for your server configuration:

{% hint style="warning" %}
The [full session recording system](https://docs.uxwizz.com/installation/requirements/pages/-MlFhp-p5VUf_FwF-x-1#b.-full-page-recording) uses a lot more resources than the default one. Depending on the content on the site being tracked, you might need more resources.
{% endhint %}

Minimum recommended server specifications:

* **<10k monthly visits**
  * Any cheap VPS or shared hosting should work
  * 1 GB RAM
  * 1 vCPU
  * 10GB disk
  * You should consider upgrading your server if you store more than 500k total sessions
* **<50k monthly visits**
  * 2 GB RAM
  * 2 vCPU
  * 25GB disk
  * You should consider upgrading your server if you store more than 1M total sessions
* **<200k monthly visits**
  * 8GB RAM
  * 4 vCPU
  * 50GB disk
  * You should consider upgrading your server if you store more than 5M total sessions
* **<1M monthly visits**
  * 32GB RAM
  * 8 vCPU
  * 320GB disk
  * You should consider upgrading your server if you store more than 10M total sessions
* **1M+ monthly visits**
  * Powerful dedicated server
  * Preferably to separate the MySQL database on a different server instance

Other recommendations:

* **Make sure your server resources are properly allocated.**

  Check the MySQL, Apache and PHP configurations to make sure they have access to utilize all the resources provided by the server. See the [optimization tips](/installation/optimization-tips) for some configuration suggestions.
* **Regularly back-up the database.** \
  I recommend an external backup service like [**SimpleBackups.io**](https://simplebackups.io/?via=cristian) because it's easy to set-up and you get notified if the backup fails. They also have a free plan for a single project. \
  Otherwise you could regularly save the output of mysqldump.&#x20;
* **If you don't use all the features, disable them.**\
  UXWizz allows you to granularly set what data is being tracked (click heatmaps, movement heatmaps, recordings). If you do not use heatmaps for example, you can disable them in order to reduce data transfer and storage. In order, the most resource-intensive features are:
  * Session Recordings (when used, the [default one](https://docs.uxwizz.com/installation/requirements/pages/-MlFhp-p5VUf_FwF-x-1#a.-default-page-recording) is recommended for best performance).
  * Movement Heatmaps
  * Click Heatmaps
* Suggestion to reduce total storage size over the years: keep all quantitative data (stats, page visits, events) but regularly delete old qualitative data (heatmaps, session recordings).

{% hint style="info" %}
[See here some recommend hosting providers.](https://docs.uxwizz.com/installation/requirements/pages/-M62BsnivEMZFwYBx5R1#id-2.-recommended-server-hosting-providers)
{% endhint %}

**If you can't decide what server configuration or hosting provider to use, you can contact support for help and suggestions.**


# Installation guide

![](/files/EnxjPqmY8Ej2Y1vXVnL3)

{% hint style="info" %}
UXWizz can be installed on a server running Apache, PHP and MySQL (LAMP).\
**Installation steps depend on your UXWizz version (Standalone or WordPress)**
{% endhint %}

**Installation guide for:**

1. [**UXWizz - Standalone**](#id-1.-standalone-version-lamp-server)
2. [**UXWizz - WordPress Plugin**](#id-2.-wordpress-version-plugin)

## 1. Standalone version (LAMP server)

### 1.1. Option A: New server (VPS or dedicated)

This is the **recommended way** as you will have a completely separated server where you can track the all your sites.\
UXWizz provides a **cloud-init** configuration script, which allows for one-click installs or you can follow the shell commands mentioned in it to download and install UXWizz.

#### See the [**steps to setup a new, dedicated UXWizz server**](/installation/setup-uxwizz-server)**.**

### 1.2. Option B. Existing server (with cPanel or FTP access)

UXWizz was designed to run on any server and even on cheap shared hosting, as long as it meets the [requirements](/installation/requirements).\
\
Install UXWizz in 4 simple steps:

1. [Upload the script](/installation/installation/uploading-the-script)
2. [Create a new *MySQL database* for UXWizz](/installation/installation/creating-a-mysql-database)
3. [Run the auto installer](/installation/installation/running-the-installer)
4. [Add the tracking code to your site](/installation/adding-the-tracking-code)

## 2. WordPress version (plugin)

You can find a more detailed [WordPress installation guide here](https://usertrack.net/blog/wordpress-analytics-plugin-installation).

Summary:

1. Install **wp-usertrack.zip** as a WordPress plugin and **activate** it.
2. Access the userTrack plugin from the wp-admin sidebar.
3. Choose a **password**.
4. Login:\
   user: **admin** \
   pass: **Your chosen password**\
   ![](/files/-Ltuu64dzjrx8qguAZtQ)
5. Add the current **domain name** to be tracked (eg. yoursite.com).
6. If your WordPress site is in a sub-folder: go to **Settings** -> **Tracking**  and click "RESET" next to the **Server path** setting so that the server API path is automatically detected.\
   &#x20;<img src="/files/-M4WolaWeH5Jc7YgkBGF" alt="" data-size="original">&#x20;
7. Make sure to check the **Pages to track** menu to set on which pages to automatically insert the **ust.min.js** file. It's recommended that you track all non-sensitve pages for more accurate data.
8. You can also include the **ust.min.js** script manually and even on different domains (tracking snippet is shown after adding a new domain name, or from the tracker info of existing domains).

{% hint style="info" %}
**Note:** After installing userTrack data should be **immediately** tracked, if you visit the site yourself and you don't see any data it means something went wrong during installation. If you can't figure out what's wrong feel free to ask for help by sending an e-mail at **support \[at] uxwizz.com**.
{% endhint %}


# Uploading the script

1. **Upload the script**
2. [Create a new *MySQL database* for UXWizz](/installation/installation/creating-a-mysql-database)
3. [Run the auto installer](/installation/installation/running-the-installer)
4. [Add the tracking code to your site](/installation/adding-the-tracking-code)

## 1.1 Uploading the script

**1. Upload**, using cPanel or FTP, the **userTrack.zip** archive to the root folder of your website (recommended).

![cPanel -> File manager -> public\_html](/files/1G9xh5gloGigq207Im4e)

**2. Extract** the zip file and delete the archive afterwards.

![Right click -> Extract -> Extract file(s). Delete .zip file afterwards.](/files/fXVSpOSZkGOsLS89w67b)

**3.** You should now have a **userTrack** folder inside the root of your web server.

{% hint style="info" %}
**File permissions**

In some cases you might have to change the **file permissions** (chmod) after they are uploaded. Most of the files only need read permission, but the following files also need write permissions:

* **server/dbconfig.php** - write permission needed so the auto-installer can save the database connection information. Write permission can be revoked after the installation is completed.
* **server/ust.min.js** - this is the minified tracking script which is updated every time the settings in tracker.js are changed.
* **server/ust-rr.min.js** - same as above, but with full session tracking

Note that UXWizz comes with an auto-updater. In order for the updater to replace older UXWizz files with the newest version, all UXWizz files and folders should be writable from PHP (have write permission).
{% endhint %}


# Creating a MySQL database

1. [Upload the script](/installation/installation/uploading-the-script)
2. **Create a new&#x20;*****MySQL database*****&#x20;for UXWizz**
3. [Run the auto installer](/installation/installation/running-the-installer)
4. [Add the tracking code to your site](/installation/adding-the-tracking-code)

## 1.2 Creating the database

UXWizz requires access to a **MySQL database**, either local (on the same server) or remote.

**1. Create a MySQL database**.\
If you are using cPanel you can create it using ***MySQL® Databases***.&#x20;

![](/files/Z0UBHTByWyZOTT4nGdmQ)

**2. Create a MySQL user** (make sure you remember **database name,** **username** and **password**).

![](/files/qKHfFyes6lmrDfWVUhUs)

**3. Assign** the user to the database. Mark the "***ALL PRIVILEGES***" checkbox when asked.

![](/files/C1cYTChBaf6WO9cyuPHq)

{% hint style="success" %}
We now have everything needed to start the installation wizard.
{% endhint %}


# Running the installer

1. [Upload the script](/installation/installation/uploading-the-script)
2. [Create a new *MySQL database* for UXWizz](/installation/installation/creating-a-mysql-database)
3. **Run the auto installer**
4. [Add the tracking code to your site](/installation/adding-the-tracking-code)

## 1.3 Auto installer

Almost done, just one more step:

1. Access \~\~\_**[www.yourdomain.com\*\*\_\~\~\*\*/userTrack/server/install.php](http://www.yourdomain.com**_~~**/userTrack/server/install.php)** and follow the instructions, more specifically in this step you have to fill the connection credentials to the database created in step 2.

{% hint style="info" %}
If you copied UXWizz files to a different location, access **/server/install.php** relative to the installation path.
{% endhint %}

{% hint style="success" %}
Installation is now complete and you should be prompted to choose a new password.
{% endhint %}

&#x20;


# Install on a new server

{% hint style="info" %}
**In the guide you will learn why and how to easily create a new server dedicated to running UXWizz.** \
**After completing this guide, you will have your own UXWizz dashboard running on a VPS or dedicated server, accessible by your own domain name.**&#x20;
{% endhint %}

## How to install **UXWizz**

* [Install on a clean Ubuntu 20.04 server](/installation/setup-uxwizz-server/ubuntu-20.04)
* [Install on DigitalOcean in a few clicks](/installation/setup-uxwizz-server/digitalocean)
* [Install via Docker](/installation/docker)

## Quick notes:

### 1. Benefits of running **UXWizz** on its own server

Although you can install UXWizz on the same server as your site, sometimes it might not be possible (eg. your site does not run on PHP) or you might not want to add extra resources on the same server as your site. There are also other advantages of running UXWizz on a separate server:

* **Security:** If someone somehow gains access to your UXWizz installation, or a vulnerability is found in UXWizz, the attacker will not be able to affect anything else outside the UXWizz dashboard.
* **Site performance:** UXWizz is well optimized, but it's even better if all UXWizz tracking and queries are executed on a separate server, as there is no way for those to affect the performance of the tracked sites.
* **Dashboard performance:** The recommended DigitalOcean $5/mo server performance is usually better than most shared hostings, so all the  UXWizz dashboard will be faster, as all the graphs can be generated faster on the server.

### **2. Recommended server hosting providers**

* [**DigitalOcean**](https://m.do.co/c/32db05609806) **- Simple UI and Quick 1-Click Installation ($200 credit 60-day credit)**
* [**Hetzner.com**](https://hetzner.cloud/?ref=UbRqvwvi1mfG) **- For affordable VPS and powerful dedicated servers ($20 credit)**

Choose DigitalOcean for the best UI/UX and ease of installation.\
Choose Hetzner for best prices/performance and if you need EU hosting.

Why I recommend DigitalOcean:

* I used them for several projects and I had a really **good experience**.&#x20;
* I already **tested** and run an UXWizz dashboard on one of their $5/mo server and it runs well.
* Their **interface and UX** are one of the best.
* The **server performance** is good and stable, your UXWizz dashboard will be fast and reliable.
* They provide pre-built **LAMP** images, meaning that you can create a server that already has **Apache**, **PHP** and **MySQL** ready.
* They allow for **cloud-init** scripts for easy installation, and there is also a [1-Click UXWizz app](https://marketplace.digitalocean.com/apps/uxwizz?refcode=1ae65cd1b449).
* They have a **referral program.** The [DigitalOcean ](https://m.do.co/c/32db05609806)links on this page have an affiliate code and if you sign-up through the links on this page you will get $200 in credit over 60 days. This means that you can get a very powerful server **for 2 months for free.**

If you prefer to get a more powerful server, I can't really recommend DigitalOcean as they can get pretty expensive for the high-end specs, in which case I recommend [**Hetzner.com**](https://hetzner.cloud/?ref=UbRqvwvi1mfG)**.**


# Ubuntu 20.04 (or higher)

{% hint style="info" %}
This guide assumes that you already have SSH (console) access to a clean Ubuntu installation.\
If you do not already have a server, check out the [recommended server specs](/installation/requirements/server-specs-cpu-ram).
{% endhint %}

## Steps summary:

You will learn how to setup the **LAMP stack** and how to install **UXWizz**.

* [**Install Apache, PHP, MariaDB**](/installation/setup-uxwizz-server/ubuntu-20.04#lamp-setup)
* [**Improve security configuration**](/installation/setup-uxwizz-server/ubuntu-20.04#basic-security)
* [**Install UXWizz**](#installing-uxwizz)
* [**Use your own domain name**](/installation/setup-uxwizz-server/ubuntu-20.04#adding-your-domain-name)

## LAMP Setup

To install Apache, PHP, MariaDB, run those commands in order:&#x20;

```bash
sudo apt install apache2
sudo apt install php libapache2-mod-php
sudo apt install mariadb-server
sudo apt-get install php-mysql
```

## Basic Security

{% hint style="info" %}
Use those commands to enable firewall (ufw) and improve the default MySQL security.
{% endhint %}

Those steps are optional, but recommended. \
Follow the prompts whenever necessary.

```bash
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
sudo ufw enable
sudo mysql_secure_installation
```

## Installing UXWizz

{% hint style="info" %}
By default, the 14 days trial version will be installed.\
You can then upgrade to the full version using a valid license key in the interface (Settings->Updates).\
\
If you want to **install directly the full version**, replace the second line with\
`curl -Lo userTrack.zip`` `**`https://www.uxwizz.com/download-latest-version?variant=rg&cv=6.4.0&license=YOUR_LICENSE_CODE`**

Remember to replace **YOUR\_LICENSE\_CODE**  with the license code received via email and to change **variant** accordingly (**wp** for WordPress version, **ag** for the Agency Version).
{% endhint %}

{% hint style="danger" %}
Replace **YOUR\_ROOT\_DATABASE\_PASSWORD** with the password chosen when you ran ***mysql\_secure\_installation*****.**
{% endhint %}

```bash
cd /var/www/html
curl -Lo userTrack.zip https://www.uxwizz.com/trial-download
apt install unzip
unzip userTrack.zip
rm userTrack.zip
mv userTrack/* userTrack/.* .
find . -type d -exec chmod 0777 {} +
find . -type f -exec chmod 0666 {} +
rm userTrack -r
ust_rootp=YOUR_ROOT_DATABASE_PASSWORD
ust_db=uxwizz
ust_user=uxwizz
ust_password="$(openssl rand -base64 12)"
mysql -u root -p"$ust_rootp" -e "CREATE DATABASE $ust_db /*\!40100 DEFAULT CHARACTER SET utf8 */;"
mysql -u root -p"$ust_rootp" -e "CREATE USER $ust_user@'%' IDENTIFIED BY \"$ust_password\";"
mysql -u root -p"$ust_rootp" -e "GRANT ALL PRIVILEGES ON $ust_db.* TO $ust_user@'%';FLUSH PRIVILEGES;"
sed -i "s*password = ''*password = '$ust_password'*" server/dbconfig.php
sed -i "s*username = 'root'*username = '$ust_user'*" server/dbconfig.php
sed -i "s*db_name = 'uxwizz'*db_name = '$ust_db'*" server/dbconfig.php
apt-get install php-zip -y
a2enmod headers rewrite
systemctl restart apache2
```

{% hint style="info" %}
If, after the installation you need to see the database connection credentials, the values are stored in **server/dbconfig.php.**
{% endhint %}

## Adding your domain name

### Install certbot

Certbot is used to generate a free [Let's Encrypt](https://letsencrypt.org/) certificate and manage its auto-renewal.

```bash
sudo apt update
sudo apt install snapd -y
sudo snap install snap-store
sudo snap install --classic certbot
```

To set your own domain name for this dashboard, [see this adding your domain name section](https://docs.uxwizz.com/installation/setup-uxwizz-server/pages/-MTmCqCRFDvc-ZmvC9lQ#id-2.-point-your-own-domain-name-to-the-uxwizz-dashboard-server).

{% hint style="warning" %}
**Note**: If accessing *yoursite.co&#x6D;**/server*** shows the Directory listing instead of 'Forbidden', it means that .htaccess files don't work properly. To fix this, set AllowOverride to All in your Apache2 config. You can automatically set it, assuming default paths, by running this command:

`sudo sed -i 's/AllowOverride None/AllowOverride All/g' /etc/apache2/apache2.conf`
{% endhint %}


# DigitalOcean

{% hint style="warning" %}

### **Note: This guide is deprecated.**

### **Use the UXWizz 1-Click DigitalOcean App instead!**

UXWizz is now available as a 1-Click App on DigitalOcean and can be installed even easier.\
[**Click here to deploy UXWizz 1-Click App on DigitalOcean**](https://marketplace.digitalocean.com/apps/uxwizz?refcode=1ae65cd1b449\&action=deploy)**.**
{% endhint %}

Server setup summary:

1. [Create a new UXWizz **server**.](#1.-create-a-new-server-running-uxwizz)
2. [Point your own **domain** name at that server's IP.](#2.-point-your-own-domain-name-to-the-uxwizz-dashboard-server)
3. [Add free **HTTPS certificate** for that domain.](#3.-add-free-https-certificate-for-that-domain.)

### 1. Create a new server running UXWizz&#x20;

If you don't already have a DigitalOcean account, you can [create one here](https://m.do.co/c/32db05609806) (referral link, you get **$200 free credits** on sign-up).

**1) Create a new droplet.**\
&#x20;<img src="/files/-M62M8bFoPpfe72LLcRr" alt="" data-size="original"> <br>

**2) Choose your preferred server location**\
Normally this should be close to you, or close to where the majority of the tracked users are. A central location such as Amsterdam could also be good.

<figure><img src="/files/MmQ0rYitszX21SZSDg0q" alt=""><figcaption></figcaption></figure>

**3) Choose the LAMP image from the Marketplace**&#x20;

<figure><img src="/files/CdiQURcLrlGHlQ9GZ1DS" alt=""><figcaption><p>DigitalOcean Marketplace - LAMP image</p></figcaption></figure>

{% hint style="info" %}
If you are interested you can read more about the **DigitalOcean LAMP image** here: <https://marketplace.digitalocean.com/apps/lamp#getting-started>
{% endhint %}

**4) Choose the $6/mo plan** \
If you want you can choose a more powerful server, but the $6/mo should be enough for at least 20-30k monthly visitors. If you want even faster performance, you can go for the $7/mo premium CPUs with NVMe SSD.\
You can also change the plan any time after creating the server.

<figure><img src="/files/98MnEGZRYsFIpS09KdDT" alt=""><figcaption></figcaption></figure>

**5) Select the preferred authentication method to access the server and the server name. SSH is recommended, but if you are not familiar with SSH you can select one-time password.**&#x20;

<figure><img src="/files/wo37hB9SVNJN9Ncpe7Un" alt=""><figcaption></figcaption></figure>

**6) Select the free "Monitoring and alerting" add-on**\
This will enable performance graphs in your DigitalOcean dashboard, so you can see the CPU/Memory/Disk/Network usage of the server.

<figure><img src="/files/xrxLqd1udKQlNI1Pw8Bc" alt=""><figcaption><p>DigitalOcean Enable Monitoring and Alerting</p></figcaption></figure>

**7) Click Advanced Options -> Add Initialization scripts (free)**\
This is where the magic happens and what automatically installs **UXWizz** on the server.

{% hint style="warning" %}
You can get the "user data" code by accessing this URL:\
**(replace YOUR\_LICENSE\_KEY with your own UXWizz license code)**\
[https://www.uxwizz.com/get-cloud-config?license=YOUR\_LICENSE\_KEY](https://www.usertrack.net/get-cloud-config?license=YOUR_LICENSE_KEY)

**NOTE**: If you are using the **trial** version, use this link instead:\
[https://www.uxwizz.com/get-cloud-config?license=TRIAL](https://usertrack.net/get-cloud-config?license=TRIAL)
{% endhint %}

Add the copied code to the text input, it should look something like this:

<figure><img src="/files/HXAR65ACeknummzPMeos" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
You can optionally enable **backups.** You can also do this later, after the server is created.
{% endhint %}

{% hint style="success" %}
To recap, those options should be selected:

1. **Marketplace -> LAMP** on 18.04 (or newer) image.
2. **User data textarea must be filled** with the #cloud-config code as explained above.
   {% endhint %}

Everything is done, click **Create Droplet**. \
The server will now be created, it usually takes **4-5 minutes** before it can be accessed.

![](/files/-M62Y6Bv05NZQqSajRYb)

While it's being setup we can add our own domain to point to that IP.

### 2. Point your own domain name to the UXWizz dashboard server

To do this, you have to go add some DNS records to your domain from your domain name registrar.\
Add two **A** records from your domain (or subdomain name) to the **IP of your server**.

1. **A analytics.example.com 123.123.456.9**
2. **A [www.analytics.example.com](http://www.analytics.example.com) 123.456.78.9**

### **3. Add free HTTPS certificate for that domain.**

The easiest way to access the server is through the web console. Here you can use the password that was set when creating the droplet.&#x20;

![](/files/-M62bcN-K2giTstua-5q)

{% hint style="info" %}
Note that **when you type passwords in a console, nothing is displayed** but the password is actually typed. When you paste the password from your email you won't see anything, so just paste with it CTRL+V and submit with ENTER.
{% endhint %}

{% hint style="success" %}
You should now be able to **access UXWizz using the new domain name.** It can also be accessed from the server IP.
{% endhint %}

Now, back to the **HTTPS certificate**.\
While you are in the console, run this command to generate a free **HTTPS certificate** using **certbot:**\
**(replace example.com and [www.example.com](http://www.example.com) with the own domains, the same as in step 2)**

```
certbot --apache --agree-tos -d example.com -d www.example.com
```

There are 3-4 questions you have to respond to in the console after running that command in order for the certificate to be issued.

{% hint style="success" %}
**Done!**\
\
**You now have a UXWizz instance, running on your own server, on your own domain with a HTTPS certificate.**
{% endhint %}

You might be able to also use this as a guide to add UXWizz on a server from different hosting provider, but the **user data** (cloud-init) script might not work, as it has some DigitalOcean specific paths.

If you had any issues following this guide, or want to suggest making a similar guide for a different provider (assuming they support premade LAMP images and cloud-init), you can send me an e-mail at support \[at] uxwizz.com.


# Docker

UXWizz also provides public Docker images for the trial version, which can be upgraded to the full version using a [license key](https://www.uxwizz.com/pricing?ref=docker-docs).

There are two options:

{% content-ref url="/pages/m6V3wQAorh1eQ6yZnYsR" %}
[Standalone Docker image](/installation/docker/standalone-docker-image)
{% endcontent-ref %}

{% content-ref url="/pages/PylwCCcRM0ygk7qoIjdR" %}
[Via Docker Compose](/installation/docker/via-docker-compose)
{% endcontent-ref %}


# Via Docker Compose

{% hint style="info" %}
This guide assumes you already have [Docker ](https://www.docker.com/)installed.
{% endhint %}

{% hint style="info" %}
This Docker compose creates two services:&#x20;

1. **Webserver** (Apache/PHP)  - The [UXWizz Webserver image](https://hub.docker.com/repository/docker/uxwizz/uxwizz-webserver/general)
2. **Database** (MySQL) - [MariaDB Image](https://hub.docker.com/_/mariadb)
   {% endhint %}

## Running UXWizz via docker compose

Copy this **compose.yml**  file locally in a folder named `uxwizz` and run **`docker compose up -d`**

{% code title="compose.yml" %}

```yaml
services:
  webserver:
    image: uxwizz/uxwizz-webserver:latest
    container_name: "uxwizz-webserver"
    restart: always
    ports:
      - "8000:80"
      - "4430:443"
    volumes:
      - html:/var/www/html
      - php-config:/usr/local/etc/php/php.ini
      - apache_sites_enabled:/etc/apache2/sites-enabled
      - apache_logs:/var/log/apache2
    environment:
      UXWIZZ_DB_HOST: db
      MYSQL_DATABASE: uxwizz
      MYSQL_ROOT_PASSWORD: temp-root-password-jasdlkz1
    depends_on:
      db:
        condition: service_healthy
  db:
    image: mariadb:11.7.2
    container_name: "uxwizz-db"
    ports:
      - "3306:3306"
    command: --max-allowed-packet=64MB --bind-address=0.0.0.0
    environment:
      MYSQL_ROOT_PASSWORD: temp-root-password-jasdlkz1
      MYSQL_DATABASE: uxwizz
      MARIADB_AUTO_UPGRADE: 1
      MARIADB_INITDB_SKIP_TZINFO: 1
    volumes:
      - mysql_data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
      start_period: 10s
      interval: 10s
      timeout: 5s
      retries: 3
    restart: always
volumes:
  mysql_data:
  html:
  apache_logs:
  apache_sites_enabled:
  php-config:

```

{% endcode %}

{% hint style="warning" %}
It is recommended to replace both values of **MYSQL\_ROOT\_PASSWORD** with a secure password.
{% endhint %}

To **stop** the services, you can run `docker compose down`.

To also **delete** all UXWizz data/db/volumes, you can run `docker compose down -v`.

## Accessing UXWizz

As shown in the compose file, the ports exported are **8000** (HTTP) and **4430** (HTTPS).\
\
You should now be able to access your dashboard at [**http://localhost:8000**](http://localhost:8000)

## Tip: Using Bind Volumes

If you want to use local folders as bind volumes, instead of named volumes.

You must first populate the **html** folder from the webserver image, by running this command:

```sh
mkdir -p ./html; docker run --rm --entrypoint="" uxwizz/uxwizz-webserver \
tar cf - -C /var/www/html . | tar xf - -C ./html
```

Then, in **compose.yml** prepend **./** to all volumes, like this:

```yaml
services:
...
  webserver:
  ...
    volumes:
      - ./html:/var/www/html
      - ./php.ini:/usr/local/etc/php/php.ini:ro
      - ./sites-enabled:/etc/apache2/sites-enabled
      - ./apache_logs:/var/log/apache2
  db:
  ...
    volumes:
      - ./mysql_data:/var/lib/mysql

```


# Standalone Docker image

This page explains how to start a new UXWizz Docker container.

{% hint style="info" %}
This guide assumes you already have [Docker ](https://www.docker.com/)installed.
{% endhint %}

### Creating the container

To start a new UXWizz container, run this command:

```
docker run -d -p 8080:80 --name uxwizz -v uxwizz_www:/var/www/html -v uxwizz_db:/var/lib/mysql uxwizz/uxwizz
```

Explanation:

* **-d** - Run the container detached, without having to keep the current console open
* **-p 8080:80** - Map the port 8080 on the host to port 80 in the container
* **--name uxwizz** - Container instance name
* **-v uxwizz\_www:/var/www/html** - Volume to persist UXWizz webserver files
* **-v uxwizz\_db:/var/lib/mysql** - Volume to persist UXWizz database
* **uxwizz/uxwizz** - The name of the public [UXWizz Docker Image on DockerHub](https://hub.docker.com/r/uxwizz/uxwizz)

### Accessing UXWizz

Open the browser and access <http://localhost:8080>

{% hint style="info" %}
If you installed it on a remote server, access it via the server IP instead.

You can change the port mapping by moidfying *8080*, for example *-p 80:80 -p 443:443*  for a normal HTTP/HTTPS config.
{% endhint %}

### Notes

* The named volumes persist between container restarts.
* **Updating the platform is done through the UXWizz dashboard itself.**


# Adding the tracking code

1. [Upload the script](/installation/installation/uploading-the-script)
2. [Create a new *MySQL database* for UXWizz](/installation/installation/creating-a-mysql-database)
3. [Run the auto installer](/installation/installation/running-the-installer)
4. **Add the tracking code to your site**

## 1.4 Tracking a domain

{% hint style="warning" %}
**Note: You should include the snippets provided in the UXWizz dashboard, which are unique for each domain.**
{% endhint %}

You can track unlimited domains on a single UXWizz installation. To track a new domain you have to do two things:

1. **Add the domain name** by giving domain access to your own user using the one of the *Add domain* buttons (from main overview, domain selector or settings→users).
2. **Include the tracking script on that domain**. On each page of the tracked domain you need to include this JavaScript file:

{% hint style="info" %}
**The actual snippets/links are provided in your dashboard!**
{% endhint %}

```html
<script>UST_CT = [];UST = { s: Date.now(), addTag: function(tag) { UST_CT.push(tag) } };UST.addEvent = UST.addTag;</script>
<script src="https://your.uxwizz.com/server/ust.min.js" async></script>
```

Add it just before the end of the ***head*** tag, like so:

```html
<head>
...
...
<script>UST_CT = [];UST = { s: Date.now(), addTag: function(tag) { UST_CT.push(tag) } };UST.addEvent = UST.addTag;</script>
<script src="https://your.uxwizz.com/server/ust.min.js" async></script>
</head>
```

**Note that if you want to use the AB testing feature the tracking code is bigger AND different for each domain (get this code from the interface, for each domain on the Domains page):**

```html
<script>
UST_CT = [];UST = { s: Date.now(), addTag: function(tag) { UST_CT.push(tag) } };UST.addEvent = UST.addTag;
// Prevent AB test flashing
(function() {var ust_s = document.createElement('STYLE');ust_s.id = 'ust_body_style';
ust_s.appendChild(document.createTextNode('body {visibility: hidden}'));document.head.appendChild(ust_s);})();
setTimeout(function(){ var el = document.getElementById('ust_body_style'); el && el.remove()}, 800);
</script>
<script src="https://your.uxwizz.com/server/ab/trackeddomain.com.ab.js" defer></script>
<script src="https://your.uxwizz.com/server/ust.min.js" async></script>

```

{% hint style="info" %}
**On what pages to include the script?**&#x20;

It is recommended to include the script on all pages, but you might not want to include the tracking script on sensitive pages such as the login page.&#x20;
{% endhint %}

{% hint style="info" %}

#### Different tracking settings for each domain?

If you want different tracking settings for each domain tracked you can change the settings inside the generated **ust.min.js** tracker file, saving it with another name (eg: ust.min.domain.js) and include this copy on the other domain instead of the original ust.min.js.&#x20;

**Note:** that when you do this, whenever you change settings in the UI, only the original ust.min.js will be updated/regenerated.

Domain-specific settings is a planned future.
{% endhint %}

{% hint style="success" %}
If everything worked as expected you should **immediately** see visitors data in your dashboard after a refresh, you can test if the script is working by visiting yourself the site you have installed the tracker on.
{% endhint %}


# Automatic SPA pageview tracking

{% hint style="info" %}
To track page views in a Single Page Application (SPA), you normally listen for route changes on your router and send a tracking call.&#x20;
{% endhint %}

Here's how you can do it automatically, without changing any code in your application, by detecting when the URL changes:

### Automatically track pageviews on a Single Page Application

````html
```html
<script>
    (() => {
        let lastTrackedUrl = window.location.href;

        // Whenever 
        const trackPageView= () => {
            const currentUrl = window.location.href;
            if (currentUrl === lastTrackedUrl) return;
            
            // Page changed
            UST.trackNewPage();
            lastTrackedUrl = currentUrl;
        };

        // Monitor URL changes (pushState, replaceState, and popstate)
        ['pushState', 'replaceState'].forEach((method) => {
            const original = history[method];
            history[method] = function (...args) {
                const result = original.apply(this, args);
                try {
                    trackPageView();
                } catch (e) {
                    console.error(e);
                }
                return result;
            };
        });

        window.addEventListener('popstate', trackPageView);
    })();
</script>
```
````


# Add tracker to Next.js App

{% hint style="warning" %}
This guide is still quite new. If you encounter any issues, please [contact support](/guides/support).
{% endhint %}

To add an external analytics tracking snippet in your Next.js application:

1. [Include the tracking snippet in **\_document.tsx** or **app/layout.tsx.**](#id-1.-option-a-next.js-uxwizz-snippet-in-_document.tsx)
2. [Create the UXWizzPageview.tsx component.](#id-2.-creating-uxwizzpageview.tsx)
3. [Include the pageview component.](#id-3.-adding-the-pageview-component)

{% hint style="info" %}
Write this in your existing **\_document.tsx** file.\
Create it in your **pages directory** if it doesn't exist.

If you are using the new **app** routing, copy the \<head> section into /**app/layout.tsx.**
{% endhint %}

{% hint style="warning" %}
**Note!! - This was the tracking code as of version 6.4.0.**&#x20;

Please update it to match the tracking code given to you in the UXWizz dashboard.

Set your own dashboard URL **dashboardURL** constant.
{% endhint %}

### 1. (Option A) Next.js UXWizz snippet in \_document.tsx

```jsx
import { Html, Head, Main, NextScript } from 'next/document';
import Script from 'next/script';

const dashboardURL = 'https://your.uxwizz.com/server';
const trackedDomain = 'yourappdomain.com';

export default class MyDocument extends Document {
  render() {
    return (
      <Html>
        <Head>
          {/* UXWIZZ SNIPPET START */}
          {/* Global scope */}
          <Script
            id="ust-init"
            strategy="beforeInteractive"
            dangerouslySetInnerHTML={{
              __html: `UST_CT = []; UST = { s: Date.now(), addTag: function(tag) { UST_CT.push(tag) } }; UST.addEvent = UST.addTag;`,
            }}
          />
  
          {/* vvv -- Only include this part to enable A/B tests -- vvv*/}
          <Script
            id="ust-ab-init"
            strategy="beforeInteractive"
            dangerouslySetInnerHTML={{
              __html: `(function() {var ust_s = document.createElement('STYLE');ust_s.id = 'ust_body_style';
                  ust_s.appendChild(document.createTextNode('body {opacity: 0}'));document.head.appendChild(ust_s);})();
                  setTimeout(function(){ var el = document.getElementById('ust_body_style'); el && el.remove()}, 800);`,
            }}
          />
          <Script
            id="ust-ab"
            src={`${dashboardURL}/ab/${trackedDomain}.ab.js?v=x.x.x`}
            strategy="afterInteractive"
            defer
          />
          {/* ^^^ -- Only include this part to enable A/B tests -- ^^^*/}
  
          {/* Main UXWizz script */}
          <Script
            id="uxwizz-script"
            src={`${dashboardURL}/ust.min.js?v=x.x.x`}
            strategy="afterInteractive"
            async
          />
          {/* UXWIZZ SNIPPET END */}
        </Head>
        <body>
          <Main />
          <NextScript />
        </body>
      </Html >
    )
  }
}
```

### 1. (Option B) Next.js UXWizz snippet in /app/layout.tsx

```jsx
const dashboardURL = 'https://your.uxwizz.com/server';
const trackedDomain = 'yourappdomain.com';

...

export default function RootLayout({
  children,
}: Readonly<{
  children: React.ReactNode;
}>) {
  return (
    <html lang="en">
      <head>
        {/* UXWIZZ SNIPPET START */}
        {/* Global scope */}
        <Script
          id="ust-init"
          strategy="beforeInteractive"
          dangerouslySetInnerHTML={{
            __html: `UST_CT = []; UST = { s: Date.now(), addTag: function(tag) { UST_CT.push(tag) } }; UST.addEvent = UST.addTag;`,
          }}
        />

        {/* vvv -- Only include this part to enable A/B tests -- vvv*/}
        <Script
          id="ust-ab-init"
          strategy="beforeInteractive"
          dangerouslySetInnerHTML={{
            __html: `(function() {var ust_s = document.createElement('STYLE');ust_s.id = 'ust_body_style';
                ust_s.appendChild(document.createTextNode('body {opacity: 0}'));document.head.appendChild(ust_s);})();
                setTimeout(function(){ var el = document.getElementById('ust_body_style'); el && el.remove()}, 800);`,
          }}
        />
        <Script
          id="ust-ab"
          src={`${dashboardURL}/ab/${trackedDomain}.ab.js?v=x.x.x`}
          strategy="afterInteractive"
          defer
        />
        {/* ^^^ -- Only include this part to enable A/B tests -- ^^^*/}

        {/* Main UXWizz script */}
        <Script
          id="uxwizz-script"
          src={`${dashboardURL}/ust.min.js?v=x.x.x`}
          strategy="afterInteractive"
          async
        />
        {/* UXWIZZ SNIPPET END */}
      </head>
      <body>
        {children}
      </body>
    </html>
  );
}
...

```

This will only track the initial page as a pageview. To track all route changes, add this component:

### 2. Creating UXWizzPageview\.tsx

```jsx
'use client';

import { usePathname, useSearchParams } from "next/navigation";
import { useEffect, useRef } from "react";

export default function UXWizzPageview() {
    const pathname = usePathname();
    const searchParams = useSearchParams();
    const isInitialLoad = useRef(true);

    useEffect(() => {
        if (isInitialLoad.current) {
            isInitialLoad.current = false
            return;
        };
        if (typeof window === 'undefined') return;
        const ust = (window as typeof window & { UST: { trackNewPage: () => void } })['UST'];
        if (!ust || !ust.trackNewPage) return;
        ust.trackNewPage(); // Call on route change, but not on initial load
    }, [pathname, searchParams]);

    return null;
}
```

### 3. Adding the pageview component.

You can then import **UXWizzPageview** in the body section of **layout.tsx**

```jsx
...

import dynamic from 'next/dynamic';
const UXWizzPageview = dynamic(() => import('./UXWizzPageview'), { ssr: false });
...
...
...
      <body>
        <UXWizzPageview />
        {children}
      </body>
...
```

{% hint style="warning" %}
If you don't use TypeScript, you can simply remove the typings replace this line:

```javascript
const ust = (window as typeof window & { UST: { trackNewPage: () => void } })['UST'];
```

with

```javascript
const ust = window['UST'];
```

{% endhint %}


# Add tracker to React Router App

## 1. Include the UXWizz tracking snippet in your index.html file

You should now be able to use `UST` in your application. If you use TypeScript, you can declare `UST` as any. TypeScript typings for the tracker will be released soon.

## 2. Track pageviews

By default, being a SPA, only the entry pageview will be tracked.

To track all consequent pageviews, include a new UXWizzPageview\.ts in your app

```jsx
import { useEffect } from 'react';
import { useLocation } from 'react-router-dom';

export default function UXWizzPageview() {
    const location = useLocation();
    const isInitialLoad = useRef(true);

    useEffect(() => {
        if (isInitialLoad.current) {
            isInitialLoad.current = false
            return;
        };
        if (typeof window === 'undefined') return;
        const ust = (window as typeof window & { UST: { trackNewPage: () => void } })['UST'];
        if (!ust || !ust.trackNewPage) return;
        ust.trackNewPage(); // Call on route change, but not on initial load
    }, [location]);
    
    return null;
};
```

Then, in your main App component, include `UXWizzPageview`.

<pre class="language-jsx"><code class="lang-jsx">// ...
import UXWizzPageview from './UXWizzPageview';

<strong>export default function App() {
</strong>  return (
    &#x3C;Router>
      &#x3C;UXWizzPageview/>
      {/* your other components */}
    &#x3C;/Router>
  );
}
</code></pre>

{% hint style="info" %}
UXWizz will automatically track the initial page-load (when the tracker file is loaded).

We added a check, to avoid tracking the initial page-load again.
{% endhint %}

{% hint style="warning" %}
If you don't use TypeScript, you can simply remove the typings replace this line:

```javascript
const ust = (window as typeof window & { UST: { trackNewPage: () => void } })['UST'];
```

with

```javascript
const ust = window['UST'];
```

{% endhint %}


# Optimization tips


# MySQL/MariaDB

## **Easy to implement, high impact:**

Some of those optimizations might only be possible on VPS or dedicated servers, not on shared hosting with cPanel.

### 1. Replace MySQL with[ MariaDB](https://en.wikipedia.org/wiki/MariaDB)

MariaDB is an open-source fork of MySQL that provides better performance.&#x20;

The nice part is that MariaDB is a "drop-in replacement" for MySQL, meaning that you can just install it over the current MySQL installation and it should work.

{% hint style="info" %}
MariaDB also has a bunch of good articles on database optimization: <https://mariadb.com/kb/en/optimization-and-tuning/>
{% endhint %}

### 2. Set correct MySQL configuration&#x20;

By default, MySQL won't use all the server resources. You have to tell MySQL explicitly how much memory it can use.&#x20;

**It is important to change your the `innodb-buffer-pool-size` based on the available RAM size.**

Here is a recommended MySQL config for an 8GB/4vCPU server:

```
[mysqld]

# InnoDB
innodb_buffer_pool_size = 5600M # This should be around 70% of your total RAM
innodb_log_file_size = 1400M # Around 15-25% of buffer-pool-size
innodb_file_per_table = 1 # Don't fragment tables across files
innodb_flush_log_at_trx_commit = 2 # Increases tracking write speed

max_connections = 100
max_allowed_packet = 16M

# Disable bin log - more efficient, but less robust:
#  this drastically reduces storage size and improves performance
#  but you lose the replication and restore capabilities
skip-log-bin 
```

{% hint style="info" %}
**An easy way to find the correct values for your** [**MySQLTuner tool**](https://github.com/major/MySQLTuner-perl#downloadinstallation)**.** \
**When ran, the MySQLTuner will check your current configuration and server specifications and suggest some reasonable values to use.**
{% endhint %}

### **3**. Delete unnecessary data more often

{% hint style="info" %}
Checkout the cron jobs guide to enable automatic data deletion.[Auto-delete old data (cron jobs)](/installation/optimization-tips/auto-delete-old-data-cron-jobs)
{% endhint %}

The highest database usage in UXWizz are usually the heatmaps and session recordings. \
By default, UXWizz keeps this data until the user associated with it is also removed.

If your database size grew too big, or you want to reduce the size before a server migration, you can safely delete old heatmaps and session recordings.&#x20;

For example, if you only want to **delete the oldest 50K heatmap** entries and **oldest 10K recordings,** you can run those MySQL queries:

```sql
// Clear old heatmap data
DELETE FROM ust_movements ORDER BY ID ASC limit 50000;
DELETE FROM ust_clicks ORDER BY ID ASC limit 50000;

// Clear old record data
DELETE FROM ust_records ORDER BY ID asc LIMIT 10000;
DELETE FROM ust_partials ORDER BY ID asc LIMIT 10000;
```

{% hint style="info" %}
**Example:**

If you want to know how many rows of click heatmap data are stored in the database you can run this query:

```sql
SELECT COUNT(*) FROM ust_clicks
```

If it shows that you have **124000** rows and you only want to keep the latest 24000, you could then run the query described above to delete 100k rows:

```sql
DELETE FROM ust_clicks ORDER BY ID ASC limit 100000;
```

{% endhint %}

## A useful tool: MySQLTuner-perl

The optimal configuration settings depend on the database size and system specs. There are tools that can automatically suggest the best configuration for your specific setup. One such tools is [**MySQLTuner-perl**](https://github.com/major/MySQLTuner-perl)

{% hint style="info" %}
Please check their repo for the latest installation instructions.
{% endhint %}

To install on use it, simply download the Perl file and executed it:

```shell
cd /
wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl -O mysqltuner.pl
wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/basic_passwords.txt -O basic_passwords.txt
wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/vulnerabilities.csv -O vulnerabilities.csv
perl mysqltuner.pl
```

<br>


# Auto-delete old data (cron jobs)

You can use the provided cron jobs to automatically delete old data in order to keep the database size low and maintainable for many years.

{% hint style="info" %}
Most data usage comes from heatmaps and [recordings](/api/session-recording).
{% endhint %}

{% hint style="danger" %}
**Deprecated** - This was the old way to set-up cron jobs. Now the cron jobs set-up and running cron jobs is done automatically through the interface, from the **Scheduled Tasks settings** screen.
{% endhint %}

### How to run the cron jobs

{% hint style="warning" %}
Note: This assumes that your dashboard is installed at **/var/www/html/**.\
Update the paths accordingly if your dashboard is installed at a different location.\
\
You might first have to run **sh /var/www/html/server/cron/set\_exec\_permissions.sh** to make sure that cronjob can execute the scripts.
{% endhint %}

Edit the crontab file to set what scripts to execute when, by running **`crontab -e`**.\
Add the scripts you want to be executed, like this:

<pre data-title="crontab -e"><code># ... previous crontab content ...

# UXWizz cron jobs
0 2 * * * cd /var/www/html/server/cron; ./ust_del_record_60_days.sh >> /var/log/ust_cron.log 2>&#x26;1
<strong>0 3 * * * cd /var/www/html/server/cron; ./ust_del_heatmap_60_days.sh >> /var/log/ust_cron.log 2>&#x26;1
</strong>0 4 * * * cd /var/www/html/server/cron; ./ust_limit_record_number.sh >> /var/log/ust_cron.log 2>&#x26;1
# Backup the database every Sunday at 3AM
<strong>0 3 * * 0 cd /var/www/html/server/cron; ./ust_backup_dh.sh >> /var/log/ust_cron.log 2>&#x26;1
</strong></code></pre>

{% hint style="info" %}
You can use the `nano` editor for modifying this file. You can press CTRL+O to save the file and CTRL+X to exit.\
\
**Notes**

`0 3 * * *` = Every day at 3 AM\
Tool to understand the cron time syntax: <https://crontab.cronhub.io/>

**/var/www/html/server/cron/log.txt** Will contain the execution date and time logs for the scripts that were run.
{% endhint %}

### Built-in example scripts

{% hint style="danger" %}
**There are currently no cron job examples for Multi-DB Agency setups.**\
**Those cron jobs will only delete data in the main database.**
{% endhint %}

UXWizz comes with some helper and example scripts that can be used for cron jobs.&#x20;

{% code title="/var/www/html/" %}

```sh
###################
# Core scripts
###################
server/cron/ust_execute_query.sh
server/cron/set_exec_permissions.sh

###################
# Built-in example scripts to be used as cron jobs
###################

# Delete heatmap data older than 60 days (data saving)
server/cron/ust_del_heatmap_60_days.sh

# Delete recording data older than 60 days (data saving)
server/cron/ust_del_record_60_days.sh

# Delete all data older than 1 year (session retention)
server/cron/ust_del_visitors_1_year.sh

# Enforce domain record limit (delete sessions going over the set domain limit)
server/cron/ust_limit_record_number.sh

# Delete zero second recordings (potential bots)
server/cron/ust_del_zero_sec_rec.sh

# Create a backup of the main database (in /tmp/backups/)
server/cron/ust_backup_dh.sh

```

{% endcode %}

\
To change the retention numbers or create other scripts, you can copy one of the example .sh files and edit it. (e.g. change interval from 60 days to 6 months).


# Apache

## Increase max CCU

### 1. Allocate more resources

This allows for more Apache child processes to be spawned, thus being able to handle more concurrent connections.

{% hint style="info" %}
You can read more about Apache performance tuning here: <https://www.liquidweb.com/kb/apache-performance-tuning-mpm-directives/>
{% endhint %}

```bash
nano /etc/apache2/mods-enabled/mpm_prefork.conf
---
        ServerLimit 2048
        MaxRequestWorkers        2048
```

### 2. Kill connections faster

This might increase the latency of each request, but allow for more concurrent users to send requests without the idle connections using too much space.

```bash
nano /etc/apache2/apache2.conf
---
KeepAlive Off
```


# Frequently Asked Questions

## Unique Visitor Tracking

### **Is UXWizz cookie-less?**

> Yes. UXWizz does not store or use cookies.\
> [Read more about Personal Data on user's device here](https://docs.uxwizz.com/about/personal-data-information#cookies-data-stored-on-users-computer)

### Is a visitor uniquely tracked across sessions?

> Not with high accuracy.\
> By default, a hash of the IP and user agent of the user is stored.\
> This can be used to approximately see all sessions of the same user, but it is not always accurate.

### How can I track more accurately a visitor across sessions?

> You can create a unique identifier, store it in localStorage and tag user's sessions using [Tags](/api/tags).\
> \
> For example, by adding this snippet:
>
> `UST.addTag('token_' + (localStorage['ust_token'] ||= UST.randomToken()))`\
> \
> This will store a random ID in localStorage and tag each session of this user with this ID.

## Generate custom dashboards

### Can I generate custom graphs/charts using UXWizz?

> No. UXWizz does not come with a chart editor, but your data is stored in a simple MySQL database.\
> You can use any dashboard generation tool that comes with MySQL connection support.\
> For example: [getmotoradmin.com](<https://getmotoradmin.com >)  or [chartbrew.com](https://chartbrew.com/) or any MySQL database viewer.


# Tags

**Tags** are strings that can be associated with a specific visit/session.\
Unlike [**events**](/api/events), tags are unique per session (i.e. can not have duplicate tags), are simple strings of a length of maximum 128 characters.\
Tags can be used to quickly filter/segment data.

**Example**

```javascript
// Call this when the scrollbar reaches the end
UST.addTag('scrolled_to_footer')

// Call this when user adds an item to the basket
UST.addTag('add_to_basket_timestamp: ' + Date.now())
```

**Instructions**

* Sometimes you might want to save additional data for each tracked user (such as username or whether they clicked a button or not).
* To add a tag the function **UST.addTag()** is provided. It has only one parameter which is the tag value. For example after calling this: **UST.addTag("username\_John")**

  The tag will be saved for the current recording and you will be able to find it more easily.
* You can also enable auto-tagging when certain elements are clicked. Add the HTML5 attribute **data-UST\_click\_tag** to set what tag will be added if the current element is clicked.

  Example: `<input type="text" data-UST_click_tag="clicked_input" />`. When this input is clicked the tag **clicked\_input** will be added for this session.

  You will then be able to, for example, see only the recordings of users who clicked that specific input.

**Notes**

1. Once written, the value of **tags can not be changed**.&#x20;
2. Each tag is **unique** and can appear **only once**. If you call `UST.addTag()` again with the same tag value, nothing will happen.
3. If you want more tags with similar name, you can either add a random value or a unique ID to each tag name.

## Examples: Using tags

### 1.  Track if user scrolled on the homepage

#### JavaScript:

```javascript
// Add a tag for users who scroll at least once on the homepage
window.addEventListener('scroll', function didScroll() {
    UST.addTag('scrolled_on_home');
    window.removeEventListener('scroll', didScroll); // Sending it once is enough, remove listener
});
```

#### Result:

Recorded users will then have tags similar to this:

![](/files/-LtuuAQyek29oslUqDb_)

### 2. Record all clicked elements

By default, in order to reduce storage size, userTrack only stores click positions for both heatmaps and recordings. If you want to also store the clicked elements selectors, you could add something like this after the tracker file:

```markup
<script>
UST.onLoaded = function () {
   addDynamicEventListener(document.body, 'click', '*', function (e) {
        if (!e.delegatedTarget) return;
        var tag = UST.DOM.getUniquePath(e.delegatedTarget);
        UST.addTag('click_' + tag);
    });
}
</script>
```

This will add a tag like `click_element-path` for every element clicked, for example `click_#pricing-button(1)`.

The `element-path` is a CSS selector that has the `nth-child:`  part remove to save space, you can get the original selector by using this function:

```javascript
function uncompressSelector(selector) {
    return selector.replace(/\((\d+)\)/g, ' > *:nth-child($1)');
}

// Example
var cssSelector = uncompressSelector('#pricing-button(1)');
console.log(cssSelector );
// Outputs: #pricing-button > *:nth-child(1)
```


# Events

{% hint style="warning" %}
**Note:** Currently the events are only stored and displayed per user in the dashboard. In the future versions you will be able to filter and generate charts based on those events. \
Until then, you can use MySQL to directly query the database.
{% endhint %}

{% hint style="info" %}
If you want to track, for example, conversions, you should also store a Tag, e.g. `purchased`. This allows you to easily filter those sessions and generate charts.
{% endhint %}

Events allow you to store arbitrary data for a specific session or pageview.\
The main difference between **events** and [**tags** ](/api/tags)is that **tags** are unique strings stored per session, whereas events are complex objects saved per individual page visited.

### UST.addEvent(eventData)

Example:

```javascript
// NOTE: Make sure this code is added AFTER the tracking snippet
UST.addEvent({
    category: 'SHOP', // REQUIRED
    action: 'PURCHASED', // REQUIRED
    label: 'Football Shoes',
    value: 49.99,
    value_secondary: 15.99,
    item_id: 'SHOE123',
    data: { img: "prod/img/shoe.png" }
});
```

#### Input parameters

You can pass those values in the **eventData** argument:

| Parameter            | Type              | Example value                | Info                    |
| -------------------- | ----------------- | ---------------------------- | ----------------------- |
| **category**         | string - REQUIRED | "SHOP"                       |                         |
| **action**           | string - REQUIRED | "PURCHASED"                  |                         |
| **label**            | string - OPTIONAL | "Football Shoes"             |                         |
| **value**            | number - OPTIONAL | 49.99                        | eg. product price       |
| **value\_secondary** | number - OPTIONAL | 15.99                        | eg. shipping costs/tax  |
| **item\_id**         | string - OPTIONAL | "SHOE123"                    | eg. item SKU            |
| **data**             | string - OPTIONAL | { img: "prod/img/shoe.png" } | This can be any object. |

{% hint style="warning" %}
**Data types limits**

* **strings** (**category**, **action**, **label**, **item\_id**) have a **character limit of 128**.
* **numbers** (**value** and **value\_secondary**) are stored as fixed precision decimal numbers. \
  They always have **2 decimals** and a maximum of **13** digits before the decimal.

  Max decimal number format example: **9,999,999,999,999.99**
* The **data** field is stored as a MySQL **TEXT** variable and can have any size (limited by the database engine).
  {% endhint %}

{% hint style="info" %}
**Note:** The **data** field is automatically converted to **JSON** using [**JSON.stringify()**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify) on the client-side **if** the passed value is not already a string.
{% endhint %}

#### Autofilled values

Those values are automatically added by the server for each event

| Name             | Type             | Info                                                   |
| ---------------- | ---------------- | ------------------------------------------------------ |
| **id**           | UNSIGNED INTEGER | ID of the event                                        |
| **clientid**     | UNSIGNED INTEGER | ID of the client (session)                             |
| **clientpageid** | UNSIGNED INTEGER | ID of the client page (pageview)                       |
| **date**         | DATETIME         | Date and time when the event was added to the database |

{% hint style="info" %}
The events system is loosely opinionated, meaning that you can store values in any way you prefer. The system provides multiple **string** and **number** fields that you populate.

In the future, the value of some of those fields might gain a specific meaning in order to automatically generate and display specific charts. For example, the dashboard could automatically show "Revenue" as being the sum of "value" for events that have the action name "PURCHASED".
{% endhint %}


# Hooks/callbacks

## What are UXWizz callbacks?

The UXWizz callbacks or hooks are a way to tap into the client-side UXWizz tracking functionality and listen to specific events. This is useful, for example, if you want to read or forward some UXWizz tracking data to another service.

### Available callbacks

* **UST.onLoaded()**
  * Called as soon as the ust.min.js finishes loading.
* **UST.onTrackingStarted() : false | undefined**
  * Called when all tracking checks passed, meaning that a new session will be created.
  * This is called before the session was created.
  * If you want to stop creating this session, return `false` from this function.
* **UST.onSessionCreated(clientID: number)**
  * Called when the UXWizz server create a new session for this client
  * **clientID**: The integer number ID of the session.
  * This is called only once per visit for each visitor.
* **UST.onPageViewCreated(clientID: number, clientPageID: number)**
  * Called when a new page has loaded and the server responded with the pageview ID.
  * **clientID:** The integer ID of the session.
  * **clientPageID:** The integer ID of the pageview.
  * This callback is also called once immediately after onSessionCreated (first pageview).
* **UST.onDataSent(data: string\[])**
  * Called whenever tracking data (session recording/heatmap data) is sent to the server.
  * **data:** An array of data strings sent to the server. \
    Each data string is in the format `c=XXX` where `c` is the data type and `XXX` is the data value.\
    The data type can be:
    * **m** - Heatmap movements
      * Data value is a [Positions string](/api/hooks-callbacks#positions-string-compressed-format)
    * **c** - Heatmap clicks
      * Data value is a [Positions string](/api/hooks-callbacks#positions-string-compressed-format)
    * **p** - Partial recording data
      * Data value is a [Recording string](/api/hooks-callbacks#recording-string-compressed-format)
    * **r** - Full recording data (sent when pageview has finished)
      * Data value is a [Recording string](/api/hooks-callbacks#recording-string-compressed-format)
    * x - Recording type
      * Data is an integer
    * w - We have a complete recording
      * Data is 1 (or not set)
    * s - Skip updating lastActivity
      * Useful for when we want to update data for a user, without automatically refreshing/increasing the user's session duration.
      * Data is 1 (or not set)
    * **i** - clientPageID
      * Data value is a number
* **UST.onTagAdded(tag: string)**
  * Called when **UST.addTag()** was called and the server responded.
  * **tag**: The string that has just been added as a tag to the current user.
* **UST.onEventAdded(eventData: Event)**
  * **Added in version 3.5.0**
  * Called when **UST.addEvent()** was called and the server responded.
  * **eventData**: The original eventData passed, also containing **clientID** and **clientPageID**
* **UST.onGDPRAccepted()**
  * Called when the user accepted the UXWizz tracking consent pop-up.
* **UST.onGDPRDeclined()**
  * Called when the user declined the UXWizz tracking consent pop-up.

### **Usage example**

{% hint style="warning" %}
Make sure write the callbacks declarations **after the tracking file** is included.
{% endhint %}

#### Example: Multiple UXWizz callbacks

```javascript
// <head>
// After ust.min.js include snippet
// ...
// <script>

// Example: User will be recorded
UST.onTrackingStarted = function() {
    console.log('Creating session...!');
}
   
// Example: New session has been created with an unique clientID
UST.onSessionCreated = function(clientID) {
     console.log('New session created for client', clientID);
}

// Example: whenever a tag is added, add the same tag + current pageID
UST.onTagAdded = function(tag) {
    if (tag === 'AddToCart' || tag === 'Converted') {
         UST.addTag(tag + ';' + sessionStorage.clientPageID);
    }
} 

// <script>
// </head>
```

#### Example: Dynamically disable tracking the current visitor

```javascript
// Example: Permanently disable tracking a visitor once they reached checkout
UST.onTrackingStarted = function() {
    if (window.location.path === '/checkout-complete') {
        // Starting with the next page-load disable tracking this user (permanently)
        UST.disableRecord();
        
        // Return `false` to stop tracking this first pageview too
        return false;
    }
}
```

#### Example: Track the current user but disable session recording

```javascript
UST.onTrackingStarted = function() {
     // Disable session recording for specific IPs
     // Note: `ust_myIP` is globally populated ONLY if you have set 
     // some excluded IPs in the tracking settings
     if (['123.456.12.13', '127.0.0.1'].indexOf(ust_myIP) !== -1) {
         UST.settings.enableSessionRecordings =  false; // Disable sending rec data
         UST.fullRec = false; // Disable attaching the full recorder
         UST.nativeSessionRecording = false; // Disable attaching the native recorder
     }
     
     console.log('Creating pageview...!');
} 
```

{% hint style="info" %}
After the session has been created (**onSessionCreated**), you can always read the current userTrack clientID and clientPageID from **sessionStorage**:

**sessionStorage.getItem('clientPageID')**

**sessionStorage.getItem('clientID')**

**sessionStorage.getItem('token')**\
**token** - Another unique identifier per session (similar to clientID). \
This is useful as it's not incremental.
{% endhint %}

### Notes

#### Positions string (compressed format):

```javascript
"X1^Y1^count1~X2^Y2^count2"
// For example:
"303^490^1~441^570^1~439^642^1"
```

#### Recording string (compressed format)

```javascript
// This is more complex, looking at the data send or in the ust_records
// Should give you some idea of the format
// Some event names and their shorthand character:
enum PlaybackEventType {
    CLICK = 'c',
    SCROLL = 's',
    MOVEMENT = 'm',
    INACTIVITY = 'i',
    BLUR_INPUT = 'b',
    TEXT_SELECTION = 'a',
    WINDOW_RESIZE = 'r',
}

// For example
"a`body(2)(1)(5)(1)(2)(4)(2)(4)%201%23T%23^body(2)(1)(5)(1)(2)(4)(2)(4)%201%23T%23^8^9~i`80"
"m`966^1016~i`8~s`0^806~s`0^998~m`954^1415~s`0^1000~m`962^1416"
```


# Other API functions

<img src="/files/wsnVnXIXcsVmRmeYuL1i" alt="" width="188">

## Client-side API functions

1. [Disable tracking yourself](/api/other-api#1-disable-tracking-yourself)
   1. `UST.disableRecord()`
   2. `UST.enableRecord()`&#x20;
2. [Force send the recorded data](/api/other-api#3-force-send-the-recorded-data)
   1. `UST.forceSendData()`
3. [Track a new pageview](#id-3.-track-a-new-page)
   1. `UST.trackNewPage()`

### 1. Disable tracking yourself

**Example**

```javascript
 // Starting with the next page load the tracking will be disabled
 UST.disableRecord();

 // Removes the "disabled" flag.
 // Starting with the next page load you will be tracked
 UST.enableRecord();
```

**Instructions**

* To disable tracking yourself or other client you can call **UST.disableRecord()** from the JavaScript console or from a JS file.
* To re-enable tracking the curent client call **UST.enableRecord()**
* The tracking enabled/disabled flag is stored in the **localStorage**. As long as the browser localStorage is not cleared/reset this setting will persist. (eg: you won't be tracked again unless you clear all your browser data/cookies/localStorage)

{% hint style="info" %}
**Note:** You can also use the **`ust-opt-out`** and **`ust-opt-in`** query strings to disable tracking on a specific website where the tracker is installed. \
Access that website and add the query string like this: **`www.site.com?ust-opt-out`**.
{% endhint %}

### 2. Force send the recorded data

**Example**

```javascript
// A request to send *new* data to the server will be created
UST.forceSendData();
```

**Instructions**

* userTrack sends data to the server in an efficient way: it **batches** multiple actions made by the users and sends all of them at once in a single request. This means that sometimes you have recorded data stored on the client that hasn't been sent yet (it's queued to be sent in a specific amount of time). You can call **UST.forceSendData()** to reset the **time left** to send the next batch to **0**, thus forcing userTrack to send the data as soon as possible.
* One **use case** of this method is if you want to make sure the last seconds of the user's visit are recorded by calling **UST.forceSendData()** inside window [onbeforeunload](https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onbeforeunload) callback.
* You could also call this function after the user makes an important action that you want to make sure has been sent to the server (eg: `user clicks a specific button`). Note that in this case you should also use [`UST.addTag()`](/api/other-api#2-tag-visitors-dynamically)

### 3. Track a new page

**Example**

```javascript
// Creates a new pageview for this session
UST.trackNewPage();

// By default, it first sends all the cached data (recordings, movements)
// for the current page before creating a new page.
// If you want to avoid sending the latest stored data, you can pass `true`:

// Create a new pageview WITHOUT first sending the remaining data for 
// the curret page (discard currently tracked but not sent data)
UST.trackNewPage(true);
```

{% hint style="warning" %}
UST.trackNewPage() was added and is available from UXWizz version **6.5.0**
{% endhint %}

**Instructions**

* This is often used when tracking Single Page Applications (SPAs). You normally want to call this when your routes changes, to track a new pageview (otherwise UXWizz will keep recording data as being for the initial entry page, so you will have 1 pageview only per session).
* Note that, when using the full session recorder, this also takes a new snapshot of the current page (to be able to view a recording of only the current page if needed).


# Session Recording

### Choosing the recording mode

There are two distinct session recording systems that you can choose from.

{% hint style="warning" %}
**You can select the recording mode for each page when the tracker is installed, depending on which JS file is included:**\
\
`ust.min.js` **for using A. Default page recording**\
\
`ust-rr.min.js`  **for using B. Full page recording**
{% endhint %}

You can use either of the two recording systems on any different page: session playback can work even if some pages are recorded with one system and other pages with the other system.

### **A. Default page recording**

{% hint style="info" %}
**Lightweight**, very efficient tracking system that only stores the URL of the visited page and the actions taken by the users.&#x20;
{% endhint %}

This system is best used for recording static pages. When viewing the recording, the current content of the page will be loaded based on the URL. <br>

The main drawbacks of this method are:

1. It doesn't work well with dynamic content or behind login-protected pages (as the page is loaded in  your browser based only on the URL)
2. The tracked website must be shown in an iframe when viewing the recording.
3. Actions are actually executed again when viewing a recording.

{% hint style="warning" %}
This is NOT a video recording, [actions are replayed](/guides/basic-usage#this-is-not-a-video-recording) on top of your website's iframe.
{% endhint %}

{% hint style="success" %}
**The default session recording system uses around 1MB / 100 recordings.**
{% endhint %}

### **B. Full page recording**

{% hint style="info" %}
**Accurate** tracking that records the page content (HTML) and all changes and actions that happen on the page.&#x20;
{% endhint %}

This system should be used for recording highly dynamic pages, dashboards or pages where the same URL can show different content.

The main drawback of this method is that the size of each recording and the size of the data sent from the user to your server is larger.

{% hint style="danger" %}
**Use this with caution!**&#x20;

**The full recording system can use more than 1MB per page recorded!!**

**In order to keep the database size small, you might want to** [**regularly delete old recordings**](https://docs.uxwizz.com/api/pages/-MTm7hUXNWUDPmVvCP9E#3.-delete-unnecessary-data-more-often)**.**
{% endhint %}


# Ignore specific elements

For privacy reasons, you can mask or skip specific elements from being recorded by adding a CSS class to the HTML element:

| CSS class          | Description                                                                                       |
| ------------------ | ------------------------------------------------------------------------------------------------- |
| **ust-rec-block**  | Do not record this element ([full tracking system](/api/session-recording))                       |
| **ust-rec-ignore** | Do not record input events on this element ([both tracking systems](/api/session-recording))      |
| **ust-rec-mask**   | Replace all text input in this element with `*` ([both tracking systems](/api/session-recording)) |

{% hint style="info" %}
`input[type="password"]` will be masked by default for both tracking systems.
{% endhint %}

### Example

```html
<!-- Without masking -->
<input type="text" name="email" value="test@x.com" />
<!-- Email displayed in recording will be test@x.com -->

<!-- With masking -->
<input type="text" name="email" value="test@x.com" class="ust-rec-mask" />
<!-- Email displayed in recording will be ********** -->
```


# Goals (NEW!)

![](/files/EnxjPqmY8Ej2Y1vXVnL3)

A segment can be converted to a **goal**. Goals help you find the amount of and conversion rates for specific user behaviors within specific user segments.

<figure><img src="/files/VTb0lEfLgG8ws0Xmsk5P" alt=""><figcaption><p>Example of two Goals ("Pricing" visit, Trial download) per segment, with 3 segments active (All, Direct, Google)</p></figcaption></figure>

{% hint style="warning" %}
Currently goals are only stored locally, in localStorage, not persistently in the database.
{% endhint %}

{% hint style="info" %}
Temporary idea, if you want to uniquely store goals and segments per domain:\
You can add multiple DNS entries to your dashboard (e.g. stats.domain1.com and stats.domain2.com, or d2.stats.domain1.com). \
The localStorage data where the segments and goals are stored will be stored per domain.
{% endhint %}

## What can you use goals for?

Here are some examples on how you can use goals to better understand your visitors:

* **Conversion rates**\
  See how many sessions purchased out of all the sessions.
  * Goal — \[Tag: purchased]
  * Active segments: \[All]
* **Conversion rates for different segments**\
  Easily compare how many sessions purchased for different sources.
  * Goal — \[Tag: purchased]
  * Active segments: \[All], \[Referrer: t.co], \[Referrer: \*google\*]
* **A/B test results**\
  Quickly compare A/B test results and see which variant is better.
  * Goal — \[Page: /checkout]
  * Active segments: \[All], \[Tag: AB\_test1\_default], \[Tag: AB\_test1\_Variant1]
* **Funnel-like data**\
  See step-by-step values. This also works combined with multiple active segments: you can see the funnel data per segment (e.g. funnel for All visitors vs Facebook visitors).
  * Goal — \[Page: /pricing]
  * Goal — \[Page: /pricing, Page: /checkout]
  * Goal — \[Page: /pricing, Page: /checkout, Tag: purchased]
  * Active segments: \[All], \[Referrer: \*facebook.com\*]

## Creating a goal

{% hint style="info" %}
Goals are based on segments. \
Segments can be converted into goals and goals can be converted back into segments.
{% endhint %}

To create a new goal, create a user segment or use an existing one from the header menu.\
You can then convert the segment to a goal, from the segment menu.

<figure><img src="/files/oTcvVq5lOxKpz6RImNNh" alt="" width="276"><figcaption><p>Convert a segment to a goal</p></figcaption></figure>

The segment will then be removed from the header and a goal will be displayed in the dashboard:

<figure><img src="/files/KLMCotRqpyK6MAQ2j6lm" alt="" width="269"><figcaption><p>Goal card example</p></figcaption></figure>

{% hint style="info" %}
A goal can be removed, or converted back into a segment for editing purposes.
{% endhint %}

## How the goal value is calculated

Goals display **the number of user sessions in the merged goal segment**, over the number of user sessions in each of the currently active header segments.

The merged goal segment is computed individually for each active segment by merging the two segments as explained below.

### How the goal segment is merged with the active segments

Simply put, the merged goal segment is computed by **combining both the filters from the active segment with the goal filters**.

#### Example of internal goal segment merging:

Let's say we want to see how many of the **visitors that came from Twitter visited the pricing page**.

1. Create a segment for "User visited the pricing page":&#x20;

<figure><img src="/files/FHKZPqiSgmzTT0MzBrI5" alt=""><figcaption></figcaption></figure>

2. Create a segment "Referrer is Twitter":&#x20;

<figure><img src="/files/Lu3IrC5wHxvoRgmUN4bp" alt=""><figcaption></figcaption></figure>

3. Converting the "Pricing" segment above to a goal.
4. This is the internal merged segment that will be used to compute the goal values.

<figure><img src="/files/o1MBA7qtMBGYfLz68LpH" alt=""><figcaption><p>The internal goal merged segment, used to count sessions</p></figcaption></figure>

4. The merged segment is simply "Referrer is Twitter AND User visited the pricing page".\
   The goal value is computed by counting the user sessions in this merged segment.\
   This is how the final goal card will look like:

<figure><img src="/files/iq8EStSXiL0b3HwfYxvs" alt=""><figcaption><p>Goal: "User visited pricing", having the Twitter segment active.<br>Twitter segment has 42 sessions; merged "Twitter AND Pricing" segment has 19 sessions; 19/42 = 45.2% conversion rate.</p></figcaption></figure>

### How filters are combined

An intelligent way to combine filters has been implemented. It should work as expected in most cases.\
This is how specific filters are combined

<table><thead><tr><th width="126">Filter</th><th width="150">Active Segment</th><th width="138">Goal Segment</th><th width="191">Merged Segment</th><th>Merge type</th><th data-hidden></th></tr></thead><tbody><tr><td><strong>IP</strong></td><td>A</td><td><strong>B</strong></td><td>Has IP <strong>B</strong></td><td>Last value set</td><td></td></tr><tr><td><strong>Tag</strong></td><td><strong>A, B</strong></td><td><strong>C</strong></td><td>Has Tags <strong>A, B, C</strong> </td><td>Union (AND)</td><td></td></tr><tr><td><strong>Page</strong></td><td><strong>A, B</strong></td><td><strong>C</strong></td><td>Visited Pages <strong>A, B, C</strong></td><td>Union (AND)</td><td></td></tr><tr><td><strong>Country</strong></td><td><strong>US, RO</strong></td><td><strong>RO, DE</strong></td><td>Is from <strong>RO</strong></td><td>Intersection</td><td></td></tr><tr><td><strong>Referrer</strong></td><td><strong>A.com, B.com</strong></td><td><strong>B.com, C.com</strong></td><td>Came from <strong>B.com</strong> </td><td>Intersection</td><td></td></tr><tr><td>Session length</td><td>min: <strong>5s</strong><br>max: <strong>30s</strong></td><td>min: <strong>17s</strong><br>max: <strong>49s</strong></td><td>min: <strong>17s</strong><br>max: <strong>30s</strong></td><td>Intersection</td><td></td></tr></tbody></table>

In some cases, the goal value will be 0 when the intersection of two filters is null.\
For example, if the active segment is "Country: RO" and the goal is "Country: US", the goal will be 0.


# Ask AI (NEW!)

![](/files/EnxjPqmY8Ej2Y1vXVnL3)

Ask AI is a new feature in UXWizz that allows you to get insights of your stored data with the help of an AI chatbot (LLM).<br>

{% hint style="warning" %}
To use this feature you currently need an [OpenAI API key](https://platform.openai.com/api-keys) or [OpenRouter API key](https://openrouter.ai/settings/keys).\
You also need to have enough credits in your API provider account (e.g. $10).\
**Note: The AI model can and will make mistakes or provide incorrect queries.**&#x20;
{% endhint %}

<figure><img src="/files/fpMNMj9NVs97rd0jiGTy" alt=""><figcaption><p>Basic UXWizz Ask AI ChatGPT query demo</p></figcaption></figure>

## How does it work?

1. You type your question.\
   e.g. "*How many visitors came from Google versus directly?"*
2. The question, together with the database schema and some instructions (system prompt) are sent to ChatGPT.
3. The AI generates a MySQL query that answers your question.
4. The MySQL query is displayed to you. You can then send the query for execution to your local database to get the results.
5. The output is displayed as JSON in the chat.
6. The AI can also generate a Chart.js chart from this query.

Soon, there will be additional ways to display the results (graphs, exportable csv, files, images, etc.)

### Example query

<figure><img src="/files/6WkA9p6br7uXVgFnZM0e" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
TIP: You can simply press Enter with an empty input to get some question/prompt ideas.
{% endhint %}

### Selecting AI model

You can change the model from the top-right Settings → GPT Model menu.\
Currently, only OpenAI ChatGPT API and models are supported.&#x20;

<figure><img src="/files/ykVJVy39vemmeyBXZM4H" alt=""><figcaption></figcaption></figure>

### Generating charts

{% hint style="info" %}
Ask AI Charts was introduced in version 7.0.0.
{% endhint %}

You can simply ask the AI to generate a chart. \
The AI will create a MySQL query that returns the data and a Chart.js configuration. \
This data + config are then used in your dashboard to display the chart.

Here is a quick demo video:

{% embed url="<https://youtu.be/PchemV0LDE0?si=wYTDT_MYlpsFajyk>" %}

{% hint style="warning" %}
Coming soon!\
\* Ollama local AI support (ChatGPT alternative)\
\* ChatGPT completion summary (time spent, tokens consumed, estimate cost).
{% endhint %}


# Basic usage

![](/files/EnxjPqmY8Ej2Y1vXVnL3)

{% hint style="info" %}
This documentation page is still under construction and the quality and information on it is not of very high quality yet.
{% endhint %}

## &#x20;Usage and features

{% hint style="warning" %}
**Note**: This guide assumes that **UXWizz** was installed in a sub-folder called **userTrack** inside the root folder of your site (eg. **domain.com/userTrack**). If your installation was path was different, please adjust the mentioned URLs accordingly.
{% endhint %}

### 1. Accesing the interface

To login go to **domain.com/userTrack** and enter your password chosen at setup time.

By default the username is **admin**

### 2. Heatmaps

You can access **Click**, **Movements** and **Scroll** heatmaps from the **Heatmaps** menu in the sidebar.

![userTrack heatmaps interface](/files/-M1wwUPFKlVzV5MnvE88)

By pressing the settings gear you have access to change the window size, heatmap point size and also filter the data loaded from database to only include a specific resolutions range.

![](/files/-M1wx_g01nnWzIoNKSz6)

### 3. Record Playback

Ater clicking the play button from the **visitors** list the **session playback** for that visitor will start. Here you can **skip** the current page, skip the playback to a specific page or stop/restart playback for current page.

![userTrack record playback](/files/-M1wyBHkiU-nvh4QaJQN)

### **This is not a video recording**

UXWizz stores only the actions done by the user and the page URL they were done on. Because of this, when you watch a recording all the user actions are triggered again. It is advisable to add the CSS class **UST\_noClick** to the important buttons (such as finalizing an order), so that the click will be shown in playback but the click action will not be triggered again.

Please read here more about [session recording](/api/session-recording).

Note: In order not to affect the user experience browsing the website, the last page a user visits is not fully recorded (so the user can close the page without waiting for the data to be sent). When a user accesses a new a page the recording of the last page is sent. This saves a lot of database usage by reducing the number of requests sent to the server.

### 4. Admin settings

1. Tracking and privacy settings can be changed by admin users.
2. New users can be added by admin users. You can assign access to specific domains for those users.
3. Each domain can have a recorded visitor limit (if this limit is reached, oldest data will be overwritten when new data comes in). You can change this limit from the dashboard overview.

### 5. Remove data from database

1. You can delete specific clients (users) with all their corresponding data by selecting the users from the list and clicking the trash icon
2. Bulk deleting of data for a specific domain is currently being implemented in v3.


# A/B testing

## What can you A/B test

The A/B testing feature allows you to test different content/style of specific elements on your site in order to improve conversion rates. Currently, you can A/B test:

* **Text of elements** (eg. BUY NOW vs GET STARTED)
* **Style of elements** (eg. change colors, make them bigger, hide them, etc.).

## How can you A/B test

userTrack allows you to quickly create tests and make changes for each variant in a test.\
To add a new change you can use the visual editor, where you click an element on your site in order to get its selector and then input the new value for that element. You can immediately preview all the changes in a specific variant, and can also quickly switch between variants to compare them.

## The structure of a test

* TEST 1
  * Default
  * Variant 1
    * Change X
    * Change Y
  * Variant 2
    * Change Z
* TEST 2
  * Default
  * Variant 1
    * Change W

You can have multiple tests running at the same time, but statistically it is better to only test one thing at a time in order to make sure that the result of one test is not influenced by another.

Each test has multiple **variants**, one of them always being the **default** variant (current version of the site, with nothing changed). For example, you can have a **test** named "hero text", in which you want to find the best copy for the hero text on your landing page. In this test you could have 3 variants:

* **default** variant - hero text is the description of your product
* **benefits** variant - hero text is changed to showcase benefits of your product instead of its description
* **colored** variant - same text as default, but text color is different

Each of those variant has a list of **changes**, for the example above, those changes would be:

* **default**
  * no changes
* **benefits**
  * Change: Replace h1 text on homepage with the given text
* **colored**
  * Change: Change style of h1 text on homepage with the given style

{% hint style="info" %}
Each **test** can have unlimited **variants** and each variant can consist of unlimited **changes**.

It is usually recommended to keep the number of variants low (2 or 3) in order to have a big enough sample size (number of users) that see each variant.
{% endhint %}

## Results of an A/B test

After an A/B test is created and published, your users will see one of the variants created. When a user sees a specific variant, it will be **tagged** with the variant that he saw. This allows you to use **segments** in order to view stats for users who saw a specific variant. One way to compare results of an A/B test is to create a segment for each variant (i.e. each **tag** created for those variants).

## Results UI:

Since version 8.5.0, results for A/B tests are automatically calculated and shown on the A/B testing page.\
Those results are based on your existing tests, variants, goals and currently selected segments.

For example, for the test "pricing-h3" with two variants (Default and Variant 1), with the goal "Pricing" and segments "All" and "Google" enabled:

<figure><img src="/files/VWA4dQiu3seUbrpUeOP5" alt=""><figcaption></figcaption></figure>


# Usage tips

(under construction)

## Usage tips

### Heatmaps

Here are a few tips on how to make use of the heatmap data generated by userTrack.

#### 1. Unused call-to-action elements

If you have buttons, links or other interactive elements that the user is supposed to click on but using the heatmap data you noticed **low to no activity** on them you should consider:

1. If it's not a core element of your site you can **entirely remove the element** as it has no real-world use to the user and it occupies space and is a distraction for the user.
2. If the element is actually important for your site and you want the users to click it try making the element more visible by:
   1. Ensuring there is a high contrast between the element and the background.
   2. The element has enough white space around it and is not very close to other important call-to-action elements.
   3. Make sure the element's text accurately represents what will happen if the user clicks it.

### Recordings

#### 1. Gray "play" button and fake visitors

If there' s a gray `play` button next to a user it usually means:

1. The visitor was actually a **bot** or fake visitors. You see this gray button a lot if, for example, you advertise on Facebook which currently sends a lot of fake visitors or bots.
2. The visitor left the page immediately, before any data could be sent to the server. This could also happen if the user opens your site in a background tab and closes that tab without ever viewing your site.

#### 2. Panic clicking

If a user clicks multiple times in the same spot and nothing happens it might be because he would expect for something to change when he clicks that spot. Don't make elements look like buttons if they are not one. This couldalso mean that the button is not working properly or it's buggy.

### Other stats

* I find very important the list of referrers presented in the main dashboard. Notice which websites bring most traffic to your page and try amplifying this traffic by increasing your presence on that site.


# Environment settings

UXWizz can read selected configuration values from server environment variables. This is useful for administrators who want to keep credentials outside application files, or who want to disable specific platform capabilities for security and compliance reasons.

All feature flags are enabled by default. Environment variables are only needed when you want to override the default behavior.

### How UXWizz Reads Environment Variables

UXWizz reads environment variables from PHP using the standard environment sources available on the server:

* `getenv()`
* `$_ENV`
* `$_SERVER`

This makes the feature compatible with common PHP deployments, including Apache, Nginx with PHP-FPM, Docker, Linux services, Windows/WAMP, and other PHP 8+ environments.

Only the exact value `1` enables a disable flag. If a variable is missing, empty, or set to another value, UXWizz keeps the default behavior.

### Setting Environment Variables

The exact method depends on your hosting environment.

#### Linux / Ubuntu

#### 1. Add global env variables to /etc/environment

```shellscript
sudo nano /etc/environment
```

Define your desired variables in this file, available env variables (replace with your own values):

```dotenv
UXWIZZ_DISABLE_AI_CHAT="0"
UXWIZZ_DISABLE_SELFUPDATE="0"
UXWIZZ_DISABLE_SCHEDULED_TASKS_EXECUTION="0"
UXWIZZ_DB_HOST="127.0.0.1"
UXWIZZ_DB_NAME="uxwizz"
UXWIZZ_DB_USER="uxwizz"
UXWIZZ_DB_PASSWORD="your-secret-password"
```

**Apache**\
**1. Link environment variables to Apache via Systemd**

Run `sudo systemctl edit apache2`.&#x20;

{% hint style="warning" %}
You must **paste** this block exactly **between the two preservation comment lines**, or it won't save:
{% endhint %}

```shellscript
[Service]
EnvironmentFile=/etc/environment
```

**2. Pass them in your VirtualHost (or .htaccess) and Restart**

Add this line inside your Apache virtual host file, usually in `/etc/apache2/sites-available/`

{% hint style="info" %}
If your dashboard is served over HTTPS, this is usually the `*:443` virtual host. On Let's Encrypt setups, that is often the `*-le-ssl.conf` file. If the `*:80` virtual host only redirects to HTTPS, it usually does not need these variables. If UXWizz is also available over plain HTTP, add the same variables to both the `*:80` and `*:443` virtual hosts.
{% endhint %}

```apache
<VirtualHost *:443>
    ...
    PassEnv UXWIZZ_DISABLE_AI_CHAT UXWIZZ_DISABLE_SELFUPDATE UXWIZZ_DISABLE_SCHEDULED_TASKS_EXECUTION UXWIZZ_DB_HOST UXWIZZ_DB_NAME UXWIZZ_DB_USER UXWIZZ_DB_PASSWORD
</VirtualHost>
```

Then restart Apache:

```sh
sudo systemctl restart apache2
```

**PHP-FPM**

If your server uses PHP-FPM, add these lines to your PHP-FPM pool config, for example `/etc/php/8.3/fpm/pool.d/www.conf`:

```ini
env[UXWIZZ_DISABLE_AI_CHAT] = 1
env[UXWIZZ_DISABLE_SELFUPDATE] = 1
env[UXWIZZ_DISABLE_SCHEDULED_TASKS_EXECUTION] = 1
env[UXWIZZ_DB_HOST] = 127.0.0.1
env[UXWIZZ_DB_NAME] = uxwizz
env[UXWIZZ_DB_USER] = uxwizz
env[UXWIZZ_DB_PASSWORD] = your-secret-password
```

Then restart PHP-FPM:

```sh
sudo systemctl restart php8.3-fpm
```

Replace `8.3` with your installed PHP version.

#### Docker

Pass variables to the container:

```sh
docker run \
  -e UXWIZZ_DISABLE_SELFUPDATE=1 \
  -e UXWIZZ_DB_HOST=database \
  -e UXWIZZ_DB_NAME=uxwizz \
  -e UXWIZZ_DB_USER=uxwizz \
  -e UXWIZZ_DB_PASSWORD=your-secret-password \
  your-uxwizz-image
```

#### Windows / WAMP

Set environment variables in Windows, then restart WAMP/Apache so PHP receives the new values.

PowerShell example:

```powershell
[Environment]::SetEnvironmentVariable("UXWIZZ_DISABLE_AI_CHAT", "1", "Machine")
[Environment]::SetEnvironmentVariable("UXWIZZ_DB_HOST", "127.0.0.1", "Machine")
[Environment]::SetEnvironmentVariable("UXWIZZ_DB_NAME", "uxwizz", "Machine")
[Environment]::SetEnvironmentVariable("UXWIZZ_DB_USER", "uxwizz", "Machine")
[Environment]::SetEnvironmentVariable("UXWIZZ_DB_PASSWORD", "your-secret-password", "Machine")
```

### Feature Disable Flags

#### Disable AI Chat

```sh
UXWIZZ_DISABLE_AI_CHAT=1
```

Disables the AI chat question workflow.

When this flag is enabled:

* UXWizz will not send AI chat requests to LLM providers.
* Users can still open the AI chat screen.
* Users can still configure AI provider settings, API keys, model choices, and chat history preferences.
* When a user tries to ask a question, the server rejects the request and shows that AI chat is disabled by the administrator.

Use this when you want a fully local UXWizz installation that cannot send chat prompts to external AI providers.

#### Disable Self-Update

```sh
UXWIZZ_DISABLE_SELFUPDATE=1
```

Disables the built-in automatic updater.

When this flag is enabled:

* UXWizz can still check whether a new version is available.
* UXWizz can still validate the license and support status.
* The update page still shows version information.
* The application will not download, extract, overwrite, or delete files through the self-updater.
* The "Update now" action is disabled in the dashboard.

Use this when updates should be handled by your deployment pipeline, package manager, container image, or manual administrative process.

#### Disable Scheduled Task Execution

```sh
UXWIZZ_DISABLE_SCHEDULED_TASKS_EXECUTION=1
```

Disables execution of scheduled tasks.

When this flag is enabled:

* Admins can still create and edit scheduled task definitions.
* Admins can still view scheduled task history and settings.
* Manual task runs from the dashboard are blocked.
* Automatic task runs from cron or WP-Cron are blocked.
* Existing schedules are preserved, but they will not execute until the flag is removed.

Use this when you want to prevent UXWizz from running maintenance/reporting jobs, while still allowing administrators to review or prepare task configuration.

### Database Credentials From Environment Variables

Standalone UXWizz installations can load the main database connection from environment variables.

Supported variables:

```sh
UXWIZZ_DB_HOST=127.0.0.1
UXWIZZ_DB_NAME=uxwizz
UXWIZZ_DB_USER=uxwizz
UXWIZZ_DB_PASSWORD=your-secret-password
```

UXWizz only uses these variables when the matching value in `server/dbconfig.php` is empty.

For example:

```php
$host = '';
$username = '';
$password = '';
$db_name = '';
```

With the values above empty, UXWizz loads the database connection from:

* `UXWIZZ_DB_HOST`
* `UXWIZZ_DB_USER`
* `UXWIZZ_DB_PASSWORD`
* `UXWIZZ_DB_NAME`

If a value is already hard-coded in `server/dbconfig.php`, the hard-coded value takes priority.

### Updates and Env-Based Database Credentials

When UXWizz updates itself, it preserves database credentials in `server/dbconfig.php`.

If a database value was loaded from an environment variable, UXWizz keeps the matching `dbconfig.php` field empty during the update. This prevents environment-provided secrets from being copied into the application file.

### WordPress Installations

The WordPress version of UXWizz uses the WordPress database configuration constants from `wp-config.php`.

The `UXWIZZ_DB_HOST`, `UXWIZZ_DB_NAME`, `UXWIZZ_DB_USER`, and `UXWIZZ_DB_PASSWORD` variables are only used by standalone UXWizz installations, not by the WordPress overwrite package.

### Security Notes

* Do not expose environment variables in public PHP info pages, debug output, logs, or screenshots.
* Prefer environment variables or secret managers for production database credentials.
* Restart the web server or PHP process after changing environment variables.
* Feature disable flags are enforced server-side. Dashboard UI messages are informational, but the security boundary is the backend guard.
* Environment variables should be set by the server administrator, deployment system, hosting panel, or container runtime.

### Reference

| Variable                                   | Default | Description                                                                                                                                                                                                                               |
| ------------------------------------------ | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `UXWIZZ_DISABLE_AI_CHAT`                   | unset   | Set to `1` to prevent AI chat requests from being sent to LLM providers.                                                                                                                                                                  |
| `UXWIZZ_DISABLE_SELFUPDATE`                | unset   | Set to `1` to disable the built-in file updater.                                                                                                                                                                                          |
| `UXWIZZ_DISABLE_SCHEDULED_TASKS_EXECUTION` | unset   | Set to `1` to block manual and automatic scheduled task execution.                                                                                                                                                                        |
| `UXWIZZ_DB_HOST`                           | unset   | Main database host, used only when `$host` is empty in standalone `server/dbconfig.php`.                                                                                                                                                  |
| `UXWIZZ_DB_NAME`                           | unset   | Main database name, used only when `$db_name` is empty in standalone `server/dbconfig.php`.                                                                                                                                               |
| `UXWIZZ_DB_USER`                           | unset   | Main database username, used only when `$username` is empty in standalone `server/dbconfig.php`.                                                                                                                                          |
| `UXWIZZ_DB_PASSWORD`                       | unset   | Main database password, used only when `$password` is empty in standalone `server/dbconfig.php`.                                                                                                                                          |
| `UXWIZZ_MYSQL_SSL_CA_PATH`                 | unset   | <p>Path to an SSL CA certificate file for MySQL connections, used only when <code>$sslCaPath</code> is empty in standalone <code>server/dbconfig.php</code>.<br><br>Example value: <code>/var/www/html/certs/global-bundle.pem</code></p> |


# Dashboard user access level

{% hint style="warning" %}
Currently the UXWizz user access levels are not that well structured. \
You normally want to use either level 5 (admin) or level 0 (read-only).\
\
UI is being implemented to show this information inside the dashboard.
{% endhint %}

You can see the up-to-date permissions/access levels inside the **server/permissions.php** file.\
Those were the permissions as of version 6.5.0:

```php
// Permissions, 5 is the highest level

// Root
'UPDATE_PLATFORM' => 5,
'SET_LICENSE_KEY' => 5,
'CHANGE_DASHBOARD_SETTINGS' => 5,
'CHECK_LICENSE_KEY' => 5,
'SET_GPT_API_KEY' => 5,

// Administrator
'ADD_USER' => 4,
'DELETE_USER' => 4,
'SET_USER_DATA' => 4,
'SET_USER_LEVEL' => 4,
'SET_USER_MAX_DOMAINS' => 4,
'CHANGE_DOMAIN_ACCESS' => 4,
'GET_USERS_LIST' => 4,
'VIEW_DB_STATS' => 4,
'SET_OWN_USER_DATA' => 4,
'UPDATE_AB_TESTS' => 4,
'CHANGE_SETTINGS' => 4,
'CHANGE_GPT_MODEL' => 4,

// Analyst
'REMOVE_TAG' => 3,
'ADD_TAG' => 3,
'SET_RECORD_LIMIT' => 3 ,
'DELETE_RECORDED_CLIENT' => 3,
'CHANGE_OWN_DOMAIN_ACCESS' => 3,
'CHAT_WITH_AI' => 3,

'SHARE_RECORDING' => 1,
```

A user with **level 2** will have **access to all actions that require level 2 or less (2, 1, 0).**


# Resetting the admin password

If you no longer remember the admin password **the only way to reset it is by changing it in the database**.

{% hint style="info" %}
For security purposes the password is stored in the database **SHA256 encrypted** and uses an **unique salt** per user.
{% endhint %}

## Steps to reset the password:

### A. Using the MySQL console

You can set a new password for the admin user using this MySQL query:

```sql
UPDATE ust_users SET password=SHA2(CONCAT(salt, 'NEW_PASSWORD'), 256) WHERE id=1;
```

{% hint style="info" %}
Make sure to replace `NEW_PASSWORD` with your actual password.\
If you want to reset the password using this command for a different user, you can change the "WHERE" statement to `name=username`.
{% endhint %}

### B. Using PHPMyAdmin:

1\. Access the **`ust_users`** table in your database.

2\. Copy the contents of the **`salt`** column from the admin user.

3\. Decide on your new password, and prefix it with the salt: **salt**MyNewPassword123

4\. Encrypt the salt+password as SHA256.&#x20;

{% hint style="info" %}
You can use an [online SHA256 encryption tool like this](https://passwordsgenerator.net/sha256-hash-generator/).
{% endhint %}

5\. Save that encrypted value in the password field.

#### **Example:**

So let's say the salt in the DB is **f57efb9fa449** and you want your new password to be **XXXyyyZZZ**

You concatenate them:  **f57efb9fa449XXXyyyZZZ**

Get the sha256 encrypted value using the site linked above: **`7ABE3FCED2D3A6FD77D4D703C3C24B6D1634B4F351380C0154A6ECA64AAE3EA4`**

Save the above hash in the `password` column of the admin user in the database:

![](https://mail.google.com/mail/u/0?ui=2\&ik=c8761517f4\&attid=0.1\&permmsgid=msg-a:r-6551002517205299543\&th=172d7b4ca46fad80\&view=fimg\&sz=s0-l75-ft\&attbid=ANGjdJ8_Lz5NF1_OF0irSLx_olhknqZLivNNrIJzBn_7NJRI5DCDmdn8soLIptYntCiQbEcnb8wxie9Z1qLxFZgRAXYtQAsst7Q_Ys5Vhet1kxgzchIiHmJFOh811wc\&disp=emb\&realattid=ii_k9r3meo81)

###


# Database querying

In some cases it can be useful to query the UXWizz database directly. This page explains the database structure and how the data is stored in it.

## Database structure

{% hint style="warning" %}
**NOTE:** This was the database structure for version 8.5.0.\
A newerer version might include new tables.
{% endhint %}

Here is a diagram created using `PHPMyAdmin->Designer` for an existing UXWizz database:

<figure><img src="/files/t1A8lc6q1SxGorRy3aMH" alt="UXWizz database structure"><figcaption></figcaption></figure>

### Remarks

* **ust\_clients** - Stores unique **sessions/visits**. An unique user can have multiple entries. The `ip` can be used to link all sessions from the user.
* **ust\_clientpage** - Stores unique **pageviews**. Each session has multiple pageviews.
* **ust\_records/ust\_partials** - Store the record playback information for a specific **pageview**.
* **ust\_movements/ust\_clicks** - Heatmap data, stored per **pageview**.
* **ust\_client\_tag** - Session level **tag/label/event data**.
* **ust\_client\_event** - **Events** stored linked to a specific pageview, session and user.
* **ust\_ab** - Stores AB tests
* **ust\_users** (internal) - Stores list of UXWizz dashboard users
* **ust\_access** (internal) - Stores which domain data can be accessed by which users

{% hint style="info" %}
For improved performance, there are multiple indexes already created. Those indexes are specifically created for the queries ran for the UXWizz dashboard, but they should also lead to very fast query performance in most cases.
{% endhint %}

### Examples

{% hint style="info" %}
You can **find many example queries in the PHP source code of UXWizz**. \
Usually each PHP file only runs a single query.
{% endhint %}

#### Basic query

```sql
SELECT * FROM `ust_clients` WHERE `domain`="domain.com" 
```

#### Domain change (move all users tracked from one domain to another)

```sql
UPDATE ust_clients SET `domain`='new.com' WHERE `domain`='old.com';
```

#### Get the path each visitor took before first reaching the pricing page:

```sql
SELECT 
    t1.clientid as clientID, 
    GROUP_CONCAT(t1.page ORDER BY t1.id ASC SEPARATOR ' -> ') as path 
FROM 
    ust_clientpage t1 
WHERE 
    t1.id <= ( 
        SELECT MIN(t2.id) as min_id FROM ust_clientpage t2 
        WHERE t2.page LIKE '%pricing%' AND t2.clientid = t1.clientid 
    ) 
    AND t1.clientid IN (SELECT id FROM ust_clients WHERE domain = 'uxwizz.com')
GROUP BY t1.clientid 
ORDER BY t1.clientid 
DESC LIMIT 10;

# Example output:
# [{"clientID":126951,"path":"/hotjar-alternative -> /pricing"}]
```


# Technical details

{% content-ref url="/pages/NTKqFGV0yraqtRfGjgbk" %}
[IP Geolocation](/guides/technical-details/ip-geolocation)
{% endcontent-ref %}


# IP Geolocation

The **Country** and optional **City** of each recorded user session is stored in the database and displayed in the dashboard.

The geolocation is done based on user IP using the freely available IP geolocation database provided by [https://db-ip.com](https://db-ip.com/).

To switch between **Country** and **City** level tracking go to Settings->Tracking settings and click "Download city geoip database" (or "Disable" to delete it):

![](/files/j2rSZe0XnnYgIkFmxfxH)

{% hint style="info" %}
UXWizz automatically detects whether a **city database** is present or not and will use it for newly tracked sessions.
{% endhint %}

### Manually uploading an IP geolocation database

#### Country-level geolocation:

If no city database is present, the default country one will be used **ip-database.mmdb**

{% hint style="warning" %}
The default **ip-database.mmdb** database will be overwritten automatically every time you update to a new UXWizz version.
{% endhint %}

#### To enable city-level geolocation:

* Upload an IP geolocation database file named **ip-database-city.mmdb** to your UXWizz server inside the **/server/helpers/geolocation/** folder

  I recommend the [City Lite Free DB from db-ip.com](https://db-ip.com/db/download/ip-to-city-lite).&#x20;
* Download the **mmdb** file (extract it if the extension is **.gz**)
* Rename it to **ip-database-city.mmdb**&#x20;
* Place it inside the **/server/helpers/geolocation/** folder.

{% hint style="warning" %}
An Apache server restart might be needed for PHP to detect the new file.
{% endhint %}

To disable city-level geolocation rename or remove the `ip-database-city.mmdb`.

### Increasing the accuracy of IP geolocation

IP geolocation is in general only an approximation and not extremely accurate. One way to increase the accuracy is to purchase a more accurate database like the [DB-IP Location](https://db-ip.com/db/ip-to-location) one and preferably update every few months to the latest version.


# Troubleshooting

1. If the script does not record anything or simply doesn't work, you can:
   1. Open Google Chrome's **dev panel** by pressing CTRL + SHIFT + J &#x20;
   2. Select the **Console** tab.
   3. See if there any **errors** in the console.
2. If the script is still not working and your support period is valid please contact me at **support \[at] usertrack.net**.

## Common problems and solutions:

{% content-ref url="/pages/XkzpGjGUeWaRcRWlaLwP" %}
[No data is being recorded](/guides/troubleshooting/tracking/no-data-is-being-recorded)
{% endcontent-ref %}

{% content-ref url="/pages/-MScUN2YAf1gbbN6uUdi" %}
[Website iframe not loading (x-frame-options)](/guides/troubleshooting/dashboard/website-iframe-not-loading-x-frame-options)
{% endcontent-ref %}

{% content-ref url="/pages/ctvgCyPHcieZW9YJlbqE" %}
[Refreshing dashboard sub-page leads to 404 error](/guides/troubleshooting/dashboard/refreshing-dashboard-sub-page-leads-to-404-error)
{% endcontent-ref %}

{% content-ref url="/pages/-MTm57mhKEayjVmUia8Q" %}
[Can't include tracker via Google Tag Manager](/guides/troubleshooting/tracking/tracker-doesnt-with-google-tag-manager)
{% endcontent-ref %}

{% content-ref url="/pages/SAZcvPHBp6lrHboMAKIN" %}
[The A/B test JS file is missing](/guides/troubleshooting/tracking/the-a-b-test-js-file-is-missing)
{% endcontent-ref %}


# Agency


# MultiDB

### Problem:

You can not add new domains when multi-database is enabled.

{% hint style="danger" %}
Failed to create multi-db database. See error log for more.
{% endhint %}

### Cause:

This usually happens because the MySQL user stored in the `multidb-list.php` file does not have privileges to create a new database.

### Solution:&#x20;

Execute this MySQL query, with your actual username (`root` in this case) and password:

{% hint style="success" %}

```sql
CREATE USER IF NOT EXISTS `root`@`%` IDENTIFIED BY 'yourpass';
GRANT ALL PRIVILEGES ON *.* TO `root`@`%` IDENTIFIED BY 'yourpass';
```

{% endhint %}

The user needs all privileges on wildcard database names, because it has to be able to create new a new database for the newly added domain.


# Dashboard


# Refreshing dashboard sub-page leads to 404 error

{% hint style="warning" %}
As of version 5.0.0 UXWizz uses hash routing instead of URL rewrites.

The .htaccess support is recommended, but not needed.\
If this problem still occurs with a version newer than 5.0.0 it means the root index.html file can't be loaded properly.
{% endhint %}

{% hint style="info" %}
If refreshing doesn't work in the dashboard for deep URLs (other page in the dashboard than the homepage) means that the **.htaccess URL rewrites don't properly work on your server** for the userTrack folder.
{% endhint %}

\
Make sure that:

1. You are using **Apache** (or other .htaccess compatible webserver).
2. The **.htaccess** files are present in the root userTrack folder and in the userTrack/server folder.
3. That **AllowOverride** is set to **All** in **httpd.conf** (this allows .htaccess files to overwrite existing rules).

Useful links:

* [Stackoverflow: How to set AllowOverride](https://stackoverflow.com/a/22526144/407650)
* [Apache .htaccess AllowOverride docs](https://httpd.apache.org/docs/2.4/mod/core.html#allowoverride)


# Website iframe not loading (x-frame-options)

### **Problem:**

{% hint style="danger" %}
The website does not load when trying to view session recordings or heatmaps.
{% endhint %}

### **Cause:**

The problem is the x-frame-options setting on the tracked site. That setting specifically disallows your website to be displayed inside an iframe on external domains.

The error message often is *"site could not be displayed in a frame because it set 'X-Frame-Options' to 'sameorigin'. " or "*&#x52;efused to display '<https://xxx.com>' in a frame because it set 'X-Frame-Options' to 'sameorigin".

### **Solutions:**

{% hint style="success" %}
Allow the UXWizz dashboard domain to load your website inside an iframe.
{% endhint %}

**Solution A: Set the correct HTTP headers**

Best way is to add the correct headers to the tracked site. Those headers will allow only the UXWizz dashboard domain to load your website in an iframe.

### Apache:

If you are using **Apache**, add this to **.htaccess:**

```markup
<IfModule mod_headers.c>
  Header always set X-Frame-Options "SAMEORIGIN"
  Header set Content-Security-Policy "frame-ancestors 'self' your-uxwizz.com;"
</IfModule>
```

{% hint style="info" %}
If the headers are not being set make sure **AllowOverride** is set to **All** in **httpd.conf**
{% endhint %}

{% hint style="warning" %}
Remember to replace (in the Headers above) ***your-uxwizz.com*** with the actual domain where you host your dashboard.
{% endhint %}

### Nginx:

If you are using **Nginx**, add this line to your site's configuration:

```bash
add_header Content-Security-Policy "default-src 'self'; frame-ancestors 'self' your-uxwizz.com;";
```

{% hint style="warning" %}
Remember to replace (in the Headers above) ***your-uxwizz.com*** with the actual domain where you host your dashboard.
{% endhint %}

### IIS (.NET):

If you are using **IIS**, add this in web.config or in IIS:

```xml
<add name="Content-Security-Policy" value="upgrade-insecure-requests; base-uri 'self'; frame-ancestors 'self' https://www.your-uxwizz.com; form-action 'self'; object-src 'none';"/>
```

{% hint style="warning" %}
Remember to replace **<https://www.your-uxwizz.com>** with the actual domain where you host your dashboard.
{% endhint %}

### Still not working?

If the iframe still can't be loaded, try adding this [CORP header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cross-Origin_Resource_Policy_\(CORP\)) too:

```bash
# Apache
Header always set Cross-Origin-Resource-Policy "cross-origin"

# Nginx
add_header Cross-Origin-Resource-Policy "cross-origin"
```

**Solution B: Disable the browser security policy (Not recommended)**

Another, easier solution is to use a browser extension to disable this security policy:

* Google Chrome: <https://chrome.google.com/webstore/detail/ignore-x-frame-headers/gleekbfjekiniecknbkamfmkohkpodhe>
* Firefox: <https://addons.mozilla.org/en-US/firefox/addon/ignore-x-frame-options-header/>

### **Useful resources:**

You can learn more about **X-Frame-Options** and **Content-Security-Policy** here:

* <https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options>
* <https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/frame-ancestors>
* <https://content-security-policy.com/examples/>


# License says "invalid"

### Problem:

Setting your license key in the dashboard doesn't work, resulting in a red message with the text "Invalid license key".

### Cause:

There are two common causes:

1. You have the wrong variant installed (e.g. WordPress instead of regular, or trying to update a regular version trial to an Agency version).
2. Your server can not contact the UXWizz license server due to outdated HTTPS certificates.

{% hint style="info" %}
If something doesn't work as expected, the quickest way to see what the problem is is to check your server's **error.log** file for more information.
{% endhint %}

### Solution:

For case #1 (wrong version) please contact support, and you will receive two files to replace in your UXWizz installation to force-request the correct version when checking the license.

#### For case #2: The requests to the license server are blocked.

This can happen for several reasons:

1. A firewall or security plugin on your server is blocking external requests.
2. The request fails because the HTTPS certificates list is outdated on your server.

{% hint style="warning" %}
Make sure there is no firewall blocking outgoing requests from your server to the UXWizz download server (allow requests to the **license-api.uxwizz.com domain)**
{% endhint %}

**The PHP ca-bundle.crt file might be outdated on your server**.&#x20;

More specifically, it might miss the "ISRG" certificate entry (which is used by Let's Encrypt that is used for the HTTPS certificate on the UXWizz license server).\
The ca-bundle used is specified in **php.ini** in the \[openssl] section:

![](/files/TTIEL4QRPQOui33RYsEx)

If a path is set, you can try updating the certificates list file with a recent one available online: <https://curl.se/docs/caextract.html> ( **cacert.pem** )\
Here is the same one, but with the same file name as you need: <https://raw.githubusercontent.com/bagder/ca-bundle/master/ca-bundle.crt>

{% hint style="warning" %}
You should backup the existing file **ca-bundle.crt** file before replacing.
{% endhint %}

\
You can also try to update the OS-level list of certificates (eg. **sudo update-ca-certificates** if you have an Ubuntu server).


# Updating Fails

Here are a few potential cases where the update might fail, and the fixes for it.

## Problem - File integrity check failed:

{% hint style="warning" %}
Warning: file\_get\_contents(**<https://raw.githubusercontent.com/UXWizz/update-integrity-check/master/v6/latest-version-hash?token=1733905913>**): failed to open stream: HTTP request failed! **HTTP/1.1 404 Not Found** in **/var/www/html/server/helpers/update/update.php** on line 102 Expected hash: Remote hash: e64a580cb8d471609a18387a8737dbf1c8c5b4dc75dc4634bef1d5a7299dbe1d File integrity check failed. Update process stopped.
{% endhint %}

### Why this happens:

For security, the updater checks each new .zip update file with a remote GitHub repository that contains the correct integrity hash for that version. If the hash of the downloaded file is different to the integrity hash in the GitHub repository, the updater will stop the updating process.

### Issue with versions older than 7.0.2: **GitHub has recently changed how their content is delivered. Because the updating will fail with the old URL, you have to manually fix the URL.**

### Solution (if you are on version older than 7.0.2):

{% hint style="success" %}

#### Please do this single step to fix the updater:

In the file /var/www/htm&#x6C;**/server/helpers/update/update.php**\
\
**Replace this line  (Line #72 or near it)**:

{% code title="Old integrity check URL" %}

```php
$HASH_CHECK_URL = 'https://raw.githubusercontent.com/UXWizz/update-integrity-check/master/v6/latest-version-hash';
```

{% endcode %}

\
**With this one:**

{% code title="New integrity check URL" %}

```php
$HASH_CHECK_URL = 'https://uxwizz.github.io/update-integrity-check/v6/latest-version-hash';
```

{% endcode %}
{% endhint %}


# Tracking


# No data is being recorded

{% hint style="info" %}
After a successful installation new sessions and data should be tracked and available immediately in your dashboard (after a refresh).
{% endhint %}

### Problem:

{% hint style="danger" %}
No data is being sent to the dashboard.
{% endhint %}

### Possible causes and solutions

1. The **tracking snippet was not included** on the tracked website (check the source code of the page to make sure it was added).&#x20;
2. **Wrong dashboard server path setting** (after installation or a domain name change). Go to your dashboard Settings->Tracking and click "Reset" next to the "Server path" setting or manually set it to the URL of your dashboard.
3. Caching issues: if you added the tracking script but it's not visible in the source code, the old page might be cached (see [clearing the cache](#undefined) below). You should also clear the cache after changing any settings (such as after fixing the server path).

{% hint style="warning" %}
The easiest way to debug tracking issues is to open the Network tab in the browser dev tools (F12) and check if, in order:

1. The JS tracking file was loaded.
2. The createClient.php request was successful.&#x20;
   {% endhint %}

### **Clearing the cache**

Depending on your how your website is built, there are multiple caches that might need to be cleared:

1. **Browser cache** - Refresh using CTRL+SHIFT+R (or use your browser's settings to clear the cache for the tracked website and your dashboard).
2. **CDN cache** (such as Cloudflare) - Go to your CDN and Purge the cache for the tracked website and your dashboard (if behind Cloudflare).
3. **WordPress plugin cache** (if you use plugins like WP Rocket or W3 Total Cache) - Clear the website cache from the plugin settings.
4. **Server cache** - Depending on the web server used, you might have an additional caching layer still serving the old JS tracking file. Open the file URL directly in the browser to see if any setting looks outdated.


# Can't include tracker via Google Tag Manager

{% hint style="info" %}
Including UXWizz through Google Tag Manager is not recommended. \
Google Tag Manager is blocked by ad-blockers, which means that UXWizz will fail to load too.
{% endhint %}

### Problem:

Including the UXWizz tracking script via Google Tag Manager doesn't work.

{% hint style="danger" %}
**Uncaught TypeError: Cannot read property 's' of undefined at ust.min.js?v=3.4.2:2**
{% endhint %}

### Cause:

The issue occurs because when you include multiple scripts via GTM, the include order is not guaranteed.

{% code title="The default way to include UXWizz" %}

```markup
<script>UST_CT = [];UST = { s: Date.now(), addTag: function(tag) { UST_CT.push(tag) } };UST.addEvent = UST.addTag;</script>
<script src="https://your.uxwizz.com/server/ust.min.js?v=x.x.x" async></script>
```

{% endcode %}

{% hint style="info" %}
**With Google Tag Manager, the second \<script> tag might be loaded before the first one.**
{% endhint %}

### Solution:

A quick solution is to use a single script tag and load ust.min.js dynamically like this:

{% code title="Single-script way to include UXWizz" %}

```markup
<script>UST_CT = [];UST = { s: Date.now(), addTag: function(tag) { UST_CT.push(tag) } };UST.addEvent = UST.addTag;
var ust_min_js = document.createElement("script");
ust_min_js.src = 'https://your.uxwizz.com/server/ust.min.js?v=x.x.x';
document.head.appendChild(ust_min_js);
</script>
```

{% endcode %}

{% hint style="warning" %}
Make sure to replace **`https://your.uxwizz.com/server/ust.min.js?v=x.x.x`** with the actual URL to your tracking file.
{% endhint %}


# The A/B test JS file is missing

### Problem

After the initial installation you might notice that, if you checked the A/B testing feature when including the tracking script, the domain.ab.js file is missing, returning "404 Not Found".

### Cause

This happens because **the AB** **testing file is only generated once at least one AB test has been created** and published.

### Solution

#### A. If you are not using AB tests, include the tracking snippet without this feature

Go to **Domains->Wrench icon (for the domain you want to change the tracking snippet) -> Include the tracking pixel**.

Disable the A/B tests feature and copy the tracking code. Update the tracking snippet on your domain.

![Removing the A/B test code from the tracking snippet](/files/EZd503VwNkTtTVgHhcOM)

**B. Create and publish an empty test**

If you do plan to use A/B tests but don't want to create one yet, you can still generate the A/B test file by going to **A/B tests -> Add new test (bottom right) -> Publish Tests**

![Creating an empty A/B test to generate the missing ab.js file](/files/BTKjAryzK9uIbkMPuwDm)


# WordPress


# Cloudways 403 Forbidden screen on WordPress

### Problem:

A 403 Forbidden screen is shown when trying to access the UXWizz WordPress plugin dashboard.

### Cause:

{% hint style="info" %}
Direct access to the UXWizz plugin folder is needed in ordered to view the dashboard.
{% endhint %}

There is a small incompatibility issue with Cloudways by default: Cloudways blocks by default access to all PHP files in the wp-content folder.

### **Solution:**

{% hint style="success" %}
Allow direct access to the wp-content folder, or at least to the UXWizz plugin folder.
{% endhint %}

See [**this guide**](https://support.cloudways.com/en/articles/5127209-restrict-direct-access-to-wordpress-php-files) on how to enable direct wp-content access on Cloudways. <br>


# NGINX 403 Forbidden screen on WordPress

### Problem:

A 403 Forbidden or 404 Not Found screen is shown when trying to access the UXWizz WordPress plugin dashboard.

### Cause:

{% hint style="info" %}
Direct access to the UXWizz plugin folder is needed in ordered to view the dashboard.
{% endhint %}

By default, nginx should use index.html as the index of the directory.\
If this is default is change, you have to make sure index.html is used as index.

### **Solution:**

{% hint style="success" %}
Set index.html as the index file for the UXWizz main directory
{% endhint %}

```nginx
server {
    listen 80;
    
    # ADD THIS PART vvv
    location /wp-content/plugins/wp-usertrack/userTrack {
        index index.html;
    }
    # ADD THIS PART ^^^
}
```

### Still not working?

Sometimes there might be some security plugin or firewall rule to disallow direct access to the **wp-content** folder. Make sure that the UXWizz root folder is white-listed for direct access.

Here are some links to how to whitelist a folder in most popular WordPress security plugins:

* Sucuri: <https://docs.sucuri.net/website-firewall/whitelist-and-blacklist/whitelisting-a-file-folder>
* Wordfene: <https://www.wordfence.com/help/firewall/options>

The path `/wp-content/plugins/wp-usertrack/userTrack` should be allowed and accessible in your browser.


# Extending the dashboard

Sometimes you might want to add or remove information from your dashboard, or automate specific tasks.&#x20;

{% hint style="info" %}
Currently the dashboard extensibility is not a priority, so there are no tools or callbacks provided.
{% endhint %}

## Adding custom CSS/JS using a browser extension

You can use a browser extension such as [User JavaScript and CSS (for Chrome)](https://chrome.google.com/webstore/detail/user-javascript-and-css/nbhcbdghjpllgmfilhnhkllmkecfmpld/related?hl=en) to automatically executed custom JavaScript on your dashboard.

Examples:

### 1. Making the flags clickable (view IP geolocation info)

Let's assume you want to make it so that when you click the country flag next to an user IP (in the visitors list) it opens a new tab with the geolocation information of that IP.

One basic solution would be:&#x20;

* Every 2 seconds, find all IP `td`  elements in the table
* Get the IP from the `value` of the `td`&#x20;
* Make `onclick` handler of the flag icon open a new tab to a geolocation of that IP.

{% hint style="warning" %}
This will only work if IP hashing and IP censoring are disabled in the settings, otherwise there is no way to know the IP of the user.
{% endhint %}

For your UXWizz dashboard URL, **add this code in the extension**&#x20;

```javascript
function makeFlagsClickable() {
    const IPchips = document.querySelectorAll('.MuiTableRow-root td:nth-child(3)');
    for(node of IPchips) {
        const IP = node.getAttribute('value');
        const a = node.querySelector('a');
        const flag = a.previousSibling;
        flag.style.cursor = 'pointer'
        flag.style.outline = '2px dashed lightblue';
        const geoIPURL = 'https://whatismyipaddress.com/ip/' + IP;
        flag.title = geoIPURL;
        flag.onclick = function() {
            window.open(geoIPURL, '_blank').focus();
        }
    }
}
setInterval(makeFlagsClickable, 2000);
```

So it will look like:

![](/files/E0ITOBn8RCToT2Fq5f6s)


# Support

![](/files/EnxjPqmY8Ej2Y1vXVnL3)

If you have any trouble installing this script or have bugs to report feel free to send an e-mail at **support \[at] uxwizz.com**.&#x20;

{% hint style="warning" %}
Please mention your **UXWizz license code** and the **URL** of your **UXWizz dashboard**.
{% endhint %}


# Migrating to a new server

{% hint style="danger" %}
Page under construction.

**Note:** If you migrate from a multi-db (Agency) setup, you have to migrate all databases.
{% endhint %}

To migrate your UXWizz dashboard to a new server, you have to:

1. [Migrate the MySQL database](#id-1.-migrate-the-mysql-database)
2. [Copy the UXWizz files](#id-2.-copy-the-uxwizz-folder)
3. [Update your domain to point to the new server ](#id-3.-point-your-domain-name-to-new-server)

{% hint style="info" %}
You can also use a database backup service like [SimpleBackups.io](https://simplebackups.com/?via=cristian). \
It's also useful and easy to use for regular, scheduled backups and alerting.
{% endhint %}

### 1. Migrate the MySQL database

{% hint style="warning" %}
Before migrating the database, it's a good idea to first [remove all unnecessary data](/installation/optimization-tips/auto-delete-old-data-cron-jobs#built-in-example-scripts) (e.g. old recordings, heatmaps, etc.) in order to reduce the database size as much as possible.
{% endhint %}

#### 1.1 Backup the current database

UXWizz provides a script to back up the current database. Simply run this in your UXWizz folder:

```bash
sh /server/cron/ust_backup_dh.sh
```

#### 1.2 Copy the .sql.gz file to the new server

We will use `scp` over `ssh` to copy the file directly to the new server. (you can also manually copy this file)

#### 1.2.1 Generate new SSH key

{% hint style="warning" %}
Skip if the new server uses password auth. This key is only used for the scp authentication.
{% endhint %}

On the original server, generate a new SSH key:

```bash
ssh-keygen -t rsa -b 4096
# View and CTRL+C copy the key
cat ~/.ssh/id_rsa.pub
```

On the new server, add the previously generated public key:

```bash
# Open the authorized keys file
nano ~/.ssh/authorized_keys

# Add a new line with the previous contents from id_rsa.pub
ssh-rsa AAAA_EXISTING_KEYS...
ssh-rsa AAAA_THE_NEW_KEY...
```

#### 1.2.2 Copy the backup file

Finally, start copying the backup file (replace the filename and the IP to the new server IP)

```bash
scp your_backup.sql.gz root@12.45.67.89:/tmp/ust.sql.gz
```

#### 1.3 Import the new database

On the new server, unzip the backup, create a new database (preferably with the same name as the old one) and import the sql file:

```bash
gunzip ust.sql.gz
mysql -u root -p -e "CREATE DATABASE new_database_name; USE new_database_name; SET autocommit=0 ; source ust.sql ; COMMIT;"
```

You might also have to create the same users as before. On the original server, you can see existing MySQL users and their permissions:

```bash
 apt-get install percona-toolkit
 pt-show-grants -u YOUR_MYSQL_USER -p YOUR_MYSQL_PASSWORD --database YOUR_UXWIZZ_DB
```

You can copy those grant commands and run them on the new MySQL instance to create the users and give grant privileges.

### 2. Copy the UXWizz folder

Assuming your installation folder is **/var/www/html**:

{% hint style="info" %}
Make sure the folder exists on the new server: `mkdir -p /var/www/html`
{% endhint %}

{% code title="On original server:" %}

```bash
cd /var/www/
scp -r html root@12.45.67.89:/var/www/
```

{% endcode %}

**Note:**  If you had cron jobs enabled, you should also copy the contents of `crontab -e`

### 3. Point your domain name to new server

Go to your domain name's DNS configuration and update the IP to point to the new server.

For any other server configuration (**HTTPS** certificate, MySQL optimized configuration) check out the [UXWizz new server installation guide](/installation/setup-uxwizz-server).


# Import SQL data on an existing server

{% hint style="info" %}
**When to use this**: you setup UXWizz on a new server, but forgot to import your old data. The new server already has new data, so you can't directly import old data, because the incremental IDs will clash.
{% endhint %}

This page explains how you can import SQL data that contains incremental IDs in an existing, already-populated database.

Some tips in the [migration tutorial](/guides/migrating-to-a-new-server) could help for this too.

**Steps to import old SQL data in a UXWizz server that already has data:**

1. **Old server:** Purge old data (to make the DB smaller)
   * Run the queries from [limit record/heatmaps 60 days](/installation/optimization-tips/auto-delete-old-data-cron-jobs#built-in-example-scripts) cron scripts.
2. **Old server:** Export old.sql DB from phpMyAdmin
   * Only export data, no table structure (otherwise manually replace CREATE TABLE with CREATE TABLE IF NOT EXISTS into the exported SQL file)
   * Don't export indexes (or manually remove Index creations section in the SQL file)
3. **New server:** Add a large value to all IDs in the new database (see SQL script below)
4. **New server:** Backup of current SQL file on the new server
5. **New server:** Import old.sql data.

### SQL script to increase all IDs (in order to make room for old data)

{% hint style="warning" %}
This script was tested on UXWizz version 8.5.0. If a new version introduced any database structure changes, you might have to update the script to include all missing tables/IDs.
{% endhint %}

```sql
-- Change 10million to a larger value (up to 99 million) if you had more data stored

-- Disable FK checks
SET FOREIGN_KEY_CHECKS=0;
SET @offset = 10000000;

START TRANSACTION;

-- Primary keys
UPDATE ust_users SET id = id + @offset;
UPDATE ust_clients SET id = id + @offset;
UPDATE ust_clientpage SET id = id + @offset;
UPDATE ust_client_tag SET id = id + @offset;
UPDATE ust_client_event SET id = id + @offset;
UPDATE ust_clicks SET id = id + @offset;
UPDATE ust_movements SET id = id + @offset;
UPDATE ust_records SET id = id + @offset;
UPDATE ust_partials SET id = id + @offset;
UPDATE ust_access SET id = id + @offset;
UPDATE ust_user_client_ip_label SET id = id + @offset;
UPDATE ust_limits SET id = id + @offset;
UPDATE ust_ab SET id = id + @offset;

-- Foreign keys
UPDATE ust_access SET userid = userid + @offset;
UPDATE ust_user_client_ip_label SET userid = userid + @offset;
UPDATE ust_user_client_watched 
    SET userid = userid + @offset,
        clientid = clientid + @offset;
UPDATE ust_clientpage SET clientid = clientid + @offset;
UPDATE ust_client_tag SET clientid = clientid + @offset;
UPDATE ust_client_event 
    SET clientid = clientid + @offset,
        clientpageid = clientpageid + @offset;
UPDATE ust_clicks SET client = client + @offset;
UPDATE ust_movements SET client = client + @offset;
UPDATE ust_records SET client = client + @offset;
UPDATE ust_partials SET client = client + @offset;

-- === Reset AUTO_INCREMENT for each table ===

-- ust_users
SELECT GREATEST(IFNULL(MAX(id), 0) + 1, @offset) INTO @next_id FROM ust_users;
SET @sql = CONCAT('ALTER TABLE ust_users AUTO_INCREMENT = ', @next_id);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

-- ust_clients
SELECT GREATEST(IFNULL(MAX(id), 0) + 1, @offset) INTO @next_id FROM ust_clients;
SET @sql = CONCAT('ALTER TABLE ust_clients AUTO_INCREMENT = ', @next_id);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

-- ust_clientpage
SELECT GREATEST(IFNULL(MAX(id), 0) + 1, @offset) INTO @next_id FROM ust_clientpage;
SET @sql = CONCAT('ALTER TABLE ust_clientpage AUTO_INCREMENT = ', @next_id);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

-- ust_client_tag
SELECT GREATEST(IFNULL(MAX(id), 0) + 1, @offset) INTO @next_id FROM ust_client_tag;
SET @sql = CONCAT('ALTER TABLE ust_client_tag AUTO_INCREMENT = ', @next_id);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

-- ust_client_event
SELECT GREATEST(IFNULL(MAX(id), 0) + 1, @offset) INTO @next_id FROM ust_client_event;
SET @sql = CONCAT('ALTER TABLE ust_client_event AUTO_INCREMENT = ', @next_id);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

-- ust_clicks
SELECT GREATEST(IFNULL(MAX(id), 0) + 1, @offset) INTO @next_id FROM ust_clicks;
SET @sql = CONCAT('ALTER TABLE ust_clicks AUTO_INCREMENT = ', @next_id);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

-- ust_movements
SELECT GREATEST(IFNULL(MAX(id), 0) + 1, @offset) INTO @next_id FROM ust_movements;
SET @sql = CONCAT('ALTER TABLE ust_movements AUTO_INCREMENT = ', @next_id);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

-- ust_records
SELECT GREATEST(IFNULL(MAX(id), 0) + 1, @offset) INTO @next_id FROM ust_records;
SET @sql = CONCAT('ALTER TABLE ust_records AUTO_INCREMENT = ', @next_id);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

-- ust_partials
SELECT GREATEST(IFNULL(MAX(id), 0) + 1, @offset) INTO @next_id FROM ust_partials;
SET @sql = CONCAT('ALTER TABLE ust_partials AUTO_INCREMENT = ', @next_id);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

-- ust_access
SELECT GREATEST(IFNULL(MAX(id), 0) + 1, @offset) INTO @next_id FROM ust_access;
SET @sql = CONCAT('ALTER TABLE ust_access AUTO_INCREMENT = ', @next_id);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

-- ust_user_client_ip_label
SELECT GREATEST(IFNULL(MAX(id), 0) + 1, @offset) INTO @next_id FROM ust_user_client_ip_label;
SET @sql = CONCAT('ALTER TABLE ust_user_client_ip_label AUTO_INCREMENT = ', @next_id);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

-- ust_limits
SELECT GREATEST(IFNULL(MAX(id), 0) + 1, @offset) INTO @next_id FROM ust_limits;
SET @sql = CONCAT('ALTER TABLE ust_limits AUTO_INCREMENT = ', @next_id);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

-- ust_ab
SELECT GREATEST(IFNULL(MAX(id), 0) + 1, @offset) INTO @next_id FROM ust_ab;
SET @sql = CONCAT('ALTER TABLE ust_ab AUTO_INCREMENT = ', @next_id);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

COMMIT;

-- Re-enable FK checks
SET FOREIGN_KEY_CHECKS=1;
```


# Feedback form (polls)

A basic example of a poll form with a question and a simple Yes/No answer. The response is stored as a [**tag**](/api/tags) attached to the current user. You can also modify the code to use [**events**](/api/events) instead and store more data (like the current page the user is on, the question text, username, etc.).

### Example

![A simple poll functionality implemented using UXWizz to store the results](/files/-MdMtNUQBrLWn9t38fqc)

You can test in this [JSFiddle](https://jsfiddle.net/pohcs8y2/3/) (note that this fiddle does not actually send data to UXWizz).

### HTML:

{% hint style="info" %}
Add this before the end of the \</body> tag.
{% endhint %}

```markup
<div id="ust-poll">
  <div id="ust-poll__question">
    Is this page useful?
  </div>
  
  <div id="ust-poll__answers">
    <button class="ust-poll__answer" value="no">No</button>
    <button class="ust-poll__answer" value="yes">Yes</button>
  </div>
  
  <div id="ust-poll__close">X</div>
</div>
```

### JavaScript:

{% hint style="info" %}
Add this in a \<script> tag or include it as an external JavaScript file somewhere **after** the tracker is included.
{% endhint %}

```javascript
(function() {
    if (localStorage) {
    	if (localStorage['ust-poll-closed']) return;
    }
    
    var prevOnLoaded = UST.onLoaded;
    UST.onLoaded = function () {
    prevOnLoaded && prevOnLoaded();
    
    var poll = document.querySelector('#ust-poll');
    poll.style.display = 'inline-block';
    poll.style.transform = 'translateX(-50%) scaleY(1)';
    
    function close() {
      poll.style.display = 'none';
      localStorage && (localStorage['ust-poll-closed'] = true);
    }
    
    document.querySelector('#ust-poll__close').addEventListener('click', close);
    
    function clickedAnswer(e) {
      close();
      // Add a tag to the user like `poll_no` or `poll_yes`
      // You could also use addEvent instead to store more data
      UST.addTag('poll_' + e.currentTarget.value);
    }
    
    var answers = document.querySelectorAll('.ust-poll__answer');
    for (var i = 0; i < answers.length; ++i) {
    	answers[i].addEventListener('click', clickedAnswer);
    }
  }
})();
```

### CSS:&#x20;

{% hint style="info" %}
Include this in a \<style> tag or as an external CSS file.
{% endhint %}

```
#ust-poll {
  display: inline-block;
  background: #1289A9;
  padding: 1rem 2rem;
  font-size: 1rem;
  font-weight: bold;
  color: white;
  text-align: center;
  border-radius: 10px;
  max-width: 400px;
  position: fixed;
  bottom: 1rem;
  left: 50%;
  transform-origin: bottom;
  transform: translateX(-50%) scaleY(0);
  transition: transform 0.2s ease-in-out;
  pointer-events: visible;
}

#ust-poll__question {
  padding-bottom: 1rem;  
}

#ust-poll__answers {
  display: flex;
  justify-content: space-between;
}

.ust-poll__answer {
  background: none;
  border: 2px solid white;
  padding: 0.5rem 1rem;
  color: white;
  width: 45%;
  cursor: pointer;
}

.ust-poll__answer:hover {
  background-color: rgba(255,255,255,0.1);
}

#ust-poll__close {
  position: absolute;
  right: 0.5rem;
  top: 0.5rem;
  font-family: Helvetica, sans-serif;
  font-weight: normal;
  cursor: pointer;
  font-size: 0.8rem;
  opacity: 0.5;
}
```

## JavaScript one-liner

Alternatively, you can combine the HTML, CSS and JS in a single JS snippet and include it:

```javascript
(function(){
var question='Is this page useful?';
if(localStorage){if(localStorage['ust-poll-closed']){return}}var sheet=document.createElement('style');sheet.innerHTML='#ust-poll{display:inline-block;background:#1289A9;padding:1rem 2rem;font-size:1rem;font-weight:700;color:#fff;text-align:center;border-radius:10px;max-width:400px;position:fixed;bottom:1rem;left:50%;transform-origin:bottom;transform:translateX(-50%) scaleY(0);transition:transform .2s ease-in-out;pointer-events:visible}#ust-poll__question{padding-bottom:1rem}#ust-poll__answers{display:flex;justify-content:space-between}.ust-poll__answer{background:none;border:2px solid #fff;padding:.5rem 1rem;color:#fff;width:45%;cursor:pointer}.ust-poll__answer:hover{background-color:rgba(255,255,255,0.1)}#ust-poll__close{position:absolute;right:.5rem;top:.5rem;font-family:Helvetica,sans-serif;font-weight:400;cursor:pointer;font-size:.8rem;opacity:.5}';document.body.appendChild(sheet);var div=document.createElement('div');div.innerHTML='<div id=ust-poll><div id=ust-poll__question>'+question+'</div><div id=ust-poll__answers><button class=ust-poll__answer value=no>No</button> <button class=ust-poll__answer value=yes>Yes</button></div><div id=ust-poll__close>X</div></div>';document.body.appendChild(div.firstChild);var prevOnLoaded=UST.onLoaded;UST.onLoaded=function(){prevOnLoaded&&prevOnLoaded();var poll=document.querySelector('#ust-poll');poll.style.display='inline-block';poll.style.transform='translateX(-50%) scaleY(1)';function close(){poll.style.display='none';localStorage&&(localStorage['ust-poll-closed']=true)}document.querySelector('#ust-poll__close').addEventListener('click',close);function clickedAnswer(e){close();UST.addTag('poll_'+e.currentTarget.value)}var answers=document.querySelectorAll('.ust-poll__answer');for(var i=0;i<answers.length;i+=1){answers[i].addEventListener('click',clickedAnswer)}}
})();
```


# Tracking 404 Pages

{% hint style="info" %}
You can not tell if a page did load or showed 404 just by viewing the visited pages list.

You might want to know if users land on a page that renders your 404 content.&#x20;
{% endhint %}

To get better insights, we can:

1. Create a 404 Tag, so we can easily filter those sessions.
2. Create a 404 Event, so we can see which page triggered the 404 error.

Include this JavaScript snippet in your 404 page template.

{% code title="File: 404.html" fullWidth="false" %}

```html
<!-- After the tracker is included -->
<script>
UST.addTag('404-page-not-found');
UST.addEvent({
    category: 'ERROR',
    action: '404_NOT_FOUND',
});
</script>
```

{% endcode %}

The end result will be something like this:

<figure><img src="/files/qpYT32ADBJU6qWJ8e1KG" alt=""><figcaption></figcaption></figure>


# Tracking UTM parameters

Example of reading and storing URL query parameters for each session.

By default UTM parameters and not tracked in any way, they are even removed from the saved URL so that the number of unique links stored is reduced.

If you want to store the UTM params for each session, you can automatically [tag](/api/tags) each session with the name and value of each UTM parameter. Add this after the tracking snippet:

{% code title="Store UTM parameters as tags" %}

```html
<script>
(function() {
function getParameterByName(name, url = window.location.href) {
    name = name.replace(/[\[\]]/g, '\\$&');
    var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),
        results = regex.exec(url);
    if (!results) return null;
    if (!results[2]) return '';
    return decodeURIComponent(results[2].replace(/\+/g, ' '));
}

var utms = ['utm_source', 'utm_medium', 'utm_campaign'];
utms.forEach(function(utm) {
   var val = getParameterByName(utm);
   val && UST.addTag(utm + ':' + val);
});
})();
</script>
```

{% endcode %}

{% hint style="info" %}
Once you have stored the utm parameters as tags you can create segments and filter sessions based on those tags.
{% endhint %}


# Tracking Google Ads GCLID

By default, the **gclid** parameter is removed from the query parameters, so it won't be stored.\
\
To store the Google Ads click identifier **gclid** as a [Tag](/api/tags), you can use the [tracking UTM parameters](/useful-examples/tracking-utm-parameters) guide, by adding "gclid" to the tracked utms list.

To simply include gclid in the final tracked URL, **remove** it from **Settings → Tracking → Remove query params from the saved URL**

<figure><img src="/files/U7hJnnMyDZuWlRNkNX63" alt=""><figcaption></figcaption></figure>


# Storing user device types

Example of storing custom device type data using tags.

If you want more granular device type data to be stored (e.g. mobile/tablet/desktop or Android/iOS/Windows/MacOS) and used to filter sessions, you can manually store extra device data for each session using [Tags](/api/tags).

{% hint style="info" %}
Note: The device type is sometimes hard to define, for example nowadays laptops can have a touchscreen or tablets can have keyboards and mouse and be used as laptops, the so called 2-in-1 devices (e.g. Microsoft Surface).
{% endhint %}

You should include this script tag **after** the included UXWizz tracking snippet.

{% code title="Store device type as tag" %}

```html
<script>
(function() {
// Generic function to get device type based on UA string
function deviceType() {
    const ua = navigator.userAgent;
    if (/(tablet|ipad|playbook|silk)|(android(?!.*mobi))/i.test(ua)) {
        return "tablet";
    }
    else if (/Mobile|Android|iP(hone|od)|IEMobile|BlackBerry|Kindle|Silk-Accelerated|(hpw|web)OS|Opera M(obi|ini)/.test(ua)) {
        return "mobile";
    }
    return "desktop";
};

// Store the device type as a tag, e.g. "device-mobile"
UST.addTag('device-' + deviceType());
})();
</script>
```

{% endcode %}

{% hint style="info" %}
By default UXWizz does store the device type in the `ust_clients` table under the `device-type` column, but only stores `0` for desktop devices and `1` for mobile devices (no difference is made for tablets).
{% endhint %}


# Track video playback

Let's say you have a video on your landing page, and you want to know if people watched it.\
\
We could track the following actions:

* User started playing the video
* User paused playing the video (we want to know how far they watched before pausing)
* User reached the end of the video

We can use a combination of [Tags](/api/tags) and [Events](/api/events) for tracking those actions:

### HTML5 \<video> playback tracking example

```html
<video controls>
    <source src="video.mp4" type="video/mp4">
    Your browser does not support the video tag.
    <script>
       (() => {
            var vid = document.currentScript.parentElement;
            // Track video paused as both a Tag and an Event
            vid.addEventListener('pause', function() {
                UST.addTag('video_paused');

                UST.addEvent({
                    category: 'INTERACTION', // required
                    action: 'VIDEO_PAUSED', // required
                    label: 'my hero video',
                    value: Math.round(vid.currentTime),
                });
            });

            // Track video play started and ended as Tags
            vid.addEventListener('play', () => UST.addTag('video_play'));
            vid.addEventListener('ended', () => UST.addTag('video_end'));
        })();
    </script>
</video>
```

{% hint style="info" %}
This code works well if you have only one video, if you want to track many different video elements, see below 👇
{% endhint %}

### Creating a re-usable video playback tracking function

To track multiple videos, you could also add this code to your JS scripts:

```javascript
UST.trackVideo = (vid) => {
    // Track video paused as both a Tag and an Event
    vid.addEventListener('pause', function() {
        UST.addTag('video_paused');

        UST.addEvent({
            category: 'INTERACTION', // required
            action: 'VIDEO_PAUSED', // required
            label: 'my hero video',
            value: Math.round(vid.currentTime),
        });
    });

    // Track video play started and ended as Tags
    vid.addEventListener('play', () => UST.addTag('video_play'));
    vid.addEventListener('ended', () => UST.addTag('video_end'));
}
```

After this, to use it, you could do:

```javascript
document.querySelectorAll('video').forEach(UST.trackVideo);
```


# Changelog

For upcoming changes see the [public roadmap on Trello](https://trello.com/b/z4HCNb15/usertrack-roadmap).

### UXWizz 9.10.0 (26 July 2026)

This update adds exclusion segment filters and expandable top statistics lists.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>New:</strong></p><ul><li><strong>Segments:</strong> You can now exclude specific IP addresses, pages, tags, countries, and referrers when building segments.</li><li><strong>Statistics:</strong> View all pages, referrers, and countries in searchable, sortable, paginated lists.</li></ul><p><strong>Improvements:</strong></p><ul><li><strong>Segments:</strong> Set exact minimum and maximum session lengths in seconds in addition to using quick slider presets.</li></ul> |

### UXWizz 9.9.0 (24 July 2026)

This update adds a new session playback sidebar for faster page navigation and visitor context.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>New:</strong></p><ul><li><strong>Playback:</strong> Navigate visited pages from a collapsible, resizable sidebar with page times, durations, and event or error counts.</li><li><strong>Playback:</strong> View visitor details and manage visitor tags without leaving the recording.</li></ul><p><strong>Improvements:</strong></p><ul><li><strong>Playback:</strong> See the real-world time for the current playback progress.</li></ul><p><strong>Bug fixes:</strong></p><ul><li><strong>Playback:</strong> Fix playback sometimes stopping after seeking within a recording.</li></ul> |

### UXWizz 9.8.0 (23 July 2026)

This update adds flexible domain access management for dashboard users and improves user administration.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>New:</strong></p><ul><li><strong>Domain access:</strong> You can now assign domain access when creating a dashboard user and add or remove access for individual or multiple users.</li></ul><p><strong>Improvements:</strong></p><ul><li><strong>Users screen:</strong> Search dashboard users by username, domain, or access level, and sort them by access level or number of domains.</li><li><strong>UI:</strong> Improve the Domains screen sub-header styling and layout.</li></ul><p><strong>Security:</strong></p><ul><li><strong>Domain access:</strong> Fix an issue where authenticated users could access domain data belonging to other authenticated users in some cases.</li></ul> |

### UXWizz 9.7.2 (21 July 2026)

This update makes recording seeking faster by reusing data already loaded in the browser.

| Changes                                                                                                                                                                                                                                                  |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>Improvements:</strong></p><ul><li><strong>Playback:</strong> Seeking in default and full recordings now reuses already loaded data and downloads only missing sections, reducing repeated requests during normal and live playback.</li></ul> |

### UXWizz 9.7.1 (21 July 2026)

This update improves session playback navigation and adds tracking support for pages embedded in iframes.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| <p><strong>Improvements:</strong></p><ul><li><strong>Tracking:</strong> Added support for tracking pages displayed inside iframes, while maintaining UXWizz dashboard iframe previews excluded.</li><li><strong>Playback:</strong> Improve timeline scrolling and time estimates, including long inactivity periods and skipped pauses.</li></ul><p><strong>Bug fixes:</strong></p><ul><li><strong>Dashboard:</strong> Fix data from another domain briefly appearing when opening Visitors, Stats, Heatmaps, or A/B testing.</li><li><strong>Playback:</strong> Fix playback continuing outside newly selected clip boundaries.</li></ul> |

### UXWizz 9.7.0 (21 July 2026)

This update adds shareable session recording clips and improves playback navigation.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>New:</strong></p><ul><li><strong>Playback:</strong> You can now mark, loop, and share a specific clip from a session recording.</li></ul><p><strong>Improvements:</strong></p><ul><li><strong>Default recordings:</strong> You can now seek backward or forward during playback. Previously, seeking was only available for full recordings.</li><li><strong>Playback links:</strong> Open a recording at a specific visited page and playback time.</li><li><strong>Playback controls:</strong> Added keyboard shortcuts for playing recordings and setting clip markers.</li><li><strong>Playback:</strong> Added a toggle for automatically continuing playback across visited pages.</li></ul> |

### UXWizz 9.6.1 (18 July 2026)

This update improves dashboard table controls and fixes intermittent Visitors table layout issues.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>Improvements:</strong></p><ul><li><strong>Domains:</strong> You can now choose the domain sort field, direction, and auto-refresh interval from clear dropdown controls.</li><li><strong>Visitors:</strong> Improve the compact table layout with easier horizontal scrolling for visited pages and tags.</li></ul><p><strong>Bug fixes:</strong></p><ul><li><strong>Visitors:</strong> Fix an intermittent blank table or duplicate horizontal scrollbar.</li></ul> |

### UXWizz 9.6.0 (18 July 2026)

This update upgrades the dashboard UI packages and improves the Visitors table and HTTP request handling.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>Improvements:</strong></p><ul><li><strong>Dashboard:</strong> Upgraded to Material UI 9 and replaced the unmaintained Material React Table with MUI Data Grid Pro for the Visitors table.</li><li><strong>Dashboard:</strong> Improve HTTP requests, polling, loading progress, and request cancellation handling.</li></ul><p><strong>Dev:</strong></p><ul><li><strong>Dependencies:</strong> Reduced third-party package dependencies and slightly decreased the dashboard bundle size.</li></ul> |

### UXWizz 9.5.0 (16 July 2026)

This update makes the dashboard feel faster by improving how data/stats are loaded and cached.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>Improvements:</strong></p><ul><li><strong>Dashboard:</strong> Improve loading performance with persistent caching, deduplicated requests, and priority loading for visible statistics.</li><li><strong>Heatmaps and A/B testing:</strong> Improve data loading and cache consistency across heatmaps, A/B tests, and dashboard filters.</li></ul><p><strong>Bug fixes:</strong></p><ul><li><strong>Statistics:</strong> Fix session length graph updates being incorrectly handled as pageview data.</li></ul><p><strong>Dev:</strong></p><ul><li><strong>Dashboard:</strong> Switched the dashboard query loading system to TanStack Query to improve caching, perceived loading times, and loading bar behavior.</li><li><strong>Builds:</strong> Build sizes are now tracked to help identify future opportunities to reduce and optimize platform file sizes.</li></ul> |

### UXWizz 9.4.1 (16 July 2026)

This update further reduces session recording sizes through improved rrweb compression.

| Changes                                                                                                                                                            |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| <p><strong>Improvements:</strong></p><ul><li><strong>Tracking:</strong> Further improve rrweb recording compression, reducing recording sizes by 20–50%.</li></ul> |

### UXWizz 9.4.0 (15 July 2026)

This update improves session recording performance, reliability, and playback for long recordings.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| <p><strong>New:</strong></p><ul><li><strong>Tracking:</strong> Added chunked recording storage and streaming playback, so recordings load progressively instead of being downloaded all at once.</li><li><strong>Tracking:</strong> Added a configurable full snapshot checkpoint interval for session recordings.</li></ul><p><strong>Improvements:</strong></p><ul><li><strong>Tracking:</strong> Upgraded session recording and playback to rrweb 2.1.0.</li><li><strong>Playback:</strong> Improve startup speed, seeking, and memory usage for long recordings.</li></ul><p><strong>Bug fixes:</strong></p><ul><li><strong>Playback:</strong> Fix occasional recording initialization failures when the replay DOM was not ready.</li></ul> |

### UXWizz 9.3.0 (13 July 2026)

This update improves cron job reliability when database credentials are set via environment variables.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>New:</strong></p><ul><li><strong>DB:</strong> Added support for MySQL SSL connections. You can now set the <code>UXWIZZ\_MYSQL\_SSL\_CA\_PATH</code> environment variable to specify a CA certificate path for secure database connections over TLS.</li></ul><p><strong>Improvements:</strong></p><ul><li><strong>Cron:</strong> The installer now tests DB connectivity under CLI and shows targeted remediation when credentials set via environment variables aren't visible to cron.</li><li><strong>UI/Runners:</strong> The Scheduled Tasks Runners dialog now shows a warning status with error details when a runner cannot connect to the database.</li><li><strong>GeoIP:</strong> Updated GeoIP databases.</li><li><strong>Dev:</strong> Upgraded to TypeScript v7.</li></ul><p><strong>Bug fixes:</strong></p><ul><li><strong>Cron:</strong> Fix scheduled tasks runners for deployments using environment variables.</li></ul> |

### UXWizz 9.2.0 (3 July 2026)

This update improves tracking performance and reliability.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>Improvements:</strong></p><ul><li><strong>Tracking:</strong> Improve session recording performance and reliability by switching from CONCAT-based updates to an insert-only storage system. This change drastically reduces server-side processing and I/O and reduces data corruption or timeouts in large sessions.</li></ul><p><strong>Dev:</strong></p><ul><li><strong>DB Benchmarks:</strong> Implemented an internal benchmark system for testing database performance and MySQL configurations. This helps us optimize queries, identify bottlenecks and reduces resources usage on your server.</li></ul> |

### UXWizz 9.1.1 (2 July 2026)

This update fixes the Settings save button visibility.

| Changes                                                                                                                                    |
| ------------------------------------------------------------------------------------------------------------------------------------------ |
| <p><strong>Bug fixes:</strong></p><ul><li><strong>UI/UX:</strong> Fix the Settings save button sometimes being partially hidden.</li></ul> |

### UXWizz 9.1.0 (2 July 2026)

This update adds environment variable support for admins who want more control over UXWizz deployments.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p></p><p><strong>New:</strong></p><ul><li><strong>Environment Settings:</strong> Added support for configuring UXWizz through server-side environment variables. <br>You can now use env vars for database credentials and to disable selected features globally, including Ask AI chat, self-updates, and scheduled task execution. <br>See the <a href="https://docs.uxwizz.com/guides/environment-settings"><strong>Environment Settings guide</strong></a>.</li></ul> |

### UXWizz 9.0.1 (26 May 2026)

This update simplifies cron job setup and adds support for more Ask AI providers.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>Improvements:</strong></p><ul><li><strong>Cron:</strong> Simplify cron setup instructions - added a “Quick setup” script that automatically configures the cron-jobs.</li><li><strong>Ask AI</strong>: Allow more providers: Qwen, SilliconFlow, GMICloud, DeepInfra, Parasail and AtlasCloud.</li></ul><p><strong>Bug fixes:</strong></p><ul><li><strong>UI/UX:</strong> Fix Scheduled Tasks runners displayed “last run” time in “Check runners” modal when database time zone is different than webserver (PHP) time zone.</li></ul><p><strong>Other:</strong></p><ul><li><p><strong>License Name Changes:</strong></p><ul><li>"Personal License" has been renamed to "Solo License"</li><li>"Company License" has been renamed to "Growth & Scale License"</li></ul></li></ul> |

### 🎉 UXWizz 9.0.0 (27 April 2026)

This **major update** introduces **Scheduled Tasks**, **Notifications**, improves Ask AI and fixes some bugs.

This update paves the path of transforming UXWizz from a static dashboard that you regularly have to check, to an automated system that keeps you informed on how your websites are doing and notifies you when something is wrong.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| <p><strong>New:</strong></p><ul><li><strong>Scheduled Tasks:</strong> You can now configure different tasks to be ran at regular intervals (cron) directly through the dashboard.</li><li><strong>Cleanup Tasks:</strong> You can enable Clean-up Scheduled Tasks that automatically delete zero-session recordings, optimize database tables or enforce the domain visitors limits.</li><li><strong>Retention Tasks:</strong> You can enabled Retention Scheduled Tasks to delete recordings, heatmaps or entire sessions older than X days.</li><li><strong>Notifications Channels:</strong> You can now get notified when a Scheduled Task finishes.</li><li><strong>Telegram Notifications Channel:</strong> Receive Scheduled Tasks notifications on Telegram (Telegram Bot)</li><li><strong>Email Notifications Channel</strong>: Receive Scheduled Tasks notifications via Email (SMTP).</li><li><strong>Notifications Channel Groups:</strong> Send the same notification to multiple notification channels/users.</li><li><strong>Log Tracking Errors :</strong> If data tracking results in an error on the server-side (e.g. storing a recording or heatmap data), the client will have attached an Error event with the details.</li></ul><p><strong>Improvements:</strong></p><ul><li><strong>UI/UX:</strong> Further improve document title when navigating across the app.</li><li><strong>UI/UX:</strong> Improve Settings tabs menu on small screens, so it doesn’t overflow page width.</li><li><strong>Session Playback:</strong> Try to automatically fix/recover malformatted full recordings (e.g. containing invalid HTML or wrong escaping).</li><li><strong>Ask AI:</strong> Improve AI safety (to never modify database data).</li><li><strong>Ask AI:</strong> Improve usefulness by allowing the AI to also give you more querying tips, even for database mutations, but allowing the user to automatically run mutations from the UI.</li><li><strong>Ask AI:</strong> Add newer model suggestions in the model chooser dropdown.</li></ul><p><strong>Bug fixes:</strong></p><ul><li><strong>UI/UX:</strong> Fix an edge cases where the document title would still show the wrong domain name.</li><li><strong>UI/UX:</strong> Fix empty selected domain on initial load. Instead, select the first domain in the list so sidebar buttons are clickable.</li><li><strong>WordPress:</strong> Fix database connection encoding not being properly set to utf8mb4 in some cases, leading to missing/broken recordings.</li><li><strong>Docker</strong>: Fix arm64 images wrongly using amd64 base images.</li></ul> |

### UXWizz 8.9.5 (11 March 2026)

This update improves stats page performance and fixes some long-standing bugs.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| <p><strong>Improvements:</strong></p><ul><li><strong>UI:</strong> Upgrade to react-grid-layout to 2.2.2 (improves rendering and drag\&drop performance for stats/charts).</li><li><strong>UX/Updater:</strong> Improve error messages when checking for updates or verifying license key and suggest fixes.</li></ul><p><strong>Bug fixes:</strong></p><ul><li><strong>UI/UX:</strong> Fix tab title not updating when changing domain names.</li><li>Probably fix long-standing CSRF check failing sometimes.</li></ul> |

### UXWizz 8.9.4 (16 February 2026)

This update improves dashboard performance and stability and adds a few Ask AI improvements.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>Improvements:</strong></p><ul><li><strong>Performance:</strong> Stagger domain loading when showing the summary for more than 6 domains at once.</li><li><strong>Ask AI</strong>: Remove Grok 4.1-fast-<strong>free</strong> from AI model dropdown suggestions.</li><li><strong>Ask AI:</strong> Add new more OpenRouter providers (minimax, moonshotai, stepfun).</li></ul><p><strong>Bug fixes:</strong></p><ul><li><strong>UI/UX:</strong> Fix changing the selected domain sometimes unintentionally changing the currently selected view.</li><li><strong>UI/UX:</strong> Fix domain selector selecting the wrong domain sometimes.</li></ul> |

### UXWizz 8.9.3 (5 December 2025)

Quick Cron Jobs hotfix.

| Changes                                                                                                                               |
| ------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>Bug fixes:</strong></p><ul><li><strong>Cron jobs:</strong> Fix the cron jobs only working in the Agency version.</li></ul> |

### 🎉 UXWizz 8.9.2 (3 December 2025)

This update introduces multiple UI/UX improvements, fixes the installer and improves the updater.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>Improvements:</strong></p><ul><li><strong>UI/UX:</strong> Simplified chips tooltips to make them more readable.</li><li><strong>UI/UX:</strong> You can now right-click IP and Tag chips to copy their values.</li><li><strong>UI/Updater:</strong> Improve updater styling.</li><li><strong>UX/Ask AI:</strong> Add a few more models to the LLMs autocomplete dropdown.</li></ul><p><strong>Bug fixes:</strong></p><ul><li><strong>UI/UX:</strong> Fix clicking on filterable chips in the visitors screen adding the filters to the “All” segment instead of the active segment.</li><li><strong>Cron jobs:</strong> Fix an issue where some cron jobs did not automatically use <strong>bash</strong> instead of <strong>sh</strong>, which resulted in the cron job not being properly executed in some cases.</li><li><strong>Installer:</strong> Fix installer styling and redirect issues.</li></ul> |

### UXWizz 8.9.1 (31 October 2025)

This update improves the visitors table pagination UI/UX.

| Changes                                                                                                                                                                                                                                                                                                                                                                          |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>Improvements:</strong></p><ul><li><strong>UX/Visitors screen:</strong> Refreshing the dashboard maintains the selected page.</li><li><strong>UX/Visitors screen:</strong> Going back from a session playback takes you to the same page you were on.</li><li><strong>UI/Visitors screen:</strong> Improve pagination buttons and add initial loading state.</li></ul> |

### 🎉 UXWizz 8.9.0 (24 October 2025)

This update introduces Canvas element recording capabilities.

| Changes                                                                                                                                                                                                                                                                                                                                                   |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>New:</strong></p><ul><li><p><strong>Canvas Recording:</strong> You can now enable/disable recording of content within canvas elements. <em>Note: Canvas Recording only works within the Full Session Recording mode.</em><br></p><div><figure><img src="/files/phH5CFDg2EQeQmvRT1XX" alt=""><figcaption></figcaption></figure></div></li></ul> |

### Version 8.8.1 (23 September 2025)

This update fixes some updater issues and adds Docker ARM64 support.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>New:</strong></p><ul><li><strong>Docker:</strong> Add ARM64 support for the Docker images (thanks to Andreas for the help).</li></ul><p><strong>Bug fixes:</strong></p><ul><li><strong>Updater:</strong> Fix the final update redirect on some server configurations where the UXWizz root path was not properly automatically detected.</li></ul><p><strong>WordPress:</strong></p><ul><li><strong>Updater:</strong> Fix files writable check.</li></ul> |

### UXWizz 8.8.0 (19 September 2025)

This update introduces updater improvements, better browser detection and bug fixes.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>New:</strong></p><ul><li><strong>Updater:</strong> Start implementing a post-update check to verify the installation after an update. Currently, it makes sure the minified tracker file is not empty. In the future, this will also be used to regularly check the platform works as expected.</li></ul><p><strong>Improvements:</strong></p><ul><li><strong>Updater:</strong> The update process now happens in a single screen. This gives you time to see the update logs before finalizing the update.</li><li><strong>UI:</strong> Update browser logos in visitors list.</li></ul><p><strong>Bug fixes:</strong></p><ul><li><strong>Stats:</strong> Fix session length filter when filtering for 0-second sessions.</li><li><strong>Browser detection:</strong> Correctly detect MS Edge (previously shown as Chrome)</li><li><strong>Browser detection:</strong> Save the correct Safari browser version (e.g. 17 instead of 605)</li><li><strong>UI:</strong> Fix favicon for updater/login screen.</li></ul> |

### UXWizz 8.7.0 (17 September 2025)

This update drastically improves multi-domain overview loading experience and includes bug fixes.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>Improvements:</strong></p><ul><li><strong>UI/UX:</strong> Domains summary stats are now locally cached. When refreshing the domains list, now there is less content flashing and the order of domains is stable (even when sorting your domains based on visitors count).</li><li><strong>Cron jobs:</strong> Further improve php-cli detection on some servers.</li><li><strong>AskAI:</strong> Allow xAI provider for OpenRouter.</li></ul><p><strong>Bug fixes:</strong></p><ul><li><strong>AskAI:</strong> Fix provider dropdown not working sometimes.</li></ul> |

### 🎉 UXWizz 8.6.0 (30 August 2025)

This update introduces Ask AI support for OpenRouter and includes multiple bug fixes and minor improvements.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>New:</strong></p><ul><li><strong>Ask AI - OpenRouter API support:</strong> The OpenRouter provider can also be now used instead of only OpenAI.</li><li><strong>Ask AI - Use all models:</strong> You can now set and use any model, instead of having to choose only from a predefined list.</li></ul><p><strong>Improvements:</strong></p><ul><li><strong>Tracking:</strong> Improve token random generation logic to reduce conflicts chances.</li><li><strong>Cron jobs:</strong> Auto-detect php-cli binary path, as on some servers cron executions use the wrong php-fcgi binary instead of php-cli.</li><li><strong>Goals:</strong> Change default goal name when converting “All“ segment to “Goal”.</li><li><strong>Ask AI:</strong> Improved prompt for increased accuracy and reduced errors on a wider range of models.</li></ul><p><strong>Bug fixes:</strong></p><ul><li><strong>Goals:</strong> Remove error message when converting “All” segment.</li><li><strong>UI:</strong> Fix some localization issues (“domain” in Top referrers).</li></ul> |

### 🎉 UXWizz 8.5.0 (9 July 2025)

This update improves the A/B test UI and introduces A/B test results.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>New:</strong></p><ul><li><p><strong>A/B Tests Results:</strong> Results are now automatically shown in the A/B testing page based on your existing tests, goals and currently selected segments.</p><div><figure><img src="/files/VWA4dQiu3seUbrpUeOP5" alt=""><figcaption></figcaption></figure></div></li></ul><p><strong>Improvements:</strong></p><ul><li><strong>Ask AI:</strong> Reduce SQL errors.</li><li><strong>Ask AI:</strong> Ask more follow-up questions if needed.</li><li><strong>Ask AI:</strong> Improve chart generation (e.g. charts like “visits per hour”).</li><li><strong>UI:</strong> Improved A/B tests list UI.</li></ul> |

### UXWizz 8.4.1 (21 June 2025)

This update enables cron jobs for multi-db.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>Improvements:</strong></p><ul><li><strong>Agency:</strong> Cron jobs now work with multi-db (e.g. ust\_del\_heatmap\_60\_days.sh runs the MySQL deletion query on both the main database and all other domain databases)</li><li><strong>Agency:</strong> Domain names are clickable in Settigns → MultiDB → Servers usage list (it links to domain's stats).</li><li><strong>Logging:</strong> Improve logs for cron jobs at /server/cron/log.txt</li></ul> |

### 🎉 UXWizz 8.4.0 (19 June 2025)

This update improves the Domains screen with additional sorting and filtering options.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>New:</strong></p><ul><li><p><strong>Domain sorting</strong>: You can now sort domains based on name, visitors in last 24h, or online visitors.</p><div><figure><img src="/files/A0X8OFrNOSBzfVvZbhcN" alt=""><figcaption></figcaption></figure></div></li><li><strong>Domain filtering:</strong> You can now filter the list of domains shown based on the domain name.</li><li><strong>Domains auto-refresh interval:</strong> You can now change the refresh interval for the domains list, or disable auto-refreshing.</li></ul><p><strong>Improvements:</strong></p><ul><li><strong>UI:</strong> Update “Track new domain” button style and position.</li></ul><p><strong>Bug fixes:</strong></p><ul><li>Fix for Error Tracking setting sometimes being always on.</li><li>Fix more i18n localization plurals.</li></ul> |

### UXWizz 8.3.0 (1 June 2025)

This update adds support for new ChatGPT models and fixes some updating issues.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                            |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>Improvements:</strong></p><ul><li><strong>Ask AI:</strong> Add support for GPT 4.1, GPT 4.1-mini and GPT o4-mini</li><li><strong>Ask AI:</strong> Change OpenAI pricing link to a more detailed list of models.</li></ul><p><strong>Bug fixes:</strong></p><ul><li>Fix updating from an older version where Error Tracking didn’t exist yet.</li><li>Fix Renew License link not working in the Trial version.</li></ul> |

### 🎉 UXWizz 8.2.0 (4 May 2025)

This update introduces **Error Tracking**, improved performance, UI enhancements and bug fixes.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| <p><strong>New:</strong></p><ul><li><p><strong>Error Tracking:</strong> You can now track and view JavaScript errors for each user session. </p><div><figure><img src="/files/El0AZhWm352hZRF7HFHv" alt=""><figcaption><p>Error Tracking can be enabled in the Tracking Settings.</p></figcaption></figure></div></li></ul><p><strong>Improvements:</strong></p><ul><li><strong>Performance:</strong> Improve loading performance when going to the visitors screen for a specific domain from the domains screen.</li><li><strong>UI:</strong> Simplify Goal block design (only show Goal segment total count when hovering the conversion rate percentage).</li><li><strong>UI:</strong> Left-align the content displayed in Events list.</li></ul><p><strong>Bug fixes:</strong></p><ul><li>Fix “Visitors” button in Domains screen, sometimes not redirecting to the selected domain.</li><li>Fix history/back button after clicking the “Visitors” link in the Domains screen (same location was added twice in history).</li><li>Fix Goal block title layout when using a long Goal name.</li><li>Fix localization plurals (i18n v23 → v24 changed to Intl pluralization).</li></ul> |

### 🎉 UXWizz 8.1.0 (14 March 2025)

This update introduces the heatmap wildcard filter, improved bounce rate stats and UI improvements.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>New:</strong></p><ul><li><p><strong>Heatmap Wildcard Filter</strong>: You now aggregate data from multiple pages into a single heatmap. </p><div><figure><img src="/files/SjrOKFXn3W7e3kfvTEtM" alt=""><figcaption><p>Useful for cases when you have dynamic but similar pages (like/product/id1 and /product/id2/).</p></figcaption></figure></div></li></ul><p><strong>Improvements:</strong></p><ul><li><strong>Stats:</strong> Changed the way how <strong>Bounce Rate</strong> is calculated. Previously, all sessions with 1 page were considered as “bounced”, but this doesn’t reflect engagement well. Now, if a session is longer than 10 seconds, it will be considered as “engaged”. Expect the new bounce rate to show lower, more accurate values.</li><li><strong>UI:</strong> Improved heatmap menu responsive layout.</li><li><strong>UI:</strong> Improved Goal blocks design.</li><li><strong>Dev:</strong> Updated all JS packages.</li></ul> |

### 🎉 UXWizz 8.0.0 (18 February 2025)

This update introduces Custom Layouts, design changes, multiple UI/UX improvements and bug fixes.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>New:</strong></p><ul><li><strong>Custom Layouts</strong> (BETA): Added the ability to resize and re-order the widgets/charts in the Stats screen. You can drag cards by their title.<br>This paves the future for new features like custom dashboards and Ask AI widgets.</li></ul><p><strong>Improvements:</strong></p><ul><li><strong>UI:</strong> Update dashboard styling and theme colors, to reduce contrast and make it easier on the eyes.</li><li><strong>UI:</strong> Numbers in the Stats panel are now displayed in a compact mode (e.g. 8.1k instead of 8103), hover to see the original value.</li><li><strong>UI:</strong> Visitors list - Improve readability by left-aligning all columns.</li><li><strong>UI/UX:</strong> Visitors list - Improve and move “Watch” button to avoid having to scroll all the way to the right to be able to play the recording.</li><li><strong>UI/UX</strong>: Segments - When converting a Goal back into a Segment, make the Segment inactive by default. This prevents other stats blocks from changing in size (when a segment is enabled).</li><li><strong>UI:</strong> Stats - Make Top Referrers list height same as Top Countries and Top Pages.</li><li><strong>UI/UX</strong>: Add button to go to the updates page from the “update available” notification.</li><li><strong>UI:</strong> Simplify updates screen and make it easier to read.</li></ul><p><strong>Bug fixes:</strong></p><ul><li>Fix playback for default recording mode when recording contains multi-line masked text.</li><li>Fix updater is\_writable check, which might incorrectly say file permissions are wrong when trying to update UXWizz.</li><li>Fix some stats loading bar display issues.</li><li>Fix link to OpenAI API pricing page (they changed it).</li><li>Fix some issues with the French locale.</li></ul> |

### 🎉 UXWizz 7.3.0 (14 January 2025)

This update improves session playback UI and adds the ability to jump to a certain timestamp in the recording.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>New:</strong></p><ul><li>Add <strong>seek</strong> functionality for full recording session playback.</li></ul><p><strong>Improvements:</strong></p><ul><li><strong>UI:</strong> Improved record playback and playback UI (display time and smoother progress bar).</li><li><p><strong>Tracking</strong>: Updated GeoIP databases to January 2025 versions from <a href="https://db-ip.com/db/download/ip-to-city-lite">db-ip.com</a>.<br>Note: you must download/update the city-level GeoIP database from Settings → Tracking:</p><div><figure><img src="/files/fJ65e5uqLUNJh9oH7KkF" alt=""><figcaption></figcaption></figure></div></li></ul><p><strong>Bug fixes:</strong></p><ul><li><strong>UI</strong>: Fix caching issue when going back to visitors list after watching a recording would select the wrong domain.</li></ul> |

### 🎉 UXWizz 7.2.0 (9 January 2025)

This update drastically improves session recording accuracy and session playback stability.

| Changes                                                                                                                                                                             |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>Improvements:</strong></p><ul><li>Updated full session recorder (RRWeb V1 → V2 Alpha).</li><li>Improved session live playback mode (for both recording modes).</li></ul> |

### 🎉 UXWizz 7.1.0 (5 January 2025)

This update upgrades the app to React 19 and improves the Visitors list.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>Improvements:</strong></p><ul><li><strong>UI</strong>: Improved Visitors table row readability and spacing.</li><li><strong>UX</strong>: For the Visitors table, persist locally the selected table density option.</li><li><strong>UX</strong>: <strong>Page chips can now be right-clicked or middle-clicked to open the pages in a new tab.</strong></li><li><strong>UX</strong>: Referrer chips can now also be opened in a new tab when shown in the segments header.</li><li><strong>Dev</strong>: Updated all packages to latest versions (including React 18 → 19)</li></ul> |

### UXWizz 7.0.2 (8 December 2024)

Hotfix: Change the updater integrity check URL.

{% hint style="warning" %}
Updating fails from versions prior to 7.0.2 unless this quick-fix is manually added!\
\
For Security reasons, UXWizz uses GitHub to store file integrity/digest hashes.\
GitHub has recently changed how their content is delivered.\
\
**Action required!**\
You have to manually update the URL — [**Please see the quick-fix here!**](https://docs.uxwizz.com/about/pages/3uNxENFlFzPTPnWC6xnL#issue-with-versions-older-than-7.0.2-github-has-recently-changed-how-their-content-is-delivered.-bec)
{% endhint %}

| Changes                                                                                                                       |
| ----------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>Bug fixes:</strong></p><ul><li>Update the integrity check URL to use GitHub pages instead of GitHub raw.</li></ul> |

### &#x20;UXWizz 7.0.1 (27 November 2024)

Quick fix for bot requests.

| Changes                                                                                                                                       |
| --------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>Bug fixes:</strong></p><ul><li>Fix error being shown in the console when website is accessed by a bot (e.g. Google bot).</li></ul> |

### 🎉 UXWizz 7.0.0 (6 November 2024)

Ask AI can now generate and display charts!

| Changes                                                                                                                                                                                                                                                                                                                 |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>New:</strong></p><ul><li><strong>Ask AI Charts:</strong> You can ask the AI to generate charts and also download them.</li></ul><p><strong>Improvements:</strong></p><ul><li>If only one domain is shown, make the domain card full-width.</li><li>Update internal JS packages to latest versions.</li></ul> |

### UXWizz 6.7.1 (29 October 2024)

This update introduces the Mobile/Desktop filter and Japanese translation.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>New:</strong></p><ul><li><strong>Device type filter</strong>: You can now filter a segment on “Desktop” or “Mobile” devices.</li><li><strong>Japanese locale</strong>: To report any issues or suggest a new language, use this repo: <a href="https://github.com/UXWizz/translations"><https://github.com/UXWizz/translations></a></li></ul><p><strong>Improvements:</strong></p><ul><li><strong>Translations:</strong> Add some missing translations and update a few wrong ones.</li></ul> |

### UXWizz 6.7.0 (14 October 2024)

This update introduces UI improvements for Goals and Domains and bug fixes.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>Improvements:</strong></p><ul><li><strong>UI</strong>: Improve goal block UI when only ALL segment is visible.</li><li><strong>UI:</strong> Improve number block UI in stats.</li><li><strong>UI:</strong> Improve Domains page layout and domain card UI.</li><li><strong>Self-host:</strong> Improve database backup script robustness, performance and error logs.</li></ul><p><strong>Bug fixes:</strong></p><ul><li><strong>Charts</strong>: Fix chart start/end dates when the server’s timezone is different from client’s.</li><li><strong>UI</strong>: Fix stats card alignment when only one goal is visible.</li><li><strong>AskAI</strong>: Fix chat history when using PHP get\_magic\_quotes\_gpc enabled.</li></ul> |

### UXWizz 6.6.0 (5 October 2024)

This update includes UX and Ask AI improvements, bug fixes and a new database backup script.

{% hint style="warning" %}
For Agency: Make sure you back up multidb-list.php before updating, as the contents might not be properly migrated due to a bug in a previous updater version.
{% endhint %}

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p></p><p><strong>New:</strong></p><ul><li><strong>Docs:</strong> Added a <a href="/pages/ej7orJAU1MoRoMTzdV02">server migration guide here</a>.</li><li><strong>Self-host</strong>: Added cron example cron/ust\_backup\_db.sh that creates a backup of the current database. You can also use this for on-demand backups. Note: For agencies, this currently only backs up the main database.</li><li><strong>Ask AI</strong>: Added GPT o1 and o1-mini models support (early access required).</li></ul><p><strong>Improvements:</strong></p><ul><li><strong>Ask AI</strong>: Better handle Ask AI GPT error responses.</li><li><strong>UX</strong>: Added “Copy” button to snackbar notifications (for errors only).</li><li><strong>UX</strong>: Better dark mode settings: you can now set the color scheme back to ‘system’ also (previously, once set, it was either ‘light’ or ‘dark’)</li><li><strong>UX</strong>: Clear <em>All segment</em> IP filter after deleting all sessions for specific user IP.</li></ul><p><strong>Bug fixes:</strong></p><ul><li><strong>Agency</strong>: Fix a potential issue with multiDB updating. Make sure you back up <strong>multidb-list.php</strong> before updating.</li><li>Fix a bug in the Visitors screen, where the list of visited pages for a session was out of order when the session had both multiple Events and multiple Tags.</li></ul> |

### UXWizz 6.5.1 (9 September 2024)

This update improves Ask AI. You can now enable chat history to send your previous questions and bot-generated responses with each new request.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>New:</strong></p><ul><li><strong>Ask AI</strong>: Setting to include <strong>chat history</strong>. This allows for follow-up questions.</li><li><strong>Ask AI:</strong> Button to ask the AI to fix the SQL error, if the latest query execution resulted in one.</li><li>Added example cron/ust\_del\_zero\_sec\_rec.sh that deletes all recordings with 0-second </li></ul><p><strong>Bug fixes:</strong></p><ul><li>Ask AI: Fix execution query output when selecting data from database that is in a binary format.</li></ul> |

### 🎉 UXWizz 6.5.0 (6 September 2024)

This update introduces tracking code changes, better SPA support, a new Agency feature and some bug fixes.

{% hint style="warning" %}
This update introduces tracking code changes.\
Please make sure, by clearing all relevant caches (WordPress cache, Cloudflare cache, etc.), that your users will be served the new tracking file (ust.min.js).
{% endhint %}

{% hint style="info" %}
The new session timeout functionality will result in slightly different new stats tracked:

* The **average session length will be shorter**.
* The **number of visits/pageviews will slightly increase** (a long session will now be likely split into 2 or more sessions, usually in cases where the user keeps the site in a background tab for more than 30 minutes).
  {% endhint %}

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p></p><p><strong>New:</strong></p><ul><li><strong>Agency: Custom Pages</strong> - You can now add buttons to the sidebar that, when clicked, displays the given URL in an iframe within the dashboard. This allows to embed any type of external or local content within the dashboard.</li><li><strong>UST.trackNewPage()</strong> - New JS API function that triggers a new pageview. Useful for tracking SPA applications. Read more about <a href="/pages/-Ltuu4PlgNgRV8-aW6XZ#id-3.-track-a-new-page">UST.trackNewPage() in the docs</a>.</li><li><strong>Session timeout</strong> - If a user leaves your site in a background tab for more than 30 minutes, when they come back to the tab, a new session will be created instead of continuing the previous one. This should reduce the number of very long (1h+) sessions.</li></ul><p><strong>Improvements:</strong></p><ul><li><strong>Ask AI</strong>: Pass current date to AI. Asking questions like “visitors in June” now returns data for June of this year.</li></ul><p><strong>Bug fixes:</strong></p><ul><li>Possibly fix an updating issue where the integrity hash value for the new version was returning an older cached value, thus preventing the update process.</li><li>Potentially fix most issues with long session lengths.</li><li>Default recorder - fix ust-rec-ignore and ust-rec-block still recording \<select> elements when using the</li><li>Default recorder - ust-rec-mask now will also mask select elements. This will actually behave the same as ust-rec-ignore and ust-rec-block when using the default recoder, as masking the selected value will stop it from correctly playing back.</li></ul> |

### UXWizz 6.4.2 (22 August 2024)

This update includes improvements, fixes and migrating the date library.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p></p><p><strong>Improvements:</strong></p><ul><li>Migrate from Moment.js to <a href="https://day.js.org/">Day.js</a> (modern, efficient and better maintained).</li><li>Always display full IP in visitors list (if not hashed or censored), instead of only the last 6 characters.</li><li>Better handle the downloading of GeoIP databases. Make sure tracking doesn’t break if the GeoIP database is corrupt.</li><li>Update GeoIP databases to August 2024 versions.</li><li>Add support for the new OpenAI project API keys.</li><li>Update JavaScript packages to latest versions.</li></ul><p><strong>Bug fixes:</strong></p><ul><li>Fixed censorIP sometimes still displaying IP in tooltip.</li></ul><p><strong>Other:</strong></p><ul><li>Update the feedback/bug report link to: <a href="https://feedback.uxwizz.com/"><https://feedback.uxwizz.com></a></li></ul><p></p> |

### UXWizz 6.4.1 (22 July 2024)

Update Ask AI models and improve responses.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                  |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p></p><p><strong>Improvements:</strong></p><ul><li><strong>Ask AI:</strong> Add <strong>GPT4o</strong> and <strong>GPT4o-mini</strong> models.</li><li><strong>Ask AI:</strong> Always display selected model in chat header.</li><li><strong>Ask AI:</strong> Improve prompts/responses.</li><li><strong>UI:</strong> Improve consistency - make top countries flags clickable chips.</li></ul><p></p> |

### 🎉 UXWizz 6.4.0 (15 June 2024)

This update introduces multi-domain filtering, a bunch of UI improvements and some quality-of-life changes.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>New:</strong></p><ul><li><strong>Multi-domain filtering:</strong> The segments header is now also displayed in the main domains page.</li><li>You can now dynamically prevent tracking the current session by returning false when overwriting the <a href="/pages/-MUBPofRMpSf7IMKb5mw#available-callbacks">UST.onTrackingStarted callback</a>.</li></ul><p><strong>Improvements:</strong></p><ul><li><strong>Updater</strong>: Check some files for write permissions before initiating the updater. This reduces instances when the updater would silently fail.</li><li><strong>UI:</strong> Simplify the stats layout if only the “All” segment is active (hide segment name and segment color).</li><li><strong>UI:</strong> Redesign Goals block styling to make them more skimmable.</li><li><strong>UI:</strong> Improve Goals responsive layout for smaller screens.</li><li><strong>UI:</strong> Increase the font size (+1px) of segment names for better readability.</li><li><strong>UI:</strong> Improved sidebar spacing and alignment.</li><li><strong>UI:</strong> Improved responsive breakpoints (mobile layout).</li></ul><p><strong>Bug fixes:</strong></p><ul><li>Fix (again) trial ending sooner than intended.</li></ul><p></p> |

### UXWizz 6.3.0 (30 May 2024)

License upgrade support, multi-database improvements and bugs fixes.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| <p><strong>New:</strong></p><ul><li>Added the ability to upgrade to a different license type (e.g. Company → Agency).</li></ul><p><strong>Improvements:</strong></p><ul><li><strong>Agency:</strong> Implement some workarounds to allow enabling multidb for an existing instance that already had tracked domains.</li><li>Preserve equivalent segment colors for all segments when toggling dark/light mode.</li></ul><p><strong>Bug fixes:</strong></p><ul><li><strong>Agency:</strong> Fix total database size usage calculation if multiple domains use the same database.</li><li>Improve separator used in GROUP\_CONCAT pages list MySQL query.</li><li>Fix dashboard crashing if toggling dark mode when more than 7 segments are enabled (because only 7 segment colors are available).</li></ul> |

### 🎉 UXWizz 6.2.0 (14 May 2024)

This update includes a new feature (Goals), many UI/UX improvements and some bug fixes.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>New:</strong></p><ul><li><p><strong>🥳 Goals:</strong> A segment can now be converted to a goal. Goals help you find the amount of and conversion rates for specific user behaviors within specific user segments. <br><a href="/pages/3JPDY8BUxkN9hyWg97gx">Learn more about goals in the docs.</a></p><div><figure><img src="/files/SMK1Hl7hfN8EeBmxTmYO" alt=""><figcaption><p>Example of a "Purchase" goal per segment when two segments (All, Twitter) are active.</p></figcaption></figure></div></li></ul><p><strong>Improvements:</strong></p><ul><li>Clicking on a country icon now adds it to the current segment.</li><li>Clicking on a page in Top pages now adds it to the current segment.</li><li>Improve stats screen styling for better readability.</li><li>Improve segment menu styling.</li><li>Update internal JS packages to their latest minor versions.</li><li>Improve segment header layout and transition for different screen sizes.</li><li>Improved tooltips consistency for elements that can be used as segment filters (e.g. country icon, referral chip, user IP, etc.)</li></ul><p><strong>Bug fixes:</strong></p><ul><li>Fix a bug where sometimes adding a segment filter would add it to the wrong segment.</li><li>Fix segment header layout when many segments are saved.</li></ul> |

### UXWizz 6.1.0 (6 May 2024)

Improve session recordings stability and performance. Includes a few quality-of-life fixes.

{% hint style="warning" %}
**NOTE:** This update includes JS tracker changes. \
You should update your included tracker code (or at least update the cache-breaker string ?v=6.1.0 at the end), and clear all caches, so your users will load the new JS tracker file.
{% endhint %}

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>Improvements:</strong></p><ul><li>Improve header date selector positioning (show date before segments).</li><li><p>Improve session recordings:</p><ul><li>Reduce <code>sessionStorage</code> data usage used for recording caching.</li><li>Fix some recordings missing when visit duration was long.</li><li>Reduce session recordings network traffic by \~50%.</li><li>Improve client-side recording performance.</li></ul></li></ul><p><strong>Bug fixes:</strong></p><ul><li>Fix reset icon positioning in header date selector.</li><li>Fix domain icon alignment in sidebar domain selector.</li><li>Fix trial ending sooner than intended.</li></ul> |

### UXWizz 6.0.3 (8 April 2024)

Quick update in preparation for publishing UXWizz as a 1-Click app on DigitalOcean. \
Updates a few internal JS packages and improves the Trial version.

| Changes                                                                                                                                                            |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| <p><strong>Improvements:</strong></p><ul><li>Trial version is now 14 days (instead of seven).</li><li>Update some internal node packages minor versions.</li></ul> |

### UXWizz 6.0.2 (4 April 2024)

Bug fixes. Better PHP 8 support.

| Changes                                                                                                                                                                                                                                                                                                                                  |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>Bug fixes:</strong></p><ul><li>Fix JSON encoding in the AI response unnecessarily escaping slashes and Unicode characters, making the response hard to read.</li><li>Fix PHP 8 notice if a visitor had no tags. (Thanks to Rodrigo for the fix)</li><li>Fix selected rows in visitors list after deleting an entry.</li></ul> |

### UXWizz 6.0.1 (12 March 2024)

Small UX and security improvements for the Ask AI feature.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                              |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| <p><strong>Improvements:</strong></p><ul><li>Ask AI: If the SQL query fails to execute, display the error message instead of 500 Internal Server Error.</li><li>Ask AI: Add a warning banner stating that the returned MySQL queries could be incorrect.</li></ul><p><strong>Security:</strong></p><ul><li>Ask AI: Add an extra check, to make sure the user has access to the domain they want to chat with the AI about.</li></ul> |

### 🎉 UXWizz 6.0.0 (11 March 2024)

This update includes a new feature (Ask AI), UI/UX improvements and multiple library upgrades.

{% hint style="warning" %}
It is recommended to backup your files and database before upgrading. Please report if you encounter any updating issues or have any suggestions.
{% endhint %}

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p></p><p><strong>New:</strong></p><ul><li><strong>🥳 Ask AI: ChatGPT integration:</strong> You can ask the AI questions about your data.<br><a href="/pages/pYImDigfoYfGIHoiBh9U"> Learn more about Ask AI in the docs.</a></li><li><strong>Smart auto chart granularity:</strong> The granularity of charts automatically switches to a better value (e.g. if you choose to view “last 2 days”, the graph will switch to hourly, if you choose “last 3 years”, the graph will switch to monthly).</li></ul><p><strong>Improvements:</strong></p><ul><li>Dashboard styling improvements (small UI fixes and dark mode color changes).</li><li>Full URL path is now displayed when hovering a page name in the visitors list.</li><li>Added more pre-made date range intervals (e.g. last 3 days, last 365 days, last 3 years)</li><li>Migrated the visitors table to MaterialReactTable. This introduces new features like column hiding, performance improvements, UI improvements and more.</li></ul><p><strong>Bug fixes:</strong></p><ul><li>Fix recorded visitors number in domains overview sometimes showing 0 (caching issue).</li></ul><p><strong>Other:</strong></p><ul><li>Updated TypeScript (v5.0 → 5.4)</li><li>Updated MUI (v5.13 → 5.15)</li><li>Updated ChartJS (v3 → v4)</li><li>Updated i18next (v19 → v23)</li><li>Updated various other internal package dependencies.</li><li><p>Updated <a data-mention href="/pages/-M25dwI6gUJBPdicDKzS">/pages/-M25dwI6gUJBPdicDKzS</a></p><ul><li>Updated the refund period to match the advertised one (14 days).</li><li>The Agency license now matches the Company license "install on up to 5 servers"</li><li>Improved TL;DR; format.</li></ul></li></ul> |

### UXWizz 5.5.1 (23 February 2024)

Hotfix: Make sure version 6.0.0 update download will work as expected (fix hash integrity path check).

### UXWizz 5.5.0 (21 February 2024)

Quality of life update: licensing system improvements and preparation for v6.0.0 release.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p></p><p><strong>New:</strong></p><ul><li>Implemented system to enable support renewal without having to manually contact support.</li><li>Created a dashboard to manage and see detailed information about your UXWizz license (will be soon live).</li></ul><p><strong>Improvements:</strong></p><ul><li>The licensing system has been revamped to be more robust.</li></ul><p><strong>Bug fixes:</strong></p><ul><li>If your support period is expired, you will see the correct message inside the dashboard instead of “Invalid license”.</li></ul><p><strong>Notes:</strong></p><ul><li>Until now, you might have been able to access the latest releases without having a valid support/updates period. Unfortunately, this has a major impact on the resources available for the project’s development. If you do like UXWizz and want to speed up the rate of updates, please consider renewing your support period. Each and every sale matters a lot for our small company.</li></ul> |

### UXWizz 5.4.0 (25 January 2024)

New URL hash tracking setting, UI improvements and bug fixes.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p></p><p><strong>New:</strong></p><ul><li>Setting to include or not the URL fragment (#hash part) when saving URLs in the database. Useful for when using a SPA or hash router.</li></ul><p><strong>Improvements:</strong></p><ul><li>Added a way to expand the list of visited pages in the visitors list.</li><li>Show full date, including date of the week, when hovering Events chips and dates in the Visitors list.</li></ul><p><strong>Bug fixes:</strong></p><ul><li>Fixed number of visited pages count being incorrect in the visitors list when many pages (10+) were visited in a single session.</li><li>Fix percentages display overlapping bar in top pages/countries charts.</li><li>Fix displayed Events time, when server timezone is different from your timezone.</li><li>Fix tag removal when using multi-db.</li></ul> |

### UXWizz 5.3.0 (25 October 2023)

Performance improvements, bug fixes and improved GeoIP precision.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p></p><p><strong>Improvements:</strong></p><ul><li>Considerably improved multiple-domains overview loading performance.</li><li>Updated Country and City GeoIP databases for more accurate geolocation.</li></ul><p><strong>Bug fixes:</strong></p><ul><li>Fix segment header not being displayed on the heatmaps page.</li><li><strong>Agency:</strong> MultiDB – Fix domain total visitors count not showing properly in the multi-domains overview screen.</li></ul><p><strong>Internal Development:</strong></p><ul><li>Refactored the entire codebase to remove <strong>@‌material/styling</strong> and replaced it with the new MUI v5 sx prop. This made the code cleaner and allows for a quicker component development.</li></ul> |

### UXWizz 5.2.0 (18 August 2023)

Small fixes, code improvements and an enhanced Agency logo-upload experience.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p></p><p><strong>Improvements:</strong></p><ul><li><strong>Agency:</strong> Added UI for uploading the logo image for the dashboard (instead of having to paste the base64 image string).</li></ul><p><strong>Bug fixes:</strong></p><ul><li>BUG: Fix dashboard crashing when no domains were added (e.g. after initial setup).</li><li>UX: Fix currently selected domain changing to first domain in list when going back to overview.</li><li>Minor fixes for some warnings shown in the JS console related to URL routing.</li></ul> |

### UXWizz 5.1.0 (3 August 2023)

New language (pt-BR), bug fixes and performance improvements.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p></p><p><strong>New:</strong></p><ul><li>Added pt-BR language (thanks to Rodrigo for submitting it).</li></ul><p><strong>Improvements:</strong></p><ul><li>Improved domain selector logic/performance.</li></ul><p><strong>Bug fixes:</strong></p><ul><li><p>Fixes when the new MultiDB feature is enabled:</p><ul><li>Fix A/B tests creation</li><li>Fix viewing events</li><li>Fix record watched flag</li><li>Fix domain selector</li><li>Fix adding/removing tags through the interface</li></ul></li><li>Fix domain selector UI sometimes not working.</li></ul> |

### UXWizz 5.0.1 (25 June 2023)

Quick quality-of-life change for better default date range picker intervals.

| Changes                                                                                                                                                                |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p></p><p><strong>Improvements:</strong></p><ul><li>Better date range picker intervals.</li><li>Upgrade internal build package (ParcelJS) to latest version.</li></ul> |

### 🎉 UXWizz 5.0.0 (8 June 2023)

{% hint style="danger" %}
This is a major release! Please backup your files and database before upgrading.
{% endhint %}

This update introduces **multi-database support** (Agency version) and a big (mostly invisible for now) code upgrade to **React v18** and **Material UI v5**.\
Updating to the latest versions of React and MUI not only makes the platform more future-proof, but it also improves the performance and usability of the platform.&#x20;

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p></p><p><strong>New:</strong></p><ul><li><strong>Agency:</strong> <strong>Multi database support</strong> - When first setting up the dashboard, you can choose to store the data for each domain in a separate database on the same server.</li><li><strong>Agency:</strong> <strong>Multi database servers support</strong> - You can now scale the database for new websites or users by adding multiple database servers. Each new domain tracked can have the data stored on any of the listed database servers.<br>Both those changes together can drastically improve performance, security and privacy.</li></ul><p><strong>Improvements:</strong></p><ul><li>Updated interface to MUI V5.</li><li>Updated internal React to v18 and TypeScript to the latest versions.</li><li>Replaced DateRangePicker to the PRO one from MUIX.</li><li>Reduced total dashboard app size (by upgrading the ParcelJS bundler to the latest version).</li><li>Various small UI fixes and improvements. The UI will be improved even further in v5 (Note: some small UI inconsistencies might still be noticed from the current transition to the new UI framework version).</li></ul><p><strong>Bug fixes:</strong></p><ul><li>Fix SET\_USER\_MAX\_DOMAINS permission not being properly checked.</li></ul><p><strong>Other:</strong></p><ul><li><strong>App paths switched to HashRouter</strong>: The routing in the dashboard (URLs) has been changed to HashRouter. This was done to remove the need of .htaccess redirects and improve compatibility with NGINX and other webservers that don’t support URL rewrites. Paths will now look like app\*\*/#/visitors\*\* instead of app\*\*/visitors\*\*. <br><strong>If you get a 404 error accessing the dashboard from your browser history or bookmarks, update the saved URL to include the hash symbol.</strong></li></ul><p><strong>WordPress:</strong></p><ul><li>Fixed a potential warning with undefined $UST\_VERSION</li><li>Use wp-load.php instead of wp-config.php for database connection, as some managed hosting providers don't provide proper wp-config.php files.</li></ul> |

### UXWizz 4.5.0 (24 October 2022)

Improved admin privacy within the dashboard by either eliminating 3rd party requests or adding the option to disable them.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>New:</strong></p><ul><li><strong>Settings->Privacy - Disable domain favicon loading</strong> - Option to disable loading of domains favicons from icons.duckduckgo.com.</li><li><strong>Settings->Privacy - Disable new version check</strong> - Option to stop the request made on dashboard load to the UXWizz license server that checks whether a new version is available or not.</li></ul><p><strong>Improvements:</strong></p><ul><li>Replaced dashboard Inter Google Font with local font files.</li><li>Replaced dashboard Material Icons Google Font with local font file.</li></ul> |

### UXWizz 4.4.1 (29 September 2022)

This update includes mainly Agency version changes, including a **Max domains** per user feature.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>New:</strong></p><ul><li><strong>Agency - max domains per user</strong> - You can now set a limit on how many domains can an individual user track.</li><li><strong>New user permission: CHANGE\_OWN\_DOMAIN\_ACCESS</strong> - Level 3 users can now change their own domain access (add/remove domain) without being able to do the same for other users.</li></ul><p><strong>Improvements:</strong></p><ul><li>UX: Clicking a domain in the users list now opens the domain settings dropdown (limit, tracking pixel info).</li><li>Agency: Removed three external links to the UXWizz documentation website in order to better respect the white-label feature. In the future, more documentation will be included locally instead of linking to docs.uxwizz.com.</li></ul><p><strong>Bug fixes:</strong></p><ul><li>Don't show Add tracker info if domain add failed</li></ul> |

### UXWizz 4.4.0 (12 May 2022)

This update introduces session playback pause and speed controls plus some Agency version improvements and fixes.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>New:</strong></p><ul><li><strong>New playback controls</strong>: session playback can now be paused and sped up by 2x, 4x or 8x.</li></ul><p><strong>Improvements:</strong></p><ul><li>The default link in the (optional) consent pop-up now leads to a local copy of the privacy-policy instead of the UXWizz documentation.</li></ul><p><strong>Bug fixes:</strong></p><ul><li>Fix local links in Agency sidebar being relative to server root instead of UXWizz server root.</li><li>Fix custom logo in Agency not being used in some locations.</li><li>Fix login redirect still not working on some servers where <code>$\_SERVER\['DOCUMENT\_ROOT']</code> doesn't return the correct path.</li></ul> |

### UXWizz 4.3.2 (23 March 2022)

This is a maintenance update with bug fixes and improvements.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>Improvements:</strong></p><ul><li>The updates settings page and new version notification are now hidden to users that don't have the UPDATE\_PLATFORM permission.</li></ul><p><strong>Bug fixes:</strong></p><ul><li>Fix full-page record playback not working when the recorded page contained the text <code>Error:</code>.</li><li>Fix a React warning logged during playback.</li><li>Fix redirect after login being wrong in some server environments.</li></ul> |

### UXWizz 4.3.1 (10 March 2022)

Hotfix: Fix redirect after login not properly leading to the dashboard.

### UXWizz 4.3.0 (4 March 2022)

This update introduces a new feature for the Agency version and improves/fixes some error messages.

{% hint style="danger" %}
**IMPORTANT: The permissions levels have changed! See the first item in the "Other" section. Users with level 4 now have more rights!!**
{% endhint %}

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><strong>New:</strong></p><ul><li><strong>Agency version - Custom links in sidebar</strong>: You can now add custom links/text in sidebar. Use this to link to your website, promote other services, or link to your own customer's portal.</li></ul><p><strong>Bug fixes:</strong></p><ul><li>Fixed error messages being displayed in the dashboard when the login session expired. Now you are properly redirected to the login page (without having to refresh).</li><li>Fixed dashboard long error message when using a license for a different variant than the one installed.</li><li>Agency version - Suppress error message when saving settings without adding a custom logo.</li></ul><p><strong>Other:</strong></p><ul><li><strong>User permissions have been updated</strong>. To better separate user roles, now only level 5 users (root) can change the dashboard itself (update, set license key, change tracking settings). Level 4 users (admins) can now also manage user accounts (create/delete users, change domain access). You can not change your own user level. You can not set to others a user level higher than your own.</li><li>The <strong>current dashboard version</strong> is now also stored in the <code>ust\_meta</code> table, with the key <code>VERSION</code>. This is useful for checking using MySQL which version is currently installed.</li></ul> |

###

### Changelog 2020

[Changelog archive: 2020](/about/changelog/changelog-archive-2020)

### Before year 2020

[Changelog archive: 2013-2020](/about/changelog/changelog-archive-2013-2020)

### Initial Release - January 2013


# Changelog archive: 2021

### UXWizz 4.2.0 (3 December 2021)

This update adds city geolocation, the Russian language and some useful fixes.

| Changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p></p><p><strong>New:</strong></p><ul><li><strong>City-level IP geolocation</strong>. You can now optionally save the city of the visitor in the database. The city is also displayed when you hover the country icon in the visitors list. You can enable city geolocation in the Tracking settings.</li><li>Translation: <strong>Russian language</strong></li></ul><p><strong>Improvements:</strong></p><ul><li><strong>Improved client/server timezone management</strong>. Previously, if your MySQL server had a different timezone than your local timezone, when you searched for sessions within a date interval, the date will be sent as is to the server for querying which lead to unexpected results. For example, let's assume you searched from the interface for visits on Tuesday at (eg. now being 9AM on Tuesday) and the server timezone was 10h behind your timezone. The query wouldn't have returned any results as for the server it was still Monday. Solution: <strong>The time used for querying is now converted to server time</strong>. Following the example above, when you search for "visits from Tuesday 00:00 to 23:59" it will convert the query to server time: "visits from Monday 14:00 to Tuesday 13:59" for a 10h behind offset. This will correctly show the sessions on your local Tuesday.</li><li>Improve settings text in UI for enabling/disable session recordings to avoid confusion (disabling the "enable full session recordings" setting removes the session playback ability entirely, it does not switch between the default/full tracking systems).</li></ul><p><strong>Security:</strong></p><ul><li>Fixed a non-critical XSS issue (an arbitrary string could be displayed in a dashboard endpoint response if the request headers were tampered, but if JS was written it wouldn't have been executed).</li></ul><p><strong>Bug fixes:</strong></p><ul><li>Fix a case where session playback would not start.</li></ul> |

### 🎉 UXWizz 4.1.0 (9 November 2021)

userTrack has been rebranded to UXWizz. This update includes the branding changes plus some bug fixes.

{% tabs %}
{% tab title="Changes" %}
**New:**

* **userTrack is now UXWizz.** Most brand text, links and images have been updated with the new name. There might still be some references to "userTrack". You can read more about this change in [the blog post](https://www.uxwizz.com/blog/rebrand-usertrack-is-now-uxwizz).

**Bug fixes:**

* Fixed errors on some versions of MariaDB when `sql_mode` has enabled the `ONLY_FULL_GROUP_BY` flag.
* Fix `server/troubleshoot.php` not working due to CSRF checks.
* Fix notification snackbars not being closable (updated [Notistack](https://github.com/iamhosseindhv/notistack/))
* Fix a crash in the visitors list when when page size was changed to a smaller value. [Also summited the fix as a PR for the material-table-core package.](https://github.com/material-table-core/core/pull/396)
* Fixed link to Personal Data Information in the GDPR pop-up showed (if the setting is enabled)
  {% endtab %}
  {% endtabs %}

### 🎉 userTrack 4.0.0 (6 October 2021)

A new, secondary, session-recording system was added. You can now record sessions on dynamic websites and in user areas (behind login screens) when using the new recording system.

{% tabs %}
{% tab title="Changes" %}
**New:**

* **Full session-recording system**. Added a secondary session recording/playback system that records entire page content and changes. This is based on [rrrweb](https://github.com/rrweb-io/rrweb).

  The recordings will be more accurate but take up a lot more space (eg. 20KB/session instead of 100sessions/KB with the default userTrack system)

  To enable this new tracking system please include the new tracker script that contains this recording method (i.e. **ust-rr.min.js** instead of **ust.min.js**).\
  Read more about this in the [session recording docs](/api/session-recording).

**Improvements:**

* UI: Improve country flags clarity

**Bug fixes:**

* Fix German (DE) language flag missing.
* Fix German language name (Deutsche -> Deutsch)
* Fix events for clients sometimes showing wrong cached data.
  {% endtab %}
  {% endtabs %}

### userTrack 3.5.3 **(3 August 2021)**

* Fix [Event](/api/events) date parsing in Safari (Safari doesn't parse dates in the `YYYY-MM-DD hh:mm:ss` format).

### userTrack 3.5.2 **(21 July 2021)**

Updated ChartJS to v3. Improved heatmaps and session playback stability.

{% tabs %}
{% tab title="Changes" %}
**Improvements:**

* Updated [ChartJS](https://www.chartjs.org/) to the new v3 release.
* Improved iframe loading stability (for viewing heatmaps and session recordings).
* Improved support for tracking pages with non-standard characters (eg. Chinese characters) in their URL.
* Improved chart tooltips and date formats.
  {% endtab %}
  {% endtabs %}

### userTrack 3.5.1 **(19 June 2021)**

Updated userTrack branding (new logo). Improved build tools and added an agency version.

{% tabs %}
{% tab title="Changes" %}
**New:**

* **Agency version** - there is now a separate userTrack build for the Agency version, which for now includes the branding (whitelabel) feature.

**Improvements:**

* Updated branding (logo) to the new version.
* Implemented a one-time info/tutorial system for displaying tips inside the dashboard.
* An info modal/warning is displayed the first time you play a session recording.
* Development only: improved some build and localization tools, this should increase the rate of future userTrack updates.
  {% endtab %}
  {% endtabs %}

### 🎉 userTrack 3.5.0 **(16 April 2021)**

Introducing a brand new **events system**, an important security improvement and some small fixes.

{% hint style="warning" %}
**This update includes changes to tracker.js.**&#x20;

**ust.min.js will be updated so make sure to clear all relevant caches so users load the latest tracker file.**&#x20;

**Updating the tracker include code, which already contains a cache-breaker is the best way to clear the cache. (eg. ust.min.js?v=3.5.0)**
{% endhint %}

{% tabs %}
{% tab title="Changes" %}
**New:**

* **Events system**. You can use events to track sales, errors or any arbitrary data for each user. Read more details here: <https://docs.usertrack.net/api/events>\
  More graphs and filtering options for events will be added soon.

**Improvements:**

* Added a **setting to toggle URI encoding** for the recording data sent via the tracking pixel. Please enable this if your firewall (such as Sucuri) blocks non-encoded parameters in the URL.
* Improved query peformance for retrieving the list of visitors.

**Security:**

* Added [**Cross Site Request Forgery (CSRF)**](https://owasp.org/www-community/attacks/csrf) **protection**. This is pre-emptive measure, which stops the possibility of someone tricking you into clicking an external link/button that executes an existing action on your userTrack dashboard.

**Bug fixes:**

* Fixed a rare timing issue, when sometimes loading the dashboard showed an error if a request took too long to load.
  {% endtab %}
  {% endtabs %}

### userTrack 3.4.4 **(17 March 2021)**

Added bot filtering, some improvements for the WordPress version, new translations and some fixes.

{% hint style="warning" %}
**This update includes changes to tracker.js.**&#x20;

**ust.min.js will be updated so make sure to clear all relevant caches so users load the latest tracker file.**&#x20;

**Updating the tracker include code, which already contains a cache-breaker is the best way to clear the cache. (eg. ust.min.js?v=3.4.4)**
{% endhint %}

{% tabs %}
{% tab title="Changes" %}
**New:**

* **Bot filtering** - Bots are now automatically excluded from tracking based on the UserAgent string.
* **New languages: French, Spanish and Portuguese** - Those were mostly automatically translated, if you find issues you can submit fixes on the [userTrack translation repository](https://github.com/userTrack/translations).

**Improvements:**

* Added `no-cache` headers to all PHP files to avoid potential caching issues with specific server configurations.

**Bug fixes:**

* Fixed an issue where the trial could not be automatically upgraded to the full version if it has already expired.
* Fixed missing translations for time intervals (eg. date, hour).

**Other:**

* Marketing/sales: Added a 7 days trial version of userTrack which can be upgraded automatically to the full version.

**WordPress:**

* **NEW**: Ability to disable tracking for specific user categories (visitors/logged-in users/admins)
* Improved tracking settings loading performance.
* Improved tracking settings UI.
  {% endtab %}
  {% endtabs %}

### userTrack 3.4.3 **(23 February 2021)**

Introducing JavaScript hooks which can be used on your website to read userTrack activity. More UX improvements.

{% hint style="warning" %}
**This update includes changes to tracker.js.**&#x20;

**ust.min.js will be updated so make sure to clear all relevant caches so users load the latest tracker file.**&#x20;

**Updating the tracker include code, which already contains a cache-breaker is the best way to clear the cache. (eg. ust.min.js?v=3.4.3)**
{% endhint %}

{% tabs %}
{% tab title="Changes" %}
**New:**

* **JS Callbacks**. Added JavaScript callbacks/hooks you can register to. Using them you can extend or implement custom userTrack functionality on your site.\
  [Check out the JS Callbacks docs.](/api/hooks-callbacks)

**Improvements:**

* UX: You can now update filters such as tags, pages in existing segments by clicking on them.
* UX: You can now click on pages in the visitors list to add them to the current segment filter.
* Better accuracy for user IP detection (if the IP is sent in the `HTTP_CF_CONNECTING_IP` or `HTTP_X_SUCURI_CLIENTIP` headers).
  {% endtab %}
  {% endtabs %}

### userTrack 3.4.2 **(4 February 2021)**

> **Hotfix for 3.4.1**\
> Fixes Pages autocomplete query not working on some MySQL instances.\
> Fixes timeseries loading bar not appearing

### userTrack 3.4.1 **(4 February 2021)**

Improved tracking settings, some tracking fixes and UI improvements.

{% hint style="warning" %}
**This update includes changes to tracker.js.**&#x20;

**ust.min.js will be updated so make sure to clear all relevant caches so users load the latest tracker file.**&#x20;

**Updating the tracker include code, which already contains a cache-breaker is the best way to clear the cache. (eg. ust.min.js?v=3.4.1)**
{% endhint %}

{% tabs %}
{% tab title="Changes" %}
**New:**

* **Added setting to enable/disable session recordings**. You can now enable/disable full session recording from the settings UI while still tracking basic pageviews stats. You can also independently enable/disable heatmaps.

**Improvements:**

* UI: Simplified segment context menu. Now only the icons are shown for segment actions (new, copy, rename, delete).
* Improved pages filter autocomplete performance when having many unique pages stored. Now only 50 URLs  are loaded initially and then the rest is dynamically fetched. Responses are also cached until you refresh the dashboard, so typing twice the same page query won't hit the server again.
* Improved the pixel tracker batching logic. It now sends data less often. It should still be accurate, but should result in 30-50% fewer requests sent for longer sessions.

**Bug fixes:**

* **Important:** Fixed record keyboard setting being always `false`. The setting was saved in DB with the key `recordKey` but the JavaScript tracker file was reading `recordKeyboard`.
* Fixed pages still not being ordered sometimes in session playback (ORDER BY clause was wrong).

**Other:**

* The "**Visitors**" graph is now called "**Visits**" as it currently shows the number of sessions, not of unique visitors. An unique visitors graph will be added soon.
  {% endtab %}
  {% endtabs %}

### 🎉 userTrack 3.4.0 **(8 January 2021)**

Improved heatmaps UI. Several bug fixes and performance improvements.

{% hint style="warning" %}
**This update includes changes to tracker.js.**&#x20;

**ust.min.js will be updated so make sure to clear all relevant caches so users load the latest tracker file.**&#x20;

**Updating the tracker include code, which already contains a cache-breaker is the best way to clear the cache. (eg. ust.min.js?v=3.4.0)**
{% endhint %}

{% tabs %}
{% tab title="Changes" %}
**New:**

* **Heatmaps by device filter**. Added device buttons to the heatmaps interface so you can quickly select and view data based on visitors' screen size. Previously you had to manually select both *iframe width* and *page width filter*. Selecting a device automatically sets those two values.

**Improvements:**

* When viewing heatmaps, changing the current page by clicking a link on the site now automatically loads the heatmap data for that specific page
* Improved overall dashboard queries performance (especially for larger databases)

**Bug fixes:**

* Fixed page scroll sometimes not being recorded in playback if the website scrollbar was happening on the `body` instead of the `window`.
* Fixed pages order in playback not always being correct.
  {% endtab %}
  {% endtabs %}


# Changelog archive: 2020

### userTrack 3.3.2 **(23 December 2020)**

More query performance improvements. The dashboard should be REALLY fast now.

{% tabs %}
{% tab title="Changes" %}
**Improvements:**

* Improved query performance for top referrers.
* Improved query performance for top pages.
* Improved query performance for domain total stats.
* Improved query performance for bounce rate graph.

**Bug fixes:**

* Fixed some graphs not updating when changing domains from the top-left domain selector.
  {% endtab %}
  {% endtabs %}

### userTrack 3.3.1 **(11 December 2020)**

Some query performance improvements.

{% tabs %}
{% tab title="Changes" %}
**Performance improvements:**

* Visitors list performance drastically improved for big databases.
* Top pages query performance increased by 5x.
* Filtering for exact page visited query performance increased by 2x.
* Drastically improved the performance of the visitors limit query (the one that deletes old users when limit is reached).
  {% endtab %}
  {% endtabs %}

### userTrack 3.3.0 **(1 December 2020)**

Graphs data can now be grouped by hour, day, week or month. Other minor improvements and bug fixes.

{% tabs %}
{% tab title="Changes" %}
**New:**

* **Time intervals for charts**. You can now change the time intervals for timeline charts to be grouped by Hour, Day, Week or Month.

**Improvements:**

* Tags are now sorted by time instead of alphabetically, this means that you can now see the order in which events happened.
* UI: Month name is now displayed in short format in the date range picker (Sept. instead of September) for better space usage.
* UI: Reduced chart legend length below chart title (only shows segment name now). Detailed legend (chart title + segment name) is still displayed in the hover tooltip.

**Bug fixes:**

* `sessionStorage` is now used instead of `localStorage` to store user and session recording data. This should fix some issues when the user opens the site in multiple tabs (as `sessionStorage` is unique per tab but `localStorage` was shared.
  {% endtab %}
  {% endtabs %}

### userTrack 3.2.9 **(5 November 2020)**

Drastically improved visitors list query performance and added session length filter.

{% tabs %}
{% tab title="Changes" %}
**New:**

* **Session length filter**. You can now filter sessions with a specific sessions length.

**Improvements:**

* Improved dashboard loading speed by always caching the bundled CSS/JS. It's safe to always cache them as each new build has a hashed/distinct bundle filename.
* Drastically improved visitors list loading time, especially when using a larger page size (eg: 100 rows)

**Bug fixes:**

* Fix not being able to add more than two page filters
  {% endtab %}
  {% endtabs %}

### userTrack 3.2.8 **(27 October 2020)**

Added new summary stats per segment to easier understand and compare them.<br>

![Comparing All visitors vs those who came from any Google domain](/files/-MKfLrIMBkomYQ-R48h7)

{% tabs %}
{% tab title="Changes" %}
**New:**

* **Summary stats.** In the statistics page, for each segment it will now also be displayed: the total number of visitors, pageviews, average session length and average bounce rate.&#x20;

**Improvements:**

* Referrer links act more like links now, meaning that you can middle or right click a referrer in the *Top referrers* or *Visitors* lists to open that page in a new tab.

**Bug fixes:**

* Fixed some translation issues for the German locale.
  {% endtab %}
  {% endtabs %}

### userTrack 3.2.7 **(9 October 2020)**

This update introduces more privacy features, the ability to filter all sessions from a single user and some UX improvements for the visitors list.

{% tabs %}
{% tab title="Changes" %}
**New:**

* **Anonymize IP**. You can now choose to hash IPs before they are stored in the database for increased user privacy. The hash also includes the UserAgent string to avoid false positives. I strongly recommend using this feature.
* **Filter by IP**. You can now easily filter all sessions for a user based on IP (or hashed IP). Now that the IP can be anonymized, this allows you to see multiple visits of a single user without affecting a specific user's privacy.

**Improvements:**

* Updated the AB testing tracker code to be included. It now hides the page using `opacity: 0` instead of `visibility: hidden` as it results in less content flashing in most browsers.
* Default settings: *Hash user IP* and *Censor visible IP* settings are enabled by default to increase user privacy.
* UX: Number of rows per page in visitors list is now cached in `localStorage`.
* UX: Page index currently being viewed in visitors list is now stored in the URL. This means that you can now refresh or use the browser back button and you will stay on the same page number.
* Performance: Improved visitors list loading performance (previously the list was requested multiple times, thus putting more stress on the server)

**Bug fixes:**

* Fixed some translation issues for the Dutch locale.
  {% endtab %}
  {% endtabs %}

### userTrack 3.2.6 **(24 August 2020)**

This update introduces wildcard filters for referrers, German language, some performance improvements and a heatmap fix.

{% tabs %}
{% tab title="Changes" %}
**New:**

* **Wildcard referrer filter**.  You can now search for a referrer using a start or an end wildcard (similar to the pages search). This is very useful as you can now add `*google.*` as a segment's referrer filter, and it will match all international Google domains (eg. google.com, google.de, google.es, etc.)
* Translation: **German language**

**Improvements:**

* Improved tracking performance of a new user (removed one DB query).

**Bug fixes:**

* Fix heatmap points position: `static` positioning was not correctly storing the relative X values.
* Fix tracking error on some PHP versions, when notices are enabled (in createClient.php:70)
  {% endtab %}
  {% endtabs %}

### userTrack 3.2.5 **(17 August 2020)**

This update introduces improvements to the translation system and adds the Dutch language.

{% tabs %}
{% tab title="Changes" %}
**New:**

* Dutch language

**Improvements:**

* Code: Translation files are not stored as JSON. You can help with translations here: <https://github.com/userTrack/translations>
* UI: Remove the domains thumbnail images. Read the reasons here:  <https://trello.com/c/Vvoo0ak5>
* UI: `admin` is now shown as a placeholder in the login form (useful if you forgot the default username).

**Bug fixes:**

* Fix update `.htaccess` file not working on some server configurations.
  {% endtab %}
  {% endtabs %}

### userTrack 3.2.4 **(10 August 2020)**

This is mainly an update for the WordPress version. The auto-updater has also been added to the userTrack WordPress plugin.

{% tabs %}
{% tab title="Changes" %}
**New:**

* **Auto-updater on WordPress**. The same auto-updater that was added in 3.2.0 for the standalone version is now also available in the WordPress version.

**Bug fixes:**

* Fixed an issue with A/B tests were the last previewed variant was used during playback instead of the A/B variants the user saw.

**WordPress:**

* Auto-updater was added (as mentioned above).
* You can now deselect all checkboxes in the *Pages to track* menu if you don't want the tracker file to be automatically included. Previously at least one checkbox had to be selected.
  {% endtab %}
  {% endtabs %}

### userTrack 3.2.3 **(3 August 2020)**

This update includes small improvements and bug fixes.

{% tabs %}
{% tab title="Changes" %}
**New:**

* **URL tracking opt-out**. Users can opt out (or in) from being tracked by your userTrack instance by accessing any URL where your tracker is installed with the query parameter `ust-opt-out` or `ust-opt-in`.&#x20;

  **eg.** `site.com?ust-opt-out`

**Improvements:**

* Slightly improved tracking performance and accuracy.
* For URL Favicons images use DuckDuckGo URL instead Google.

**Bug fixes:**

* Fix scroll playback offset sometimes not saving last scroll position.
  {% endtab %}
  {% endtabs %}

### userTrack 3.2.2 **(1 August 2020)**

Hot fixes for latest 3.2.0 release.

{% tabs %}
{% tab title="Changes" %}
**Bug fixes:**

* Always show errors while updating.
* Fix wrong upcoming version number shown in UI.
  {% endtab %}
  {% endtabs %}

### userTrack 3.2.1 **(1 August 2020)**

Hot fixes for latest 3.2.0 release.

{% tabs %}
{% tab title="Changes" %}
**Bug fixes:**

* Fix default relative tracking setting being false.
* Fix settings save not working.
  {% endtab %}
  {% endtabs %}

{% embed url="<https://www.youtube.com/watch?v=IpuyLrlCukY>" %}

### 🎉userTrack 3.2.0 **(1 August 2020)**

This update introduces **automatic updates**. You will now be able to update your userTrack dashboard with one click.

{% tabs %}
{% tab title="Changes" %}

#### **New:**

* **Automatic updates**. A notification will appear in the dashboard when a new userTrack update is ready. To update the installation go to *Settings->Updates->Update now*. A valid license key is required.

**Important changes:**

* Tracking settings are now stored in the database instead of the tracker.js file. This means that you can now safely replace/update the file without losing your personalized settings.

**Bug fixes:**

* Fix tracker throwing an error when a radio button or select was clicked.

&#x20;**WordPress version:**&#x20;

* This update is only available for the standalone version. The WordPress version will receive the automatic updates functionality soon.
  {% endtab %}
  {% endtabs %}

### userTrack 3.1.1 **(9 July 2020)**

This update doesn't include any new big feature, but it fixes multiple UX issues, caching issues, tracking issues and adds some security and performance improvements.

{% tabs %}
{% tab title="Changes" %}
**New:**

* **Average session length chart**. The previous "pages per session" bar chart has been hidden as it was hard to read.&#x20;

**Important changes:**

* Tracker.js was updated to fix the session length issue, you will have to change on setting to regenerate the ust.min.js minified tracking code.

**Improvements:**

* Small **UI/UX** improvements for:
  * Sidebar UI
  * Domains list UI
  * A/B tests list UI
  * Tracking code modal
* A toggle has been added in the tracking code modal so you can choose to include or not the extra A/B tracking scripts.
* A warning is now shown saying that you will be logged out when you change your own user information
* Disabled caching of userTrack's index.html to make it easier to update to new versions
* Added a cache breaker query string `?v=3.1.0` to the included tracker script, to force clients to get the latest version.
* Improved tracking performance: reduced the initial number of requests done for each page visited from 3 to 2.

**Security:**

* A password must now be **chosen** at installation time for the admin user instead of using a default password. Note that there should always be a user named "admin".

**Bug fixes:**

* Fixed a bug where session length would be really long if a user comes back to the site. If you saw a session length of "20hours" it could have meant that the user left the site and then came back 20 hours later.
* You are now properly logged out after changing your password
* Page now correctly starts scrolled at the top when navigating to a different page in the dashboard
* Fixed errors flashing before being redirected to the login screen, if accessing the dashboard while not logged in.

&#x20;**WordPress version:**&#x20;

* userTrack will no longer be displayed in an iframe inside WordPress, but the dashboard will open in a new tab. This way there is a lot more space for the graphs/stats and it also fixes the issue with the iframe sizes not filling entire window.
  {% endtab %}
  {% endtabs %}

### userTrack 3.1.0 **(22 June 2020)**

This update introduces **A/B tests**, **dark mode**, fixes some issues with record playback and adds several UI improvements.

{% tabs %}
{% tab title="Changes" %}
**New:**

* **A/B tests**: you can now change text or inline styles on your page using just the userTrack interface. Users who see a specific version are automatically tagged with that A/B test variant so you can segment and view data for those users only.
* **Dark mode**: you can now switch between the dark and light themes of the userTrack UI.

**Important changes:**

* The tracker inclusion code was updated. There is some extra inline JavaScript before including the tracker file, in order to be able to track page load speed and make sure tags will be correctly saved, even if you call `UST.addTag()` before the script loads.
* The A/B test file can also be optionally included in order to enable A/B testing.

**Improvements:**

* You can now dismiss the info/error mesages shown in the dashboard. Their position was also moved to bottom center (was bottom left).
* You can now click the referrer URL either in the visitors list or the top referrers list and it will be added as a filter to the current active segment.
* You can now filter the referrer based on an exact URL (before you could only filter by domain name).
* Some alignment improvements for the visitors table.
* A small dot indicator is now shown on the first active segment if multiple segments are active.
* To help with installation troubleshooting, a **server/troubleshoot.php** file was added which, when accessed, checks some common userTrack installation errors and displays them.
* You can no longer add invalid domain names to tracked domains. This fixes the problem with the navigation when a a domain name was added that included a subdirectory path.
* Added info text with examples showcasing the wildcard feature for the pages filter input.
* Autocomplete dropdown options are now automatically shown, without having to type a letter first.
* Increased default users limit from 1k to 100k.

**Bug fixes:**

* Fixed an issue with event listeners callbacks not being called sometimes, which stopped some specific actions or tags from being recorded.
* Fixed a bug which stopped element hovering from working during playback. Now the elements hover should again be triggered when the cursor position is above an element.
* Fixed some events not beig replayed below the fold (if the page was scrolled).
* Fix a bug where removing all `ignoredIP` or all `ignoreGET` values from the settings would break the settings editor from working.
  {% endtab %}
  {% endtabs %}

### **userTrack 3.0.2** (4 May 2020)

This update adds back **skip pauses** during playback, **live visitors** **playback** and adds a new **pages visited filter** to segments.&#x20;

{% tabs %}
{% tab title="Changes" %}
**New:**

* **Live playback**. When watching the playback of a visitor that is still on your site, new data will be automatically loaded and playback will only stop if 10 seconds pass without any user activity.

![](/files/-M6VvDdeLaWgo3wcwJb5)

* **Skip pauses in playback** . The option to skip inactivity while watching a recording has been reimplemented.

![](/files/-M6Vuw8rZvZ5XWWZu3zR)

* **Page filters for segments**. You can now add one or more pages to filter by in segments. The pages can have a starting/ending wildcard. For example, adding `*blog*` will only show users who visited a page whos URL contains the `blog` keyword. The same wildcard syntax works when filtering data in the `Visitors` table.

![](/files/-M6VucuYOhVC1lzg5AQo)

**Bug fixes:**

* A **default date range** (14 days) is now always enabled for segments. Without having a range selected, the comparison data from segments would not be aligned. You can no longer view data without a date range specified.
* **Fixed pagination** of visitors list when using segments (total number of pages was wrong).
* **Fixed empty/incomplete visitor pages** being shown in visitors list when the pages filter is used. The filter is now done in MySQL, but the page path has to be exact.

**WordPress specific fixes:**

* Fixed an issue where sometimes the **userTrack tables would not be deleted** when the userTrack plugin is uninstalled.
* Fixed a possible **conflict with other plugins**, if they someone included the **MaxMind GeoIP** DB automatically.
* Fixed an issue where saving settings **would add magic slashes to the tracker.js file and break** it.
  {% endtab %}

{% tab title="How to update (v3.0.1 -> v3.0.2)" %}
**About updating:**

Unfortunately there is no auto-updating functionality yet.\
To update the script you must **replace the old userTrack files with the new ones**. \
Sometimes, if there's a database change, **install.php** must to be ran again for the new tables to be created.

Note that **dbconfig.php** and **tracker.js** contain your database connection information and tracking settings. You should keep those files without replacing them (unless they were actually updated) in order to keep those credentials.

**Update** **steps:**

{% hint style="info" %}

1. **Replace all client files (JS, CSS, images, etc.) with the new ones.**
2. **The following server files were created or changed and have to be copied:**\
   \&#xNAN;*(you can also just replace the entire server folder, the important server* *files to keep are **dbconfig.php**, **tracker.js** and **ust.min.js**)*

```
version-3/server/helpers/getClients.php
version-3/server/helpers/getCountryFromIP.php
version-3/server/helpers/getDomains.php
version-3/server/helpers/getRecordList.php
version-3/server/helpers/saveSettings.php
version-3/server/helpers/segments/withSegment.php
```

3\. **This update does not include any database changes, so there is no need to run install.php again.**
{% endhint %}
{% endtab %}
{% endtabs %}

### **userTrack 3.0.1** (10 April 2020)

This update includes a new **segments** feature and fixes some installation and UX issues.

{% tabs %}
{% tab title="Changes" %}
**New:**

* **Segments.** You can now group multiple filters into segments. The graphs will show all segments at once and the visitors list, heatmaps and list statistics (top pages/top referrers) will show the data for the first active segment.

![userTrack v3.0.1 analytics segments](/files/-M4VruUYI52tVjGkIYag)

* **Country filter**. A new users filter has been added in order to select only users coming from a specific country.

**Improvements:**

* When adding a new domain name, the protocol (http) is automatically removed from the URL. Previously, adding a domain name with http in front would fail to show the data for that domain and also break the interface.
* A new UI **modal** system was implemented, so most prompts in the interface now use the MaterialUI design instead of the native, thread-blocking, prompt.
* The notification system that was showing error/success messages was replaced with [**notistack**](https://iamhosseindhv.com/notistack)**.**
* Filters inputs now have an **autocomplete** feature (eg. when you add a new tag, you can suggestion based on the existing tags in the database for the current domain).
* Some performance improvements, especially when changing filters/segments. Only the graphs for the segments that were changed are now reloaded.

**Bug fixes:**

* Fixed: Pagination in visitors list - visitors list page would be wrong or the interface would crash when changing filters/segments while on a page other than first.

**Security:**

* The current database password is no longer shown during the initial database setup, to avoid a possible attack before the script is installed.
  {% endtab %}
  {% endtabs %}

### **🎉userTrack 3.0.0 (beta)** (18 March 2020)

This is a complete rewrite of userTrack's interface. It also includes new and improved features, but the best part is that now it's a lot easier to add new functionalities to userTrack.

**Summary:**

* Front-end is now written in **TypeScript**.
* The interface is based on **ReactJS** [**Material-UI**](https://material-ui.com/).
* **i18n localization** - the entire UI can now easily be translated with translation files.
* There's a new **Stats** page showing different graphs about visitors.
* Ability to have **Filters** for all graphs and heatmaps.
* Improved **Security**

**Hot fixes:**

* **19 March 2020**
  * Updated [Minifier.php](https://github.com/tedious/JShrink/blob/master/src/JShrink/Minifier.php) to fix PHP 7.3 compatibility issue.&#x20;
  * Fix *server* sub-folder permissions. This was caused by a [gulp-zip bug](https://github.com/sindresorhus/gulp-zip/issues/112).
  * Add missing .htaccess files.

**New:**

* **Localization using** [**react-i18next**](https://github.com/i18next/react-i18next)
* **Performance improvements:**
  * User visit start and end time are now stored in the **ust\_clients** folder. This means that now the visit duration can be easily computed as a difference, between it was computed by summing the duration of each page visited.
* **Graphs:**
  * **Pages per session** (bar chart)
  * **Bounce rate** (time series chart)
  * **Top pages** (list of 10 most viewed pages)
  * **Top countries** (list of 10 most common visitor countries, based on IP geolocation)
  * **Top referrers** (list of 10 most common traffic sources, choice of domain or full URL counting)
* **Filters:**
  * A new header bar with filters was added in UI.&#x20;
  * Those filters are applied to all data shown (graphs, list of visitors, heatmaps).
  * Currently you can filter based on **Tags**, **Referrer** and **Date range**.
  * More filters will be implemented soon.
* **React-router** is used, so you can now refresh the dashboard and remain on the same page.
* **Domain changing** can now be done from any page in the interface. This allows for easily viewing a specific type of data for each of the tracked domains.
* **Iframe auto-scaling**: The iframe scale slider was removed. Its only purpose was to allow for manually scaling of the iframe so when viewing heatmap for a resolution larger than our monitor's it would still fit within our screen size. Now the iframe is always scaled to fit within our browser window. The scaling is now also applied when playing back recordings (previously recordings didn't have any type of scaling).

**Security:**

* Changed password encryption from **md5** to **sha256**.
* All passwords are now **salted** using a cryptographically secure randomly generated salt.
* Fixed one case where stats about live clients could be publicly read.
* **It is recommended to update to version 3 as soon as possible.**
* Big thanks to [**Patrick Nappa**](https://pat.sh/) for discovering and describing possible security issues and for recommending fixes for them.

**Improved:**

* **Scroll heatmap** is still based on mouse activity, but it now shows activity thresholds. We can now see, for example, that 80% of activity was above this line.&#x20;
* During **session playback** the time that the user spent on each page is also shown next to the pages names in the pages list.
* After installation the **serverPath** should be automatically set to the correct value.

**Bug fixes:**&#x20;

* Count of live visitors was wrong, it was sometimes showing more than it should.

**Other changes:**

* Database:
  * Country is now computed and stored directly in database using the [Geolite2 database](https://dev.maxmind.com/geoip/geoip2/geolite2/).
  * Browser, IP and token are now stored in 3 different columns instead of a single string.
  * Client token character length has been reduced, resulting in a slight improvement in DB usage.
  * The client visit start date and end date are directly stored in the **ust\_clients** table.
* All the server **PHP** files have been moved inside a subfolder named **/server.**
* Heatmaps minimap was removed as it was not really useful.

**Temporarily removed functionality:**

* Live visitors (will be reimplemented, not high priority).
* Adding label to IP addresses (will be reimplemented soon).
* Skipping pauses in recording (will be reimplemented very soon).
* Seeking to a specific time in session playback (will be implemented, it was somewhat buggy before).
* Deleting a single page from a session recording (might be reimplemented).
* Downloading users as CSV (will be reimplemented soon).
* Clearing data buttons: all domain data, zero recordings (will be reimplemented)
* Autoplay (this was a good idea, but it doesn't really seem to work, it won't be reimplemented any time soon).
* Record playback direct link sharing (might be reimplemented, it would be a lot more useful to make a guide on how to record and share the recording as a video).

There might be other small changes which have not been added to this list.


# Changelog archive: 2013-2020

### **userTrack 2.5.0** (24 June 2019)

**New:**

* **Visited page filter.** You can now filter the the list of clients to only show users that visited a specific page.

![](/files/-Ltuu5X3X9aZja53WbVW)

* **Setting to respect browser doNotTrack flag**. In some browsers users can set a preference to not be tracked by websites. If you want to respect this preference you can enable that in the settings.

![](/files/-Ltuu5X5NjLhQZ9Wz-js)

* **Started implementing segment statistics.** You can now see how many clients are in total in the list and how many match the current page and tag filters. **Note: stats currently correct only for the tag filters.**

![](/files/-Ltuu5X7d0Oq4z68Kxb0)

* **Range selection for clients list**. You can now use *Shift+Click* and *Ctrl+Click* controls for selecting clients in the list, making it easier to select a range of clients, useful when you want to delete multiple users at once.
* **Users with Level 4 (out of 5) can now change their own name/password.**

**Bug fixes**:

* Renamed *heatmap.js* to *h337.js* and *userTrack.html* to *dataViewer.html* to avoid being blocked by AdBlockers.
* Renamed **tracker.min.js** to **ust.min.js** for the same reason.

**Other changes**:

* Slightly improved dashboard code, reducing the number of global variables used. This is the first step towards a bigger refactoring.
* Updated Chart.js to v2.8.0.

### **userTrack 2.4.0** (12 March 2019)

**New:**

* **IP labels.** You can now click an IP address in the clients list to assign a label to it.

![](/files/-Ltuu5X9_haOxTIB0UW7)

* **Database usage**. The size (in MB) that all the userTrack tables are using is now shown in the admin dashboard.

  ![](/files/-Ltuu5XBjsGNtkWzQreq)

**Bug fixes**:

* Fixed an issue causing **form elements** with a dash in their name **not to be tracked properly**.
* The **CensorIP setting** **is now permanently stored** in the tracking file instead of locally in localStorage. This means that the setting value will persist even if you clear cookies or access the dashboard from a different device.
* Fixed **permissions for deleting recordings**. Now demo accounts (level 0 access) no longer have access to delete recordings.

**Other changes**:

* Remove text saying jQuery has to be included before the tracker, as it is no longer required.
* Improved image quality of dashboard site **thumbnails** and also fixed the thumbnail aspect ratio (images were squashed before).

### **userTrack 2.3.6** (27 August 2018)

* NEW! **Ignore IP classes**. You can now use the wildcard character (*) to ignore specific IP ranges. eg: **66.249.66.\**** will ignore Google crawlers.
* **Bug fixes**:
* Fixed an issue where recording only a percentage of visitors would sometimes record fewer users than the specified percentage.
* Fixed GDPR alert showing while viewing the recordings.
* Fixed an error with ***UST.start()*** function not being defined sometimes.
* **Other changes**:
* The default password has now been changed. Remember that you should always change the default admin password.

### **userTrack 2.3.5** (6 August 2018)

* NEW! **GDPR consent form**. A new setting has been added that enables showing users a consent form with an ACCEPT button. If this setting is enabled, tracking will only start for that user if he accepts the form.
* **Bug fixes**:
* Fixed some errors throwing when using PHP 7.
* Fixed dashboard alert prompt not properly showing in older browsers that don't support ES6. You should now correctly see an alert if your browser does not support ES6 when accessing the UST dashboard.

### **userTrack 2.3.4** (12 March 2018)

* NEW! **tracker.js minification**. A *tracker.min.js* file is now always automatically generated so you can include the minified tracker on your site, reducing the downloaded file size.
* NEW! **Recording sites with port different than 80**. You can now track websites or applications that run on different ports (ex: *webapp.com:3000* can now be tracked).
* *UI improvements*:
* You can now click on the "x visitors online" in the main dashboard to go directly to the Live playback panel
* **Bug fixes**:
* Deleting clients was broken in the previous version.
* Not being able to playback shared recordings.
* Fixed dates sometimes displaying as NaN in IE and Safari.
* Clients list delete buttons and autoplay button were sometimes invisible.

### **userTrack 2.3.3** (1 February 2018)

* NEW! **Download as CSV**. You can download the detailed list of visitors (Date of visit, IP, pages visited, visit duration, browser, etc.) as a .CSV file
* NEW! **Heatmap range width filter**. You can now view heatmaps for a specific device width interval (eg: for screens with width between 0 and 1024 pixels).
* NEW! **Pre-initialization tag caching**. You can now use `UST.addTag('tag')` even before the tracker was initialized. The values are now cached and when the connection is ready they will be automatically sent.
* **UI improvements:**
* Fixed an issue where long domains would break the dashboard UI.
* A new button has been added for downloading CSV data in the clients list page.
* Fixed several other small alignment issues .
* **Bug fixes:**
* User sessions act like actual sessions now, if the tab is closed and opened again you will see a new row in the recordings list instead of adding data to the same row.
* Performance for clients deletion has been greatly improved. Now if you change the recording limit and have to delete many visitors it will be much faster.
* Fixed several bugs for when there was no data in the database, for timezone.
* Update WordPress plugins to use `plugins_url()` instead of the hardcoded `wp-content/plugins` path.
* Thanks to everyone who suggested new features and reported bugs! :)

### **userTrack 2.3.2** (1 September 2017)

* NEW! **Live visitors (beta)** is finally here!!! You can now watch visitors live, while they are still browsing your website.
* **UI improvements:**
* A large part of the record-playback UI has been updated be easier to read and use.
* A new button has been added for accessing the Live visitors list.
* **Bug fixes:**
* Fixed a bug that would sometimes stop playing the recording even if there were more pages to be played back.
* Thanks to everyone who suggested new features and helped with testing the new version before it was released! :)

### **userTrack 2.3.1** (11 July 2017)

* NEW! **Text selection** is now recorded. If the user selects some text or element during his visit, userTrack will now also record and playback those actions.
* NEW! **Local timezone**. The date and time of the recordings will now always be shown in the current timezone (the timezone of the device used to view the recording).
* Small UI improvements.
* **Bug fixes:**
  * Fixed the previous bug mentioned in the 2.3.0 notes regarding cross-domain tracking.
  * Fixed a bug where sometimes click positions would not be stored as integers.
  * Fixed a bug where the unique path to an element was not correctly generated. Also compressed the unique path string to reduce memory usage.
  * Fixed a bug where **position: fixed;** elements would not be fixed during playback (due to a bug with Chrome iframes).

### **userTrack 2.3.0** (1 July 2017)

**NOTE!!:**\
There is a bug in this version (2.3.0) which stops the script from working cross-domain. To fix the bug please remove **line 251** from **tracker.js**, more exactly this has to be removed:\
`xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');`

* NEW! **jQuery** dependency has been **removed**. Now, tracker.js no longer requires jQuery to be included.
* NEW! **Autoplay mode**. You can now start playing a list of recordings from the clients list. Once one user session was played the next one will automatically start.
* \[API] NEW! [UST.forceSendData()](/api/other-api#3-force-send-the-recorded-data) allows you to immediately queue the sending of all stored data that has not been yet sent to the server.
* **Performance** improvements:
  * As jQuery is no longer used most tracking should be faster as it uses pure JavaScript
  * If you only included jQuery of userTrack this is a huge performance boost.
  * Heatmap should only be drawn once (previously sometimes it might be drawn twice after the page was loaded).
  * A *passive* scroll listener is used to track scroll.
* Security improvements.
* **Bug fixes**:
  * Fixed a bug where text input was sometimes not recorded.
  * Fixed thumbnails not displaying in the main dashboard.

### **userTrack 2.2.0** (12 June 2017)

* NEW! Recordings that haven't been watched show a "new" icon.
* **Performance** improvements:
  * A new format to store data has been implemented (replacing JSON) which lead to \~**70% less storage used** for recordings and heatmap data.
  * AJAX requests for storing data have been replaced by  tracking pixel requests (reducing network usage)
* **Bug fixes**:
  * Viewport size is more accurately recorded.
  * Dropdown option select should be correctly recorded.
  * Other small bug fixes related action recording.
* **Development**: E2E tests have been created for us to use in order to make sure userTrack changes and new features don't break existing functionalities. This doesn't affect you in any way, just means that new userTrack releases will be more frequent and less likely to introduce bugs.

### **userTrack 2.1.0** (22 May 2017)

* NEW! Interface update.
* NEW! The ability to scale the size of the heatmap points.
* NEW! Ability to scale the entire iframe/heatmap. This means you can easily view heatmaps for users who had larger screen resolution than yourself.
* NEW! Changing the page by clicking inside the iframe will also update the heatmap data. This means you can now change the page for which to view the heatmaps for by simply navigating through your website.
* Started refactoring most of the codebase.
* Many other UI/UX improvements.
* Dashboard performance improvements.
* Fixed a bug where sharing a recording did not work if the tracked site was from a different domain.

### **userTrack 2.0.3** (24 March 2017)

* The API to get visitors IP has been replaced with a local implementation.
* Improved IP2Location API usage, performance and accuracy.
* City of visitor is also displayed while hovering over the country flag.
* Created the foundation for a new and improved permissions system.
* Security improvements.

### **userTrack 2.0.2** (20 January 2017)

* NEW! Share recording. You can now share a recording via a public link.
* NEW! IPv6 support for country flag detection.
* Performance improvements
* UI bug fixes
* Starting with this version the database structure will auto-update if necessary. This means that you wil most likely be able to keep your old data while upgrading to a new version.

### **userTrack 2.0.1** (11 December 2016)

* Several UX improvements.
* WordPress version bug fixes (click position is displayed correctly regardless the visibility of the WP admin bar)
* WordPress version UX improvements.

### **userTrack 2.0.0** (5 November 2016)

* NEW! Basic mobile tracking support.
* NEW! Window resize event is also tracked.
* Disable MySQL 5.7 FULL GROUP BY error bug.

### Older major updates

* **userTrack 1.9** (20 June 2016) &#x20;
* **userTrack 1.8** (09 February 2016) &#x20;
* **userTrack 1.7** (4 April 2015) &#x20;
* **userTrack 1.6** (8 September 2014) &#x20;
* **userTrack 1.5** (11 February 2014) &#x20;
* **Version 1.4** (16 July 2013) &#x20;
* **Version 1.3** (01 April 2013) &#x20;
* **Version 1.2** (18 February 2013) &#x20;
* **Version 1.0** (01 February 2013)

### Initial Release - January 2013


# Personal Data Information

On this page you will find described the data that UXWizz uses and stores on user's PC and on your own server about your **visitors** that are being recorded using the **tracker.js** script.

## Cookies (data stored on user's computer)

1. UXWizz **does not store cookies** on the user's PC .
2. UXWizz stores data in **sessionStorage** to identify the current browser session. This unique ID is destroyed once the user ends their session (closes the browser tab). This session ID can't be used to identify the same user user between two distinct visits.
3. UXWizz also uses **localStorage** to store user preferences (eg: disable tracking) and for performance improvements as a caching layer before sending data to the server. No data stored in **localStorage** is sent to the server or used for user tracking purposes.

## Personal information

### 1. What data is stored on the UXWizz server?

The following data might be considered personal information and could be used to indirectly associate a person's identity to a specific recorded session:

1. For each user visit an unique ID is assigned that is only valid for the current browsing session.
2. Hash of IP + User Agent of the user. (the admin can also decide to save the plain, not hashed, IP).
3. Using the IP, geolocation data will be generated (Country and optional City).
4. Browser version and screen resolution.
5. Date of visit, visit duration, pages visited.
6. **(Optional) Actions done by the user on that site**, (unless otherwise disabled by the administrator), **such as:**
   1. Mouse movements, clicks and scroll activity
   2. Window resizing events
   3. Keyboard input on fields that have not been excluded from tracking
   4. (Optional) If the [full tracking system](https://docs.uxwizz.com/about/pages/-MlFhp-p5VUf_FwF-x-1#b.-full-page-recording) is being used, the page content (except the ignored elements) can also be sent to the server.
7. **(Optional)** [**Tags** ](/api/tags)which can be created by specific user actions defined by the webmaster (eg. clicked a button).
8. **(Optional)** [**Events**](/api/events) which can be created by specific user actions defined by the webmaster (eg. clicked a button).

Note that point (6) above might lead to sensitive information being tracked about the user. It is the webmaster's responsibility to make sure that the tracker is not included on any pages where the user has to enter sensitive information, or at least to [disable tracking the form inputs](/api/other-api#4-disable-tracking-a-text-input-field) which ask for sensitive information if the user did not consent to this data being stored.

### 2. Why is this data stored?

The data mentioned above is stored in order to aid with improving the user experience by analyzing common user behavior, more precisely it is used to:

1. Playback recordings of the visit. (eg: so the webmaster can understand why the user did or did not perform a specific action.)
2. Generate aggregated heatmaps/scrollmaps, used to understand which parts of the website's UI draw the most attention.
3. Have an overview of the traffic reaching the website in order to improve the quality of this traffic and possible conversion rates.

Most stats and tools should ultimately be used for improving the user experience.

### 3. Opting out or in for tracking

Any visitor accessing a domain where UXWizz is installed can disable tracking by accessing any of the pages of that domain where the tracker is installed and add **`ust-opt-out`** query string like this:

```
www.example.com?ust-opt-out
```

Doing this will save a flag in `localStorage` so future visits will not be tracked in any way.

You can also re-enable tracking by using the query strin&#x67;**`ust-opt-in`**.

The UXWizz dashboard admin can also decide (using the tracking settings) to:

* respect or not the `doNotTrack` flag of the browser
* show or not a consent pop-up

### 4. Data removal

Q: **How can the user ask for deletion of his data?** \
A: As the user's token is destroyed from their machine after the session ends, by default, the only cross-session personally identifiable information is the **IP+User Agent** **hash**. The user can contact the webmaster and ask for his data to be removed based on the IP+UA mentioned if those have not changed. If those have changed (eg. dynamic IP or browser was updated), by default, there is no way to uniquely identify the user anymore.

Q: **Can a specific individual be associated with a session?** \
A: Unless there is other personal data stored (as mentioned in points 1.6, 1.7, 1.8), the recorded data can not be considered personal information as the actual person or device that generated the visit can not be associated with a specific session.

Q: **How long is data stored for?** \
A: By default, the number of sessions stored is limited (to 100.000, but the limit can be altered by the webmaster) and once this limit has been reached old sessions will be replaced by newer ones. Data can also easily be permanently deleted, individually or in bulk, by the webmaster. Unless deleted using the aforementioned methods the data is stored indefinitely.

## Data stored of webmasters using the UXWizz dashboard

Being self-hosted, UXWizz does not send any dashboard usage data to external servers.&#x20;

i.e. **we don't save data** about webmasters when they access your UXWizz dashboard.

There are cookies saved on the webmaster's own PC when they log into the UXWizz dashboard in order to maintain the login session.

{% hint style="info" %}
**This page describes the Privacy Policy and handling of Personal Data for the UXWizz analytics platform.**&#x20;

**To read the Privacy Policy for the uxwizz.com landing page, check out the** [**Privacy Policy for uxwizz.com**](/about/privacy-policy-uxwizz.com)**.**
{% endhint %}


# Privacy Policy (uxwizz.com)

## uxwizz.com privacy policy

At uxwizz.com, accessible from <https://www.uxwizz.com>, one of our main priorities is the privacy of our visitors. This Privacy Policy document contains types of information that is collected and recorded by uxwizz.com and how we use it.

If you have additional questions or require more information about our Privacy Policy, do not hesitate to contact us.

General Data Protection Regulation (GDPR) We are a Data Controller of your information.

S.C. TIPS4DESIGN SRL's legal basis for collecting and using the personal information described in this Privacy Policy depends on the Personal Information we collect and the specific context in which we collect the information:

S.C. TIPS4DESIGN SRL needs to perform a contract with you You have given S.C. TIPS4DESIGN SRL permission to do so Processing your personal information is in S.C. TIPS4DESIGN SRL legitimate interests S.C. TIPS4DESIGN SRL needs to comply with the law S.C. TIPS4DESIGN SRL will retain your personal information only for as long as is necessary for the purposes set out in this Privacy Policy. We will retain and use your information to the extent necessary to comply with our legal obligations, resolve disputes, and enforce our policies. Our Privacy Policy was generated with the help of GDPR Privacy Policy Generator and the Privacy Policy Generator.

If you are a resident of the European Economic Area (EEA), you have certain data protection rights. If you wish to be informed what Personal Information we hold about you and if you want it to be removed from our systems, please contact us.

In certain circumstances, you have the following data protection rights:

* The right to access, update or to delete the information we have on you.&#x20;
* The right of rectification.&#x20;
* The right to object.&#x20;
* The right of restriction.&#x20;
* The right to data portability&#x20;
* The right to withdraw consent

#### Log Files&#x20;

uxwizz.com follows a standard procedure of using log files. These files log visitors when they visit websites. By default, most hosting companies do this and a part of hosting services' analytics. The information collected by log files include internet protocol (IP) addresses, browser type, Internet Service Provider (ISP), date and time stamp, referring/exit pages, and possibly the number of clicks. These are not linked to any information that is personally identifiable. The purpose of the information is for analyzing trends, administering the site, tracking users' movement on the website, and gathering demographic information.

Cookies and Web Beacons Like any other website, uxwizz.com uses 'cookies'. These cookies are used to store information including visitors' preferences, and the pages on the website that the visitor accessed or visited. The information is used to optimize the users' experience by customizing our web page content based on visitors' browser type and/or other information.

For more general information on cookies, please read "What Are Cookies".

Privacy Policies You may consult this list to find the Privacy Policy for each of the advertising partners of uxwizz.com.

Third-party ad servers or ad networks uses technologies like cookies, JavaScript, or Web Beacons that are used in their respective advertisements and links that appear on uxwizz.com, which are sent directly to users' browser. They automatically receive your IP address when this occurs. These technologies are used to measure the effectiveness of their advertising campaigns and/or to personalize the advertising content that you see on websites that you visit.

Note that uxwizz.com has no access to or control over these cookies that are used by third-party advertisers.

Third Party Privacy Policies uxwizz.com's Privacy Policy does not apply to other advertisers or websites. Thus, we are advising you to consult the respective Privacy Policies of these third-party ad servers for more detailed information. It may include their practices and instructions about how to opt-out of certain options. You may find a complete list of these Privacy Policies and their links here: Privacy Policy Links.

You can choose to disable cookies through your individual browser options. To know more detailed information about cookie management with specific web browsers, it can be found at the browsers' respective websites.

UXWizz uses Paddle.com as a payment provider. Please further read their [Paddle.com's privacy policy](https://paddle.com/privacy/) to understand how your data is handled when a checkout is being started or a purchase has been completed. The Paddle payment SDK can be included on some pages of uxwizz.com (such as the pricing page) in order to allow the customers to complete a purchase without leaving the uxwizz.com website.

Children's Information Another part of our priority is adding protection for children while using the internet. We encourage parents and guardians to observe, participate in, and/or monitor and guide their online activity.

uxwizz.com does not knowingly collect any Personal Identifiable Information from children under the age of 13. If you think that your child provided this kind of information on our website, we strongly encourage you to contact us immediately and we will do our best efforts to promptly remove such information from our records.

Online Privacy Policy Only Our Privacy Policy applies only to our online activities and is valid for visitors to our website with regards to the information that they shared and/or collect in uxwizz.com. This policy is not applicable to any information collected offline or via channels other than this website.

Consent By using our website, you hereby consent to our Privacy Policy and agree to its terms.

If you have any questions or requests related to your privacy and data stored on uxwizz.com please send an e-mail at <support@uxwizz.com>, addressed to "Cristian Buleandră".


# Licenses and pricing

You can view the current pricing here: <https://www.uxwizz.com/pricing>

{% hint style="info" %}
If you want to discuss or need a license not covered by the license terms on this page, please send an e-mail at support \[at] uxwizz.com.
{% endhint %}

{% hint style="warning" %}
**Note (May 2026): License Name Changes**.\
"Personal License" renamed to "Solo License" .\
"Company License" renamed to "Growth & Scale License".
{% endhint %}

### TL;DR:

1. **Solo license** - Used by **a single end-user** for their own websites. Not able to create dashboard users or give someone else access to the dashboard. \
   &#x20; \* **Non-commercial use only**: dashboard access can not be sold or used to directly generate revenue. \
   &#x20; \* Can be installed on **one server**.
2. **Growth & Scale license** - Used by **a single legal entity** (eg. a company) to track unlimited websites owned by it. It also allows creation of dashboard accounts for any employee of that entity (**multi-user**). \
   &#x20; \* **Non-commercial use only**: dashboard access can not be sold or used to directly generate revenue. \
   &#x20; \* Can be installed on **up to five servers** (useful for local installations, separating installations and tracking across different websites, scaling, etc.).
3. **Agency license** - Also multi-user, but you can give access to your dashboard to individuals or entities not directly related to your company. \
   &#x20; \* **Commercial use**: You are also allowed to charge customers for having access to your dashboard. This is usually used by web agencies who want to give their clients access to their UXWizz dashboard installation. \
   &#x20; \* Can be installed on **up to five servers** (useful for local installations, separating installations and tracking across different websites, scaling, etc.).

Licenses are private and non-shareable/transferable.

### License terms

All Licenses EULA:

> Copyright (c) 2024, TIPS4DESIGN SRL All rights reserved.
>
> Unauthorized copying of this file, via any medium is strictly prohibited. \
> Proprietary and confidential. \
> For any questions about licensing please contact support \[at] uxwizz.com
>
> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
>
> ## LICENSE Terms
>
> Last update: March 11th 2024
>
> Terms based on license tier (Solo, Growth & Scale or Agency).
>
> In the following license terms "you" refers to the license owner (the person or legal entity who purchased this license from TIPS4DESIGN SRL).
>
> In the following license terms "the product" refers to the UXWizz software product, including the entirety of its code (front-end, server-side and additional assets) that you receive and can download when purchasing a new license code.
>
> Please read the license terms based on the license that you purchased:
>
> \=================
>
> ## SOLO LICENSE
>
> &#x20;***NOTE*** The SOLO LICENSE is only valid for NON-COMMERCIAL use.
>
> You are allowed to:
>
> * Install the the product on one local or remote server that you, and only you can access.
> * Access the the product and track unlimited websites that you have direct control over.
> * View and modify the provided source files in order to personalize or improve your own experience.
>
> You are NOT allowed to:
>
> * Redistribute in any way any of the the product files or any parts of the the product's source code&#x20;
>
>   (with the exception of the public tracker JavaScript files that have to be included on your site).
> * Offer other users access to your product dashboard, be it for free or paid. (this is only possible with the GROWTH & SCALE LICENSE or AGENCY LICENSE).
> * Install the product on someone else's server for their own usage.
> * Continue using the product after this license agreement has been voided (either via a refund, license period expiration or legal action).
>
> You are entitled to:
>
> * Receive support for installation, if your support period (as defined at purchase time) is still valid. Support request can be sent to support \[at] uxwizz.com
> * Receive for free latest product updates while your support period is still valid.
> * Request a refund within 14 days from purchase date. Refund request can be sent to support \[at] uxwizz.com
> * Report bugs, security issues and UX problems at support \[at] uxwizz.com
> * Submit feature requests on [https://feedback.uxwizz.com](https://feedback.uxwizz.com/)
>
>   \[END SOLO LICENSE]
>
> \=================
>
> ## GROWTH & SCALE LICENSE
>
> &#x20;***NOTE*** The GROWTH & SCALE LICENSE license is only valid for NON-COMMERCIAL use. \
> The GROWTH & SCALE LICENSE DOES NOT allow you to resell the product in any way or charge clients for access to the product (this is only possible with the AGENCY LICENSE).
>
> In the following license terms "you" refers to the license owner (the person or legal entity who purchased this license from TIPS4DESIGN SRL). If the legal entity that purchased the license is a company with multiple employees, "you" includes all those employees.
>
> You are allowed to:
>
> * Install the the product platform on up 5 local or remote servers that you, and only you can access.
> * Access the the product dashboard and track unlimited domains that you own.
> * View and modify the provided source files in order to personalize or improve your own experience.
>
> You are NOT allowed to:
>
> * Redistribute in any way any of the product files or any parts of the product's source code&#x20;
>
>   (with the exception of the public tracker JavaScript files that have to be included on your site).
> * Offer persons outside of your company access to your product dashboard, be it for free or paid. (this is only possible with the AGENCY LICENSE).
> * Install the product on someone else's server for their own usage.
> * Continue using the product after this license agreement has been voided (either via a refund, license period expiration or legal action).
>
> You are entitled to:
>
> * Receive support for installation, if your support period (as defined at purchase time) is still valid. Support request can be sent to support \[at] uxwizz.com
> * Receive for free latest product updates while your support period is still valid.
> * Request a refund within 14 days from purchase date. Refund request can be sent to support \[at] uxwizz.com
> * Report bugs, security issues and UX problems at support \[at] uxwizz.com
> * Submit feature requests on [https://feedback.uxwizz.com](https://feedback.uxwizz.com/)
>
>   \[END GROWTH & SCALE LICENSE]
>
> \=================
>
> ## AGENCY LICENSE
>
> In the following license terms "you" refers to the license owner (the person or legal entity who purchased this license from TIPS4DESIGN SRL). If the legal entity that purchased the license is a company with multiple employees, "you" includes all those employees.
>
> You are allowed to:
>
> * Install the the product platform on up 5 local or remote servers that you, and only you can access.
> * Access the product dashboard and track unlimited domains that you own.
> * View and modify the provided source files in order to personalize or improve your own experience.
> * Offer other users access to your product dashboard, be it for free or paid. (this is only possible with the AGENCY LICENSE)
>
> You are NOT allowed to:
>
> * Redistribute in any way any of the the product files or any parts of the the product's source code (with the exception of the public tracker JavaScript files that have to be included on your site).
> * Install the product on someone else's server.
> * Continue using the product or offering product access to others after this license agreement has been voided (either via a refund, license period expiration or legal action).
>
> You are entitled to:
>
> * Receive support for installation, if your support period (as defined at purchase time) is still valid. Support request can be sent to support \[at] uxwizz.com
> * Receive for free latest product updates while your support period is still valid.
> * Request a refund within 14 days from purchase date. Refund request can be sent to support \[at] uxwizz.com
> * Report bugs, security issues and UX problems at support \[at] uxwizz.com
> * Submit feature requests on [https://feedback.uxwizz.com](https://feedback.uxwizz.com/)
>
>   \[END AGENCY LICENSE]
>
> TIPS4DESIGN SRL RESERVES THE RIGHT TO MODIFY THOSE TERMS AT ANY TIME WITHOUT PRIOR NOTICE \
> WHEN THOSE TERMS ARE UPDATED, A RELATED NOTE WILL BE INCLUDED IN THE PUBLIC PRODUCT CHANGELOG


# \[Deprecated] License Subscriptions

{% hint style="warning" %}
A subscription dashboard and management system is currently being implemented. Meanwhile, for any requests or questions please contact us via email.
{% endhint %}

To manage or cancel your monthly license or support/updates subscription, please visit [https://paddle.net](https://paddle.net/) or email **support \[at] uxwizz.com**.

There are two types of subscriptions:

* A. **Monthly license** (deprecated) - the license is valid only while the subscription is valid
* B. **Yearly support/updates** for the lifetime license - the license is valid in perpetuity, but you only have access to new versions or support while your subscription is valid.

{% hint style="info" %}
The subscription model has been deprecated in the favor of lifetime licenses + one-time paid subscription/updates renewals. This makes a lot more sense for a self-hosted product and it's also better for customers to not have to worry about having to cancel a subscription renewal. In this way, you can use the product without paying anything and only renew your support period when you need support or see a useful update that you want.
{% endhint %}


