Build a report
The report builder. Pick the data, measures and dimensions, filter it, watch the live preview, then save the report to one of your dashboards.
Go to Insights › Reports to build a report from scratch, or start from a ready-made one, and put it on one of your Insights dashboards. The page title is Report Builder.
The settings are in a column on the left. The rest of the page is a live preview of the report as you build it.
You need Build reports (reports.view) and access to Insights.
Each department's Insights has its own builder. Choose Create new in Add a report from Facilities' Insights, for example, and the builder offers only Facilities' own data (its inventory, work orders and tasks) and the reports built on it, counts only Facilities' records, and saves to Facilities' dashboards. In IT, or in an account without departments, the builder offers everything your plan includes.

The header#
Left to right:
- Back to Insights returns to your dashboards without saving.
- Name this report, e.g. Devices by status. The report's title. A report needs a name before you can save it.
- The date range. Starts at All time. It changes the preview of date-based reports, the same way the range on Insights does. It isn't saved with the report: on a dashboard, the dashboard's range applies.
- Templates opens your saved reports, under My reports, reports colleagues shared with you, under Shared with me, and the ready-made reports your plan includes. Pick one of your own to open it and change it: saving updates that report, and, if you shared it, everyone it's shared with sees the change. Pick a shared or ready-made one to load a copy into the form: saving creates a new report of your own and leaves the original alone.
- Schedule appears once the report is one of your saved reports, if you can schedule reports. It emails the report on a schedule. When it already has schedules it reads Scheduled (2). See Schedule a report.
- Save report saves to the place set in its menu. The arrow next to it (Choose where to save) changes that place. See Save a report.
Configuration#
The Configuration column, top to bottom:
- Data source. What the report counts: for example Assets, Repairs, Tickets, Time Logged, Tasks, Audits, Check-ins & Check-outs, Locations, Users, Workflow Runs, or AI Conversations. You see a source only if your plan includes it and you can open the page that shows the same records. See what data you see.
- Visualization. KPI, Bar, Line, Area, Donut, Table, Heatmap (advanced) or Sankey (flow). schoolOS picks one that suits your fields and says Chosen for this data under it. Pick another to override it.
- Measures. The numbers the report calculates: counts, sums or averages, like device count or average age.
- Dimensions. How to break the numbers down. Each value becomes a bar, slice, row or axis category, like by status, location or model. Pick at least one measure or dimension.
- On Tickets, Type is the type (Issue, Outage, Question or Request; a ticket nothing has sorted yet counts as a Question). Topic is the ticket's full topic path, like "Devices › Chromebooks › Broken screen", and Topic Category is its top-level topic, "Devices", however deep the topic sits.
- Room on Assets, Tickets, Audits, Check-ins & Check-outs and Device Health breaks a number down by the room inside the location, reading AHS › 104 as everywhere else; a record at a building alone counts under No room. Use it for the devices or tickets in each classroom.
- Drill-in attributes. Shown once you pick a measure. Lets people select the report on a dashboard and break a number down by these attributes. Leave them empty and the report can't be drilled into.
- Date scope. Shown when the data source has dates. Pick the date the report is based on, or Not date-based. With a date, the dashboard's date range filters this report and the tile shows the range. Without one, the date range never changes it.
- Pick Created date on Tickets for "how many came in", so This month on the dashboard means tickets opened this month. Pick Closed date for "how many we finished".
- Leave it Not date-based for how things stand today, like devices by status: a date range would leave out older devices and make the count look wrong.
- Compare to. Shown once you pick a measure. Shows the report beside earlier periods of the date range: Nothing, Previous period, Same period last year, or Same period, last 2 years and Same period, last 3 years. See Compare periods.
- Sort by. Shown once you pick a dimension. Auto, or any field in the report, then Descending or Ascending.
- Column order. Shown for a Table. Move each column up or down. You can also move a column from its own menu on the table: see Add rows and columns on the table.
- Rows and columns of a table. The first Dimension you pick gives the rows: Status gives a row per status. A second one splits the columns, so Status with Priority is a grid: a row per status, a column per priority, and a Total for each row, each column and the whole table. Each Measure you pick adds a column, or, in a grid, a column under each priority. With no dimension, a table is a single row of totals. You can build all of this on the table itself, too.
- Filters. Limit the report to records that match, before anything is counted. For example status is Open, or location is Library. Every filter applies: a record counts only when it matches all of them. There's no "or" between filters; to match several values of one field, use is any of.
- is any of matches several values of one field at once: status is any of Open and Pending, or priority is any of High and Urgent. Pick the values from the list, or, on a field like assignee, type each one and press Enter. Filters on different fields all apply together, so status is any of Open and Pending and location is Library counts the Library's open and pending tickets. When Otto builds a report or links one from an answer, it does the same, and splits the report by that field: "open and pending tickets" opens as a bar for Open and a bar for Pending. The same goes for devices ("Broken or In Repair"), tasks ("Open or Blocked") and audit results ("Missing or Damaged").
- is none of is the opposite: it leaves out several values of one field at once, like status is none of Closed and Solved. It's offered wherever is any of is, including your own dropdown fields. It counts records without a value the way is not does: a ticket with no status reads as Unknown, so it still counts unless Unknown is one of the values you leave out; a dropdown field you made counts only records that have an answer.
- On Tickets, Imported (Yes or No) and Origin (schoolOS, or the helpdesk a ticket was imported from) tell imported history apart. Filter Imported is No to count only tickets made in schoolOS, or break a report down by Origin to compare them.
Compare periods#
Compare to answers "how does this compare with before?" without a second report. It needs a date range other than All time and a Date scope; until then it's grayed out, and pointing at it says what's missing.
| Choice | Compares the range with | | --- | --- | | Previous period | The same length of time just before it. This month compares with last month, Last 6 months with the 6 months before, a custom week with the week before. | | Same period last year | The same dates a year earlier. | | Same period, last 2 years or 3 years | The same dates in each of those years. |
A range that runs past today is compared to date. This year with Same period, last 2 years is January 1 to today in 2026, 2025 and 2024. A February 29 compares with February 28.
How the comparison shows depends on the report:
- Over time (a Month, Week or Day dimension): one line per period, lined up January with January and week 1 with week 1. The current period is solid in the chart's main color; earlier ones are lighter and dashed. Each is named by its period: 2026 and 2025, This week and Last week, or its dates for a custom range.
- By a category (tickets by category, devices by school): bars grouped per category, one bar per period.
- KPI: the current number, its change against the period before, and the earlier numbers under it.
- Table: a column per period, then Change against the period just before. Percentages change by points.
Hover a point or bar to see every period's value and the change. Select Lower is better when a fall is good news, like resolution time or missing devices: the change then shows green when it falls.
A comparison works on reports with one dimension or none, drawn as a KPI, Line, Area, Bar or Table. A chart compares one measure; a table can compare several. Compare to is saved with the report, so the tile compares whatever range the dashboard is set to. Every period is counted with the same filters and the same access you have for the report itself.
Otto can compare too: ask "tickets this year vs last year" or "devices purchased in 2026 vs 2025 vs 2024", and Open as report opens the same comparison here.

The live preview#
The preview draws exactly what will land on the dashboard, with axis titles added. Until the report has a data source and at least one measure or dimension, it tells you what's missing instead.
- Export saves the preview as an image, a PDF or, when it has rows, a CSV. You don't have to name or save the report first.
- View full screen fills the window with the preview. Press Esc, or select outside it, to go back.
Book value and replacement reports can only count devices that can be valued. When some are left out, a note above the chart says which, and why.
Add rows and columns on the table#
When the report is a Table, you can shape it right on the preview. Each change is the same one you'd make in Configuration, which updates to match, and the report stays a table.
- Break down by… at the start of a table with no rows adds them: pick a field, like Status, for a row per status. Once there are rows, the first column's heading opens the same menu: pick another field to change what the rows are, or Remove breakdown.
- + Column at the end of the header adds a measure as a new column. On a table with rows, it can also Split columns by a second field: tickets by status, split by Priority, becomes a grid with a column per priority and totals.
- A column's heading opens its menu: Move left, Move right or Remove column.
- In a grid, the heading over the columns opens their menu: pick another field, Swap rows and columns, or Remove column groups to go back to one row per status.
A grid's totals are worked out from the records themselves, not by adding up the cells, so an average or a count of people totals correctly. A combination with no records shows a dash.
Change a report with Otto#
With a report open here, open Otto and say what to change. Otto changes the report on screen instead of making a new one:
- "Add Pending" adds a value to a filter, so status is any of Open and Pending.
- "Break it down by school" adds a dimension.
- "Only last 30 days" adds a date filter for the last 30 days.
- "Make it a line chart" changes the visualization.
- "Remove the assignee filter" removes a filter.
The Configuration column and the preview update at once, and Otto's reply says in one line what it changed. A message at the top right says the same, with Undo to put the report back the way it was.
Otto's change isn't saved. It's like a change you make yourself: select Save report to keep it, or leave without saving. Otto only uses fields you could pick yourself, and the report stays on its data source. Ask about something else, like "how many devices are in repair?", and Otto answers it as usual; a report in that answer opens as a new one.
Save a report#
Open the arrow next to Save report to choose where it goes:
- My library only. Keeps the report without putting it on a dashboard. This is the choice to start with, unless you came from a dashboard.
- An existing dashboard. Pick the Dashboard. The report is added at the bottom of that tab's last section.
- A new dashboard. Enter a New dashboard name. schoolOS creates the tab and puts the report on it.
Choosing a dashboard opens Where should this report go?. Select Save here to save, or Cancel and use Save report later.
If you opened the builder from a tab on Insights, it's already set to save to that tab.
Which should I choose?#
| Option | Choose it when | | --- | --- | | My library only | You're not sure where it belongs yet, or you're building it to share: colleagues add it to their own dashboards. | | An existing dashboard | It belongs with reports you already watch, like a new repair chart on your Assets tab. | | A new dashboard | It starts a new topic, like a "Summer refresh" tab for a Chromebook rollout. |
Whichever you pick, the report is in My reports, so you can add it to more dashboards later.
After saving to a dashboard, you land on that tab in Insights. Reports you save are yours: they go into your own dashboards and library, not anyone else's, until you share one.

Every report you save, including one kept with My library only, is listed under My reports, newest first. You find them in two places: Templates here, and Add from library on Insights, which puts one on a dashboard. Otto can find them for you too, and the reports shared with you. Nobody else sees your saved reports unless you share them.
Schedule a report#
Schedule emails one of your saved reports to people in your district every day, every week or every month. You need Schedule report emails (reports.schedule), which admins have unless it was taken away; give it to other roles at the Edit level of Reports on Admin › People › Roles.
Open the saved report (Templates, then My reports), then select Schedule. A report with no schedules opens straight to a new one. Otherwise you see its schedules, and Add a schedule.
-
Send. Every day, Every week on a day you pick, or Every month on a day you pick. Last day sends on the last day of every month; any month without the day you picked sends on its last day.
-
At. The time it's sent, every quarter hour. Times are in your district's time zone, so 7:00 AM stays 7:00 AM when the clocks change.
-
Covers. Shown for a report with a Date scope: the dates it covers each time, like Last week or Last month. All time counts every date. Pick Last week for a Monday morning report on the week before.
-
Attach it as. What's attached depends on the report:
| The report is | Attach it as | | --- | --- | | A chart (KPI, Bar, Line, Area, Donut, Heatmap, Sankey) | PNG image, or PDF with the chart and its rows | | A Table | CSV spreadsheet, or PDF |
-
To. Email addresses, separated by commas. Only addresses on your district's own email domains can get it, or a subdomain of one: with riverbend.k12.us, both [email protected] and [email protected] work, and [email protected] doesn't. Any other address is named and Schedule stays off until you take it out. An admin adds domains under Domains on Admin › Account › Account Settings.
Select Schedule to save it.
What's sent#
Each email is the report as it stands at that time, run with your access: everyone on the list sees what you'd see, never more, even if they can see more or less in schoolOS themselves. The email shows the first rows, says how many there are, attaches the file, and has Open the report in schoolOS, which opens it here (as your own saved report, for you). A report that finds nothing is still sent, and says Nothing matched this report.
Edit the report and save it, and the next email sends the new version. A report that's become a table since you scheduled it as a PNG, or a chart scheduled as a CSV, is sent as a PDF and the email says why.
Change, pause or delete a schedule#
Only you see and change your schedules. In Schedule, each one shows when it's sent, its format and addresses, when it goes next and how the last one went. Edit (the pencil) changes it, Pause stops it until you Resume, and Delete removes it. Pausing and deleting can be undone from the message that appears. Changing the time, or resuming, never sends one you missed: the next email goes at the next scheduled time.
A schedule is skipped, and says why under it, when you no longer have Schedule report emails, you leave the district, the report is deleted, or none of its addresses are on the district's domains anymore. An email that couldn't be sent is tried again a few minutes later.
Change a shared report#
Edit shared report in the Report library opens a shared report in the builder. It's offered to the person who shared it, and to anyone who can manage everyone's shared reports (reports.manage). A note above the preview says who it's shared with. Save shared report saves it for everyone it's shared with and takes you back to Insights. The report still runs with each person's own access.
Was this article helpful?
Related articles
- InsightsYour own dashboards of assets, tickets and AI. Switch tabs, pick a date range, filter or export a report, add reports shared with you, and arrange tabs, sections and reports the way you want them.
- IT DashboardYour devices at a glance. How many you have, what they're worth, which are in repair or missing, and where they are, with the full Assets list behind every number.
- Funding BurndownHow much of each grant or budget is left, month by month, based on the purchase prices of the assets it paid for. Add or change a budget right here.
- User fieldsAdd your own fields to every person's profile, like a badge number or a shirt size. Fill them in when you add someone, on the profile or from an import, and use them as columns, filters and in reports.
- Location fieldsAdd your own fields to every location, like a building number or an emergency contact. Fill them in when you add or edit a location or from an import, and use them as columns, filters and in reports.
Updated October 20, 2026
