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

# Report filters

> Filter a report down to the rows you want. Every filter field, all ten operators, include and exclude, and how AND groups combine with OR conditions.

A filter decides which records a report counts. With no filter, the report includes every record in the period.

## How filters are structured

Filters are built from **groups** and **conditions**.

* **Conditions inside one group are joined with OR.** Any one of them may match.
* **Groups are joined with AND.** Every group must match.

That gives you one level of nesting, which is enough to express almost any question without becoming unreadable.

```
Group 1: Billable is true
 AND
Group 2: Project is Website Redesign
 OR
 Project is Monthly Retainer
```

This reads: billable time on either of those two projects.

## The parts of a condition

Every condition has four parts.

| Part                  | What it does                                 |
| --------------------- | -------------------------------------------- |
| **Include / Exclude** | Whether matching records are kept or dropped |
| **Field**             | Which field to test                          |
| **Operator**          | How to test it                               |
| **Value**             | What to test it against                      |

**Exclude** negates that one condition before its group is combined. `Exclude – Billable – is – true` keeps everything that is not billable.

## The ten operators

| Operator   | Reads as            | Value you give | Keeps or drops                            |
| ---------- | ------------------- | -------------- | ----------------------------------------- |
| `eq`       | **is**              | One value      | Keeps matches                             |
| `neq`      | **is not**          | One value      | Drops matches                             |
| `in`       | **is any of**       | A list         | Keeps matches                             |
| `nin`      | **is none of**      | A list         | Drops matches                             |
| `contains` | **contains**        | Text           | Keeps matches                             |
| `gt`       | **is greater than** | A number       | Keeps matches                             |
| `gte`      | **is at least**     | A number       | Keeps matches                             |
| `lt`       | **is less than**    | A number       | Keeps matches                             |
| `lte`      | **is at most**      | A number       | Keeps matches                             |
| `exists`   | **is set**          | Nothing        | Keeps records where the field has a value |

<Note>
  **is any of** and **is none of** take a list. When the field has a picker you tick several values. When it does not, type them separated by commas: `draft, sent, overdue`.
</Note>

### Number fields only get number operators

Some fields hold a number – an amount, a duration, a date. On those, only **is greater than**, **is at least**, **is less than**, **is at most** and **is set** are offered.

**is** and **is not** are deliberately not available on a number field. They compare text against a number, so **is** would match nothing and **is not** would match everything, and both would look like a working filter while quietly giving the wrong answer.

If you switch a condition from a text field to a number field, TimeTracker repairs the operator for you. It moves to **is at least** and clears the value. If the operator was already valid for both, your choice is kept.

## What you can filter on

The filter field list is exactly the column list – every field of the report's source that you may see and that the source can calculate. Cost and revenue fields do not appear for a role that cannot view them.

### Time entries

**Fields:** Date, Day, Week, Month, Quarter, Year, Day of week, Member, Project, Task, Client, Billable, Approval status, Timesheet status, Invoice status, Source, Group, Manager, Job title, Employment type.

**Number fields:** Date, Reported time, Labor cost, Revenue, Profit, Billing rate.

### Expenses

**Fields:** the five date buckets, Member, Group, Category, Project, Client, Billable, Date, Approval status, Invoice status.

**Number fields:** Date, Expense cost, Billable value.

### Invoices

**Fields:** the five date buckets, Invoice, Client, Status, Date, AR aging.

**Number fields:** Invoice (the number), Date, Invoice total, Subtotal, Discount, Tax, Paid, Outstanding.

### Projects

**Fields:** the five date buckets, Project, Client, Status, Health.

**Number fields:** Budget, Actual cost, Tracked value, Forecast margin, Invoiced.

### Tasks

**Fields:** the five date buckets, Task, Assignee, Group, Section, Status, Priority.

**Number fields:** Estimate (h), Tracked, Remaining (h).

### Timesheets

**Fields:** the five date buckets, Status, Member, Period, Group, Manager, Employment type.

**Number fields:** Submitted, Approved.

### Time off

**Fields:** the five date buckets, Policy, Member, Group, Status, Unit.

**Number fields:** Days, Hours.

### Timecard

**Fields:** the five date buckets, Member, Status, Group.

**Number fields:** Scheduled, Worked, Late, Left early, Over scheduled.

<Note>
  Counts and percentages are never filterable. A count belongs to a whole group, not to one record, so there is nothing on a single record to compare it against.
</Note>

## Pickers versus free text

Some fields hold an id behind the scenes – a member, a group, a project, a client, a tag. Typing a name against those would match nothing, so TimeTracker gives you a **picker** of real values instead.

| Field kind                | Value control        |
| ------------------------- | -------------------- |
| Member, Manager, Assignee | A picker of people   |
| Group                     | A picker of groups   |
| Project                   | A picker of projects |
| Client                    | A picker of clients  |
| Everything else           | A text or number box |

With **is any of** or **is none of**, the picker becomes multi-select.

Each picker is permission-checked on the server. If your role may not read the list, the field falls back to a text box rather than showing an empty picker that would look like "there are none".

## How to add a filter

<Steps>
  <Step title="Open Filters">
    In the report builder, open the **Filters** section. With nothing set it reads: *"No filters. The report includes every row in the period."*
  </Step>

  <Step title="Add a group">
    Click **Add group**. A bordered box appears with one starter condition.
  </Step>

  <Step title="Set the condition">
    Choose **Include** or **Exclude**, pick the field, pick the operator, then set the value.
  </Step>

  <Step title="Add an OR">
    Click **Add condition** inside the same group. The new row is joined to the one above with **OR**.
  </Step>

  <Step title="Add an AND">
    Click **Add group** again. The new group is joined to the previous one with **AND**.
  </Step>

  <Step title="Remove something">
    The **X** on a condition row removes that condition. The **X** at the bottom of a group removes the whole group. It only appears when there is more than one group.
  </Step>
</Steps>

## Example

Priya Raman wants billable, unbilled work on Northwind Studio's two Bluebird Coffee projects.

| Group | Conditions                                                                 |
| ----- | -------------------------------------------------------------------------- |
| 1     | Include – **Billable** – is – `true`                                       |
| 2     | Include – **Project** – is any of – `Website Redesign`, `Monthly Retainer` |
| 3     | Include – **Invoice status** – is – `uninvoiced`                           |

All three groups must match, so the report shows only billable, uninvoiced time on those two projects. She adds the **Uninvoiced time** and **Revenue** columns and now has the money still on the table.

To exclude one person from the same report, she adds a fourth group: Exclude – **Member** – is – `Ana Ferreira`.

## Temporary filters in the viewer

A report you cannot edit still lets you change the filters. Those changes are temporary and never touch the saved report.

A banner appears while a temporary filter is active:

> **Temporary preview**
> You're previewing with temporary filters. They won't change this saved report.

Two buttons sit beside it. **Reset** clears the overrides. **Save as new report** keeps them as a fresh report, and only appears if you can create reports.

## Permissions

You do not need a separate capability to filter. What you can filter on follows what you can see:

* A cost field only appears if your role holds `time.viewCost`.
* A billing field only appears if your role holds `rate.viewBilling`.
* Roster fields only appear if your role can read the roster.
* A picker only loads values your role is allowed to read.

The server re-checks every filter field on every run. A filter naming a field you may not see is refused, not silently ignored.

## What happens next

Filters are part of the saved report, so they travel with it into exports and scheduled emails. A scheduled report runs its saved filters, not whatever you last previewed.

## Common questions

<AccordionGroup>
  <Accordion title="How do I say 'A and B' on the same field?">
    Put each condition in its own group. Groups are joined with AND. Two conditions in one group would be OR.
  </Accordion>

  <Accordion title="What is the difference between 'is not' and Exclude?">
    They land in the same place for a single condition. **Exclude** is clearer when you want to negate a picker-based condition such as *is any of*, because you keep the list and flip the whole thing.
  </Accordion>

  <Accordion title="Why can I not use 'is' on an amount?">
    An amount is a number and the value box collects text. **is** would match nothing and **is not** would match everything. Use **is at least** or **is at most** instead.
  </Accordion>

  <Accordion title="Why is my field showing a text box instead of a picker?">
    Either the field's value is the human text already – a job title, an employment type, billable – or your role may not read the underlying list.
  </Accordion>

  <Accordion title="Can I filter on a total?">
    No. Counts, distinct counts and percentages describe a group, not a record, so there is nothing to test per row. Filter on the underlying field instead.
  </Accordion>
</AccordionGroup>

## Troubleshooting

| Message                                                                             | Meaning                                                      | Fix                                   |
| ----------------------------------------------------------------------------------- | ------------------------------------------------------------ | ------------------------------------- |
| *"This report can't filter on X. Remove that filter."*                              | The field is not on this source, or your role may not see it | Remove the condition or switch source |
| *"X holds a number, so 'is' doesn't apply. Use greater than or less than instead."* | A text operator on a number field                            | Change the operator                   |
| The report is suddenly empty                                                        | An AND group is too narrow                                   | Remove one group at a time to find it |
| A picker shows no options                                                           | The list has not loaded, or your role may not read it        | Reopen the section, or ask an admin   |

## Related guides

<CardGroup cols={2}>
  <Card title="Build a report" icon="wrench" href="/reports/build-a-report">
    The whole builder, section by section.
  </Card>

  <Card title="Report sources" icon="database" href="/reports/report-sources">
    Which fields each source offers.
  </Card>

  <Card title="Grouping and pivots" icon="folder-tree" href="/reports/grouping-and-pivots">
    Nest rows and read subtotals.
  </Card>

  <Card title="Date ranges and periods" icon="calendar" href="/reports/date-ranges-and-periods">
    The period is a filter too.
  </Card>

  <Card title="Report permissions" icon="lock" href="/reports/report-permissions">
    Why some fields never appear.
  </Card>
</CardGroup>
