Releases: umami-software/umami
v2.19.0
Today we're excited to release Umami v2.19.0
! This will likely be the final release of the v2
series as we prepare for v3
. In this release, we are preparing the underlying tables for the v3 migration.
Features
Data export
You can now export data directly from the UI. On the overview page, there is a download button that will get all the stats from the current page.

Additionally, you can download individual stats from different sections and from reports. All data returned is in CSV format.

Event properties chart/table view
You can now view custom event properties as a chart or as a table.

Migrations
This release includes a migration to create a new table for holding revenue data.
If you have any revenue data, you will need to run the migration under scripts/data-migrations/populate-revenue-table.sql
.
Fixes
- Fixed environment variables so they work in Docker at runtime #3412
- Fixed malformed frameAncestors #3494
- Added keepalive to tracker fetch #3489
- Improved performance of send #3469
- URL hash is not included in record #3445
Updates
- Language updates: Vietnamese, Arabic
- Upgraded Next to
15.3.3
- Upgrade Prisma to
6.7.0
Thanks
@vedantbhavsar26 @sancho1952007 @sufyanfa @eoussama @abcsnoob @basbroek @vicke4 @AlexEscalante @alasjo @Sov3rain @KrakenWagen @querry43 @Nambers @ruchernchong @monyasau
v2.18.1
v2.18.0
Features
Attribution report
The new Attribution report allows you to trace the source origin of a user so that you can measure the effectiveness of your ad campaigns and optimize your spend. This report also integrates revenue data so you can see which channels contribute the most to your sales.
Read docs.
Distinct ID
We are introducing a new property for sessions called the distinct ID. This is a new parameter that lets you assign a ID to a session to help you identify a user later.
To set a distinct ID, use the umami.identify
method from the tracker.
umami.identify('[email protected]');
In a server environment, you would send an event payload with a id
parameter.
{
"payload": {
"hostname": "your-hostname",
"language": "en-US",
"referrer": "",
"screen": "1920x1080",
"title": "dashboard",
"url": "/",
"website": "your-website-id",
"id": "[email protected]"
},
"type": "event"
}
You can then search the distinct ID from the Sessions screen.
Read docs.
data-before-send attribute
We are introducing a new tracker attribute data-before-send
that let's you define a function that will be called before data is sent. You can then inspect and modify the payload or cancel the send entirely. The function will take two parameters, type
and payload
. To continue with sending, you return a payload object. To cancel the send, return a false-y value.
First, define the function to be called.
function beforeSendHandler(type, payload) {
if (checkPayload(payload)) {
return payload;
}
return false;
}
Then pass the name of the function using the data-before-send
attribute.
<script defer
src="/script.js"
data-website-id="7801d46c-afd2-424c-8680-4ea713b2002a"
data-before-send="beforeSendHandler"></script>
Events chart filtering
You can now filter custom events by clicking on an item in the events table.
Alternative host for icons
The default host we use for displaying website favicons is icons.duckduckgo.com
. Now you can use an alternative host with the environment variable FAVICON_URL
. You need to pass a string with a token to replace the domain name. For example:
https://icons.duckduckgo.com/ip3/{{domain}}.ico
Some alternatives you can use:
https://www.google.com/s2/favicons?domain={{domain}}
https://logo.clearbit.com/{{domain}}
Migrations
This release includes some database migrations that add new columns for handling UTM parameters. The migrations will
automatically run during the build process.
The migrations will only apply the new schema but not do any migration of old data. The reason for this is we didn't
want to hang up the build process for users with lots of data. Instead we will be providing scripts that you can run to migrate your
data separately.
To migrate your data for this release, use the SQL for your database from here
Fixes
- Empty event search #3329
- Realtime activity details not listed from newest to oldest #3330
- POST /api/auth/very Method not allowed | Outdated documentation? #3339
- Null region breaks Insights Report #3344
- Docker middleware #3357
- CORS errors in Docker #3307
- API requests are ignored if User-Agent is empty #3337
- Referrer data displayed in every table #3284
- Realtime View Graph and Activity are not in sync #3244
Updates
- Upgraded Next to
15.3.1
- Upgraded Prisma to
6.7.0
Thanks
@harryo @Cibiyanna26 @YoSev @Maxime-J @perso182 @astappiev @thomasdn @YektaDev @gjelbrim
v2.17.0
Features
Batch send
You can now send data in batches, for example when trying to import a lot of data through the API. Instead of sending a single payload object, you would send an array of objects. It will be processed by the same logic from /api/send
. To use this feature, you would make a POST
request to /api/batch
.
Payload overrides
When you send a request to /api/send
, Umami pulls data from the request such as user-agent and IP address. Now you can provide your own values in the payload. This is useful when you're sending from a server or mobile environment where you are not using a web browser. The values you can provide are:
- ip: IP address. Note that when you send a custom IP address, the normal geo headers from hosts like Vercel and Cloudflare are ignored and a local lookup will be made to get the country and city data.
- userAgent: User agent string. Note this must be in a valid format or your request might be flagged as a bot.
- timestamp: UNIX timestamp in seconds. If passed in, Umami will record the data with the given timestamp instead of the current time.
Do Not Track
You can respect users DNT setting by adding the parameter data-do-not-track=true
on your tracker script.
Fixes
- Error when filtering using referrer #3255
- CORS headers missing from custom endpoints. #3281
- Journey report regression #3268
- Hostname is not allowed 127.0.0.1 #3279
- Grouped referrers shows incorrect values #3257
Updates
- Improved paid ad channel detection #3270
Thanks
v2.16.1
Fixes
Updates
- Updated languages: Indonesian
Thanks
v2.16.0
Features
Channels
We added a new view called Channels which shows you how your traffic is divided up. This is also where you can see your direct traffic (no referrer).
Grouped referrers
There is also a new view for seeing grouped referrers. So domains like google.com
, google.es
, google.co.uk
all get grouped under the category Google.
Ignore URL hashes
If you don't want to track hash values in the URL, you can now set an attribute on the tracker tag, data-exclude-hash=true
.
Updates
- Language updates: Mongolian, Persian (Farsi), Spanish
- Prisma upgraded to
v6.1.0
Fixes
- Event tracking on links with target=_top are broken #3187
- Custom filtering triggers invalid query #3154
- Issue with User Role in Redis Authentication #3213
- Session creation soft-lock #3188
- Funnel report does not work for events with spaces in their name #3171
Thanks
@mamal72 @appuchias @iffa @bilguun0203 @harryo @ahocevar @murtazabaanihali
v2.15.1
v2.15.0
Features
The funnel report now allows partial matching for URLs. You can add *
to the start and/or end of the text. In this example, we're seeing if users triggered ANY event with "button" in the name.
You can now properly search on city, region and country names. Before you had to lookup by ISO codes because that is what is stored in the database.
It even works with localized names.
Fixes
- Fixed unicode characters in location names #3106
- Fixed
websiteId
missing error #2614 - Fixed favicon issue with www subdomains #3073
Updates
- Language updates: Chinese, Japanese, Norweigan
- Upgraded Next to
v15.0.4
- Upgraded Prisma to
v5.22.0
Thank you
@Maxime-J @bparmentier @ccrvlh @mxbeer @PeterDaveHello @God-2077 @Kilian @blt950 @pawelromanskidajar @milk1000cc
v2.14.0
Features
Revenue report
We added a new report that allows you to track revenue. Simply send a custom event with revenue data and it will start tracking. Learn more.
Improved dashboard
In the dashboard, you are now able to select which websites you want to appear, not just the order. Simply toggle the ones you want visible and the rest will be hidden. If none are toggled then all the websites will appear just like before. We also fixed an issue where you couldn't see all your websites if you had too many. Additionally you can now search for websites on the dashboard edit screen.
Hash based routing support
We now record hashes in URLs for websites that use hashed based routing.
Redirect to team
Umami now redirects to your last selected team on login.
Fixes
- Fixed dashboard editing #3048
- Fixed unknown countries #3054
- Fixed mobile display issue #3039
- Fixed wrong events count #2980
- Fixed display of event properties #2928
- Fixed session data not deleting #2915
Updates
- Language updates (German, French, Russian, Czech, German - Switzerland)
- Added minor version tags to Docker images
- Allow underscores in subdomains
- Added cache control headers for tracker script
Thank you
@quiple @konstantintutsch @Quadrubo @xuserz @peter-kuhmann @yArna @Brawl345 @fra-iesus @ZerGo0 @rafaelschranz @DDDDD12138 @ruchernchong @sigmazz @michaelpayne02 @chelsey-g @mooxl @eremannisto