Commit Graph

1403 Commits

Author SHA1 Message Date
Artur Pata f4a09ebfa4 Merge remote-tracking branch 'origin/master' into fix-ce-script-cache-issue 2025-12-17 21:26:01 +02:00
Artur Pata 604e65b8ab Fix cache test 2025-12-17 20:28:32 +02:00
Artur Pata 2fbdd10bd4 Refactor to have CE and EE script caches, fix CE cache 2025-12-17 20:15:39 +02:00
RobertJoonas 9aa6a8aa23
Add comparisons to DashboardQueryParser (#5955)
* list field defaults to [] in ParsedQueryParams

* refactor include.comparisons + QueryInclude struct

* fix custom datetime comparisons

* build and execute queries directly in QueryComparisonsTest

* fix compile warnings

* move test from plausible_web to plausible

* create Stats.QueryImportedTest and extract 3 tests into it

* create Stats.QuerySpecialMetricsTest and extract 7 tests into it

* create Stats.QueryTest and extract 4 tests into it

* extract 2 more tests into QuerySpecialMetricsTest

* fix DashboardQuerySerializer and Parser tests

* comparisons to DashboardQueryParser

* serialize comparisons too

* remove internal test endpoint

* credo

* query-api types autogenerate

* add_or_replace_filter

* remove redundant Map.to_list

* fix type
2025-12-17 15:53:13 +00:00
Sanne de Vries dfeda94e06
Add report percentages to dashboard and details view (#5923)
* Update report percentages on dashboard and details view

* Add percentages to Countries, Regions, and Cities reports

* Add percentages to Channels, Sources, and UTM reports

* Add percentages to top pages, entry pages, and exit pages reports

* Update tests to include percentages

* Change dashboard copy from title case to sentence case

* Update details modal style

* Make animations snappier

* Introduce max height to modal and make inner content scrollable

* Improve modal mobile design

- Enable horizontal scroll for details modal on mobile
- Add responsive spacing and positioning to modal

* Added mobile tap behavior to external link in list report

* Show tooltips only when in comparison mode or when the number is abbreviated

* remove previously added showTooltip prop

- This isn't needed anymore since we now handle the tooltip logic in the MetricValue component

* Show long format upon hovering detailed view metrics

* Added mobile tapping behaviour to detailed view

* Added percentages to all detailed views

* Add mobile swipe-to-close behavior for modal

* Adjust sensitivity of modal drag to close

* Use hammerjs for swipe-to-close modal behaviour

* Prevent dragging if gesture starts inside table

* Show 2 decimal places for percentages < 0.1% across dashboard

* Adjust dark mode styles

* Add hover effect to external link icon

* Update tests to expect two-decimal percentages

* Undo hammer install and revert to old modal styling

* Remove CR and % columns from goals and custom props reports on dashboard, and show on hover in detailed view

* Remove unused constants

* Undo conversion rate on hover behaviour

- Unlike percentages, CR should show permanently.

* Show percentages permanently in custom props detailed view

* Adjust width of conversion metrics column

* Updated metric-value test

* Update top-bar test

* Added changelog entry

* Fix test expectations for percentages with imported data

- Update tests to expect correct percentages (≤100%) when imported data is included. These tests will fail until the percentage calculation bug is fixed, documenting the expected behavior.

* Add imported_visitors to tests to ensure correct total_visitors calculation

* Correct imported_visitors count in test
2025-12-16 12:43:16 +00:00
Adam Rutkowski 38381195f8
Reapply+bugfix: goals with custom props (#5936) (#5944)
* Reapply "Goals with custom props (Stats API queries, funnels) (#5936)" (#5943)

This reverts commit 45116bda7b.

* Gracefully handle `nil` for existing goal.custom_props

* Revert "Gracefully handle `nil` for existing goal.custom_props"

This reverts commit 8e38748775.

* Migration: make `goals.custom_props` non-null

* Adjust test
2025-12-11 13:09:34 +00:00
Adam Rutkowski 45116bda7b
Revert "Goals with custom props (Stats API queries, funnels) (#5936)" (#5943)
This reverts commit b6b9c2c0bf.
2025-12-11 09:17:33 +00:00
Adam Rutkowski b6b9c2c0bf
Goals with custom props (Stats API queries, funnels) (#5936)
* Migration: add custom propos to goals + revisit unique constraints

* Update constraints in goal schema (and move module)

* Add a comment, not really related but useful?

* Implement querying for goals with custom props

* Optimize goal_join_data (down to one iteration) + include goal custom props

* Test goal custom propos addition + new constraints

* Test querying for goals with custom propos attached

* Test funnels made of goals with custom props

* Format

* Fixup test name

* Fixup migration

* Unified goal join macro

* Remove dupe test

* Clean up user_id usage

* Fixup test to match the description

* Revert "Temporary: make room for pre/post migration constraint names (#5942)"

This reverts commit e4bc6b8715.

---------

Co-authored-by: Uku Taht <uku.taht@gmail.com>
2025-12-11 08:39:46 +00:00
Adam Rutkowski e4bc6b8715
Temporary: make room for pre/post migration constraint names (#5942) 2025-12-11 07:56:37 +00:00
RobertJoonas d6673fbbd5
DashboardQueryParser & DashboardQuerySerializer (#5938)
* rename query_parser_test to api_query_parser_test

* allow metrics to be nil in ParsedQueryParams

* swap now with relative_date in ParsedQueryParams

* add DashboardQueryParser

* stop defining defaults in ParsedQueryParams

* add DashboardQuerySerializer

* make sure parse -> serialize is a reversible transformation

* fix codespell

* fix test and silence credo

* fix another test

* parse and serialize with_imported

* cleaner decode_filters

* precompile do_not_url_encode_map and simplify uri_encode_permissive

* remove prepending ? logic
2025-12-09 13:07:36 +00:00
Artur Pata 007155ba60
Validate password cookie for password-protected shared links on internal stats API requests (#5932)
* Works

* Move shared link password check to AuthorizeSiteAccess plug

* Write changelog, cleanup

* Handle cookies already fetched in AuthorizeSiteAccess

* Unify shared link kind with plugins API entity
2025-12-08 07:05:31 +00:00
RobertJoonas 12d818af8a
Refactoring preparation for DashboardQueryParser (#5929)
* rename QueryParser to ApiQueryParser

* move utc_time_range construction to querybuilder

* input_date_range format

* rename 30m atom to realtime_30m

* move build_comparison_date_range into do_build
2025-12-03 15:09:17 +00:00
Adrian Gruntkowski 98632aee74
Don't multiply average revenue metric by sampling rate in the query (#5931)
* Don't multiply average revenue metric by sampling rate in the query

* Fix formatting
2025-12-03 14:49:11 +00:00
RobertJoonas 5b69061885
Consolidated views <> revenue goals: add comment + fix typespec (#5921)
* add comment + fix typespec

* Update lib/plausible/goals/goals.ex

Co-authored-by: Adrian Gruntkowski <adrian.gruntkowski@gmail.com>

---------

Co-authored-by: Adrian Gruntkowski <adrian.gruntkowski@gmail.com>
2025-12-01 13:17:13 +00:00
Adam Rutkowski b64a2355a0
Platform upgrade: elixir 1.19.4 and otp 27.3.4.6 (#5920)
* Platform upgrade: elixir 1.19.4 and otp 27.3.4.6

* !fixup

* credo

* credo

* Bump cache

* fix docker image tag

* hum

* hum

* Match docker images

* Define ALPINE_VERSION once

* fixup
2025-12-01 12:50:49 +00:00
Adam Rutkowski 111a8b9462
Enforce max limit for goals per site (#5917)
* Limit preloading goals

* Enforce max limit for goals per site

* typo

* credo

* Remove logger call

* Integrate #5916

* Add a test

* Add test

* Unignore opts
2025-11-27 10:19:13 +00:00
RobertJoonas 7a11f5ec40
Refactor building the Query struct (#5893)
* rename Query.build -> Query.parse_and_build

* rename two test files and move 4 %Query{} building functions into subfolder

* rename StatsAPIFilterParser to LegacyStatsAPIFilterParser

* rename Filters.QueryParser to QueryParser

* turn QueryParserTest into QueryParseAndBuildTest

* move query_parser.ex out of filters directory

* separate build from parse

* disable sample_threshold in the new intermediate build function, for now

* remove now redundant test util functions

* remove unused import

* address todo from earlier

* credo

* Make module names in sync with paths in tests

---------

Co-authored-by: Adrian Gruntkowski <adrian.gruntkowski@gmail.com>
2025-11-24 09:16:05 +00:00
Sanne de Vries 1df08a25b4
Change header dropdown copy to sentence case (#5887) 2025-11-18 13:31:15 +00:00
Adrian Gruntkowski a2ba1256d2
Show revenue data in all breakdowns (#5767)
* Include revenue data for all detailed API responses except entry/exit pages

* Expose revenue data in all breakdown modals except entry/exit pages

* Add revenue metrics to breakdown response only on EE

* Change query builder to enable querying event metrics \w session dimension

* Add revenue metrics to entry and exit pages breakdowns

* Expose revenue data in entry and exit pages breakdowns

* Use `argMax` for `exit_page` and `exit_page_hostname` dimensions (h/t @ukutaht)

* Don't handle event-only dimensions with session-only metrics for now

* Add tests for all breakdowns

* Add clarifying comments in code

* Mark revenue tests as EE-only
2025-11-18 11:24:54 +00:00
Adam Rutkowski 08c7d2e948
Consolidated View life cycle + billing integration (#5866)
* Migration: add consolidated views feature to enterprise plans

* Migration: Add user preferences per team table

* Update static plan definitions

* Add feature module definition

* Display consolidated view availability in crm

* Extend ConsolidatedView interface:
 - add functions to manipulate user/team options (for CTA)
 - require at least two sites in order to create a consolidated view
 - require billing/plan compliance when computing eligibility

* Team/User preferences schema

* Implement consolidated view life cycle on /sites

Co-authored-by: Sanne de Vries <sannedv@protonmail.com>
Co-authored-by: Uku Taht <uku.taht@gmail.com>

* Enroll `consolidated_view` feature flag

* Consolidated view access hardening (+feature flag)

- require team-wise feature flag instead of super admin role
- redirect to /sites if the team isn't eligible any more
- enforce regular site in shared links controller

* Remove no longer needed `ConsolidatedView.enabled?/1`

* Alias PrimaDropdown

* No consolidates views for shared links

* Remove user argument from `ok_to_display?`

* Adjust a temporary test

* More elaborate alert

* Fix responsive design issues on sites page

- Fix z-index issue with button dropdown
- Fix truncation issue with team name
- Improve responsiveness of site cards
- Fix focus state of site cards
- Improve responsiveness of consolidated view CTA
- Improve design of prima_dropdown component
- Replace `+` with plus icons in dropdown items

* Use the plus icon for standalone "Add website" too

cc @sanne-san

* Format

* Fix z-index issue with dropdowns on sites page

* Remove TODOs

* Make consolidated view cards disappear when searching

* Clean up test

* Use per-team membership user preferences

* Use conditional instead of `with` statement

* Inline `ensure_eligible`

* Use `Map.fetch!` getting preference from default struct

* fixup

* Revert "Migration: add consolidated views feature to enterprise plans"

Will be included via main branch sync

This reverts commit 05bec55276.

* Fix and test feature-flag effect on both view and CTA cards

---------

Co-authored-by: Sanne de Vries <sannedv@protonmail.com>
Co-authored-by: Uku Taht <uku.taht@gmail.com>
2025-11-12 13:41:24 +00:00
RobertJoonas f24aa4f305
Consolidated view email reports (#5876)
* fix weekly/monthly email reports + stats report tests

* fix title of stats email reports

* add missing test

* do not render review installation link for consolidated view traffic drop emails + test

* refactor email_match_query to predicate fn

* make site_id_query_filter a public fn

* make traffic spike notifications work + test

* improve spike/drop notification email copies

* fix ScheduleEmailReports introduction comment

* add tests for stats report email scheduling

* remove space before .

* apply credo suggestion

* fix CE tests, use module attrs for text assertions

* skip frequency comment

* single query

* rename to site_member

* single query for real
2025-11-11 13:26:52 +00:00
Adam Rutkowski 49c9cabaed
Minor crm fixes (#5863)
* Bump `accept_traffic_until` on `trial_expiry_date` change

* Fix domain escaping in CRM

* Format
2025-11-05 14:28:53 +00:00
Adrian Gruntkowski 1a5eba85e7
Reduce noise in 2FA enforce notifications and update docs link (#5869)
* Do not send email notification to users who already enabled 2FA

* Update docs link

* Improve email notification assertion
2025-11-05 08:05:41 +00:00
Adrian Gruntkowski a07aaa67eb
Add ability to enforce 2FA for all members of the team (#5855)
* Introduce `force_2fa` team policy and add API for toggling it

* Implement 2FA enforcement

* Make team policy available to CE too

* Improve copy (h/t @metmarkosaric)

* Send email to all team members when enforcing 2FA is enabled

* Only owners can enable and disable enforcing 2FA

* Don't send email to the user who enabled enforcing 2FA

* Add team selection screen to 2FA enforce exceptions

* Fix email URL

* Add tests

* Hide the Force 2FA section for non-owners completely

* Improve e-mail formatting

* Point at 2FA docs page for now

* Add changelog entry

* Reverse the exception to make dialyzer happy

* Fix a typo

Co-authored-by: Uku Taht <Uku.taht@gmail.com>

* Fix typespec 🤡 (h/t @ukutaht)

* Deliver force 2FA email notifications asynchronously

* Fix a typo in AlpineJS variable name (h/t @ukutaht)

* Put parameter in path helper instead of concatenating it as a string

* Improve and test audit logging of toggling 2FA enforcement

* Introduce 3 second delay before redirect

* Test audit logging only on EE

---------

Co-authored-by: Uku Taht <Uku.taht@gmail.com>
2025-11-04 16:33:44 +00:00
RobertJoonas d0ba8f7bd0
Consolidated view settings (#5795)
* render error reason in flash message (cs)

* exclude whole sections in consolidated site settings

* filter settings general

* make goal settings work + tests

* do not render funnels cta

* change title of consolidated view settings

* disable consolidated view revenue goal creation (UI)

* disable consolidated view revenue goal creation (API)

* change title of add goal form

* make Props.suggest_keys_to_allow work for consolidated views

* fix props settings rendering for consolidated views + basic tests

* fix form view + tests

* exclude site settings integrations too

* fix CE tests

* refactor check_no_currency_if_consolidated

* use consolidated? instead of regular?

* use revenue?

* lookup site_ids by site domain

* fix CE

* fix CE again

* extract display_name function
2025-11-04 14:17:26 +00:00
Artur Pata a44ce24867
Fix tracker script config backfill (#5860) 2025-11-03 13:31:25 +00:00
Artur Pata 51ce8a41b5
Fix migration for CE 3.0.1 to current (#5844)
* Fix migration for CE

* Remove dead code
2025-11-03 10:22:22 +00:00
Adam Rutkowski fc34357865
CRM: 24h charts + minor extensions (#5832)
* Display 24h charts in CRM

* Move New Custom Plan button to the top of the page

* Allow custom plan deletion

* Add managed proxy price modifier to custom plan estimation
2025-10-27 14:29:11 +00:00
Artur Pata 0e0415fd6b
Broadcast tracker script config updates (#5806)
* Broadcast tracker script config updates

* Fix broadcast_put typespec

* Preload site association on CE

* Stop preloading uselessly

* Reload tracker_script_config on CE only
2025-10-27 10:48:06 +00:00
RobertJoonas 7540511deb
Clean up detection sentry events + tests (#5833)
* add module name to service_error when check times out

Otherwise, it can sometimes remain unclear in the diagnostics, whether
it was InstallationV2 or InstallationV2CacheBust that timed out.

* Remove duplicate timeout logic

The current production logs show two types of verification timeouts:

* service_error: "Unhandled Browserless response status: 408" (vast
  majority of cases)
* service_error: :timeout (only a few cases)

The latter happens when we hit the Req receive_timeout
(endpoint_timeout + 2s). I've seen Browserless not respect the timeout
param from time to time, so it's better to keep the timeout logic
"in-house" only.

* make service_error into a map with code and extra

* interpret temporary service errors

...but still consider them "unhandled" for telemetry, also notifying Sentry
and logging the warning.

* separate sentry messages (verification)

* make Verification.ChecksTest more DRY

* organize tests into describe blocks

* test verification telemetry and logging

* fix codespell

* get rid of legacy verification

* rename Checks.InstallationV2 -> Checks.VerifyInstallation

* delete Live.Installation and rename Live.InstallationV2 -> Live.Installation

* rename installationv2 (live) files as well

* delete old change-domain routes

Also rename current liveview modules and routes, removing the v2 suffix

* rename domain_change_v2 files, removing v2 suffix

* remove legacy JS verifier code

Also fix dockerignore and elixir.yml referencing a wrong priv path

* rename verification_v2_test -> verification_test

* remove v2 prefix from logs and sentry messages

* clean up duplicate external_sites_controller_test.exs tests

* remove flag

* fix typespec

* pass timeout as query param to Browserless too

* Fixup external sites controller test module (#5826)

* fix test description

* clean up detection sentry events + tests

* improve naming

---------

Co-authored-by: Artur Pata <artur.pata@gmail.com>
2025-10-27 10:31:24 +00:00
RobertJoonas a83b4f3583
Clean up legacy verification code and script v2 flag (#5824)
* add module name to service_error when check times out

Otherwise, it can sometimes remain unclear in the diagnostics, whether
it was InstallationV2 or InstallationV2CacheBust that timed out.

* Remove duplicate timeout logic

The current production logs show two types of verification timeouts:

* service_error: "Unhandled Browserless response status: 408" (vast
  majority of cases)
* service_error: :timeout (only a few cases)

The latter happens when we hit the Req receive_timeout
(endpoint_timeout + 2s). I've seen Browserless not respect the timeout
param from time to time, so it's better to keep the timeout logic
"in-house" only.

* make service_error into a map with code and extra

* interpret temporary service errors

...but still consider them "unhandled" for telemetry, also notifying Sentry
and logging the warning.

* separate sentry messages (verification)

* make Verification.ChecksTest more DRY

* organize tests into describe blocks

* test verification telemetry and logging

* fix codespell

* get rid of legacy verification

* rename Checks.InstallationV2 -> Checks.VerifyInstallation

* delete Live.Installation and rename Live.InstallationV2 -> Live.Installation

* rename installationv2 (live) files as well

* delete old change-domain routes

Also rename current liveview modules and routes, removing the v2 suffix

* rename domain_change_v2 files, removing v2 suffix

* remove legacy JS verifier code

Also fix dockerignore and elixir.yml referencing a wrong priv path

* rename verification_v2_test -> verification_test

* remove v2 prefix from logs and sentry messages

* clean up duplicate external_sites_controller_test.exs tests

* remove flag

* fix typespec

* pass timeout as query param to Browserless too

* Fixup external sites controller test module (#5826)

* fix test description

---------

Co-authored-by: Artur Pata <artur.pata@gmail.com>
2025-10-27 09:39:41 +00:00
Adrian Gruntkowski f3ccfde980
Adjust persistor metrics buckets and remove decode measurement (#5831) 2025-10-27 08:12:09 +00:00
Adrian Gruntkowski 0abad8b0ab
Add metric for decode duration in remote persistor client (#5821) 2025-10-23 11:52:27 +00:00
Adrian Gruntkowski d1c5f19e3c
Explicitly enable Nagle's algorithm for persistor HTTP client (#5820) 2025-10-23 07:28:52 +00:00
Adam Rutkowski bce08903e5
Integrate consolidated view UI (#5798)
* Create static consolidated view UI on `/sites` page

- Improve existing site card layout
- Add static UI for the consolidated view
- Add dismissable upgrade card UI
- Extract favicon fetching logic to function
- Configure configurable fallback icon per route
- Add `/favicon/sources_globe/` route with different icon than `/favicon/sources/` to use on `/sites` page

* Improve the mobile view of the `/sites` page

* Minor query interface UX extension (#5713)

* Minor query interface extension

* !fixup

* !fixup

* Initial implementation of consolidated views on /sites

* Improve loading state

* no need to handle nil in main interface

* Juggle `can_manage_consolidated_view?`

* Require team setup in order to enable consolidated view

* nil catcher

* Fixup test fixture

* Don't show Consolidated View tab in CS if team is not setup

* Reorganize + test

* Remove comment

* Only show consolidated views to superadmins for now

* Remove temporary sleep

* CE unused bindings

* Clean up seeds

* EE

* Fixup test

* Test non-superadmin scenario

* Add a test guarding parity between small plots (consolidated vs individual)

* Move private function so CE won't complain

* See if the graphs are now similar at least :)

* sort

* Map keys are unsorted

* Ensure engagement events aren't counted as visitors on smol graphs

* just try and revert

* Revert "just try and revert"

This reverts commit 7584f59816.

* Simplify globe icon handling

* Remove unnecessary @rest

* Split tests into more focused cases

* Address jumpiness on furious refresh cycle

* Revert "Address jumpiness on furious refresh cycle"

This reverts commit 5c03b36918.

* Another attempt at jumpiness

* Enforce less noticeable lag applying the diff from loading to loaded

* Reduce flashing on stats load

---------

Co-authored-by: Sanne de Vries <sannedv@protonmail.com>
2025-10-22 10:58:26 +00:00
Adrian Gruntkowski 80244e5dad
Avoid crashing telemetry handler for persistor on recv Finch errors (#5815) 2025-10-20 12:20:57 +00:00
Adrian Gruntkowski 3d1f1eca8e
Ensure `conn` from `Plug.Conn.read_body` is always passed down the pipeline (#5814)
* Ensure `conn` from `Plug.Conn.read_body` is always passed down the pipeline

* Alter persistor related histogram metrics for better view of timings

* Update typespec
2025-10-20 11:54:52 +00:00
Adam Rutkowski 5976a6ae6a
Sampling Cache: ensure consolidated values are reported; cache all sites, not only >threshold (#5783)
* Sampling Cache: ensure consolidated values above threshold are reported

* Calculate fractional sampling regardless of cached traffic record

* Fix alias
2025-10-20 11:08:00 +00:00
Adrian Gruntkowski daf1c1a9cd
Measure total `Persistor.Remote` request duration, outside `Finch` (#5811) 2025-10-16 13:03:23 +00:00
Uku Taht 46000fd4bc
Implement custom date/time range comparisons (#5805)
* Implement custom date/time range comparisons

* Update ts schema

* Use Etc/UTC, not UTC - timezone shifted structs are differrent otherwise

* Remove debug statement

* Adjusts timezone in tests

---------

Co-authored-by: Adam Rutkowski <hq@mtod.org>
2025-10-16 06:14:49 +00:00
Adrian Gruntkowski cd68b43d0a
Put params in URL for GET Paddle API request instead of body (#5797) 2025-10-12 10:16:48 +00:00
Adrian Gruntkowski e097afea8f
Implement extended metrics for persistor client (#5791)
* Implement conversion of finch telemetry events to persistor specific ones

* Implement metrics and remove unused telemetry

* Adjust buckets

* Adjust buckets again and use milliseconds for unit uniformly
2025-10-09 15:12:31 +00:00
RobertJoonas 3de4aa54d4
Installation support telemetry (#5790)
* detection handled/unhandled telemetry

* telemetry for verification too

* move sentry call next to telemetry event

* fix ce compile warning

* fix case clause

* remove implicit nil

* telemetry_event functions without argument
2025-10-09 14:13:58 +00:00
Adrian Gruntkowski 6abc0089b6
Set `protocols` in persistor pool config instead of deprecated `protocol` (#5786) 2025-10-08 12:55:51 +00:00
Cenk Kücük a237dfc761
Add threat_ip drop reason (#5773)
The load balancer tags IPs with this x_plausible_ip_type based on a our custom list.
2025-10-02 14:27:25 +00:00
Adrian Gruntkowski fc5f56e475
Don't log no_session_for_engagement errors coming from persistor (#5765) 2025-10-01 08:22:20 +00:00
Adam Rutkowski 45659fd2a6
Broadcast consolidated view cache updates across the cluster (#5769) 2025-10-01 08:17:12 +00:00
Adrian Gruntkowski f52bf3feab
Configure promex metrics sent by `Persistor.EmbeddedWithRelay` (#5762) 2025-10-01 07:26:30 +00:00
Adam Rutkowski 41b2106489
Consolidated view lifecycle (#5760)
* Extract `has_sites_to_consolidate?` and `enabled?` for consolidated
views

* Ensure consolidated view is validated on site removal

* Verify condolidated view preconditions on regular site removal

* Hook only regular sites

* Alias

* Revert "Alias"

This reverts commit 5c95b1fa0a.

* Fix flaky test

* Always update stats start dates for consolidated views

* Ensure consistent regular site id ordering

* Introduce `reset_if_enabled/1` - along with site transfers and deletions

* Credo

* Re-implement reset_if_enabled to delete only when necessary

* Turn `has_sites_to_consolidate/1` private

* Move test to a different describe block

* Test `stats_start_date` refresh for consolidated views

* Credo

* Remove transaction wrap

* Fix typo
2025-09-30 09:46:17 +00:00
RobertJoonas 9ed79a831e
Move InstallationSupport code to `/extra` (EE only) folder (#5758)
* move lib/plausible/installation_support/ -> /extra/lib/...

* extract Live.AwaitingPageviews exclusively for CE

* VerificationTest to ee only

* fix the rest of the compile/test errors on CE

* fix warning about not using default for optional argument

* move module attr
2025-09-29 14:01:56 +00:00