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.
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.
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.
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.
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.