Adds a new script extension that allows tracking interactions with specific HTML elements on a website. For example - to track link clicks on one specific `<a>` element, you can tag it like this:
```html
<a href=... class="plausible-event-name=<your_event_name>">
```
And you can also tag the link with custom property names and values:
```html
<a href=... class="plausible-event-name=<your_event_name> plausible-event-<your_custom_prop>=<your_value>">
```
Tagging a link as above will send a custom event with the given name and props, if a `click` or `auxclick` browser event happens, and targets the link element.
The tracking behavior is somewhat different based on the HTML element type:
- `<a>`
- triggers on `click` and `auxclick` events
- intercepts navigation based on the same rules as `outbound-links` and `file-downloads`
- `<form>`
- triggers on `submit` event
- always intercepts navigation (calls `form.submit()` after preventing default and sending the Plausible event)
- other (`<img>`, `<button>`, `<span>`, `<div>`, `<h2>`, etc ...)
- triggers on `click` and `auxclick` events
- does not prevent default to intercept possible navigation. Simply calls Plausible with the event name and props read from the element class list.
* moved custom event code to the bottom + fix indentation
* add handlebars helper fn + extract getLinkEl fn
* extract isOutboundLink function
* extract shouldFollowLink function
* remove middle and click variables
* use only one click handler for outbounds and downloads
* extract sendLinkClickEvent function
* add error handling when script compilation fails
* use callback instead of fixed timeout
* do not prevent default if externally prevented + test
* add more tests
* generate tracker files in priv/tracker/js
* update changelog
* requested changes after review
* regenerate tracker files
* use return instead of else if
* move middleMouseButton outside the function
* Accept letters from non-Latin alphabets in domain names
* Replace static URLs with Router functions in settings_visibility
* Beautify dashboard URL in visibility tab
* Add IDN support to CHANGELOG
* add separate module for filter parsing
* add tests for filter parser
* allow escaping pipe character in filter value
* add documentation and doctests
* do not remove escape chars from wildcard values
* changelog update
* change the parse_filters/1 function argument
* Render 404 when shared link cannot be found
* Add documentation for StatsController and shared link rendering
* Refactor shared_link/2 for more clarity
* Add changelog entry
* Use mermaid graph for sequence diagram
* Use more accurate return value in sequence diagram
* Refactor Ecto query to be more idiomatic
* Remove order dependence in test
* Restore backwards compatibility for older shared links
* Add changelog entry
* Update Timex version from 3.7.7 to 3.7.8
* Generate timezone list from Tzdata
This commit fixes a bug where timezone changes weren't updating the
timezone list displayed when editing or creating a site.
Timezones were being pulled from a static list. This commit changes it
to generate the list from Tzdata, that uses a timezone database with
updated information on time changes. Additionally it adds more timezones
with aliases and links to the list.
Closes#1340
* Use timezone name from browser to recommend timezone
This commit matches the timezone name instead of offset to recommend a
timezone when creating a new site. The JavaScript Intl.DateTimeFormat
API is widely supported according to the link. In any case, if the
timezone fails to match by name, it fallbacks to the offset strategy.
https://caniuse.com/mdn-javascript_builtins_intl_datetimeformat_resolvedoptions_computed_timezoneCloses#904
* Replace current tooltip with Popper.js
* Merge tooltip and title for top stats
* Format bounce rate and visit duration numbers in tooltip
* Add 'width=manual' mode for embed
* Add changelog entry
* Use helper function canMetricBeGraphed
* Fix geolocation subdivision pattern matching
This commit fixes a bug where regions were not being saved. This was
caused because Geolix response was returning an additional
`:geolocation` map key. It also adds a test case for this.
Closes#2033
* Add geolocation database to .gitignore
This commit fixes a bug where location filters were filtering stats but
not the locations list. This was caused by a `Map.put/3` call that
overrides the user filter. This commit rollbacks 5b57143273
changes and removes the `Map.put/3` call.
Closes#1982
* Adds tri-state disable_registration config
* Formatting
* Changes variable back to atom
* Changelog
* Uses atoms correctly :/
* Swaps to a more fitting value
* Formatting
* added custom dimension filtering tests for pages
* first filter UI in place
* pages, entry pages and exit pages can be filtered by pageview props
* added tests for expected filtering behaviour
* fix dimension filter for sources + tests
* added is_not filtering functionality
* fixed formatting
* fixed admin_test
* added (none) as filter value + is_not filter type in UI
* added prefilling applied filter values and some UI tweaks
* added fetch options
* Make prop suggestions work with `props` filter
* Fix test
* Track login state internally
* Add CHANGELOG entry
Co-authored-by: Uku Taht <uku.taht@gmail.com>
* Update the internal /sites api to paginate results and adapts site-switcher to it
* Update the Changelog
* Format internal controller
* Remove the `+ Add Site` link from the site-switcher in the dashboard
* Change camel to snake case and replace imports with fully qualified calls
* Remove trailing comma from site-switcher
* First pass bringing in previous graph improvements, and comparsion context
* Swaps issue template to new issue form syntax
* Indentation update
* Indentation update?
* More indentation
* Intendation is hard
* Finalized indentation?
* Github indentation
* Missing fields
* Formatting changes
* Checkbox changes
* Uses new timeseries API, various UI improvements, descopes conversions, ToP from graphing
* Fixes Mobile UI Issues
* Improves point detection and display on hover
* Fixes & adds tests for updated main-graph API route
* Changelog
* Changes to better metric option declaration & minor UI/default fixes
* Fixes top stat tooltips showing unformatted numbers for special (non-rounded) top stats
* Formatting
* Fixes regression with dashed portion not stopping at present_index
* Removes comparison + lint
* Improves top stat active style
* Removes comparison tests
* Splits out tooltip and top stats
Still needs:
- Tests
- Potentially more cleanup
* Adds/moves tests for top stats
* Formatting
* Updates metric LS key, removes console log
* Various fixes + cleanup
* Makes tooltip position & style more consistent
* Fixes test (returns import status on both main graph & top stats)
* Fixes interaction with month dateFormatter
* Fixes edge case tooltip behavior
It was simpler than I thought :/
* Make the entire top stat clickable
* Minor UI improvements
* Fixes another tooltip visibility edge case + cleans up boolean algebra
Co-authored-by: Uku Taht <Uku.taht@gmail.com>
* small refactors and adds 'contains' to modal
* supports contains filter in the backend
* moves entry and exit page under the page filter
* prettier
* updates the CHANGELOG
* undo package-lock changes
* fixes formatting for elixir
* renames unused parameter to _
* Update changelog
* Use uppercase for constants and update type/prefix lookup
* chore(docker): improve repeat contributions workflow
* This change adds two new commands to gracefully stop and remove the Postgres and Clickhouse docker containers. To do so, it also gives them a recognizable name.
* Additionally, the Postgres container is updated to use a named volume for its data. This lower friction for repeat contributions where one would otherwise sign up and activate their accounts again and again each time.
* fix(ui): site switcher should toggle, instead of just opening
* feat/wip: public site toggle dropdown
* fix(ux): toggling the site switcher & closing from anywhere
* Do not react to key presses for guest users
* Cleanup duplicate code
* Fix logic left in for local testing
* Add a changelog entry for guest dropdown toggle
* Add `utm_content` and `utm_term`.
Support `utm_content` and `utm_term` as requested in #515.
* Add dropdown for UTM options
* Remove utm_content and term from filter modal for now
Co-authored-by: Blender Defender <defenderblender@gmail.com>
* adding api route PUT /api/v1/sites/goals with form fields "goal_type" and "goal_value" with supported types "event" and "page"
* arm64 docker images
* adding api route DELETE /api/v1/sites/goals/:goal_id with form param "site_id"
* revert makfile + package.json
* return statement hotfix in case site could not be found
* adding api route PUT /api/v1/sites/goals/:goal_id with form params "site_id", "goal_type", and "goal_value"
* update the goal api routes to accept event_name or page_path instead of goal_value
* cleaning goals model
* mix format
Co-authored-by: Ahmed Abbas <a.abbas@ixdc.net>
* chore(docker): improve repeat contributions workflow
* This change adds two new commands to gracefully stop and remove the Postgres and Clickhouse docker containers. To do so, it also gives them a recognizable name.
* Additionally, the Postgres container is updated to use a named volume for its data. This lower friction for repeat contributions where one would otherwise sign up and activate their accounts again and again each time.
* fix(ui): pill text to use text decoration instead of border
Support is pretty good including Safari 12+ without a prefix.
* docs(changelog): entry for pill text fix
* Merge branch 'plausible_master'
* Add City level details
* Add City level details
* Use ISO codes instead of geoname_id for subdivisions
* Add easier way to configure geolocation database
* Add workflow for dev branch
* Correct clickhouse migration
* Translate subdivision names
* Translate city names
* WIP
* Region and country filters
* Fix region filter
* Remove region_name when removing region filter
* Add modals for regions and cities
* Remove dead code
* WIP
* Revert "WIP"
This reverts commit 3202bf2fe9.
* Feature flag to hide cities when deployed
* Add changelog entry
* Remove unused code
* Remove unused variables
* Fix test
Co-authored-by: AymanTerra <aymanterra@yahoo.com>
* Add option to specify a URL in the manual extension
* Fix error when option parameter isn't provided
The uglify-js dependency had to be updated to support the optional chaining operator
* Remove the possibility to pass a function for the custom URL
This added weight unnecessarily, as the users can simply call the function themselves before triggering the event.
* Change optional chaining to ternary for improved browser support
* Revert package-lock.json to version 3.9.4 of uglify-js
It was previously updated to support optional chaining; reverting it as a reminder that this is the current browser support level that is accepted by Plausible.
* Add details=True to export API parameters
This makes the ZIP export add `%{"details" => "True"}` to the query's
`params` when fetching data internally for packaging in the ZIP.
This adds bounce_rate and time_on_page to the data in pages.csv, and
bounce_rate and visit_duration to sources.csv.
* Make API return data with consistent names
Some of the data types returned via the JSON or CSV API use inconsistent
naming, and some have redundant name changes (i.e. count -> visitors ->
count). This makes these all consistent and removes the redundancy.
This addresses #1426, fixes some of the CSV headers, and unifies the
JSON and CSV return data labels.
* Update changelog
* Test should use Timex.shift, not relative time
* Return full country names in CSV export
This also replaces the " character with ' in two country names, as those
are the characters used in the names, yielding a more predictable and
'correct' output.
* Fetch CSV exported data concurrently
* Use spinner to indicate when export has started
* Use 300 as default number of brekadown entries for export
Higher numbers (e.g. 1000) seem to cause clickhouse errors when there
many pages to request. It is unclear what is causing the error, as
clickhouse returns an "unknown" error code and an empty error message.
* Export all dashboard data in zip
This packages all data currently visible in the dashboard into
individual CSVs and downloads them together in a zip.
* Also export conversions in zip of CSVs
* Update export test with zip file response
* Add zip file download to changelog
* Adds pagination for custom props, fixes errant (none) being returned in the middle of a dataset
* Formatting
* Fixes errant (none) value correctly
* Changelog
* Adds tests
* Add conversion_rate to sources api and source table
* Remove percentageFormatter
* Update source tests to include conversionat rate
* Add CR to detals modal
* Correct formatting with linter
* Add change log
* Add CR to Pages, Device and Countries panels
* chore(docker): improve repeat contributions workflow
* This change adds two new commands to gracefully stop and remove the Postgres and Clickhouse docker containers. To do so, it also gives them a recognizable name.
* Additionally, the Postgres container is updated to use a named volume for its data. This lower friction for repeat contributions where one would otherwise sign up and activate their accounts again and again each time.
* Format countries modal
* Remove unused imports
* Run ESLint and make related fixes
* ESlint formatting for entry pages modal
* WIP: proof of concept for scrollable modals on mobile
* Fix modals being too wide on desktop
* Make modals truly responsive
This fixes the desktop behaviour completely now.
* Update changelog with modals responsiveness
* Update desktop modal width to 860px
It was an oversight to set it at 800px in the first place.
Co-authored-by: Uku Taht <Uku.taht@gmail.com>
* chore(docker): improve repeat contributions workflow
* This change adds two new commands to gracefully stop and remove the Postgres and Clickhouse docker containers. To do so, it also gives them a recognizable name.
* Additionally, the Postgres container is updated to use a named volume for its data. This lower friction for repeat contributions where one would otherwise sign up and activate their accounts again and again each time.
* Break words early to maintain spacing; truncate on larger screens
* Update changelog entry on UI bars
* Truncate bar text from md breakpoint
* Turn off form autocompletion for new shared links
Many browser autofill input fields based on their name, but here it makes no sense to use the user's name (email) or even password for the shared link.
* Update changelog
* chore(docker): improve repeat contributions workflow
* This change adds two new commands to gracefully stop and remove the Postgres and Clickhouse docker containers. To do so, it also gives them a recognizable name.
* Additionally, the Postgres container is updated to use a named volume for its data. This lower friction for repeat contributions where one would otherwise sign up and activate their accounts again and again each time.
* Improve bar component to work in a variety of situations
This fixes two issues from #972
- Goals area has display issues depending on the name of your custom events
- It is not possible to view labels for outbound links, 404 and custom props
* Update changelog entry
* Move content to children for Bar component
* Remove redundant fallback width
* Fix text color on root conversion texts
Hyperlinks (<a>) inherit their color. In the case of the root conversion text, we needed to specify the color somewhere.
The same color as the breakdown texts has been chosen.
The Bar component no longer needs to take in text classes.
* chore(docker): improve repeat contributions workflow
* This change adds two new commands to gracefully stop and remove the Postgres and Clickhouse docker containers. To do so, it also gives them a recognizable name.
* Additionally, the Postgres container is updated to use a named volume for its data. This lower friction for repeat contributions where one would otherwise sign up and activate their accounts again and again each time.
* Update the ticks on the X and Y axis of the main chart to be responsive
* Update the changelog for the graph responsiveness fix
* Invite existing user to a site
* Add invitation flow for non-existing users
* Accept and reject invitations
* Use invitation flow for existing users
* Locking mechanism for sites
* Authorization for site settings
* Show usage based on site ownership
* Add ability to remove members from a site
* Do not show settings link to viewer roles
* Ability to remove invitations
* Remove `Plausible.Sites.count_for/1`
* Fix tests
* Do not show the trial banner after the trial
* Correct trial emails
* Transfer ownership
* Send invitation email to existing user
* Add invitation email flows
* Add plug for role-based authorization
* Rename AuthorizeStatsPlug -> AuthorizeSiteAccess
* Add email flow for ownership transfer
* Fix URLs in emails
* Fix small copy issues
* Make 'People' its own section in site settings
* Notify user via email if their access has been removed
* Check site lock status when invitation is accepted
* Check lock status when user subscribes
* Make sure only admins and owners can create shared links
* Changelog
* Add LockSites to daily cron
* Clean invitations after 48 hours
* Add notices about expiry
* Add invitation expired page
* Add doc link
* First pass on manual filter & path regex/negated filters
Still needs:
- Form structure on filter modal
- Edit filter button
- Filter dropdown UI improvement
- Filter modal mount data collection
- Tests
- Potentially negating other filters
* Second pass - mostly everything user-facing is done
Still needs:
- Tests
- Potentially negating other filters
- Potentially some code cleanup
* Bugfix in realtime view, formatting
* Fixes editing UX on list view
* Adds tests for exclusions and wildcards
* Various UI Improvements
- Makes edit buttons full-length & properly sized
- Adds remove filter button in edit menu
* Changelog
* Makes requested changes, adds different version of filter button
* Makes colorings on top bar elements consistent
Currently, both are hard-coded to relatively small values.
This may cause an unnecessary high load on the Clickhouse instance.
It makes sense to make those configurable.
* First pass
Needs more testing & potentially cleanup
* Fixes tests, error handling
* Formatting
* Removes broken test
* Fixes inconsistent test
This was due to Clickhouse setup not inserting the sessions with the exact same timestamp consistently and making the test inconsistent
* Combines `include` param, asyncs time_on_page and bounce_rate
* Fixes CH error when no pageviews exist in period
* Format
* Changelog
* Increases await timeout to accomodate larger data sets
* Improves handling of timeout behavior
* Fixes session-based filtering on time on page queries
* Formatting
* Removes old forced entry page modal from top pages report
* First Pass - 90% wrong
* Second pass - basically done
* Swaps N+1 for multiMatchAllIndices & friends
* New version of query with just one regex computation
* Slight formatting, basic test
* Updates tests to match master new events
* Changelog
* Adds more sophisticated glob tests
* Initial Pass
* Adds support for page visits counting by referrer
* Includes goal selection in entry and exit computation
* Adds goal-based entry and exit page stats, formatting, code cleanup
* Changelog
* Format
* Exit rate, visit duration, updated tests
* I keep forgetting to format :/
* Tests, last time
* Fixes double counting, exit rate >100%, relevant tests
* Fixes exit pages on filter and goal states
* Adds entry and exit filters, fixes various bugs
* Fixes discussed issues
* Format
* Fixes impossible case in tests
Originally, there were only 2 pageviews for `test-site.com`,`/` on `2019-01-01`, but that doesn't make sense when there were 3 sessions that exited on the same site/date.
* Format
* Removes boolean function parameter in favor of separate function
* Adds support for queries that use `page` filter as `entry-page`
* Format
* Makes loader/title interaction in sources report consistent
* Adds data-exclude support and plausible_ignore support
* Splits exclusion into separate script option
* localStorage parsing upgrades
* Additional script type additions
I'm unsure about the formatting decision in tracker.ex - lmk.
* Adds new compiled files
This will certainly have conflicts with my other PRs related to the tracking scripts right now, I'll make one extra PR after both are done to ensure they're consolidated into the compiled scripts.
* Moves localStorage blocker out of special script
* Changelog
* Second thoughts on localStorage exclusion
* Updates `*` to not match `/` or whitespace
* Fix formatting
* Removes zero-length asterisks
* Adds support for double glob, zero-length replacements
* Update to reduce size+allow localStorage exclude
Co-authored-by: Uku Taht <Uku.taht@gmail.com>
* uses tailwind breakpoint to not apply the opacity:0 to the cog on small screen sizes (<768px wide)
* Adds feature description to changelog
Co-authored-by: Uku Taht <Uku.taht@gmail.com>
* Introduce SELFHOST config. Enable cron by default for self hosters
* Fix cron, disable custom domain for selfhost
* Add github links
* Add notice about google search console on self hosted
* Enfore BASE_URL
* Set all selfhost users' trial expiry to 100 years from now
* Fix admin user creation
* Initial Implementation
Still needs clear all functionality, various styles and spacing, and overall cleanup
* Second pass
Most of the styling issues are still present, but collapsing/expanding logic should be complete
* Third pass
* Refactors, comments, cleans up filters code
* Flatpickr color+placement changes
* Last(?) pass on UI
* Actually fixes sticky dates without breaking navigation
* Changelog
* Puts this back where it goes
* Updates based on @ukutaht's comments
- Removes Screenclass hook in favor of simple viewport size storage
- Uses class-based component
- Removes recheck variable in favor of tri-state wrapped
- General formatting & code cleanup
* Fixes goal conversion rate when period is realtime
* Adds unique visitors (30m) to realtime top stats
* Changelog
Co-authored-by: Uku Taht <Uku.taht@gmail.com>
* Adds New Dark Mode Assets
* Moves triangle for dropdown to a reasonable position
* Majority .eex dark implementation
* Fixes Logo Positioning
* Adds theme flag to user schema, uses it
* Uses correct variables for theme applicator script
* Minor missed theme changes/fallbacks
* Individual Component Support + Theme Context
* Sources Tab Support
This was a pain to test D:
* Partial Stats Sections Support
* More of stats modules supported
* Modal +table support
* Improves some Flatpickr in light theme, supports dark theme
* Fixes missed settings tab colors
* Finishes Devices module support
* Fixes bar graph colors
* Better colorizes maps module
* Undoes colorized bars
(they looked bad, on second thought)
* Fixes loading indicator
* Finishes conversions module
* Adds changelog entry
The PR number could be wrong, will double check
* Fixes missed header color
* Fixes naming of migration and removes static alter
* Does migration correctly
As I said, my Elixir is pretty weak heh
* Adds support for spike notifications setting
* Improves contrast and visibility for email settings
* Add initial implementation for sticky header
* Minor mobile formatting improvements
* Finishes (probably) pinned header feature
* Adds changelog entry for pinned header
* Updates PR number in sticky header changelog entry
* Wraps up code cleanup + feature
* Merge conflicts are hard, apparently
* Removes extraneous tailwind variants
* Fixes mentioned issues
* Removes option to unsticky
* py-3
* Tailwind in CSS
* Adds New Dark Mode Assets
* Moves triangle for dropdown to a reasonable position
* Majority .eex dark implementation
* Fixes Logo Positioning
* Adds theme flag to user schema, uses it
* Uses correct variables for theme applicator script
* Minor missed theme changes/fallbacks
* Individual Component Support + Theme Context
* Sources Tab Support
This was a pain to test D:
* Partial Stats Sections Support
* More of stats modules supported
* Modal +table support
* Improves some Flatpickr in light theme, supports dark theme
* Fixes missed settings tab colors
* Finishes Devices module support
* Fixes bar graph colors
* Better colorizes maps module
* Undoes colorized bars
(they looked bad, on second thought)
* Fixes loading indicator
* Finishes conversions module
* Adds changelog entry
The PR number could be wrong, will double check
* Fixes missed header color
* Fixes naming of migration and removes static alter
* Does migration correctly
As I said, my Elixir is pretty weak heh
* Adds support for spike notifications setting
* Improves contrast and visibility for email settings
* Resolves @ukutaht's comments on #467
* Fixes missing dark style
* Found one more missed dark element (shared links)
* Formatting fixes
* WIP
* Actually activate the user
* Send email verification codes
* Send activation code with email
* Only show onboarding steps during first site creation
* Add worker to config
* Consistent form styles
* Send welcome email when user activates account
* Add changelog entry
* Use https in new site form
* Correct spelling in email
* Collect browser and OS version
* Display browser version
* Show operating system versions
* Device categorization
* Treat headless chrome like a bot
* Ignore events from automated browsers
* Only take major and minor of the version
* Add tests
* Add CHANGELOG entry
* Add changelog entry for bots
* Store empty value as browser when unknown
* Add weekdays to the visitor graph
Abbreviate both weekday and month in order to keep horizontal spacing
roughly the same as it's been.
Closes#175.
* Add note to CHANGELOG
* Ability to add event metadata
* Close Dropdown on outside click
* Show (none) value in metadata breakdown
* Allow filtering for metadata key/val pairs
* Use correct clickhouse_ecto
* Better naming for meta filter
* Add tests
* Add changelog entry
* Remove change made for testing
* Filter by screen size
* Filter by browsers
* Add filter for Operating system
* Add changelog entry
* Add filter for countries
* Add tests for filters
* Show utm_medium, utm_source, and utm_campaign in sources modal
* Allow filtering by UTM tags
* Integrate filters with URL bar
* Add CHANGELOG entry
* Refresh modal when filter changes
* Remove Direct / None from campaign results
* Add UTM tabs to top sources report
* Add pagination
* Remove dropdown from top sources popup
* Fix bug in clickhouse_ecto
* Remove referrers_for_goal
* Make sure UTM tags work OK with goals
* Make source tab selection sticky
* Consistent styling for devices and source tabs
* Add noref in realtime to utm tabs
* Fix tests
* Use clickhouse-ecto for stats
* Use clickhouse ecto instead of low-level clickhousex
* Remove defaults from event schema
* Remove all references to Clickhousex
* Document configuration change
* Ensure createdb and migrations can be run in a release
* Remove config added for debug
* Update plausible_variables.sample.env