Analytics¶
Note
Analytics is a new feature — your feedback is much appreciated! Please share your thoughts and suggestions via the usual channels.
Askbot includes a built-in analytics system that tracks user activity on the forum. It records events such as questions asked, answers posted, votes cast, content viewed, and time spent on site. The data is aggregated into hourly and daily summaries per user and per group.
Analytics pages are accessible only to administrators and moderators,
at the URL path /analytics/.
Overview¶
The analytics system has three layers:
Event collection – a middleware creates sessions for authenticated users and Django signals record events as they happen.
Summarization – a management command compiles raw events into hourly and daily summaries, per user and per group.
Reporting – two web views present the data: the Users view shows aggregated statistics by segment/group/user, and the Activity view shows an event log with filtering.
Tracked events¶
The following event types are recorded:
Event type |
Trigger |
|---|---|
User registered |
User completes registration |
Logged in |
User logs in |
Logged out |
User logs out |
Question viewed |
Authenticated user opens a question page |
Answer viewed |
Authenticated user views an answer |
Upvoted |
User upvotes a post |
Downvoted |
User downvotes a post |
Vote canceled |
User cancels a vote |
Question asked |
User posts a new question |
Answer posted |
User posts a new answer |
Question commented |
User comments on a question |
Answer commented |
User comments on an answer |
Question retagged |
Tags on a question are changed |
Sessions and time on site¶
The AnalyticsSessionMiddleware creates or updates a session record
for every authenticated request. A session expires after a configurable
inactivity timeout (default 30 minutes). Time on site is calculated
from session start to last activity within each hourly window.
Configuration¶
Groups must have the used_for_analytics flag set to True to
participate in analytics — that is, to appear in filtering,
summarization, and segmentation. By default this flag is False,
so groups are invisible to the analytics system unless explicitly
enabled. You can set the flag manually via Django admin, or it is
set automatically by the askbot_create_per_email_domain_groups
management command.
Analytics settings are defined in settings.py using the
ASKBOT_ prefix. They are static settings (not changeable via the
admin UI at runtime).
ASKBOT_ANALYTICS_SESSION_TIMEOUT_MINUTESNumber of minutes of inactivity after which a session is considered expired. Default:
30.ASKBOT_ANALYTICS_EMAIL_DOMAIN_ORGANIZATIONS_ENABLEDWhen
True, enables grouping users by email domain. The management commandaskbot_create_per_email_domain_groupswill create one group per unique email domain found in the user table and assign users to the matching group. These groups are marked withused_for_analytics=True. Default:False.ASKBOT_ANALYTICS_NAMED_SEGMENTSA list of dictionaries defining named user segments. Each dictionary must have the keys:
name,slug,description, andgroup_ids(a list of Askbot Group ids). Named segments appear as top-level rows in the Users analytics view. Default:[].Example:
ASKBOT_ANALYTICS_NAMED_SEGMENTS = [ { 'name': 'Engineering', 'slug': 'engineering', 'description': 'Engineering team members', 'group_ids': [10, 11, 12], }, ]
ASKBOT_ANALYTICS_DEFAULT_SEGMENTA dictionary with keys
name,slug, anddescription. This segment captures all users who do not belong to any of the named segments, for example - your customers. It appears after the named segments in the Users view. Default:{}(empty – must be configured if segments are used).Example:
ASKBOT_ANALYTICS_DEFAULT_SEGMENT = { 'name': 'Customers', 'slug': 'customers', 'description': 'Our Customers', }
Middleware setup¶
The analytics session middleware must be included in
MIDDLEWARE in your settings.py:
MIDDLEWARE = [
...
'django.contrib.auth.middleware.AuthenticationMiddleware',
'askbot.middleware.analytics_session.AnalyticsSessionMiddleware',
...
]
This middleware is included by default when a new site is created with
askbot-setup.
Management commands¶
askbot_compile_analyticsCompiles raw events into summary tables. This command should be run periodically (e.g. hourly via cron). It performs these steps:
Summarizes unsummarized events into hourly per-user summaries.
Extracts time-on-site from sessions into hourly summaries.
Rolls up hourly user summaries into daily user summaries and hourly group summaries.
Rolls up hourly group summaries into daily group summaries.
Finalizes daily group summaries with user counts.
Only completed hours and completed days are summarized, so the command is safe to run at any time.
Options:
--silentSuppress progress output.
Example cron entry (run every hour):
0 * * * * cd /path/to/project && python manage.py askbot_compile_analytics --silent
askbot_create_per_email_domain_groupsCreates one group per unique email domain found among users and assigns each user to the corresponding group. Groups are marked with
used_for_analytics=True. RequiresASKBOT_ANALYTICS_EMAIL_DOMAIN_ORGANIZATIONS_ENABLED = True.Options:
--silentSuppress progress output.
askbot_add_test_analytics_contentPopulates the database with synthetic analytics sessions and events based on existing user activity. Useful for development and testing.
Web interface¶
The analytics pages are at /analytics/ and require administrator
or moderator privileges.
Users view¶
URL pattern: /analytics/users/<users_segment>/<dates>/
Shows aggregated statistics (questions, answers, votes, views, time on site, user counts) broken down by segment. Drill-down navigation:
Per-segment stats – shows all named segments, the default segment, and totals.
Per-group in segment – within the default segment, shows stats per group (organization).
Per-user in group – shows individual user stats within a group or named segment.
Activity view¶
URL pattern:
/analytics/activity/<activity_segment>/<content_segment>/<users_segment>/<dates>/
Shows a paginated event log with filters:
Activity segment – filter by event type (e.g.
question-posted,content-voted,all-activity).Content segment – filter by thread or post (e.g.
thread:123,post:456,all-content).Users segment – filter by user, group, named segment, or
all-users.
Date ranges¶
Both views accept the following date range values:
last-7-dayslast-30-daysthis-monthlast-monthlast-3-monthslast-6-monthsthis-yearlast-yearall-time
Data model¶
The analytics data is stored in the following database tables
(Django models in askbot.models.analytics):
SessionTracks per-user browsing sessions with IP, user agent, and timestamps. Sessions expire based on the configured timeout.
EventIndividual analytics events, each linked to a session, with an event type, timestamp, and a generic foreign key to the related object (user, post, or thread).
HourlyUserSummaryAggregated counts per user per hour.
HourlyGroupSummaryAggregated counts per group per hour, including user counts.
DailyUserSummaryAggregated counts per user per day.
DailyGroupSummaryAggregated counts per group per day, including user counts.
Summary fields tracked: num_questions, num_answers,
num_upvotes, num_downvotes, question_views,
time_on_site. Group summaries additionally track num_users
and num_users_added.
Google Analytics (external)¶
Askbot also supports embedding a Google Analytics tracking snippet. This is configured separately via the admin UI under External Services > Keys for external services > Google Analytics key. Set the key to your Google Analytics tracking ID and the snippet will be included in all pages.

