2023-08-24 20:24:31 +03:00
<!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" >
2024-01-11 10:50:44 +03:00
< meta name = "generator" content = "ExDoc v0.31.0" >
2023-08-24 20:24:31 +03:00
< meta name = "project" content = "Plausible v0.0.1" >
2024-01-11 10:50:44 +03:00
2023-08-24 20:24:31 +03:00
< title > Plausible.Billing.Quota — Plausible v0.0.1< / title >
2024-01-11 10:50:44 +03:00
< link rel = "stylesheet" href = "dist/html-elixir-3ZLIM5JF.css" / >
2023-08-24 20:24:31 +03:00
< script src = "dist/handlebars.runtime-NWIB6V2M.js" > < / script >
2024-01-11 10:50:44 +03:00
< script src = "dist/handlebars.templates-43PMFBC7.js" > < / script >
2024-01-15 13:40:15 +03:00
< script src = "dist/sidebar_items-0D4C46BF.js" > < / script >
2023-08-24 20:24:31 +03:00
< script src = "docs_config.js" > < / script >
2024-01-11 10:50:44 +03:00
< script async src = "dist/html-CILPWI2Q.js" > < / script >
2023-08-24 20:24:31 +03:00
< / head >
< body data-type = "modules" class = "page-module" >
< 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" >
2024-01-11 10:50:44 +03:00
< button class = "sidebar-button sidebar-toggle" aria-label = "toggle sidebar" aria-controls = "sidebar" >
2023-08-24 20:24:31 +03:00
< i class = "ri-menu-line ri-lg" title = "Collapse/expand sidebar" > < / i >
< / button >
2024-01-11 10:50:44 +03:00
< nav id = "sidebar" class = "sidebar" >
2023-08-24 20:24:31 +03:00
< div class = "sidebar-header" >
2024-01-11 10:50:44 +03:00
< div class = "sidebar-projectInfo" >
2023-08-24 20:24:31 +03:00
2024-01-11 10:50:44 +03:00
< a href = "readme.html" class = "sidebar-projectImage" >
< img src = "assets/logo.png" alt = "Plausible" / >
< / a >
2023-08-24 20:24:31 +03:00
2024-01-11 10:50:44 +03:00
< div >
< a href = "readme.html" class = "sidebar-projectName" translate = "no" >
2023-08-24 20:24:31 +03:00
Plausible
2024-01-11 10:50:44 +03:00
< / a >
< div class = "sidebar-projectVersion" translate = "no" >
v0.0.1
< / div >
2023-08-24 20:24:31 +03:00
< / div >
< / div >
2024-01-11 10:50:44 +03:00
< ul id = "sidebar-listNav" class = "sidebar-listNav" role = "tablist" >
< li >
< button id = "extras-list-tab-button" role = "tab" data-type = "extras" aria-controls = "extras-tab-panel" aria-selected = "true" tabindex = "0" >
Pages
< / button >
< / li >
< li >
< button id = "modules-list-tab-button" role = "tab" data-type = "modules" aria-controls = "modules-tab-panel" aria-selected = "false" tabindex = "-1" >
Modules
< / button >
< / li >
< li >
< button id = "tasks-list-tab-button" role = "tab" data-type = "tasks" aria-controls = "tasks-tab-panel" aria-selected = "false" tabindex = "-1" >
< span translate = "no" > Mix< / span > Tasks
< / button >
< / li >
2023-08-24 20:24:31 +03:00
2024-01-11 10:50:44 +03:00
< / ul >
< / div >
2023-08-24 20:24:31 +03:00
2024-01-11 10:50:44 +03:00
< div id = "extras-tab-panel" class = "sidebar-tabpanel" role = "tabpanel" aria-labelledby = "extras-list-tab-button" >
< ul id = "extras-full-list" class = "full-list" > < / ul >
< / div >
2023-08-24 20:24:31 +03:00
2024-01-11 10:50:44 +03:00
< div id = "modules-tab-panel" class = "sidebar-tabpanel" role = "tabpanel" aria-labelledby = "modules-list-tab-button" hidden >
< ul id = "modules-full-list" class = "full-list" > < / ul >
< / div >
2023-08-24 20:24:31 +03:00
2024-01-11 10:50:44 +03:00
< div id = "tasks-tab-panel" class = "sidebar-tabpanel" role = "tabpanel" aria-labelledby = "tasks-list-tab-button" hidden >
< ul id = "tasks-full-list" class = "full-list" > < / ul >
< / div >
< / nav >
2023-08-24 20:24:31 +03:00
2024-01-11 10:50:44 +03:00
< main class = "content" >
2023-08-24 20:24:31 +03:00
< output role = "status" id = "toast" > < / output >
< div class = "content-outer" >
< div id = "content" class = "content-inner" >
2024-01-11 10:50:44 +03:00
< div class = "top-search" >
< div class = "search-settings" >
< form class = "search-bar" action = "search.html" >
< label class = "search-label" >
< span class = "sr-only" > Search documentation of Plausible< / span >
< input name = "q" type = "text" class = "search-input" placeholder = "Search Documentation (press /)" autocomplete = "off" autocorrect = "off" autocapitalize = "off" spellcheck = "false" / >
< / label >
< button type = "submit" class = "search-button" aria-label = "Submit Search" >
< i class = "ri-search-2-line ri-lg" aria-hidden = "true" title = "Submit search" > < / i >
< / button >
< button type = "button" tabindex = "-1" class = "search-close-button" aria-hidden = "true" >
< i class = "ri-close-line ri-lg" title = "Cancel search" > < / i >
< / button >
< / form >
< button class = "icon-settings display-settings" >
< i class = "ri-settings-3-line" > < / i >
< span class = "sr-only" > Settings< / span >
< / button >
< / div >
< / div >
< div class = "autocomplete" >
< / div >
2023-08-24 20:24:31 +03:00
< h1 >
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/billing/quota.ex#L1" 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 translate = "no" > Plausible.Billing.Quota< / span >
< small class = "app-vsn" translate = "no" > (Plausible v0.0.1)< / small >
< / h1 >
< section id = "moduledoc" >
< p > This module provides functions to work with plans usage and limits.< / p >
< / section >
< section id = "summary" class = "details-list" >
< h1 class = "section-heading" >
< a class = "hover-link" href = "#summary" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< / a >
2024-01-11 10:50:44 +03:00
< span class = "text" > Summary< / span >
2023-08-24 20:24:31 +03:00
< / h1 >
2023-11-30 15:30:44 +03:00
< div class = "summary-types summary" >
< h2 >
< a href = "#types" > Types< / a >
< / h2 >
2023-12-20 17:57:27 +03:00
< div class = "summary-row" >
< div class = "summary-signature" >
< a href = "#t:limit/0" translate = "no" > limit()< / a >
< / div >
< / div >
2023-11-30 15:30:44 +03:00
< div class = "summary-row" >
< div class = "summary-signature" >
< a href = "#t:monthly_pageview_usage/0" translate = "no" > monthly_pageview_usage()< / a >
< / div >
< / div >
2023-12-20 17:57:27 +03:00
< div class = "summary-row" >
< div class = "summary-signature" >
< a href = "#t:over_limits_error/0" translate = "no" > over_limits_error()< / a >
< / div >
< / div >
2023-11-30 15:30:44 +03:00
< div class = "summary-row" >
< div class = "summary-signature" >
< a href = "#t:period/0" translate = "no" > period()< / a >
< / div >
< / div >
< div class = "summary-row" >
< div class = "summary-signature" >
< a href = "#t:usage_cycle/0" translate = "no" > usage_cycle()< / a >
< / div >
< / div >
< / div >
2023-08-24 20:24:31 +03:00
< div class = "summary-functions summary" >
< h2 >
< a href = "#functions" > Functions< / a >
< / h2 >
2023-10-11 15:41:12 +03:00
< div class = "summary-row" >
< div class = "summary-signature" >
2023-10-18 11:30:10 +03:00
< a href = "#allowed_features_for/1" translate = "no" > allowed_features_for(user)< / a >
2023-10-11 15:41:12 +03:00
< / div >
2023-10-18 11:30:10 +03:00
< div class = "summary-synopsis" > < p > Returns a list of features the user can use. Trial users have the
2023-10-11 15:41:12 +03:00
ability to use all features during their trial.< / p > < / div >
< / div >
2023-11-06 17:02:40 +03:00
< div class = "summary-row" >
< div class = "summary-signature" >
< a href = "#below_limit?/2" translate = "no" > below_limit?(usage, limit)< / a >
< / div >
< div class = "summary-synopsis" > < p > Returns whether the usage is below the limit or not.
Returns false if usage is equal to the limit.< / p > < / div >
< / div >
2023-12-13 13:48:29 +03:00
< div class = "summary-row" >
< div class = "summary-signature" >
< a href = "#ensure_can_add_new_site/1" translate = "no" > ensure_can_add_new_site(user)< / a >
< / div >
< div class = "summary-synopsis" > < p > Enterprise plans are always allowed to add more sites (even when
over limit) to avoid service disruption. Their usage is checked
in a background job instead (see < code class = "inline" > check_usage.ex< / code > ).< / p > < / div >
< / div >
2023-10-26 18:21:35 +03:00
< div class = "summary-row" >
< div class = "summary-signature" >
2023-12-20 17:57:27 +03:00
< a href = "#ensure_within_plan_limits/3" translate = "no" > ensure_within_plan_limits(user_or_usage, plan, opts \\ [])< / a >
2023-10-26 18:21:35 +03:00
< / div >
2023-12-20 17:57:27 +03:00
< div class = "summary-synopsis" > < p > Ensures that the given user (or the usage map) is within the limits
of the given plan.< / p > < / div >
2023-10-26 18:21:35 +03:00
< / div >
2023-10-11 15:41:12 +03:00
< div class = "summary-row" >
< div class = "summary-signature" >
2023-10-18 11:30:10 +03:00
< a href = "#features_usage/1" translate = "no" > features_usage(user)< / a >
2023-10-11 15:41:12 +03:00
< / div >
2023-11-17 20:44:20 +03:00
< div class = "summary-synopsis" > < p > Given a user, this function returns the features used across all the sites
this user owns + StatsAPI if the user has a configured Stats API key.< / p > < / div >
2023-10-11 15:41:12 +03:00
< / div >
2023-08-24 20:24:31 +03:00
< div class = "summary-row" >
< div class = "summary-signature" >
2023-12-13 13:48:29 +03:00
< a href = "#monthly_pageview_limit/1" translate = "no" > monthly_pageview_limit(user)< / a >
2023-08-24 20:24:31 +03:00
< / div >
< / div >
< div class = "summary-row" >
< div class = "summary-signature" >
2023-12-20 17:57:27 +03:00
< a href = "#monthly_pageview_usage/2" translate = "no" > monthly_pageview_usage(user, site_ids \\ nil)< / a >
2023-08-24 20:24:31 +03:00
< / div >
2023-12-20 17:57:27 +03:00
< div class = "summary-synopsis" > < p > Queries the ClickHouse database for the monthly pageview usage. If the given user's
subscription is < code class = "inline" > active< / code > , < code class = "inline" > past_due< / code > , or a < code class = "inline" > deleted< / code > (but not yet expired), a map
with the following structure is returned< / p > < / div >
2023-08-24 20:24:31 +03:00
< / div >
< div class = "summary-row" >
< div class = "summary-signature" >
< a href = "#site_limit/1" translate = "no" > site_limit(user)< / a >
< / div >
< / div >
< div class = "summary-row" >
< div class = "summary-signature" >
< a href = "#site_usage/1" translate = "no" > site_usage(user)< / a >
< / div >
< div class = "summary-synopsis" > < p > Returns the number of sites the given user owns.< / p > < / div >
< / div >
2023-09-04 15:56:06 +03:00
< div class = "summary-row" >
< div class = "summary-signature" >
< a href = "#team_member_limit/1" translate = "no" > team_member_limit(user)< / a >
< / div >
< / div >
< div class = "summary-row" >
< div class = "summary-signature" >
< a href = "#team_member_usage/1" translate = "no" > team_member_usage(user)< / a >
< / div >
2023-12-13 13:48:29 +03:00
< div class = "summary-synopsis" > < p > Returns the total count of team members associated with the user's sites.< / p > < / div >
2023-09-04 15:56:06 +03:00
< / div >
2023-10-26 18:21:35 +03:00
< div class = "summary-row" >
< div class = "summary-signature" >
< a href = "#usage/2" translate = "no" > usage(user, opts \\ [])< / a >
< / div >
< / div >
2023-11-30 15:30:44 +03:00
< div class = "summary-row" >
< div class = "summary-signature" >
2023-12-06 15:02:59 +03:00
< a href = "#usage_cycle/4" translate = "no" > usage_cycle(user, cycle, owned_site_ids \\ nil, today \\ Timex.today())< / a >
2023-11-30 15:30:44 +03:00
< / div >
< / div >
2023-08-24 20:24:31 +03:00
< div class = "summary-row" >
< div class = "summary-signature" >
< a href = "#within_limit?/2" translate = "no" > within_limit?(usage, limit)< / a >
< / div >
2023-11-06 17:02:40 +03:00
< div class = "summary-synopsis" > < p > Returns whether the usage is within the limit or not.
Returns true if usage is equal to the limit.< / p > < / div >
2023-08-24 20:24:31 +03:00
< / div >
< / div >
< / section >
2023-11-30 15:30:44 +03:00
< section id = "types" class = "details-list" >
2023-11-30 14:51:25 +03:00
< h1 class = "section-heading" >
2023-11-30 15:30:44 +03:00
< a class = "hover-link" href = "#types" >
2023-11-30 14:51:25 +03:00
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< / a >
2024-01-11 10:50:44 +03:00
< span class = "text" > Types< / span >
2023-11-30 14:51:25 +03:00
< / h1 >
2023-11-30 15:30:44 +03:00
< div class = "types-list" >
2023-12-20 17:57:27 +03:00
< section class = "detail" id = "t:limit/0" >
< div class = "detail-header" >
< a href = "#t:limit/0" class = "detail-link" title = "Link to this type" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< span class = "sr-only" > Link to this type< / span >
< / a >
< h1 class = "signature" translate = "no" > limit()< / h1 >
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/billing/quota.ex#L13" class = "icon-action" rel = "help" title = "View Source" >
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
< / div >
< section class = "docstring" >
< div class = "specs" >
< pre translate = "no" > < span class = "attribute" > @type< / span > limit() :: :site_limit | :pageview_limit | :team_member_limit< / pre >
< / div >
< / section >
< / section >
2023-11-30 15:30:44 +03:00
< section class = "detail" id = "t:monthly_pageview_usage/0" >
2023-11-30 14:51:25 +03:00
< div class = "detail-header" >
2023-11-30 15:30:44 +03:00
< a href = "#t:monthly_pageview_usage/0" class = "detail-link" title = "Link to this type" >
2023-11-30 14:51:25 +03:00
< i class = "ri-link-m" aria-hidden = "true" > < / i >
2023-11-30 15:30:44 +03:00
< span class = "sr-only" > Link to this type< / span >
2023-11-30 14:51:25 +03:00
< / a >
2023-11-30 15:30:44 +03:00
< h1 class = "signature" translate = "no" > monthly_pageview_usage()< / h1 >
2023-11-30 14:51:25 +03:00
2023-12-20 17:57:27 +03:00
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/billing/quota.ex#L17" class = "icon-action" rel = "help" title = "View Source" >
2023-11-30 14:51:25 +03:00
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
< / div >
< section class = "docstring" >
2023-11-30 15:30:44 +03:00
< div class = "specs" >
< pre translate = "no" > < span class = "attribute" > @type< / span > monthly_pageview_usage() :: %{required(< a href = "#t:period/0" > period< / a > ()) => < a href = "#t:usage_cycle/0" > usage_cycle< / a > ()}< / pre >
< / div >
2023-12-20 17:57:27 +03:00
< / section >
< / section >
< section class = "detail" id = "t:over_limits_error/0" >
< div class = "detail-header" >
< a href = "#t:over_limits_error/0" class = "detail-link" title = "Link to this type" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< span class = "sr-only" > Link to this type< / span >
< / a >
< h1 class = "signature" translate = "no" > over_limits_error()< / h1 >
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/billing/quota.ex#L15" class = "icon-action" rel = "help" title = "View Source" >
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
< / div >
< section class = "docstring" >
< div class = "specs" >
< pre translate = "no" > < span class = "attribute" > @type< / span > over_limits_error() :: {:over_plan_limits, [< a href = "#t:limit/0" > limit< / a > ()]}< / pre >
< / div >
2023-11-06 17:02:40 +03:00
< / section >
< / section >
2023-11-30 15:30:44 +03:00
< section class = "detail" id = "t:period/0" >
2023-10-26 18:21:35 +03:00
< div class = "detail-header" >
2023-11-30 15:30:44 +03:00
< a href = "#t:period/0" class = "detail-link" title = "Link to this type" >
2023-10-26 18:21:35 +03:00
< i class = "ri-link-m" aria-hidden = "true" > < / i >
2023-11-30 15:30:44 +03:00
< span class = "sr-only" > Link to this type< / span >
2023-10-26 18:21:35 +03:00
< / a >
2023-11-30 15:30:44 +03:00
< h1 class = "signature" translate = "no" > period()< / h1 >
2023-10-26 18:21:35 +03:00
2023-12-20 17:57:27 +03:00
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/billing/quota.ex#L19" class = "icon-action" rel = "help" title = "View Source" >
2023-10-26 18:21:35 +03:00
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
< / div >
< section class = "docstring" >
2023-11-30 14:51:25 +03:00
< div class = "specs" >
2023-11-30 15:30:44 +03:00
< pre translate = "no" > < span class = "attribute" > @type< / span > period() :: :last_30_days | :current_cycle | :last_cycle | :penultimate_cycle< / pre >
2023-11-30 14:51:25 +03:00
< / div >
2023-10-26 18:21:35 +03:00
2023-11-30 15:30:44 +03:00
< / section >
< / section >
< section class = "detail" id = "t:usage_cycle/0" >
< div class = "detail-header" >
< a href = "#t:usage_cycle/0" class = "detail-link" title = "Link to this type" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< span class = "sr-only" > Link to this type< / span >
< / a >
< h1 class = "signature" translate = "no" > usage_cycle()< / h1 >
2023-12-20 17:57:27 +03:00
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/billing/quota.ex#L21" class = "icon-action" rel = "help" title = "View Source" >
2023-11-30 15:30:44 +03:00
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
< / div >
< section class = "docstring" >
< div class = "specs" >
< pre translate = "no" > < span class = "attribute" > @type< / span > usage_cycle() :: %{
date_range: < a href = "https://hexdocs.pm/elixir/Date.Range.html#t:t/0" > Date.Range.t< / a > (),
pageviews: < a href = "https://hexdocs.pm/elixir/typespecs.html#basic-types" > non_neg_integer< / a > (),
custom_events: < a href = "https://hexdocs.pm/elixir/typespecs.html#basic-types" > non_neg_integer< / a > (),
total: < a href = "https://hexdocs.pm/elixir/typespecs.html#basic-types" > non_neg_integer< / a > ()
}< / pre >
< / div >
< / section >
< / section >
< / div >
< / section >
< section id = "functions" class = "details-list" >
< h1 class = "section-heading" >
< a class = "hover-link" href = "#functions" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< / a >
2024-01-11 10:50:44 +03:00
< span class = "text" > Functions< / span >
2023-11-30 15:30:44 +03:00
< / h1 >
< div class = "functions-list" >
< section class = "detail" id = "allowed_features_for/1" >
< div class = "detail-header" >
< a href = "#allowed_features_for/1" class = "detail-link" title = "Link to this function" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< span class = "sr-only" > Link to this function< / span >
< / a >
< h1 class = "signature" translate = "no" > allowed_features_for(user)< / h1 >
2023-12-20 17:57:27 +03:00
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/billing/quota.ex#L433" class = "icon-action" rel = "help" title = "View Source" >
2023-11-30 15:30:44 +03:00
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
< / div >
< section class = "docstring" >
< p > Returns a list of features the user can use. Trial users have the
ability to use all features during their trial.< / p >
2023-10-26 18:21:35 +03:00
< / section >
< / section >
2023-11-30 15:30:44 +03:00
< section class = "detail" id = "below_limit?/2" >
2023-11-30 15:20:12 +03:00
< div class = "detail-header" >
2023-11-30 15:30:44 +03:00
< a href = "#below_limit?/2" class = "detail-link" title = "Link to this function" >
2023-11-30 15:20:12 +03:00
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< span class = "sr-only" > Link to this function< / span >
< / a >
2023-11-30 15:30:44 +03:00
< h1 class = "signature" translate = "no" > below_limit?(usage, limit)< / h1 >
2023-11-30 15:20:12 +03:00
2023-12-20 17:57:27 +03:00
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/billing/quota.ex#L455" class = "icon-action" rel = "help" title = "View Source" >
2023-11-30 15:20:12 +03:00
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
< / div >
< section class = "docstring" >
2023-11-30 14:51:25 +03:00
2023-11-30 15:30:44 +03:00
< div class = "specs" >
< pre translate = "no" > < span class = "attribute" > @spec< / span > below_limit?(< a href = "https://hexdocs.pm/elixir/typespecs.html#basic-types" > non_neg_integer< / a > (), < a href = "https://hexdocs.pm/elixir/typespecs.html#basic-types" > non_neg_integer< / a > () | :unlimited) :: < a href = "https://hexdocs.pm/elixir/typespecs.html#built-in-types" > boolean< / a > ()< / pre >
< / div >
2023-11-30 15:20:12 +03:00
2023-11-30 15:30:44 +03:00
< p > Returns whether the usage is below the limit or not.
Returns false if usage is equal to the limit.< / p >
2023-11-30 15:20:12 +03:00
< / section >
< / section >
2023-12-13 13:48:29 +03:00
< section class = "detail" id = "ensure_can_add_new_site/1" >
< div class = "detail-header" >
< a href = "#ensure_can_add_new_site/1" class = "detail-link" title = "Link to this function" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< span class = "sr-only" > Link to this function< / span >
< / a >
< h1 class = "signature" translate = "no" > ensure_can_add_new_site(user)< / h1 >
2023-12-20 17:57:27 +03:00
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/billing/quota.ex#L100" class = "icon-action" rel = "help" title = "View Source" >
2023-12-13 13:48:29 +03:00
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
< / div >
< section class = "docstring" >
< p > Enterprise plans are always allowed to add more sites (even when
over limit) to avoid service disruption. Their usage is checked
in a background job instead (see < code class = "inline" > check_usage.ex< / code > ).< / p >
< / section >
< / section >
2023-12-20 17:57:27 +03:00
< section class = "detail" id = "ensure_within_plan_limits/3" >
2023-11-30 15:30:44 +03:00
2023-12-20 17:57:27 +03:00
< span id = "ensure_within_plan_limits/2" > < / span >
2023-10-26 18:21:35 +03:00
< div class = "detail-header" >
2023-12-20 17:57:27 +03:00
< a href = "#ensure_within_plan_limits/3" class = "detail-link" title = "Link to this function" >
2023-10-26 18:21:35 +03:00
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< span class = "sr-only" > Link to this function< / span >
< / a >
2023-12-20 17:57:27 +03:00
< h1 class = "signature" translate = "no" > ensure_within_plan_limits(user_or_usage, plan, opts \\ [])< / h1 >
2023-10-26 18:21:35 +03:00
2023-12-20 17:57:27 +03:00
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/billing/quota.ex#L378" class = "icon-action" rel = "help" title = "View Source" >
2023-10-26 18:21:35 +03:00
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
< / div >
< section class = "docstring" >
2023-12-20 17:57:27 +03:00
< div class = "specs" >
< pre translate = "no" > < span class = "attribute" > @spec< / span > ensure_within_plan_limits(
< a href = "Plausible.Auth.User.html#t:t/0" > Plausible.Auth.User.t< / a > () | < a href = "https://hexdocs.pm/elixir/typespecs.html#basic-types" > map< / a > (),
< a href = "https://hexdocs.pm/elixir/typespecs.html#basic-types" > struct< / a > () | < a href = "https://hexdocs.pm/elixir/typespecs.html#basic-types" > atom< / a > () | nil,
< a href = "https://hexdocs.pm/elixir/Keyword.html#t:t/0" > Keyword.t< / a > ()
) ::
:ok | {:error, < a href = "#t:over_limits_error/0" > over_limits_error< / a > ()}< / pre >
< / div >
2023-10-26 18:21:35 +03:00
2023-12-20 17:57:27 +03:00
< p > Ensures that the given user (or the usage map) is within the limits
of the given plan.< / p > < p > An < code class = "inline" > opts< / code > argument can be passed with < code class = "inline" > ignore_pageview_limit: true< / code >
which bypasses the pageview limit check and returns < code class = "inline" > :ok< / code > as long as
the other limits are not exceeded.< / p >
2023-10-11 15:41:12 +03:00
< / section >
< / section >
2023-10-18 11:30:10 +03:00
< section class = "detail" id = "features_usage/1" >
2023-10-11 15:41:12 +03:00
< div class = "detail-header" >
2023-10-18 11:30:10 +03:00
< a href = "#features_usage/1" class = "detail-link" title = "Link to this function" >
2023-10-11 15:41:12 +03:00
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< span class = "sr-only" > Link to this function< / span >
< / a >
2023-10-18 11:30:10 +03:00
< h1 class = "signature" translate = "no" > features_usage(user)< / h1 >
2023-10-11 15:41:12 +03:00
2023-12-20 17:57:27 +03:00
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/billing/quota.ex#L303" class = "icon-action" rel = "help" title = "View Source" >
2023-10-11 15:41:12 +03:00
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
< / div >
< section class = "docstring" >
< div class = "specs" >
2023-11-17 20:44:20 +03:00
< pre translate = "no" > < span class = "attribute" > @spec< / span > features_usage(< a href = "Plausible.Auth.User.html#t:t/0" > Plausible.Auth.User.t< / a > () | < a href = "Plausible.Site.html#t:t/0" > Plausible.Site.t< / a > ()) :: [< a href = "https://hexdocs.pm/elixir/typespecs.html#basic-types" > atom< / a > ()]< / pre >
2023-10-11 15:41:12 +03:00
< / div >
2023-11-17 20:44:20 +03:00
< p > Given a user, this function returns the features used across all the sites
this user owns + StatsAPI if the user has a configured Stats API key.< / p > < p > Given a site, returns the features used by the site.< / p >
2023-10-11 15:41:12 +03:00
< / section >
< / section >
2023-08-24 20:24:31 +03:00
< section class = "detail" id = "monthly_pageview_limit/1" >
< div class = "detail-header" >
< a href = "#monthly_pageview_limit/1" class = "detail-link" title = "Link to this function" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< span class = "sr-only" > Link to this function< / span >
< / a >
2023-12-13 13:48:29 +03:00
< h1 class = "signature" translate = "no" > monthly_pageview_limit(user)< / h1 >
2023-08-24 20:24:31 +03:00
2023-12-20 17:57:27 +03:00
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/billing/quota.ex#L120" class = "icon-action" rel = "help" title = "View Source" >
2023-08-24 20:24:31 +03:00
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
< / div >
< section class = "docstring" >
< div class = "specs" >
2023-12-13 13:48:29 +03:00
< pre translate = "no" > < span class = "attribute" > @spec< / span > monthly_pageview_limit(
< a href = "Plausible.Auth.User.html#t:t/0" > Plausible.Auth.User.t< / a > ()
| Plausible.Billing.Subscription.t()
) ::
2023-08-24 20:24:31 +03:00
< a href = "https://hexdocs.pm/elixir/typespecs.html#basic-types" > non_neg_integer< / a > () | :unlimited< / pre >
< / div >
2023-12-13 13:48:29 +03:00
2023-08-24 20:24:31 +03:00
< / section >
< / section >
2023-12-20 17:57:27 +03:00
< section class = "detail" id = "monthly_pageview_usage/2" >
< span id = "monthly_pageview_usage/1" > < / span >
2023-08-24 20:24:31 +03:00
< div class = "detail-header" >
2023-12-20 17:57:27 +03:00
< a href = "#monthly_pageview_usage/2" class = "detail-link" title = "Link to this function" >
2023-08-24 20:24:31 +03:00
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< span class = "sr-only" > Link to this function< / span >
< / a >
2023-12-20 17:57:27 +03:00
< h1 class = "signature" translate = "no" > monthly_pageview_usage(user, site_ids \\ nil)< / h1 >
2023-08-24 20:24:31 +03:00
2023-12-20 17:57:27 +03:00
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/billing/quota.ex#L172" class = "icon-action" rel = "help" title = "View Source" >
2023-08-24 20:24:31 +03:00
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
< / div >
< section class = "docstring" >
< div class = "specs" >
2023-12-20 17:57:27 +03:00
< pre translate = "no" > < span class = "attribute" > @spec< / span > monthly_pageview_usage(< a href = "Plausible.Auth.User.html#t:t/0" > Plausible.Auth.User.t< / a > (), < a href = "https://hexdocs.pm/elixir/typespecs.html#built-in-types" > list< / a > () | nil) ::
< a href = "#t:monthly_pageview_usage/0" > monthly_pageview_usage< / a > ()< / pre >
2023-08-24 20:24:31 +03:00
< / div >
2023-12-20 17:57:27 +03:00
< p > Queries the ClickHouse database for the monthly pageview usage. If the given user's
subscription is < code class = "inline" > active< / code > , < code class = "inline" > past_due< / code > , or a < code class = "inline" > deleted< / code > (but not yet expired), a map
2024-01-15 17:40:05 +03:00
with the following structure is returned:< / p > < pre > < code class = "makeup elixir" translate = "no" > < span class = "p" data-group-id = "3943935806-1" > %{< / span > < span class = "w" >
< / span > < span class = "ss" > current_cycle< / span > < span class = "p" > :< / span > < span class = "w" > < / span > < span class = "n" > usage_cycle< / span > < span class = "p" data-group-id = "3943935806-2" > (< / span > < span class = "p" data-group-id = "3943935806-2" > )< / span > < span class = "p" > ,< / span > < span class = "w" >
< / span > < span class = "ss" > last_cycle< / span > < span class = "p" > :< / span > < span class = "w" > < / span > < span class = "n" > usage_cycle< / span > < span class = "p" data-group-id = "3943935806-3" > (< / span > < span class = "p" data-group-id = "3943935806-3" > )< / span > < span class = "p" > ,< / span > < span class = "w" >
< / span > < span class = "ss" > penultimate_cycle< / span > < span class = "p" > :< / span > < span class = "w" > < / span > < span class = "n" > usage_cycle< / span > < span class = "p" data-group-id = "3943935806-4" > (< / span > < span class = "p" data-group-id = "3943935806-4" > )< / span > < span class = "w" >
< / span > < span class = "p" data-group-id = "3943935806-1" > }< / span > < / code > < / pre > < p > In all other cases of the subscription status (or a < code class = "inline" > free_10k< / code > subscription which
does not have a < code class = "inline" > last_bill_date< / code > defined) - the following structure is returned:< / p > < pre > < code class = "makeup elixir" translate = "no" > < span class = "p" data-group-id = "4357559577-1" > %{< / span > < span class = "ss" > last_30_days< / span > < span class = "p" > :< / span > < span class = "w" > < / span > < span class = "n" > usage_cycle< / span > < span class = "p" data-group-id = "4357559577-2" > (< / span > < span class = "p" data-group-id = "4357559577-2" > )< / span > < span class = "p" data-group-id = "4357559577-1" > }< / span > < / code > < / pre > < p > Given only a user as input, the usage is queried from across all the sites that the
2023-12-20 17:57:27 +03:00
user owns. Alternatively, given an optional argument of < code class = "inline" > site_ids< / code > , the usage from
across all those sites is queried instead.< / p >
2023-08-24 20:24:31 +03:00
< / section >
< / section >
< section class = "detail" id = "site_limit/1" >
< div class = "detail-header" >
< a href = "#site_limit/1" class = "detail-link" title = "Link to this function" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< span class = "sr-only" > Link to this function< / span >
< / a >
< h1 class = "signature" translate = "no" > site_limit(user)< / h1 >
2023-12-20 17:57:27 +03:00
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/billing/quota.ex#L49" class = "icon-action" rel = "help" title = "View Source" >
2023-08-24 20:24:31 +03:00
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
< / div >
< section class = "docstring" >
< div class = "specs" >
< pre translate = "no" > < span class = "attribute" > @spec< / span > site_limit(< a href = "Plausible.Auth.User.html#t:t/0" > Plausible.Auth.User.t< / a > ()) :: < a href = "https://hexdocs.pm/elixir/typespecs.html#basic-types" > non_neg_integer< / a > () | :unlimited< / pre >
< / div >
2023-12-13 13:48:29 +03:00
2023-08-24 20:24:31 +03:00
< / section >
< / section >
< section class = "detail" id = "site_usage/1" >
< div class = "detail-header" >
< a href = "#site_usage/1" class = "detail-link" title = "Link to this function" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< span class = "sr-only" > Link to this function< / span >
< / a >
< h1 class = "signature" translate = "no" > site_usage(user)< / h1 >
2023-12-20 17:57:27 +03:00
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/billing/quota.ex#L91" class = "icon-action" rel = "help" title = "View Source" >
2023-08-24 20:24:31 +03:00
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
< / div >
< section class = "docstring" >
< div class = "specs" >
< pre translate = "no" > < span class = "attribute" > @spec< / span > site_usage(< a href = "Plausible.Auth.User.html#t:t/0" > Plausible.Auth.User.t< / a > ()) :: < a href = "https://hexdocs.pm/elixir/typespecs.html#basic-types" > non_neg_integer< / a > ()< / pre >
< / div >
< p > Returns the number of sites the given user owns.< / p >
< / section >
< / section >
2023-09-04 15:56:06 +03:00
< section class = "detail" id = "team_member_limit/1" >
< div class = "detail-header" >
< a href = "#team_member_limit/1" class = "detail-link" title = "Link to this function" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< span class = "sr-only" > Link to this function< / span >
< / a >
< h1 class = "signature" translate = "no" > team_member_limit(user)< / h1 >
2023-12-20 17:57:27 +03:00
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/billing/quota.ex#L68" class = "icon-action" rel = "help" title = "View Source" >
2023-09-04 15:56:06 +03:00
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
< / div >
< section class = "docstring" >
< div class = "specs" >
< pre translate = "no" > < span class = "attribute" > @spec< / span > team_member_limit(< a href = "Plausible.Auth.User.html#t:t/0" > Plausible.Auth.User.t< / a > ()) :: < a href = "https://hexdocs.pm/elixir/typespecs.html#basic-types" > non_neg_integer< / a > ()< / pre >
< / div >
2023-12-13 13:48:29 +03:00
2023-09-04 15:56:06 +03:00
< / section >
< / section >
< section class = "detail" id = "team_member_usage/1" >
< div class = "detail-header" >
< a href = "#team_member_usage/1" class = "detail-link" title = "Link to this function" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< span class = "sr-only" > Link to this function< / span >
< / a >
< h1 class = "signature" translate = "no" > team_member_usage(user)< / h1 >
2023-12-20 17:57:27 +03:00
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/billing/quota.ex#L265" class = "icon-action" rel = "help" title = "View Source" >
2023-09-04 15:56:06 +03:00
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
< / div >
< section class = "docstring" >
< div class = "specs" >
< pre translate = "no" > < span class = "attribute" > @spec< / span > team_member_usage(< a href = "Plausible.Auth.User.html#t:t/0" > Plausible.Auth.User.t< / a > ()) :: < a href = "https://hexdocs.pm/elixir/typespecs.html#basic-types" > integer< / a > ()< / pre >
< / div >
2023-12-13 13:48:29 +03:00
< p > Returns the total count of team members associated with the user's sites.< / p > < ul > < li > < p > The given user (i.e. the owner) is not counted as a team member.< / p > < / li > < li > < p > Pending invitations are counted as team members even before accepted.< / p > < / li > < li > < p > Users are counted uniquely - i.e. even if an account is associated with
many sites owned by the given user, they still count as one team member.< / p > < / li > < / ul >
2023-10-26 18:21:35 +03:00
< / section >
< / section >
< section class = "detail" id = "usage/2" >
< span id = "usage/1" > < / span >
< div class = "detail-header" >
< a href = "#usage/2" class = "detail-link" title = "Link to this function" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< span class = "sr-only" > Link to this function< / span >
< / a >
< h1 class = "signature" translate = "no" > usage(user, opts \\ [])< / h1 >
2023-12-20 17:57:27 +03:00
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/billing/quota.ex#L28" class = "icon-action" rel = "help" title = "View Source" >
2023-10-26 18:21:35 +03:00
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
< / div >
< section class = "docstring" >
2023-11-30 15:30:44 +03:00
< / section >
< / section >
2023-12-06 15:02:59 +03:00
< section class = "detail" id = "usage_cycle/4" >
2023-11-30 15:30:44 +03:00
< span id = "usage_cycle/2" > < / span >
2023-12-06 15:02:59 +03:00
< span id = "usage_cycle/3" > < / span >
2023-11-30 15:30:44 +03:00
< div class = "detail-header" >
2023-12-06 15:02:59 +03:00
< a href = "#usage_cycle/4" class = "detail-link" title = "Link to this function" >
2023-11-30 15:30:44 +03:00
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< span class = "sr-only" > Link to this function< / span >
< / a >
2023-12-06 15:02:59 +03:00
< h1 class = "signature" translate = "no" > usage_cycle(user, cycle, owned_site_ids \\ nil, today \\ Timex.today())< / h1 >
2023-11-30 15:30:44 +03:00
2023-12-20 17:57:27 +03:00
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/billing/quota.ex#L195" class = "icon-action" rel = "help" title = "View Source" >
2023-11-30 15:30:44 +03:00
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
< / div >
< section class = "docstring" >
< div class = "specs" >
2023-12-06 15:02:59 +03:00
< pre translate = "no" > < span class = "attribute" > @spec< / span > usage_cycle(< a href = "Plausible.Auth.User.html#t:t/0" > Plausible.Auth.User.t< / a > (), < a href = "#t:period/0" > period< / a > (), < a href = "https://hexdocs.pm/elixir/typespecs.html#built-in-types" > list< / a > () | nil, < a href = "https://hexdocs.pm/elixir/Date.html#t:t/0" > Date.t< / a > ()) ::
< a href = "#t:usage_cycle/0" > usage_cycle< / a > ()< / pre >
2023-11-30 15:30:44 +03:00
< / div >
2023-09-04 15:56:06 +03:00
< / section >
< / section >
2023-08-24 20:24:31 +03:00
< section class = "detail" id = "within_limit?/2" >
< div class = "detail-header" >
< a href = "#within_limit?/2" class = "detail-link" title = "Link to this function" >
< i class = "ri-link-m" aria-hidden = "true" > < / i >
< span class = "sr-only" > Link to this function< / span >
< / a >
< h1 class = "signature" translate = "no" > within_limit?(usage, limit)< / h1 >
2023-12-20 17:57:27 +03:00
< a href = "https://github.com/plausible/analytics/blob/main/lib/plausible/billing/quota.ex#L464" class = "icon-action" rel = "help" title = "View Source" >
2023-08-24 20:24:31 +03:00
< i class = "ri-code-s-slash-line" aria-hidden = "true" > < / i >
< span class = "sr-only" > View Source< / span >
< / a >
< / div >
< section class = "docstring" >
< div class = "specs" >
< pre translate = "no" > < span class = "attribute" > @spec< / span > within_limit?(< a href = "https://hexdocs.pm/elixir/typespecs.html#basic-types" > non_neg_integer< / a > (), < a href = "https://hexdocs.pm/elixir/typespecs.html#basic-types" > non_neg_integer< / a > () | :unlimited) :: < a href = "https://hexdocs.pm/elixir/typespecs.html#built-in-types" > boolean< / a > ()< / pre >
< / div >
2023-11-06 17:02:40 +03:00
< p > Returns whether the usage is within the limit or not.
Returns true if usage is equal to the limit.< / p >
2023-08-24 20:24:31 +03:00
< / section >
< / section >
< / div >
< / section >
< 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
2024-01-11 10:50:44 +03:00
< a href = "https://github.com/elixir-lang/ex_doc" title = "ExDoc" target = "_blank" rel = "help noopener" translate = "no" > ExDoc< / a > (v0.31.0) for the
2023-08-24 20:24:31 +03:00
< a href = "https://elixir-lang.org" title = "Elixir" target = "_blank" translate = "no" > Elixir programming language< / a >
< / p >
< / footer >
< / div >
< / div >
2024-01-11 10:50:44 +03:00
< / main >
2023-08-24 20:24:31 +03:00
< / div >
< script src = "https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js" > < / script >
< script > mermaid . initialize ( { startOnLoad : true } ) < / script >
< / body >
< / html >