The Veracity Learning LRS offers several ways to generate custom dashboards. At the most basic level, you can place widgets (charts or lists) on a dashboard page. You can customize each widget with a set of options like what actor, what object, or what verb to use. Beyond that, we offer a set of highly flexible widgets that you can use to build custom bar, pie, and timeseries charts. These widgets include a point-and-click interface to build many common queries. We also offer a fully customizable Custom VQL Query widget, which uses the same query language as our aggregation endpoint. This widget lets you build very sophisticated analyses and pair them with a huge variety of chart options.

For on-premises enterprise customers, you can customize your server with additional widgets through an easy-to-use API.
Custom Dashboards
The most basic way to get additional insight into your data is to use our Custom Dashboard feature. Each custom dashboard can have a set of configurable widgets on it, each of which shows a chart or table.
How to Create a Custom Dashboard
Start by loading the Analytics page for your LRS. Do this by clicking the Analytics button on the left side menu.
Then open the Custom Dashboards menu item on the left and click New Dashboard.
This creates a new custom dashboard and lets you enter a title. Click Create to save the dashboard.
You will now see the new dashboard saved under Custom Dashboards. Click the pencil icon to edit the dashboard.
From here you can add widgets, configure widgets, and rename the dashboard.
To add a widget, click Add a Widget from the menu.
You'll now see a popup with a list of widget types you can select. Click More in the bottom-left to view the full list of widget types to choose from. Choose a widget from the list by clicking it.
Below each widget button is a description of its function.
When you select a widget, one will be added to the dashboard. The layout engine will choose a location and size for the widget, which you can edit later. If the widget expects configuration, its configuration dialog will appear.
Every widget exposes a set of parameters that modify how the widget works. Generally, widgets expose properties to help scope their chart to a particular actor, object, or verb. Many also let you override the global time range. You must click the Ok button to save the parameters. Click the Cancel button to discard the changes.
You can remove, move, and size, and configure widgets with the menu on the top right. These options are only visible when the dashboard is in "Edit mode". Click the Edit Widget icon to launch each widget's configuration dialog. You can move the widget by clicking the top center movement icon, and you can resize it by clicking and dragging the corners. The layout engine will move other widgets around as necessary.
You might find that your parameters result in an empty chart. This simply means that there is not enough data to display a chart.

When you exit Edit mode, if a widget doesn't have enough data to display, then it will be hidden completely.
You can set the title of the dashboard with the Rename option in the left menu. Change the title and click the Rename button to save it.
All custom dashboards will be shown on the list in the left-hand menu. Anyone with Analytics permissions on the LRS can view these dashboards.
The Chart Builder
The Chart Builder widget presents a flexible and user-friendly form for building bar, pie, and timeseries charts, including split or multiple series.
The Chart Builder is divided into four major sections. On the left is the series editor form where you'll make all your configuration changes. Top right is the render preview. Bottom right, you'll find both the full data returned by the analysis, and the computed query Veracity Query Language (VQL). You can use the VQL in a variety of places to reproduce this chart.
Series Editor Form |
| Render Preview
Returned Data (left), Computed VQL Query (right)
|
The render preview will update automatically as you make changes to the chart.
Series Options When Chart Type Is Bar or Pie
- Series Title — This is a title for each series. In a multi series chart, the legend will use this title to label the columns or slices.
- Make a column for each unique value of — This allows you to specify a path into an xAPI statement. The chart builder will generate one column or slice for each unique value found on this path.
- Set the height (or width) of the (column or slice) to — This selects a metric setting the value of the column or slice. By default, the value is the Total Count of the statements that have the given unique value (see above). You can change this to a metric aggregation such as the Average, Sum, Standard Deviation, Minimum, Maximum, or Unique Count across some field.
- Of the values at — When the value of the bar or slice is not the count, you can tell the system what values to include when taking the average, sum, etc. Supply a path into an xAPI statement that selects a number (See note below*).
- Sort By — By default, you'll get the top ten columns or slices by the count of statements that have the unique value on the supplied path. Even if the value of the bars is some metric, you'll still sort by the count by default. If the sort is not set or is Count descending (or Count ascending), then you're showing something like "scores of the most (or least) common students." Set the sort order to Metric descending (or Metric ascending) to show "highest (or lowest) scoring students", which may not include the most frequently seen actors.
- How many columns to show — The number of columns or slices to compute.
- Matching statements where — This lets you filter the dataset based on any path and value.

*If you want to choose an xAPI statement duration property as a value path, then don’t use result.duration. It returns a string value: e.g., PT36.69S. Use meta.duration instead. It returns an integer value, in milliseconds: e.g., 36690.
The below image shows the configuration to find the top ten most frequently seen actors across all data (within the globally selected time range).
This image shows the same actors but makes the value of the bar the average of each actor's scaled score.
Now, we change the sort order to Metric Descending to select the ten actors with the highest average score.
This version adds a filter, so we're seeing the top scoring actors in only the "Data Science" course.
Splitting and Adding Series
A chart can have either one series, which you can optionally "split", or it can have multiple series. You cannot split a series if you have multiple, and you cannot add a second series if you've enabled a split.
Split Series
You can subdivide each bar based on the uniqueness of some other field. Click + Split Series at the bottom to do so. When you add a series split, you'll see these values in the Series Split portion of the form.
This chart shows a bar chart of the most frequent actors, split by the object.
Split series charts ignore the metric of the original series. Instead, the value of the bar is the sum of all its split sections. You can configure the metric for the series split just like the original series.
Multi Series
You can plot two different series side-by-side along the X-axis. The rendering engine will attempt to group the bars by common values on the X-axis. If you don't select a query that generates the same X-axis values for both series, each entire chart will appear in order on the X-axis.
Here's a chart showing students' average scores versus their standard deviation.
This chart plots students in one series and courses in the second. We end up with two different charts side-by-side on the X-axis.
To add a series, click + Add Series at the bottom of the Series Editor form, which adds a blank series that you must fill-in.

Another easier way to add a series is to build the first series, and then click + Duplicate Series inside the form and change the duplicate only as much as needed.
Series Options When Chart Type Is Timeseries
- Series Title — This is a title for each series. In a multi series chart, the legend will use this title to label the lines.
- The field representing the time value is — Choose a path to a time value in the xAPI statements. This is usually either timestamp or stored but could be some extension value.
- Set the value of the line at each time to — This selects a metric setting the value of the series. By default, the value is the Total Count of the statements that fall on the given day. You can change this to a metric aggregation such as the Average, Sum, Standard Deviation, Minimum, Maximum, or Unique Count across some field.
- Of the values at — When the value of the series is not the Total Count, you can tell the system what values to include when taking the average, sum, etc. Supply a path into the xAPI statement that selects a number.
- Matching statements where — This allows you to filter the dataset based on any path and value.
This image shows the total count of statements over time.
This image shows the average score for one course over time.
Split Timeseries
You can split a timeseries chart just like a bar chart.

Some series may not extend to the bounds of the chart, and some series may not have data at every time interval.
Here, we split the above chart by actor.id. Because the default split metric is Total Count, we see the relative traffic over time in this one course for the top ten actors.
Multi Timeseries
A multi time series will simply plot two different lines over each other on the X-axis. The Series Title will be used to label the lines. Here's an example showing the relative traffic over time in two different courses.
The List Builder
The list builder lets you show information in a scrollable list widget. Each list item has a title, a subtitle, and an icon.
The List Builder works almost exactly like the Chart Builder, but with a different rendering. See the documentation on the Chart Builder for information on how to filter and sort data or compute metrics. Unlike the Chart Builder, the List Builder has no option for multi or split series.
The List Builder uses JavaScript string interpolation for setting the title and subtitle of each list item. You can use the template string, ${value.…}, to select some portion of the data. Here's a handy list of values:
- ${value._id} — This is the value of the field selected in the "Make an entry for each unique value of" part of the configuration.
- ${value.canonical.display} — If the value at the _id is the URI of an actor, activity, or verb, then value.canonical will automatically be populated with the canonical representation of the object. value.canonical.display always returns the best available display name for the object. In general, it's best to make lists over the IDs of things and use the canonical value for display. This prevents a change in a course title or actor name from being counted as a new course or actor. The chart renderer does this for you automatically, but you'll need to let us know using the JavaScript syntax in the List Builder.
- ${value.count} — The number of statements that matched the unique value of the list entry.
- ${value.metric} — The computed metric value.

Look in the Returned Data window in the lower-right of the List Builder to see all the values available in the selected path.

You can use expression substitution to perform some simple arithmetic in the interpolated string: like ${value.metric * 100}.
The Metric Builder
The Metric Builder is nearly exactly like the list builder, except it presents only one item as a large, centered title.