{"result":{"depiction_url":null,"edges":{"observes":{"objects":[{"created":"2026-11-09T11:26:19Z","object_id":{"id":1466,"is_a":["text","documentation","reference","notification"],"name":"doc_notification_admin_menu","title":"observe_admin_menu\/3","uri":"https:\/\/zotonic.com\/id\/1466"},"seq":1},{"created":"2026-11-09T11:26:19Z","object_id":{"id":1816,"is_a":["text","documentation","reference","notification"],"name":"doc_notification_email_failed","title":"observe_email_failed\/2","uri":"https:\/\/zotonic.com\/id\/1816"},"seq":2},{"created":"2026-11-09T11:26:19Z","object_id":{"id":2005,"is_a":["text","documentation","reference","notification"],"name":"doc_notification_module_activate","title":"observe_module_activate\/2","uri":"https:\/\/zotonic.com\/id\/2005"},"seq":3},{"created":"2026-11-09T11:26:19Z","object_id":{"id":2105,"is_a":["text","documentation","reference","notification"],"name":"doc_notification_email_bounced","title":"observe_email_bounced\/2","uri":"https:\/\/zotonic.com\/id\/2105"},"seq":4},{"created":"2026-11-09T11:26:19Z","object_id":{"id":2108,"is_a":["text","documentation","reference","notification"],"name":"doc_notification_email_sent","title":"observe_email_sent\/2","uri":"https:\/\/zotonic.com\/id\/2108"},"seq":5},{"created":"2026-11-09T11:26:19Z","object_id":{"id":2159,"is_a":["text","documentation","reference","notification"],"name":"doc_notification_module_deactivate","title":"observe_module_deactivate\/2","uri":"https:\/\/zotonic.com\/id\/2159"},"seq":6},{"created":"2026-11-09T11:26:19Z","object_id":{"id":2319,"is_a":["text","documentation","reference","notification"],"name":"doc_notification_middleware","title":"observe_middleware\/3","uri":"https:\/\/zotonic.com\/id\/2319"},"seq":7}],"predicate":{"id":2550,"is_a":["meta","predicate"],"name":"observes","title":{"_type":"trans","tr":{"en":"Observes"}},"uri":"https:\/\/zotonic.com\/id\/observes"}},"subject":{"objects":[{"created":"2026-11-09T11:26:19Z","object_id":{"id":2555,"is_a":["categorization","keyword","keyword_information_type"],"name":"zotonic_topic_reference","title":"Reference","uri":"https:\/\/zotonic.com\/id\/2555"},"seq":1},{"created":"2026-11-09T11:26:19Z","object_id":{"id":2564,"is_a":["categorization","keyword","keyword_audience"],"name":"zotonic_topic_backend_developer","title":"Backend developer","uri":"https:\/\/zotonic.com\/id\/2564"},"seq":2},{"created":"2026-11-09T11:26:19Z","object_id":{"id":2566,"is_a":["categorization","keyword","keyword_audience"],"name":"zotonic_topic_operator","title":"Operator","uri":"https:\/\/zotonic.com\/id\/2566"},"seq":3},{"created":"2026-11-09T11:26:19Z","object_id":{"id":2593,"is_a":["categorization","keyword","keyword_domain"],"name":"zotonic_topic_privacy_and_consent","title":"Privacy and consent","uri":"https:\/\/zotonic.com\/id\/2593"},"seq":4},{"created":"2026-11-09T11:26:19Z","object_id":{"id":2595,"is_a":["categorization","keyword","keyword_domain"],"name":"zotonic_topic_email_delivery","title":"Email delivery","uri":"https:\/\/zotonic.com\/id\/2595"},"seq":5},{"created":"2026-11-09T11:26:19Z","object_id":{"id":2607,"is_a":["categorization","keyword","keyword_domain"],"name":"zotonic_topic_logging_and_monitoring","title":"Logging and monitoring","uri":"https:\/\/zotonic.com\/id\/2607"},"seq":6},{"created":"2026-11-09T11:26:19Z","object_id":{"id":2635,"is_a":["categorization","keyword","keyword_architecture"],"name":"zotonic_topic_module","title":"Module","uri":"https:\/\/zotonic.com\/id\/2635"},"seq":7}],"predicate":{"id":308,"is_a":["meta","predicate"],"name":"subject","title":{"_type":"trans","tr":{"en":"Keyword"}},"uri":"http:\/\/purl.org\/dc\/elements\/1.1\/subject"}}},"export_revision":35,"id":3149,"is_a":["text","documentation","reference","module"],"links":[{"rel":"self","target":"https:\/\/zotonic.com\/.zotonic\/websub\/topic\/3149"},{"rel":"hub","target":"https:\/\/zotonic.com\/.zotonic\/websub"}],"medium":null,"medium_url":null,"name":"doc_module_mod_analytics","page_url":{"en":"https:\/\/zotonic.com\/docs\/3149\/mod_analytics","x-default":"https:\/\/zotonic.com\/docs\/3149\/mod_analytics"},"preview_url":null,"resource":{"version":7,"pivot_location_lat":null,"title":"mod_analytics","is_authoritative":true,"body":"<p>Site Analytics provides lightweight local analytics for site traffic, popular content,\nemail activity and module-defined events. Enable <code>mod_analytics<\/code> and open\n<strong>Content → Site Analytics<\/strong>. Configure recordings under <strong>System → Analytics configuration<\/strong>.\nThe default Languages recording starts paused and can be resumed there.<\/p>\n<h2>Permissions and privacy<\/h2>\n<p>Reports require <code>use mod_analytics<\/code>. Configuration and recording mutations require\nsite administrator access (<code>use mod_admin_config<\/code>); the two permissions are independent.\nRequest events exclude users with <code>use mod_admin<\/code> and requests marked <code>analytics_exclude<\/code>.\nDNT and GPC headers do not exclude requests from aggregate analytics. With\n<code>require_consent<\/code> enabled, the context must contain <code>analytics_consent = true<\/code>.\nOrdinary logged-in users are otherwise eligible.\nNo visitor identifiers, tracking cookies or raw request logs are stored.<\/p>\n<h2>Recordings and storage<\/h2>\n<p>Each recording selects one event, fixed filters and at most one breakdown dimension.\nCounters are aggregated asynchronously into capped minute, quarter-hour, hour and day\nslots in the site&#39;s PostgreSQL database. Popular content uses bounded approximate\nrankings over moving periods. These are event counts, not unique visitors.\nIngestion is best-effort: overload can drop events, and reports indicate incomplete data.\nPausing preserves history and its storage reservation; deleting releases the reservation.<\/p>\n<p>Per-site configuration:<\/p>\n<table class=\"table\"><thead><tr><th>Key<\/th><th>Default<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td><code>row_budget<\/code><\/td><td><code>1000000<\/code><\/td><td>Maximum reserved group\/time slots across recordings.<\/td><\/tr><tr><td><code>require_consent<\/code><\/td><td><code>false<\/code><\/td><td>Require explicit context consent for request-associated events.<\/td><\/tr><\/tbody><\/table>\n<h2>Integration<\/h2>\n<p><code>controller_page<\/code> and <code>controller_template<\/code> default to the <code>page<\/code> dispatch analytics type;\n<code>controller_api<\/code> defaults to <code>api<\/code>. Override with <code>{analytics, Type}<\/code>, or disable a route\nwith <code>{analytics, false}<\/code>. Page events count successful public HTML GET responses.\nOther classified requests can include errors and expose HTTP status for filters or breakdowns.\nSMTP observers count sent, retry, failed and bounced notifications independently of requests.<\/p>\n<p>Modules declare namespaced events using the <code>analytics_events<\/code> fold notification and call\n<code>m_analytics:record_event\/3<\/code> for background events or <code>\/4<\/code> with the current request.\nSee <code>m_analytics<\/code> and the application README for calling conventions and schema examples.<\/p>","slug":"mod_analytics","doc_module_config":[{"default":"1000000","description":"Maximum reserved group\/time slots across all retained recordings.","has_default":true,"key":"row_budget","module":"mod_analytics","type":"integer"},{"default":"false","description":"Only collect request events when analytics_consent is true in the request context.","has_default":true,"key":"require_consent","module":"mod_analytics","type":"boolean"}],"is_protected":false,"visible_for":0,"tz":"UTC","language":["en"],"doc_source_hash":"cdc02f9cc7302ebc5edb30196ee539dc04cfb0494fe390b4b4d6412ae7c92ef3","is_featured":false,"content_group_id":{"id":2551,"is_a":["meta","content_group"],"name":"content_group_imported_docs","title":"Imported documentation","uri":"https:\/\/zotonic.com\/id\/content_group_imported_docs"},"category_id":{"id":320,"is_a":["meta","category"],"name":"module","title":"Modules","uri":"https:\/\/test.zotonic.com\/id\/320"},"doc_source_path":"apps\/zotonic_mod_analytics\/src\/mod_analytics.erl","publication_start":"2026-11-09T11:26:19Z","github_url":"https:\/\/github.com\/zotonic\/zotonic\/blob\/master\/apps\/zotonic_mod_analytics\/src\/mod_analytics.erl","pivot_location_lng":null,"doc_source_kind":"module","name":"doc_module_mod_analytics","is_unfindable":false,"is_published":true,"pivot_geocode":null,"created":"2026-11-09T11:26:19Z","uri":null,"doc_status":"current","is_dependent":false,"erlang_app":"zotonic_mod_analytics","publication_end":"9999-06-01T00:00:00Z","modifier_id":{"id":1,"is_a":["person"],"name":"administrator","title":"Site Administrator","uri":"https:\/\/zotonic.com\/id\/1"},"privacy":0,"doc_source_commit":"f3c6a9a2dde17cb5b121dd3e3018d9ef4b1b3943\n","creator_id":{"id":1,"is_a":["person"],"name":"administrator","title":"Site Administrator","uri":"https:\/\/zotonic.com\/id\/1"},"modified":"2026-11-09T21:39:24Z","title_slug":"mod_analytics"},"uri":"https:\/\/zotonic.com\/id\/3149","uri_template":"https:\/\/zotonic.com\/id\/:id","version":35,"websub":{"hub":"https:\/\/zotonic.com\/.zotonic\/websub","topic":"https:\/\/zotonic.com\/.zotonic\/websub\/topic\/3149"}},"status":"ok"}