> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ontime.hosai.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Custom reports

> Build a report from an existing data source and a chosen set of columns, then edit or delete it.

export const PermissionNote = ({perm}) => <Info>
    Requires the <code>{perm}</code> permission. Ask your administrator if an
    action described here is missing from your screen — see
    [Roles & permissions](/help/concepts/roles-and-permissions).
  </Info>;

<PermissionNote perm="report:write" />

A custom report is a **named selection over an existing source**. You choose the source and which of its columns to include; you do not write a query.

<Note>
  This is deliberate. There is no free-form SQL, no join builder and no filter expression language. A custom report cannot produce data the catalog cannot — it presents the same sources differently.
</Note>

## Building one

<Steps>
  <Step title="Open the builder">
    Reports → **Build new**.
  </Step>

  <Step title="Pick a source">
    The list of runnable sources behind the catalog: daily attendance summary, late arrivals, absentee, punch source, leave balance, leave taken, salary summary, overtime payout, PF/ESI register, TDS, Professional Tax and Form 16 status.

    The source decides what time filter the report will ask for when it runs.
  </Step>

  <Step title="Choose columns">
    A subset of the source's full column set, in the order you want them.
  </Step>

  <Step title="Name it and pick a category">
    The category decides where it appears in the library.
  </Step>

  <Step title="Choose export formats">
    Which of CSV, Excel and PDF this report offers.
  </Step>
</Steps>

## Why source-and-columns rather than a query builder

Each source is a hand-written generator that already handles organization scoping, the correct joins, and the period semantics for its data. Restricting custom reports to a column selection over those generators means a custom report cannot produce a wrong number, and cannot see across organizations.

The trade-off is real: if your question cannot be answered by narrowing an existing source, it cannot be answered as a custom report. Use the [public API](/developers/overview) for those.

## Editing

Name, columns and formats can be changed at any time. The source cannot — a report is tied to its source.

<Tip>
  To change a report's source, build a new one and delete the old. Nothing depends on a report's identity except its schedule.
</Tip>

## Deleting

Custom reports can be deleted. **Catalog reports cannot** — they are read-only, and deleting one is refused.

## Scheduling

Any report, custom or catalog, can be given a delivery schedule — with an important caveat about what "delivery" currently means. See [Scheduling and exports](/help/reports/scheduling-and-exports).
