Analytics — Askbot 0.12.7 documentation

# Askbot Project Documentation

Home | Ask Questions | Consulting Services | Documentation | Contribute | Contact

# 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:

1. Event collection – a middleware creates sessions for authenticated users and Django signals record events as they happen.

2. Summarization – a management command compiles raw events into hourly and daily summaries, per user and per group.

3. 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_MINUTES`

  Number of minutes of inactivity after which a session is considered expired. Default: `30`.

`ASKBOT_ANALYTICS_EMAIL_DOMAIN_ORGANIZATIONS_ENABLED`

  When `True`, enables grouping users by email domain. The management command `askbot_create_per_email_domain_groups` will create one group per unique email domain found in the user table and assign users to the matching group. These groups are marked with `used_for_analytics=True`. Default: `False`.

`ASKBOT_ANALYTICS_NAMED_SEGMENTS`

  A list of dictionaries defining named user segments. Each dictionary must have the keys: `name`, `slug`, `description`, and `group_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_SEGMENT`

  A dictionary with keys `name`, `slug`, and `description`. 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_analytics`

  Compiles raw events into summary tables. This command should be run periodically (e.g. hourly via cron). It performs these steps:

  1. Summarizes unsummarized events into hourly per-user summaries.

  2. Extracts time-on-site from sessions into hourly summaries.

  3. Rolls up hourly user summaries into daily user summaries and hourly group summaries.

  4. Rolls up hourly group summaries into daily group summaries.

  5. 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:

  `--silent`

    Suppress 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_groups`

  Creates 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`. Requires `ASKBOT_ANALYTICS_EMAIL_DOMAIN_ORGANIZATIONS_ENABLED = True`.

  Options:

  `--silent`

    Suppress progress output.

`askbot_add_test_analytics_content`

  Populates 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:

1. Per-segment stats – shows all named segments, the default segment, and totals.

2. Per-group in segment – within the default segment, shows stats per group (organization).

3. 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-days`

- `last-30-days`

- `this-month`

- `last-month`

- `last-3-months`

- `last-6-months`

- `this-year`

- `last-year`

- `all-time`

## Data model

The analytics data is stored in the following database tables (Django models in `askbot.models.analytics`):

`Session`

  Tracks per-user browsing sessions with IP, user agent, and timestamps. Sessions expire based on the configured timeout.

`Event`

  Individual 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).

`HourlyUserSummary`

  Aggregated counts per user per hour.

`HourlyGroupSummary`

  Aggregated counts per group per hour, including user counts.

`DailyUserSummary`

  Aggregated counts per user per day.

`DailyGroupSummary`

  Aggregated 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.