analytics/api-reference.html
2023-10-17 11:16:17 +00:00

2401 lines
69 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="ExDoc v0.30.3">
<meta name="project" content="Plausible v0.0.1">
<title>API Reference — Plausible v0.0.1</title>
<link rel="stylesheet" href="dist/html-elixir-P5GXSCHE.css" />
<script src="dist/handlebars.runtime-NWIB6V2M.js"></script>
<script src="dist/handlebars.templates-NBND3S2D.js"></script>
<script src="dist/sidebar_items-7ADC1E66.js"></script>
<script src="docs_config.js"></script>
<script async src="dist/html-CGDDOCMI.js"></script>
</head>
<body data-type="extras" class="page-extra">
<script>
try {
var settings = JSON.parse(localStorage.getItem('ex_doc:settings') || '{}');
if (settings.theme === 'dark' ||
((settings.theme === 'system' || settings.theme == null) &&
window.matchMedia('(prefers-color-scheme: dark)').matches)
) {
document.body.classList.add('dark')
}
} catch (error) { }
</script>
<div class="main">
<button class="sidebar-button sidebar-toggle" aria-label="toggle sidebar">
<i class="ri-menu-line ri-lg" title="Collapse/expand sidebar"></i>
</button>
<section class="sidebar">
<form class="sidebar-search" action="search.html">
<button type="submit" class="search-button" aria-label="Submit Search">
<i class="ri-search-2-line" aria-hidden="true" title="Submit search"></i>
</button>
<button type="button" tabindex="-1" class="search-close-button" aria-label="Cancel Search">
<i class="ri-close-line ri-lg" aria-hidden="true" title="Cancel search"></i>
</button>
<label class="search-label">
<p class="sr-only">Search</p>
<input name="q" type="text" class="search-input" placeholder="Search..." aria-label="Input your search terms" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" />
</label>
</form>
<div class="autocomplete">
<div class="autocomplete-results">
</div>
</div>
<div class="sidebar-header">
<a href="readme.html">
<img src="assets/logo.png" alt="Plausible" class="sidebar-projectImage">
</a>
<div class="sidebar-projectDetails">
<a href="readme.html" class="sidebar-projectName" translate="no">
Plausible
</a>
<div class="sidebar-projectVersion" translate="no">
v0.0.1
</div>
</div>
<ul class="sidebar-listNav">
<li><a id="extras-list-link" href="#full-list">Pages</a></li>
<li><a id="modules-list-link" href="#full-list">Modules</a></li>
<li><a id="tasks-list-link" href="#full-list"><span translate="no">Mix</span> Tasks</a></li>
</ul>
</div>
<div class="gradient"></div>
<ul id="full-list"></ul>
</section>
<section class="content">
<output role="status" id="toast"></output>
<div class="content-outer">
<div id="content" class="content-inner">
<h1>
<button class="icon-action display-settings">
<i class="ri-settings-3-line"></i>
<span class="sr-only">Settings</span>
</button>
<a href="https://github.com/plausible/analytics" title="View Source" class="icon-action" rel="help">
<i class="ri-code-s-slash-line" aria-hidden="true"></i>
<span class="sr-only">View Source</span>
</a>
<span>API Reference <small class="app-vsn">Plausible v0.0.1</small></span>
</h1>
<section class="details-list">
<h2 id="modules" class="section-heading">
<a href="#modules">
<i class="ri-link-m" aria-hidden="true"></i>
Modules
</a>
</h2>
<div class="summary">
<div class="summary-row">
<div class="summary-signature">
<a href="ObanErrorReporter.html" translate="no">ObanErrorReporter</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.html" translate="no">Plausible</a>
</div>
<div class="summary-synopsis"><p>Plausible keeps the contexts that define your domain
and business logic.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.AsyncInsertRepo.html" translate="no">Plausible.AsyncInsertRepo</a>
</div>
<div class="summary-synopsis"><p>Clickhouse access with async inserts enabled</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Auth.html" translate="no">Plausible.Auth</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Auth.ApiKey.html" translate="no">Plausible.Auth.ApiKey</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Auth.ApiKeyAdmin.html" translate="no">Plausible.Auth.ApiKeyAdmin</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Auth.EmailActivationCode.html" translate="no">Plausible.Auth.EmailActivationCode</a>
</div>
<div class="summary-synopsis"><p>Schema for email activation codes.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Auth.EmailVerification.html" translate="no">Plausible.Auth.EmailVerification</a>
</div>
<div class="summary-synopsis"><p>API for verifying emails.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Auth.GracePeriod.html" translate="no">Plausible.Auth.GracePeriod</a>
</div>
<div class="summary-synopsis"><p>This embedded schema stores information about the account locking grace
period.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Auth.Invitation.html" translate="no">Plausible.Auth.Invitation</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Auth.Password.html" translate="no">Plausible.Auth.Password</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Auth.Token.html" translate="no">Plausible.Auth.Token</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Auth.User.html" translate="no">Plausible.Auth.User</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Auth.UserAdmin.html" translate="no">Plausible.Auth.UserAdmin</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Billing.html" translate="no">Plausible.Billing</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Billing.EnterprisePlan.html" translate="no">Plausible.Billing.EnterprisePlan</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Billing.EnterprisePlanAdmin.html" translate="no">Plausible.Billing.EnterprisePlanAdmin</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Billing.Feature.html" translate="no">Plausible.Billing.Feature</a>
</div>
<div class="summary-synopsis"><p>This module provides an interface for managing features, e.g. Revenue Goals,
Funnels and Custom Properties.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Billing.PaddleApi.html" translate="no">Plausible.Billing.PaddleApi</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Billing.Plans.html" translate="no">Plausible.Billing.Plans</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Billing.Quota.html" translate="no">Plausible.Billing.Quota</a>
</div>
<div class="summary-synopsis"><p>This module provides functions to work with plans usage and limits.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Billing.SiteLocker.html" translate="no">Plausible.Billing.SiteLocker</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Billing.Subscription.Status.html" translate="no">Plausible.Billing.Subscription.Status</a>
</div>
<div class="summary-synopsis"><p>The subscription statuses are stored in Paddle. They can only be changed
through Paddle webhooks, which always send the current subscription status
via the payload.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.ChangesetHelpers.html" translate="no">Plausible.ChangesetHelpers</a>
</div>
<div class="summary-synopsis"><p>Helper function for working with Ecto changesets</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Cldr.html" translate="no">Plausible.Cldr</a>
</div>
<div class="summary-synopsis"><p>Provides the core functions to retrieve and manage
the CLDR data that supports formatting and localisation.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Cldr.AcceptLanguage.html" translate="no">Plausible.Cldr.AcceptLanguage</a>
</div>
<div class="summary-synopsis"><p>Parses HTTP <code class="inline">Accept-Language</code> header values as defined in
<a href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4">rfc2616</a>.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Cldr.Currency.html" translate="no">Plausible.Cldr.Currency</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Cldr.Locale.html" translate="no">Plausible.Cldr.Locale</a>
</div>
<div class="summary-synopsis"><p>Backend module that provides functions
to define new locales and display human-readable
locale names for presentation purposes.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Cldr.Number.html" translate="no">Plausible.Cldr.Number</a>
</div>
<div class="summary-synopsis"><p>Formats numbers and currencies based upon CLDR's decimal formats specification.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Cldr.Number.Cardinal.html" translate="no">Plausible.Cldr.Number.Cardinal</a>
</div>
<div class="summary-synopsis"><p>Implements cardinal plural rules for numbers.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Cldr.Number.Format.html" translate="no">Plausible.Cldr.Number.Format</a>
</div>
<div class="summary-synopsis"><p>Functions to manage the collection of number patterns defined in Cldr.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Cldr.Number.Formatter.Decimal.html" translate="no">Plausible.Cldr.Number.Formatter.Decimal</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Cldr.Number.Ordinal.html" translate="no">Plausible.Cldr.Number.Ordinal</a>
</div>
<div class="summary-synopsis"><p>Implements ordinal plural rules for numbers.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Cldr.Number.PluralRule.Range.html" translate="no">Plausible.Cldr.Number.PluralRule.Range</a>
</div>
<div class="summary-synopsis"><p>Implements plural rules for ranges</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Cldr.Number.Symbol.html" translate="no">Plausible.Cldr.Number.Symbol</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Cldr.Number.System.html" translate="no">Plausible.Cldr.Number.System</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Cldr.Number.Transliterate.html" translate="no">Plausible.Cldr.Number.Transliterate</a>
</div>
<div class="summary-synopsis"><p>Transliteration for digits and separators.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Cldr.Rbnf.NumberSystem.html" translate="no">Plausible.Cldr.Rbnf.NumberSystem</a>
</div>
<div class="summary-synopsis"><p>Functions to implement the number system rule-based-number-format rules of CLDR.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Cldr.Rbnf.Ordinal.html" translate="no">Plausible.Cldr.Rbnf.Ordinal</a>
</div>
<div class="summary-synopsis"><p>Functions to implement the ordinal rule-based-number-format rules of CLDR.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Cldr.Rbnf.Spellout.html" translate="no">Plausible.Cldr.Rbnf.Spellout</a>
</div>
<div class="summary-synopsis"><p>Functions to implement the spellout rule-based-number-format rules of CLDR.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.ClickhouseEventV2.html" translate="no">Plausible.ClickhouseEventV2</a>
</div>
<div class="summary-synopsis"><p>Event schema for when NumericIDs migration is complete</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.ClickhouseRepo.html" translate="no">Plausible.ClickhouseRepo</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.ClickhouseSessionV2.html" translate="no">Plausible.ClickhouseSessionV2</a>
</div>
<div class="summary-synopsis"><p>Session schema for when NumericIDs migration is complete</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.ClickhouseSessionV2.BoolUInt8.html" translate="no">Plausible.ClickhouseSessionV2.BoolUInt8</a>
</div>
<div class="summary-synopsis"><p>Custom type to cast Bool as UInt8</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.ConfigHelpers.html" translate="no">Plausible.ConfigHelpers</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.DataCase.html" translate="no">Plausible.DataCase</a>
</div>
<div class="summary-synopsis"><p>This module defines the setup for tests requiring
access to the application's data layer.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.DataMigration.html" translate="no">Plausible.DataMigration</a>
</div>
<div class="summary-synopsis"><p>Base module for coordinated Clickhouse data migrations
run via remote shell or otherwise (TBD).</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.DataMigration.NumericIDs.html" translate="no">Plausible.DataMigration.NumericIDs</a>
</div>
<div class="summary-synopsis"><p>Numeric IDs migration, SQL files available at:
priv/data_migrations/NumericIDs/sql</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.DataMigration.Repo.html" translate="no">Plausible.DataMigration.Repo</a>
</div>
<div class="summary-synopsis"><p>Ecto.Repo for Clickhouse data migrations, to be started manually,
outside of the main application supervision tree.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.DataMigration.RewriteFunnelDupes.html" translate="no">Plausible.DataMigration.RewriteFunnelDupes</a>
</div>
<div class="summary-synopsis"><p>A data fix migration that seeks funnels having steps
whose goals are equally named.
It then tries to rewrite the duplicate goals using the
oldest goal available. In extreme cases, e.g. when multiple
duplicates are found for a single funnel, it will either
reduce or completely remove the funnel.
This enables us to run a migration later on that will
delete duplicate goals and enforce goal uniqueness at the
database level via a CHECK constraint.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.DebugReplayInfo.html" translate="no">Plausible.DebugReplayInfo</a>
</div>
<div class="summary-synopsis"><p>Function execution context (with arguments) to Sentry reports.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Ecto.EventName.html" translate="no">Plausible.Ecto.EventName</a>
</div>
<div class="summary-synopsis"><p> Custom type for event name. Accepts Strings and Integers and stores them as String. Returns
cast error if any other type is provided. Accepting integers is important for 404 tracking.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Event.WriteBuffer.html" translate="no">Plausible.Event.WriteBuffer</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Factory.html" translate="no">Plausible.Factory</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Funnel.html" translate="no">Plausible.Funnel</a>
</div>
<div class="summary-synopsis"><p>A funnel is a marketing term used to capture and describe the journey
that users go through, from initial step to conversion.
A funnel consists of several steps (here: 2..8).</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Funnel.Step.html" translate="no">Plausible.Funnel.Step</a>
</div>
<div class="summary-synopsis"><p>This module defines the database schema for a single Funnel step.
See: <a href="Plausible.Funnel.html"><code class="inline">Plausible.Funnel</code></a> for more information.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Funnels.html" translate="no">Plausible.Funnels</a>
</div>
<div class="summary-synopsis"><p>This module implements contextual Funnel interface, allowing listing,
creating and deleting funnel definitions.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Geo.html" translate="no">Plausible.Geo</a>
</div>
<div class="summary-synopsis"><p>This module provides an API for fetching IP geolocation.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Goal.html" translate="no">Plausible.Goal</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Goals.html" translate="no">Plausible.Goals</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Google.Api.html" translate="no">Plausible.Google.Api</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Google.Api.Mock.html" translate="no">Plausible.Google.Api.Mock</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Google.Buffer.html" translate="no">Plausible.Google.Buffer</a>
</div>
<div class="summary-synopsis"><p>This GenServer inserts records into Clickhouse <code class="inline">imported_*</code> tables. Multiple buffers are
automatically created for each table. Records are flushed when the table buffer reaches the
maximum size, defined by <code class="inline">max_buffer_size/0</code>.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Google.HTTP.html" translate="no">Plausible.Google.HTTP</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Google.ReportRequest.html" translate="no">Plausible.Google.ReportRequest</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.HTTPClient.html" translate="no">Plausible.HTTPClient</a>
</div>
<div class="summary-synopsis"><p>HTTP Client built on top of Finch.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.HTTPClient.Interface.html" translate="no">Plausible.HTTPClient.Interface</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.HTTPClient.Non200Error.html" translate="no">Plausible.HTTPClient.Non200Error</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.ImportDeletionRepo.html" translate="no">Plausible.ImportDeletionRepo</a>
</div>
<div class="summary-synopsis"><p>A dedicated repo for import related mutations</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Imported.html" translate="no">Plausible.Imported</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.IngestRepo.html" translate="no">Plausible.IngestRepo</a>
</div>
<div class="summary-synopsis"><p>Write-centric Clickhouse access interface</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Ingestion.Counters.html" translate="no">Plausible.Ingestion.Counters</a>
</div>
<div class="summary-synopsis"><p>This is instrumentation necessary for keeping track of per-domain
internal metrics. Due to metric labels cardinality (domain x metric_name),
these statistics are not suitable for prometheus/grafana exposure,
hence an internal storage is used.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Ingestion.Counters.Buffer.html" translate="no">Plausible.Ingestion.Counters.Buffer</a>
</div>
<div class="summary-synopsis"><p>A buffer aggregating counters for internal metrics, within 10 seconds time buckets.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Ingestion.Counters.Record.html" translate="no">Plausible.Ingestion.Counters.Record</a>
</div>
<div class="summary-synopsis"><p>Clickhouse schema for storing ingest counter metrics</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Ingestion.Counters.TelemetryHandler.html" translate="no">Plausible.Ingestion.Counters.TelemetryHandler</a>
</div>
<div class="summary-synopsis"><p>Susbcribes to telemetry events emitted by <a href="Plausible.Ingestion.Event.html"><code class="inline">Plausible.Ingestion.Event</code></a>.
Every time a request derived event is either dispatched to clickhouse or dropped,
a telemetry event is emitted respectively. That event is captured here,
its metadata is extracted and sent for internal stats aggregation via
<code class="inline">Counters.Buffer</code> interface. </p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Ingestion.Event.html" translate="no">Plausible.Ingestion.Event</a>
</div>
<div class="summary-synopsis"><p>This module exposes the <a href="#build_and_buffer/1"><code class="inline">build_and_buffer/1</code></a> function capable of
turning %Plausible.Ingestion.Request{} into a series of events that in turn
are uniformly either buffered in batches (to Clickhouse) or dropped
(e.g. due to spam blocklist) from the processing pipeline.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Ingestion.Request.html" translate="no">Plausible.Ingestion.Request</a>
</div>
<div class="summary-synopsis"><p>The %Plausible.Ingestion.Request{} struct stores all needed fields
to create an event downstream. Pre-eliminary validation is made
to detect user errors early.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Mailer.html" translate="no">Plausible.Mailer</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.OpenTelemetry.Sampler.html" translate="no">Plausible.OpenTelemetry.Sampler</a>
</div>
<div class="summary-synopsis"><p><a href="https://hexdocs.pm/opentelemetry/readme.html#samplers">Custom OpenTelemetry sampler</a>
implementation that ignores particular traces to reduce noise. Ingestion
HTTP requests and queries to Oban tables are ignored, for example.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.PaddleApi.Mock.html" translate="no">Plausible.PaddleApi.Mock</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Plugins.API.Goals.html" translate="no">Plausible.Plugins.API.Goals</a>
</div>
<div class="summary-synopsis"><p>Plugins API context module for Goals.
All high level Goal operations should be implemented here.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Plugins.API.Pagination.html" translate="no">Plausible.Plugins.API.Pagination</a>
</div>
<div class="summary-synopsis"><p>Cursor-based pagination for the Plugins API.
Can be moved to another namespace in case used elsewhere.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Plugins.API.SharedLinks.html" translate="no">Plausible.Plugins.API.SharedLinks</a>
</div>
<div class="summary-synopsis"><p>Plugins API context module for Shared Links.
All high level Shared Links operations should be implemented here.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Plugins.API.Token.html" translate="no">Plausible.Plugins.API.Token</a>
</div>
<div class="summary-synopsis"><p>Ecto schema for Plugins API Tokens.
Tokens are stored hashed and require a description.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Plugins.API.Tokens.html" translate="no">Plausible.Plugins.API.Tokens</a>
</div>
<div class="summary-synopsis"><p>Context module for Plugins API Tokens.
Exposes high-level operation for token-based authentication flows.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.PromEx.html" translate="no">Plausible.PromEx</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.PromEx.Plugins.PlausibleMetrics.html" translate="no">Plausible.PromEx.Plugins.PlausibleMetrics</a>
</div>
<div class="summary-synopsis"><p>Custom PromEx plugin for instrumenting code within Plausible app.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Props.html" translate="no">Plausible.Props</a>
</div>
<div class="summary-synopsis"><p>Context module for handling custom event props.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Purge.html" translate="no">Plausible.Purge</a>
</div>
<div class="summary-synopsis"><p>Deletes data from a site.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Release.html" translate="no">Plausible.Release</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Repo.html" translate="no">Plausible.Repo</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Sentry.Client.html" translate="no">Plausible.Sentry.Client</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.SentryFilter.html" translate="no">Plausible.SentryFilter</a>
</div>
<div class="summary-synopsis"><p>Sentry callbacks for filtering and grouping events</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Session.CacheStore.html" translate="no">Plausible.Session.CacheStore</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Session.Salts.html" translate="no">Plausible.Session.Salts</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Session.WriteBuffer.html" translate="no">Plausible.Session.WriteBuffer</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Site.html" translate="no">Plausible.Site</a>
</div>
<div class="summary-synopsis"><p>Site schema</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Site.Cache.html" translate="no">Plausible.Site.Cache</a>
</div>
<div class="summary-synopsis"><p>A &quot;sites by domain&quot; caching interface.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Site.Cache.Warmer.html" translate="no">Plausible.Site.Cache.Warmer</a>
</div>
<div class="summary-synopsis"><p>A periodic cache warmer.
Queries all Sites from Postgres, every <code class="inline">interval</code> and pre-populates the cache.
After each run the process is hibernated, triggering garbage collection.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Site.Cache.Warmer.All.html" translate="no">Plausible.Site.Cache.Warmer.All</a>
</div>
<div class="summary-synopsis"><p>A Cache.Warmer adapter that refreshes the Sites Cache fully.
This module exists only to make it explicit what the warmer
refreshes, to be used in the supervisor tree.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Site.Cache.Warmer.RecentlyUpdated.html" translate="no">Plausible.Site.Cache.Warmer.RecentlyUpdated</a>
</div>
<div class="summary-synopsis"><p>A Cache.Warmer adapter that only refreshes the Cache
with recently updated sites every 30 seconds.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Site.CustomDomain.html" translate="no">Plausible.Site.CustomDomain</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Site.Domain.html" translate="no">Plausible.Site.Domain</a>
</div>
<div class="summary-synopsis"><p>Basic interface for domain changes.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Site.GateKeeper.html" translate="no">Plausible.Site.GateKeeper</a>
</div>
<div class="summary-synopsis"><p>Thin wrapper around Hammer for gate keeping domain-specific events
during the ingestion phase. When the site is allowed, gate keeping
check returns <code class="inline">:allow</code>, otherwise a <code class="inline">:deny</code> tagged tuple is returned
with one of the following policy markers</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Site.GoogleAuth.html" translate="no">Plausible.Site.GoogleAuth</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Site.ImportedData.html" translate="no">Plausible.Site.ImportedData</a>
</div>
<div class="summary-synopsis"><p>Embedded schema for Google Analytics imports</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Site.Membership.html" translate="no">Plausible.Site.Membership</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Site.Memberships.html" translate="no">Plausible.Site.Memberships</a>
</div>
<div class="summary-synopsis"><p>API for site memberships and invitations</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Site.Memberships.AcceptInvitation.html" translate="no">Plausible.Site.Memberships.AcceptInvitation</a>
</div>
<div class="summary-synopsis"><p>Service for accepting invitations, including ownership transfers.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Site.Memberships.RejectInvitation.html" translate="no">Plausible.Site.Memberships.RejectInvitation</a>
</div>
<div class="summary-synopsis"><p>Service for rejecting invitations.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Site.Memberships.RemoveInvitation.html" translate="no">Plausible.Site.Memberships.RemoveInvitation</a>
</div>
<div class="summary-synopsis"><p>Service for removing invitations.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Site.MonthlyReport.html" translate="no">Plausible.Site.MonthlyReport</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Site.Removal.html" translate="no">Plausible.Site.Removal</a>
</div>
<div class="summary-synopsis"><p>A site deletion service stub.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Site.SharedLink.html" translate="no">Plausible.Site.SharedLink</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Site.SpikeNotification.html" translate="no">Plausible.Site.SpikeNotification</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Site.WeeklyReport.html" translate="no">Plausible.Site.WeeklyReport</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.SiteAdmin.html" translate="no">Plausible.SiteAdmin</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Sites.html" translate="no">Plausible.Sites</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Stats.html" translate="no">Plausible.Stats</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Stats.Aggregate.html" translate="no">Plausible.Stats.Aggregate</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Stats.Base.html" translate="no">Plausible.Stats.Base</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Stats.Breakdown.html" translate="no">Plausible.Stats.Breakdown</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Stats.Clickhouse.html" translate="no">Plausible.Stats.Clickhouse</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Stats.Compare.html" translate="no">Plausible.Stats.Compare</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Stats.Comparisons.html" translate="no">Plausible.Stats.Comparisons</a>
</div>
<div class="summary-synopsis"><p>This module provides functions for comparing query periods.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Stats.CurrentVisitors.html" translate="no">Plausible.Stats.CurrentVisitors</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Stats.CustomProps.html" translate="no">Plausible.Stats.CustomProps</a>
</div>
<div class="summary-synopsis"><p>Module for querying user defined 'custom properties'.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Stats.FilterParser.html" translate="no">Plausible.Stats.FilterParser</a>
</div>
<div class="summary-synopsis"><p>A module for parsing filters used in stat queries.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Stats.FilterSuggestions.html" translate="no">Plausible.Stats.FilterSuggestions</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Stats.Filters.html" translate="no">Plausible.Stats.Filters</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Stats.Fragments.html" translate="no">Plausible.Stats.Fragments</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Stats.Funnel.html" translate="no">Plausible.Stats.Funnel</a>
</div>
<div class="summary-synopsis"><p>Module responsible for funnel evaluation, i.e. building and executing
ClickHouse funnel query based on <a href="Plausible.Funnel.html"><code class="inline">Plausible.Funnel</code></a> definition.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Stats.Imported.html" translate="no">Plausible.Stats.Imported</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Stats.Interval.html" translate="no">Plausible.Stats.Interval</a>
</div>
<div class="summary-synopsis"><p>Collection of functions to work with intervals.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Stats.Props.html" translate="no">Plausible.Stats.Props</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Stats.Query.html" translate="no">Plausible.Stats.Query</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Stats.Timeseries.html" translate="no">Plausible.Stats.Timeseries</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Stats.Util.html" translate="no">Plausible.Stats.Util</a>
</div>
<div class="summary-synopsis"><p>Utilities for modifying stat results</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Test.Support.HTML.html" translate="no">Plausible.Test.Support.HTML</a>
</div>
<div class="summary-synopsis"><p>Floki wrappers to help make assertions about HTML/DOM structures</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.TestUtils.html" translate="no">Plausible.TestUtils</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Themes.html" translate="no">Plausible.Themes</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Timezones.html" translate="no">Plausible.Timezones</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Users.html" translate="no">Plausible.Users</a>
</div>
<div class="summary-synopsis"><p>User context</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Workers.CheckUsage.html" translate="no">Plausible.Workers.CheckUsage</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Workers.CleanInvitations.html" translate="no">Plausible.Workers.CleanInvitations</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Workers.ExpireDomainChangeTransitions.html" translate="no">Plausible.Workers.ExpireDomainChangeTransitions</a>
</div>
<div class="summary-synopsis"><p>Periodic worker that expires domain change transition period.
Old domains are frozen for a given time, so users can still access them
before redeploying their scripts and integrations.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Workers.ImportGoogleAnalytics.html" translate="no">Plausible.Workers.ImportGoogleAnalytics</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Workers.LockSites.html" translate="no">Plausible.Workers.LockSites</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Workers.NotifyAnnualRenewal.html" translate="no">Plausible.Workers.NotifyAnnualRenewal</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Workers.RotateSalts.html" translate="no">Plausible.Workers.RotateSalts</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Workers.ScheduleEmailReports.html" translate="no">Plausible.Workers.ScheduleEmailReports</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Workers.SendCheckStatsEmails.html" translate="no">Plausible.Workers.SendCheckStatsEmails</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Workers.SendEmailReport.html" translate="no">Plausible.Workers.SendEmailReport</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Workers.SendSiteSetupEmails.html" translate="no">Plausible.Workers.SendSiteSetupEmails</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Workers.SendTrialNotifications.html" translate="no">Plausible.Workers.SendTrialNotifications</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Plausible.Workers.SpikeNotifier.html" translate="no">Plausible.Workers.SpikeNotifier</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.html" translate="no">PlausibleWeb</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Api.ExternalController.html" translate="no">PlausibleWeb.Api.ExternalController</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Api.ExternalSitesController.html" translate="no">PlausibleWeb.Api.ExternalSitesController</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Api.ExternalStatsController.html" translate="no">PlausibleWeb.Api.ExternalStatsController</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Api.Helpers.html" translate="no">PlausibleWeb.Api.Helpers</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Api.InternalController.html" translate="no">PlausibleWeb.Api.InternalController</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Api.PaddleController.html" translate="no">PlausibleWeb.Api.PaddleController</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Api.StatsController.html" translate="no">PlausibleWeb.Api.StatsController</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.AuthController.html" translate="no">PlausibleWeb.AuthController</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.AuthPlug.html" translate="no">PlausibleWeb.AuthPlug</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.AuthView.html" translate="no">PlausibleWeb.AuthView</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.AuthorizeSiteAccess.html" translate="no">PlausibleWeb.AuthorizeSiteAccess</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.AuthorizeSitesApiPlug.html" translate="no">PlausibleWeb.AuthorizeSitesApiPlug</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.AuthorizeStatsApiPlug.html" translate="no">PlausibleWeb.AuthorizeStatsApiPlug</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.AvatarController.html" translate="no">PlausibleWeb.AvatarController</a>
</div>
<div class="summary-synopsis"><p>This module proxies requests to BASE_URL/avatar/:hash to www.gravatar.com/avatar/:hash.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.BillingController.html" translate="no">PlausibleWeb.BillingController</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.BillingView.html" translate="no">PlausibleWeb.BillingView</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.CRMAuthPlug.html" translate="no">PlausibleWeb.CRMAuthPlug</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Captcha.html" translate="no">PlausibleWeb.Captcha</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Components.Generic.html" translate="no">PlausibleWeb.Components.Generic</a>
</div>
<div class="summary-synopsis"><p>Generic reusable components</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Components.Site.Feature.html" translate="no">PlausibleWeb.Components.Site.Feature</a>
</div>
<div class="summary-synopsis"><p>Phoenix Component for rendering a user-facing feature toggle
capable of flipping booleans in <a href="Plausible.Site.html"><code class="inline">Plausible.Site</code></a> via the <code class="inline">toggle_feature</code> controller action.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.ConnCase.html" translate="no">PlausibleWeb.ConnCase</a>
</div>
<div class="summary-synopsis"><p>This module defines the test case to be used by
tests that require setting up a connection.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.ControllerHelpers.html" translate="no">PlausibleWeb.ControllerHelpers</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Email.html" translate="no">PlausibleWeb.Email</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.EmailView.html" translate="no">PlausibleWeb.EmailView</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Endpoint.html" translate="no">PlausibleWeb.Endpoint</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.ErrorHelpers.html" translate="no">PlausibleWeb.ErrorHelpers</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.ErrorReportController.html" translate="no">PlausibleWeb.ErrorReportController</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.ErrorView.html" translate="no">PlausibleWeb.ErrorView</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Favicon.html" translate="no">PlausibleWeb.Favicon</a>
</div>
<div class="summary-synopsis"><p>A Plug that fetches favicon images from DuckDuckGo and returns them
to the Plausible frontend.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.FirstLaunchPlug.html" translate="no">PlausibleWeb.FirstLaunchPlug</a>
</div>
<div class="summary-synopsis"><p>Redirects first-launch users to registration page.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.FormHelpers.html" translate="no">PlausibleWeb.FormHelpers</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.InvitationController.html" translate="no">PlausibleWeb.InvitationController</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.LastSeenPlug.html" translate="no">PlausibleWeb.LastSeenPlug</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.LayoutView.html" translate="no">PlausibleWeb.LayoutView</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.LayoutView.JWT.html" translate="no">PlausibleWeb.LayoutView.JWT</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Live.ChoosePlan.html" translate="no">PlausibleWeb.Live.ChoosePlan</a>
</div>
<div class="summary-synopsis"><p>LiveView for upgrading to a plan, or changing an existing plan.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Live.Components.ComboBox.html" translate="no">PlausibleWeb.Live.Components.ComboBox</a>
</div>
<div class="summary-synopsis"><p>Phoenix LiveComponent for a combobox UI element with search and selection
functionality.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Live.Components.ComboBox.StaticSearch.html" translate="no">PlausibleWeb.Live.Components.ComboBox.StaticSearch</a>
</div>
<div class="summary-synopsis"><p>Default suggestion engine for the <code class="inline">ComboBox</code> component.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Live.Components.Form.html" translate="no">PlausibleWeb.Live.Components.Form</a>
</div>
<div class="summary-synopsis"><p>Generic components stolen from mix phx.new templates</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Live.Flash.html" translate="no">PlausibleWeb.Live.Flash</a>
</div>
<div class="summary-synopsis"><p>Flash component for LiveViews - works also when embedded within dead views</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Live.FunnelSettings.html" translate="no">PlausibleWeb.Live.FunnelSettings</a>
</div>
<div class="summary-synopsis"><p>LiveView allowing listing, creating and deleting funnels.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Live.FunnelSettings.Form.html" translate="no">PlausibleWeb.Live.FunnelSettings.Form</a>
</div>
<div class="summary-synopsis"><p>Phoenix LiveComponent that renders a form used for setting up funnels.
Makes use of dynamically placed <code class="inline">PlausibleWeb.Live.FunnelSettings.ComboBox</code> components
to allow building searchable funnel definitions out of list of goals available.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Live.FunnelSettings.List.html" translate="no">PlausibleWeb.Live.FunnelSettings.List</a>
</div>
<div class="summary-synopsis"><p>Phoenix LiveComponent module that renders a list of funnels with their names
and the number of steps they have.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Live.GoalSettings.html" translate="no">PlausibleWeb.Live.GoalSettings</a>
</div>
<div class="summary-synopsis"><p>LiveView allowing listing, creating and deleting goals.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Live.GoalSettings.Form.html" translate="no">PlausibleWeb.Live.GoalSettings.Form</a>
</div>
<div class="summary-synopsis"><p>Live view for the goal creation form</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Live.GoalSettings.List.html" translate="no">PlausibleWeb.Live.GoalSettings.List</a>
</div>
<div class="summary-synopsis"><p>Phoenix LiveComponent module that renders a list of goals</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Live.PropsSettings.html" translate="no">PlausibleWeb.Live.PropsSettings</a>
</div>
<div class="summary-synopsis"><p>LiveView allowing listing, allowing and disallowing custom event properties.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Live.PropsSettings.Form.html" translate="no">PlausibleWeb.Live.PropsSettings.Form</a>
</div>
<div class="summary-synopsis"><p>Live view for the custom props creation form</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Live.PropsSettings.List.html" translate="no">PlausibleWeb.Live.PropsSettings.List</a>
</div>
<div class="summary-synopsis"><p>Phoenix LiveComponent module that renders a list of custom properties</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Live.RegisterForm.html" translate="no">PlausibleWeb.Live.RegisterForm</a>
</div>
<div class="summary-synopsis"><p>LiveView for registration form.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Live.ResetPasswordForm.html" translate="no">PlausibleWeb.Live.ResetPasswordForm</a>
</div>
<div class="summary-synopsis"><p>LiveView for password reset form.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.MJML.WeeklyReport.html" translate="no">PlausibleWeb.MJML.WeeklyReport</a>
</div>
<div class="summary-synopsis"><p>MJML rendered for the weekly report e-mail</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.PageController.html" translate="no">PlausibleWeb.PageController</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.PageView.html" translate="no">PlausibleWeb.PageView</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Plugins.API.html" translate="no">PlausibleWeb.Plugins.API</a>
</div>
<div class="summary-synopsis"><p>Plausible Plugins API</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Plugins.API.Controllers.Goals.html" translate="no">PlausibleWeb.Plugins.API.Controllers.Goals</a>
</div>
<div class="summary-synopsis"><p>Controller for the Goal resource under Plugins API</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Plugins.API.Controllers.SharedLinks.html" translate="no">PlausibleWeb.Plugins.API.Controllers.SharedLinks</a>
</div>
<div class="summary-synopsis"><p>Controller for the Shared Link resource under Plugins API</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Plugins.API.Errors.html" translate="no">PlausibleWeb.Plugins.API.Errors</a>
</div>
<div class="summary-synopsis"><p>Common responses for Plugins API</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Plugins.API.Router.html" translate="no">PlausibleWeb.Plugins.API.Router</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Plugins.API.Schemas.Error.html" translate="no">PlausibleWeb.Plugins.API.Schemas.Error</a>
</div>
<div class="summary-synopsis"><p>OpenAPI schema for an error included in a response</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Plugins.API.Schemas.Goal.html" translate="no">PlausibleWeb.Plugins.API.Schemas.Goal</a>
</div>
<div class="summary-synopsis"><p>OpenAPI schema for Goal</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.html" translate="no">PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest</a>
</div>
<div class="summary-synopsis"><p>OpenAPI schema for Goal creation request</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.CustomEvent.html" translate="no">PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.CustomEvent</a>
</div>
<div class="summary-synopsis"><p>OpenAPI schema for Custom Event Goal creation request</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Pageview.html" translate="no">PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Pageview</a>
</div>
<div class="summary-synopsis"><p>OpenAPI schema for Pageview Goal creation request</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Revenue.html" translate="no">PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Revenue</a>
</div>
<div class="summary-synopsis"><p>OpenAPI schema for Custom Event Goal creation request</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Plugins.API.Schemas.Goal.CustomEvent.html" translate="no">PlausibleWeb.Plugins.API.Schemas.Goal.CustomEvent</a>
</div>
<div class="summary-synopsis"><p>OpenAPI schema for Custom Event Goal object</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Plugins.API.Schemas.Goal.ListResponse.html" translate="no">PlausibleWeb.Plugins.API.Schemas.Goal.ListResponse</a>
</div>
<div class="summary-synopsis"><p>OpenAPI schema for Goals list response</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Plugins.API.Schemas.Goal.Pageview.html" translate="no">PlausibleWeb.Plugins.API.Schemas.Goal.Pageview</a>
</div>
<div class="summary-synopsis"><p>OpenAPI schema for Pageview Goal object</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Plugins.API.Schemas.Goal.Revenue.html" translate="no">PlausibleWeb.Plugins.API.Schemas.Goal.Revenue</a>
</div>
<div class="summary-synopsis"><p>OpenAPI schema for Revenue Goal object</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Plugins.API.Schemas.Goal.Type.html" translate="no">PlausibleWeb.Plugins.API.Schemas.Goal.Type</a>
</div>
<div class="summary-synopsis"><p>OpenAPI schema for common Goal Type</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Plugins.API.Schemas.Link.html" translate="no">PlausibleWeb.Plugins.API.Schemas.Link</a>
</div>
<div class="summary-synopsis"><p>OpenAPI Link schema</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Plugins.API.Schemas.NotFound.html" translate="no">PlausibleWeb.Plugins.API.Schemas.NotFound</a>
</div>
<div class="summary-synopsis"><p>OpenAPI schema for a generic 404 response</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Plugins.API.Schemas.PaginationMetadata.html" translate="no">PlausibleWeb.Plugins.API.Schemas.PaginationMetadata</a>
</div>
<div class="summary-synopsis"><p>Pagination metadata OpenAPI schema</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Plugins.API.Schemas.SharedLink.html" translate="no">PlausibleWeb.Plugins.API.Schemas.SharedLink</a>
</div>
<div class="summary-synopsis"><p>OpenAPI schema for SharedLink object</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Plugins.API.Schemas.SharedLink.CreateRequest.html" translate="no">PlausibleWeb.Plugins.API.Schemas.SharedLink.CreateRequest</a>
</div>
<div class="summary-synopsis"><p>OpenAPI schema for SharedLink creation request</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Plugins.API.Schemas.SharedLink.ListResponse.html" translate="no">PlausibleWeb.Plugins.API.Schemas.SharedLink.ListResponse</a>
</div>
<div class="summary-synopsis"><p>OpenAPI schema for SharedLink list response</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Plugins.API.Schemas.Unauthorized.html" translate="no">PlausibleWeb.Plugins.API.Schemas.Unauthorized</a>
</div>
<div class="summary-synopsis"><p>OpenAPI schema for a generic 401 response</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Plugins.API.Schemas.UnprocessableEntity.html" translate="no">PlausibleWeb.Plugins.API.Schemas.UnprocessableEntity</a>
</div>
<div class="summary-synopsis"><p>OpenAPI schema for a generic 422 response</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Plugins.API.Spec.html" translate="no">PlausibleWeb.Plugins.API.Spec</a>
</div>
<div class="summary-synopsis"><p>OpenAPI specification for the Plugins API</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Plugins.API.Views.Error.html" translate="no">PlausibleWeb.Plugins.API.Views.Error</a>
</div>
<div class="summary-synopsis"><p>View for rendering Plugins REST API errors</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Plugins.API.Views.Goal.html" translate="no">PlausibleWeb.Plugins.API.Views.Goal</a>
</div>
<div class="summary-synopsis"><p>View for rendering Goals in the Plugins API</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Plugins.API.Views.Pagination.html" translate="no">PlausibleWeb.Plugins.API.Views.Pagination</a>
</div>
<div class="summary-synopsis"><p>A view capable of rendering pagination metadata included
in responses containing lists of objects.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Plugins.API.Views.SharedLink.html" translate="no">PlausibleWeb.Plugins.API.Views.SharedLink</a>
</div>
<div class="summary-synopsis"><p>View for rendering Shared Links in the Plugins API</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.PluginsAPICase.html" translate="no">PlausibleWeb.PluginsAPICase</a>
</div>
<div class="summary-synopsis"><p>This module defines the test case to be used by
tests that require setting up a Plugins API connection.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Plugs.AuthorizePluginsAPI.html" translate="no">PlausibleWeb.Plugs.AuthorizePluginsAPI</a>
</div>
<div class="summary-synopsis"><p>Plug for Basic HTTP Authentication using
Plugins API Tokens lookup.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Plugs.MaybeDisableRegistration.html" translate="no">PlausibleWeb.Plugs.MaybeDisableRegistration</a>
</div>
<div class="summary-synopsis"><p>Plug toggling registration according to selfhosted state.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Plugs.NoRobots.html" translate="no">PlausibleWeb.Plugs.NoRobots</a>
</div>
<div class="summary-synopsis"><p>Rejects bot requests by any means available.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.RefInspector.html" translate="no">PlausibleWeb.RefInspector</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.RemoteIp.html" translate="no">PlausibleWeb.RemoteIp</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.RequireAccountPlug.html" translate="no">PlausibleWeb.RequireAccountPlug</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.RequireLoggedOutPlug.html" translate="no">PlausibleWeb.RequireLoggedOutPlug</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Router.html" translate="no">PlausibleWeb.Router</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.SessionTimeoutPlug.html" translate="no">PlausibleWeb.SessionTimeoutPlug</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Site.MembershipController.html" translate="no">PlausibleWeb.Site.MembershipController</a>
</div>
<div class="summary-synopsis"><p> This controller deals with user management via the UI in Site Settings -&gt; People. It's important to enforce permissions in this controller.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Site.MembershipView.html" translate="no">PlausibleWeb.Site.MembershipView</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.SiteController.html" translate="no">PlausibleWeb.SiteController</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.SiteView.html" translate="no">PlausibleWeb.SiteView</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.StatsController.html" translate="no">PlausibleWeb.StatsController</a>
</div>
<div class="summary-synopsis"><p>This controller is responsible for rendering stats dashboards.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.StatsView.html" translate="no">PlausibleWeb.StatsView</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.Tracker.html" translate="no">PlausibleWeb.Tracker</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.UnsubscribeController.html" translate="no">PlausibleWeb.UnsubscribeController</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="PlausibleWeb.UnsubscribeView.html" translate="no">PlausibleWeb.UnsubscribeView</a>
</div>
</div>
</div>
</section>
<section class="details-list">
<h2 id="mix-tasks" class="section-heading">
<a href="#mix-tasks">
<i class="ri-link-m" aria-hidden="true"></i>
Mix Tasks
</a>
</h2>
<div class="summary">
<div class="summary-row">
<div class="summary-signature">
<a href="Mix.Tasks.CancelSubscription.html" translate="no">mix cancel_subscription</a>
</div>
<div class="summary-synopsis"><p>This task is meant to replicate the behavior of cancelling
a subscription. On production, this action is initiated by
a Paddle webhook. Currently, only the subscription status
is changed with that action.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Mix.Tasks.CleanClickhouse.html" translate="no">mix clean_clickhouse</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Mix.Tasks.CreateFreeSubscription.html" translate="no">mix create_free_subscription</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Mix.Tasks.DownloadCountryDatabase.html" translate="no">mix download_country_database</a>
</div>
<div class="summary-synopsis"><p>This task downloads the Country Lite database from DB-IP for self-hosted or development purposes.
Plausible Cloud runs a paid version of DB-IP with more detailed geolocation data.</p></div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Mix.Tasks.GenerateReferrerFavicons.html" translate="no">mix generate_referrer_favicons</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Mix.Tasks.PullSandboxSubscription.html" translate="no">mix pull_sandbox_subscription</a>
</div>
</div>
<div class="summary-row">
<div class="summary-signature">
<a href="Mix.Tasks.SendPageview.html" translate="no">mix send_pageview</a>
</div>
<div class="summary-synopsis"><p>It's often necessary to generate fake events for development and testing purposes. This Mix Task provides a quick and easy
way to generate a pageview or custom event, either in your development environment or a remote Plausible instance.</p></div>
</div>
</div>
</section>
<div class="bottom-actions">
<div class="bottom-actions-item">
</div>
<div class="bottom-actions-item">
<a href="readme.html" class="bottom-actions-button" rel="next">
<span class="subheader">
Next Page →
</span>
<span class="title">
Introduction
</span>
</a>
</div>
</div>
<footer class="footer">
<p>
<span class="line">
<button class="a-main footer-button display-quick-switch" title="Search HexDocs packages">
Search HexDocs
</button>
<a href="Plausible.epub" title="ePub version">
Download ePub version
</a>
</span>
</p>
<p class="built-using">
Built using
<a href="https://github.com/elixir-lang/ex_doc" title="ExDoc" target="_blank" rel="help noopener" translate="no">ExDoc</a> (v0.30.3) for the
<a href="https://elixir-lang.org" title="Elixir" target="_blank" translate="no">Elixir programming language</a>
</p>
</footer>
</div>
</div>
</section>
</div>
<script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
<script>mermaid.initialize({startOnLoad: true})</script>
</body>
</html>