Creating a Report
A report is an FPL processor: code that queries stored data, shapes it, and emits the tables and widgets that become the report's output. This page walks through authoring one: opening the editor, writing the processor, declaring the arguments that make it reusable, running it and reading the trace and error logs, and saving it so it can be scheduled. If you would rather start from working code than from an empty editor, jump to the Report Cookbook.
Opening the Editor
Add Report
- v2 interface
- Classic v1 interface
On the FPL reports tab of Reports, the + Add Report button opens the report editor at /v2/reports?kind=fpl&action=add with a new, empty report.

What the author lands on: the report's name (New_Report) as the page title, with Validate, Run and Save Processor in the header. Below it, the Name (prefilled with New_Report), Type (Report, read-only), and Description fields, the run status (Idle), and the Code Editor and Output tabs. The Code Editor tab holds an FPL skeleton (function main()) above Trace log and Error log panels, which read No traces available and No errors available for a new report.
From Reports → Processors, the Add Report button leaves the list and opens the report editor at /platform/processors/report with a new, empty report.

What the author lands on: the Code Editor, Output, and Report tabs, with the report name (New Report) and its run status in the toolbar. The Code Editor tab holds an FPL skeleton (function main()) plus Trace Log and Error Log panes, which read No traces available and No errors available for a new report. A Processor Info panel opens on the right with a Details form (a Name field prefilled with New Report, a Type dropdown set to Report, and a Description field) and Save Report at the bottom of the panel.
Cloning an Existing Report
- v2 interface
- Classic v1 interface
Click a report in the FPL reports table to open it in the editor with its FPL. A system report (one supplied with the platform) opens with the note System report. Save under a new name to create a local copy., and its save button reads Save as Processor: change Name and click Save as Processor to make your own copy. It is the fastest path to a first report.

Clone, the only entry in a processor card's ... menu, opens the editor preloaded with the source processor's FPL. It is the fastest path to a first report; the clone opens with the source's name prefilled and an empty description.

Importing a Definition
- v2 interface
- Classic v1 interface
Report definitions are imported from a .json file in the v1 interface, with Import Report on Reports → Processors. This is also how reports move between accounts; the export side is in Scheduling and Delivery.
Import Report on the Processors page opens the Import FPL Report as Processor dialog, which loads report definitions from a .json file and lets you select which to import.

The dialog has an upload area labeled Click here to upload a file (or drop the file on it), a selection table with a checkbox column and Name and Description columns that reads No data available until a file is loaded, and Import and Cancel buttons; Import stays disabled until a file is loaded and a row is selected. This is also how reports move between accounts; the export side is in Scheduling and Delivery.
The Report Editor
Code Editor Tab
The FPL source. A new report opens with a function main() skeleton.
Output Tab
The raw result of the last run: what the processor actually emitted, before rendering. This is where an author checks field names and row counts.
Report Tab
- v2 interface
- Classic v1 interface
The v2 editor has the Code Editor and Output tabs only. The rendered view of the result (the widgets as a reader will see them) is on the Report tab of the v1 editor.
The rendered view of the result: the widgets as a reader will see them.
Trace Log
The processor's trace output, reading No traces available until the report has run. Trace lines emitted by the processor are the primary debugging surface.
Error Log
Runtime errors from the last run, reading No errors available for a new report.
Report Details and Saving
- v2 interface
- Classic v1 interface
The fields above the editor: Name, Type (Report, read-only), and Description, with Validate, Run and Save Processor in the header (Save as Processor for a system report, Update Processor for one already saved). The description is what appears beneath the report's name on the FPL reports tab and in the Scheduler table.
Validate checks the code without running it, and Run works on a report that has not been saved yet, so a report can be tried before it is named. Save Processor stays greyed out until Name is filled in, and once the report is saved its Name is read-only. The notices and the run's output are described under Report Editor.
The Details form on the right (Name, Type (set to Report), and Description) plus Save Report. The description is what appears on the processor card and in the Scheduler table.
Worked Examples
Complete, working report processors live in Appendix → Cookbooks → Reports, covering Azure AD logins, behavior summary, event ingress, an Active Directory resource-loading task, and an Office 365 user-activity investigation. The Report Cookbook page routes to each one and says what it demonstrates.
Related
- Reports: how reporting works end to end
- Report Cookbook: worked report scripts
- Dashboards: rendering the result
- Scheduling and Delivery: running it on a schedule
- Programming Language: FPL reference
- Reports → FPL Reports: the editor and list, control by control (v1: Page Functionality → Processors)
- Appendix → Cookbooks → Reports: existing report scripts