How to export Jira worklogs to CSV or Excel — 3 ways that actually work

Written by the developer of Worklog Ledger — option 3 includes our own tool, disclosed where it appears.

The frustrating part first, so the rest makes sense: Jira Cloud has no native export of individual worklog entries. Issue search exports issues with an aggregate "Time Spent" column — not who logged what on which day. And JQL's worklogDate filters which issues match; it does not slice the entries inside them. So "all worklog entries for March, per person" is simply not a thing the Jira UI can hand you. Here's what works instead.

Way 1 — Native issue export (good enough for rough totals)

If per-issue totals are enough (no dates, no per-person split), the built-in export works: Filters → search with worklogDate >= "2026-03-01" AND worklogDate <= "2026-03-31" → add the Time Spent column → Export → CSV/Excel. Two caveats: the Time Spent number is the issue's lifetime logged time, not just March; and entries by different people are merged. Fine for a sanity check, wrong for an invoice.

Way 2 — The REST API (exact, but you maintain a script)

The API returns real entries. The recipe: find issues touched in the range, then pull each issue's worklogs and filter by date and author. A minimal working Python example:

import requests, csv
from requests.auth import HTTPBasicAuth

SITE = "https://your-site.atlassian.net"
AUTH = HTTPBasicAuth("you@company.com", "YOUR_API_TOKEN")  # id.atlassian.com > API tokens
JQL = 'worklogDate >= "2026-03-01" AND worklogDate <= "2026-03-31"'

issues, token = [], None
while True:
    params = {"jql": JQL, "fields": "summary", "maxResults": 100}
    if token: params["nextPageToken"] = token
    page = requests.get(f"{SITE}/rest/api/3/search/jql", params=params, auth=AUTH).json()
    issues += page["issues"]
    token = page.get("nextPageToken")
    if not token: break

rows = []
for issue in issues:
    data = requests.get(f"{SITE}/rest/api/3/issue/{issue['key']}/worklog",
                        params={"maxResults": 1000}, auth=AUTH).json()
    for w in data["worklogs"]:
        day = w["started"][:10]
        if "2026-03-01" <= day <= "2026-03-31":
            rows.append([day, w["author"]["displayName"], issue["key"],
                         issue["fields"]["summary"], w["timeSpentSeconds"] / 3600])

with open("worklogs.csv", "w", newline="") as f:
    csv.writer(f).writerows([["Date", "Person", "Issue", "Summary", "Hours"], *rows])

This is exact and free. The costs are operational: the script lives on one person's machine, API tokens expire (max one year now), rates and client mappings live in a second spreadsheet, and when Atlassian changes an endpoint (the old /search/search/jql migration broke a lot of scripts) it's your morning that goes to fixing it.

Way 3 — Timesheet apps and extensions (recurring use)

If this is a monthly ritual, tooling beats scripts. Two flavors:

Marketplace timesheet apps (Tempo, Clockwork, Worklog360…) install into the Jira site — an admin approves them, pricing is per Jira user, and in exchange you get mature reporting UIs. We compared them in detail in this guide.

Browser extensions skip the admin entirely because they run with your own login. Disclosure — this is our product: Worklog Ledger pulls entry-level worklogs for any date range, lets you map projects to clients with hourly rates and billable flags, and exports an invoice-ready CSV (hours × rate, totals row, opens clean in Excel). The free tier is a weekly worklog calendar; the report/export layer is $7/month for the person running reports. No backend — your worklog data stays in your browser, and the code is open source.

Which way?

One-off rough totals: Way 1. One-off exact export and you're comfortable with an API token: Way 2. Monthly invoicing, approvals-heavy Jira, or a non-technical person running it: Way 3 — a Marketplace app if you have admin rights and budget for every user, an extension if you don't.

Worklog Ledger for Jira — free weekly worklog calendar, invoice-ready CSV export for $7/month per reporting seat. 14-day full trial. See pricing →