# Creating Reports via Links (https://jetheads.io/help-center/fundamentals/jettime/integrations/creating-reports-via-links/)

A link can open a new time report in JetTime with its filters, dates and view already set, and build it at once. The link carries a report's settings, not the report: everyone who opens it gets a new report of their own. Share it with a colleague, keep it on a Confluence page, or have an ERP or a reminder service send people straight to the right report: say, a weekly reminder that takes a team lead to their team's hours for last week. Copy such a link with any report's settings, or build it yourself from the parameters below.

## Copy a Link with a Report's Settings [#copy-a-link-with-a-reports-settings]

<Steps>
<Step>
### Set Up the Report [!toc] [#set-up-the-report-toc]
In the main menu, select **Reports**, then open a report or create one. Set its filters and dates, then its view in the **Customize Report** panel.
</Step>
<Step>
### Open the Dialog [!toc] [#open-the-dialog-toc]
In the report, select **…** › **Copy Link with Report Settings**.
</Step>
<Step>
### Choose the Dates [!toc] [#choose-the-dates-toc]
In the **Dates** list, keep the report's own dates, or pick a preset such as **Last month**. A preset is counted from the day someone opens the link, so a link kept on a team's page shows last month's hours every month.
</Step>
<Step>
### Choose Whether the Report Builds [!toc] [#choose-whether-the-report-builds-toc]
With the **Build Report on Open** checkbox selected, the report builds as soon as the link opens. Clear it for a heavy report, say a year across the whole company: the report opens with everything set, and builds once the person who opened it selects the **Build Report** button.
</Step>
<Step>
### Copy the Link [!toc] [#copy-the-link-toc]
Select **Copy**.
</Step>
</Steps>

<BrowserFrame src="/help-center/images/fundamentals/jettime/integrations/creating-reports-via-links/hc-report-copy-link-dialog.png" alt="Screenshot of the Copy Link with Report Settings dialog in JetTime for Jira, putting a time report's filters, dates and view into a link." width={2800} height={1400} />

The same link starts a new report from these settings, which you can adjust and save as your own: see [Duplicating a Report](/help-center/fundamentals/jettime/reporting/customizing-reports/#duplicating-a-report).

## Build a Link Yourself [#build-a-link-yourself]

Another system, such as an ERP, can build the link itself. The quickest way to start: set up a report on screen, copy a link with its settings, then have your system change the dates and the IDs. Every ID the link needs is already there, written the way the link expects.

When JetTime can't read a part of a link, the report still opens with the rest. The sections below say what happens to each part.

### The Link [#the-link]

Every link has this form:

```text
https://<your-site>.atlassian.net/jira/apps/49acb430-4d42-4e89-bfc4-2e418174f486/869fe81a-e316-4e83-8c82-b32bc4ce601b/reports/new?<parameters>
```

Only `<your-site>` changes: JetTime's two IDs in the path are the same on every Jira site.

These are the parameters you can add to the link, after `?`, joined with `&`:

| Parameter | What it sets | Value |
|---|---|---|
| `filters` | The report's filters | JSON, see [Filters](#filters) |
| `dateStart`, `dateEnd` | The report's dates | `YYYY-MM-DD` |
| `datePreset` | The dates, by a preset | `last-month` and others, see [Dates](#dates) |
| `customize` | The report's view: what the **Customize Report** panel sets | JSON, see [The View](#the-view) |
| `intent` | Builds the report as the link opens | `build-report` |

Every parameter is optional, and the order doesn't matter. A parameter the link doesn't give takes its default, the same as in a new report you create with the **Create Report** button on the **Reports** page:

- no filters;
- the current month;
- the default view, listed in [The View](#the-view);
- no build until the person who opened the link selects the **Build Report** button.

Give each parameter once: a repeated one is ignored.

### Encoding [#encoding]

`filters` and `customize` take JSON. Write it in one line and URL-encode the whole value, for example with `encodeURIComponent` in JavaScript. An unencoded `+` reads as a space.

The JSON:

```json
{"Worklog::account":[{"id":"ACME","name":"Acme Corp"}]}
```

The parameter, encoded:

```text
filters=%7B%22Worklog%3A%3Aaccount%22%3A%5B%7B%22id%22%3A%22ACME%22%2C%22name%22%3A%22Acme%20Corp%22%7D%5D%7D
```

### Dates [#dates]

Set the dates in one of two ways:

- **Fixed dates**. Set both `dateStart` and `dateEnd`, as `YYYY-MM-DD`. The report includes both days: `dateStart=2026-11-13&dateEnd=2026-11-13` is one day.
- **A preset**. Set `datePreset` to one of `this-week`, `last-week`, `this-month`, `last-month`, `this-quarter`, `last-quarter`, `this-year`, `last-year`. It is counted from the day someone opens the link, in their browser's time zone. A week starts on the **First Day of the Week** set in **Settings** › **Date and Time**.

Which dates the report takes:

- Fixed dates and a preset: the fixed dates.
- No fixed dates: the preset, or the current month if the link has no preset either.
- Fixed dates JetTime can't read count as no fixed dates: one date alone, a date not written as `YYYY-MM-DD` or not a real day such as `2026-02-30`, or `dateStart` after `dateEnd`.
- An unknown preset counts as no preset.

### Filters [#filters]

`filters` is a JSON object. Each key names a filter, and each value lists that filter's values:

```json
{
  "Issue::project": [
    {
      "id": "10000",
      "name": "ACME: Acme Website"
    },
    {
      "id": "10001",
      "name": "ACMEAPP: Acme Mobile App"
    }
  ],
  "Worklog::account": [
    {
      "id": "ACME",
      "name": "Acme Corp"
    }
  ]
}
```

- A work log must match every filter, and any one value of each. In this example, a work log counts when it is in the Acme Website space or the Acme Mobile App space, and is logged to the **Acme Corp** account.
- `id` identifies the value, and it is always a JSON string: `"10000"`, never `10000`.
- `name` is only a label: the text of the filter's tag in the report's filters section, above the report in JetTime. Leave it out and the tag shows the `id`. A wrong name changes no figure.

Each filter you can put in a link, its key, and what its `id` holds:

| Filter | Key | `id` |
|---|---|---|
| **Work Item** | `Issue::issue` | The work item's numeric ID in Jira, not its key |
| **Space** | `Issue::project` | The space's numeric ID in Jira |
| **Work Item Type** | `Issue::issuetype` | The type's name, such as `Story` |
| **Status** | `Issue::status` | The status's name, such as `In Progress` |
| **Organization** | `Issue::sd-customerorganization` | The Jira Service Management organization's numeric ID |
| **Jira Filter** | `Issue::filter` | The saved Jira filter's numeric ID |
| **Assignee**, **Reporter**, **Creator** | `Issue::loaded::assignee`, `Issue::loaded::reporter`, `Issue::loaded::creator` | The person's Atlassian account ID |
| A select custom field | `Issue::loaded::customfield_<number>`, such as `Issue::loaded::customfield_10050` | The option's numeric ID |
| **Work Log User** | `Worklog::worklog-user` | The person's Atlassian account ID |
| **Account** | `Worklog::account` | The account's **Key** |
| **Team** | `Worklog::team` | The team's **Key** |
| **Role** | `Worklog::function-role` | The function role's **Key** |
| A select work log field | `Worklog::worklog-field::<field key>` | The option's text, such as `Development` |
| A checkbox work log field | `Worklog::worklog-field::<field key>` | `"true"` or `"false"` |

Where to find what goes into the link:

- **An account, a team or a function role**. Its key is the `id` of the filter value. It is in the **Key** column of the **Accounts** and **Teams** lists, and of **Settings** › **Function Roles**.
- **A work log field**. Its key is part of the filter key: `Worklog::worklog-field::<field key>`. It is in the **Key** column of **Settings** › **Work Log Fields**. The `id` is then the option's text, or `"true"` or `"false"` for a checkbox. Only single-select, multi-select and checkbox fields work as filters: text and number fields don't.
- **Jira's numeric IDs**. They come from the [Jira REST API](https://developer.atlassian.com/cloud/jira/platform/rest/v3/).

If something in `filters` is wrong:

- A filter your site doesn't have, such as a deleted work log field or a mistyped key, is ignored. The other filters apply.
- Every filter of the link is ignored when `filters` holds a value in the wrong shape (a number `id`, or no `id`), a filter with no values, or JSON that doesn't parse.
- A wrong `id` is not ignored: JetTime can't tell it from one that matches no work. The report comes out empty, or fails to load. Check the IDs before you send a link.

### The View [#the-view]

`customize` is a JSON object of what the **Customize Report** panel sets. Give any of its settings. A setting the link doesn't give takes a new report's default, in the last column.

| Key | Setting | Value | If not given |
|---|---|---|---|
| `viewMode` | **View Mode** | `Timesheet` for **Worksheet**, or `Table` | **Worksheet** |
| `timeGrouping` | **Grouping** | A list of field IDs, the top level first | **Space** › **Work Item** |
| `defaultCollapse` | **Default Collapse** | `expand-all`, `collapse-all`, or a grouping field's ID for **Collapse Below** that field | **Expand All** |
| `columns` | **Columns** | A list of field IDs | **Key** |
| `totalColumns` | **Total Columns** | A list of metric IDs | **Regular Time** |
| `timesheetMetric` | **Worksheet Metric** | One metric ID | **Regular Time** |
| `timesheetBreakdown` | **Worksheet Breakdown** | `Days`, `Weeks`, `Months` or `Quarters` | **Days** |
| `timeFormat` | **Duration Format** | `Human`, `Time`, `Minutes`, `Hours` or `Man-Days` | The one set in **Settings** › **Date and Time** |
| `isDurationUnitHidden` | **Hide Unit** | `true` or `false` | Off |

These defaults can change: with the **Duration Format** set in **Settings** › **Date and Time**, or in a later version of JetTime. A link that must look the same for years gives every setting. The dialog's link always does.

If something in `customize` is wrong:

- An unknown setting, or a value outside its list, is ignored on its own. The other settings apply.
- A `customize` that isn't a JSON object is ignored whole.
- A field or a metric your site doesn't have, such as a deleted time category, is ignored without a message, as a saved report ignores it.
- A `defaultCollapse` naming a field outside the grouping turns into **Expand All**.

### Field and Metric IDs [#field-and-metric-ids]

The **Grouping**, **Columns** and **Default Collapse** settings take field IDs:

| Field | ID |
|---|---|
| **Work Item** | `Issue::issue` |
| **Key** | `Issue::key` |
| **Space** | `Issue::loaded::project` |
| Any other Jira field a report offers, standard or custom | `Issue::loaded::<Jira field id>`, such as `Issue::loaded::status`, `Issue::loaded::customfield_10050` |
| A level of the work item hierarchy | `Issue::hierarchy::<level>`: `1` for epics, `0` for stories and tasks, `-1` for sub-tasks, `2` and up for the levels above epic |
| **Work Log** | `Worklog::worklog` |
| **Work Log User** | `Worklog::worklog-user` |
| **Work Log Date** | `Worklog::worklog-date` |
| **Work Log Date and Time** | `Worklog::worklog-date-time` |
| **Work Log Month** | `Worklog::worklog-month` |
| **Work Log Year** | `Worklog::worklog-year` |
| **Work Log Time Zone** | `Worklog::worklog-time-zone` |
| **Work Log Created** | `Worklog::worklog-created` |
| **Work Log Updated** | `Worklog::worklog-updated` |
| **Work Description** | `Worklog::work-description` |
| **Account** | `Worklog::account` |
| **Team** | `Worklog::team` |
| **Role** | `Worklog::function-role` |
| A custom work log field | `Worklog::worklog-field::<field key>` |

The **Total Columns** and **Worksheet Metric** settings take metric IDs:

| Metric | ID |
|---|---|
| **Regular Time** | `Worklog::time-category::REGULAR` |
| A custom time category | `Worklog::time-category::<category key>`, such as `Worklog::time-category::BILLABLE` |
| A number work log field | `Worklog::worklog-field::<field key>`, such as `Worklog::worklog-field::EXPENSE` |

A time category's key is in the **Key** column of **Settings** › **Time Categories**.

### Build Report on Open [#build-report-on-open]

Add `intent=build-report` to build the report as the link opens. Without it, the report opens with everything set, and builds once the person who opened it selects the **Build Report** button. An unknown `intent` is ignored.

A link with an ignored filter doesn't build at once, even with `intent=build-report`. Without that filter, the report could cover the whole site.

## Examples [#examples]

Each example shows its parameters, then the whole link, encoded.

### Hours in One Space for a Date Range [#hours-in-one-space-for-a-date-range]

October's work logs in one space, grouped by **Space** › **Work Log User** › **Work Item** › **Work Log** in the **Table** view, built at once:

`filters`:

```json
{
  "Issue::project": [
    {
      "id": "10000",
      "name": "ACME: Acme Website"
    }
  ]
}
```

`customize`:

```json
{
  "viewMode": "Table",
  "timeGrouping": [
    "Issue::loaded::project",
    "Worklog::worklog-user",
    "Issue::issue",
    "Worklog::worklog"
  ]
}
```

The other parameters: `dateStart=2026-10-01`, `dateEnd=2026-10-31`, `intent=build-report`. The whole link, encoded:

```text
https://<your-site>.atlassian.net/jira/apps/49acb430-4d42-4e89-bfc4-2e418174f486/869fe81a-e316-4e83-8c82-b32bc4ce601b/reports/new?filters=%7B%22Issue%3A%3Aproject%22%3A%5B%7B%22id%22%3A%2210000%22%2C%22name%22%3A%22ACME%3A%20Acme%20Website%22%7D%5D%7D&dateStart=2026-10-01&dateEnd=2026-10-31&customize=%7B%22viewMode%22%3A%22Table%22%2C%22timeGrouping%22%3A%5B%22Issue%3A%3Aloaded%3A%3Aproject%22%2C%22Worklog%3A%3Aworklog-user%22%2C%22Issue%3A%3Aissue%22%2C%22Worklog%3A%3Aworklog%22%5D%7D&intent=build-report
```

### One Person's Worksheet for One Day [#one-persons-worksheet-for-one-day]

Your system sends this link in a reminder to someone who logged fewer hours than their day requires. It opens their work logs of that day in the **Worksheet** view:

`filters`:

```json
{
  "Worklog::worklog-user": [
    {
      "id": "5b10ac8d82e05b22cc7d4ef5",
      "name": "Mia Krause"
    }
  ]
}
```

`customize`:

```json
{
  "viewMode": "Timesheet",
  "timeGrouping": [
    "Issue::loaded::project",
    "Issue::issue",
    "Worklog::worklog"
  ],
  "timesheetBreakdown": "Days"
}
```

The other parameters: `dateStart=2026-11-13`, `dateEnd=2026-11-13`, `intent=build-report`. The whole link, encoded:

```text
https://<your-site>.atlassian.net/jira/apps/49acb430-4d42-4e89-bfc4-2e418174f486/869fe81a-e316-4e83-8c82-b32bc4ce601b/reports/new?filters=%7B%22Worklog%3A%3Aworklog-user%22%3A%5B%7B%22id%22%3A%225b10ac8d82e05b22cc7d4ef5%22%2C%22name%22%3A%22Mia%20Krause%22%7D%5D%7D&dateStart=2026-11-13&dateEnd=2026-11-13&customize=%7B%22viewMode%22%3A%22Timesheet%22%2C%22timeGrouping%22%3A%5B%22Issue%3A%3Aloaded%3A%3Aproject%22%2C%22Issue%3A%3Aissue%22%2C%22Worklog%3A%3Aworklog%22%5D%2C%22timesheetBreakdown%22%3A%22Days%22%7D&intent=build-report
```

### Last Month's Hours of One Account [#last-months-hours-of-one-account]

A link kept on a Confluence page your team reads. It groups the account's hours by role and person, shows **Regular Time** week by week, and totals **Regular Time** and **Billable Time**. Each month it opens on the month before:

`filters`:

```json
{
  "Worklog::account": [
    {
      "id": "ACME",
      "name": "Acme Corp"
    }
  ]
}
```

`customize`:

```json
{
  "timeGrouping": [
    "Worklog::function-role",
    "Worklog::worklog-user"
  ],
  "totalColumns": [
    "Worklog::time-category::REGULAR",
    "Worklog::time-category::BILLABLE"
  ],
  "timesheetBreakdown": "Weeks",
  "timeFormat": "Hours"
}
```

The other parameters: `datePreset=last-month`, `intent=build-report`. The whole link, encoded:

```text
https://<your-site>.atlassian.net/jira/apps/49acb430-4d42-4e89-bfc4-2e418174f486/869fe81a-e316-4e83-8c82-b32bc4ce601b/reports/new?filters=%7B%22Worklog%3A%3Aaccount%22%3A%5B%7B%22id%22%3A%22ACME%22%2C%22name%22%3A%22Acme%20Corp%22%7D%5D%7D&datePreset=last-month&customize=%7B%22timeGrouping%22%3A%5B%22Worklog%3A%3Afunction-role%22%2C%22Worklog%3A%3Aworklog-user%22%5D%2C%22totalColumns%22%3A%5B%22Worklog%3A%3Atime-category%3A%3AREGULAR%22%2C%22Worklog%3A%3Atime-category%3A%3ABILLABLE%22%5D%2C%22timesheetBreakdown%22%3A%22Weeks%22%2C%22timeFormat%22%3A%22Hours%22%7D&intent=build-report
```

## Good to Know [#good-to-know]

- **A link shares settings, not data**. Anyone who can open **Reports** can open it, and sees only the work logs their permissions allow.
- **A link is a snapshot**. It holds the settings as they were when you copied it: later edits to the report don't reach it. Copy a new link.
- **A link's report is new and unsaved**. It opens untitled. To keep it as it opened, select its title, enter a name in the **Rename Report** dialog and select **Save**. After a change, select the **Save Report** button to keep it. It is saved as the report of whoever opened the link; the report the settings came from stays its owner's alone.
- **A link works on one site**. It opens on the Jira site it was made for.
