License¶
JiraBundle is a paid plugin. Kimai time tracking always runs unlicensed, but the plugin's own Jira features — worklog sync, import, and the live issue lookup — only run with a valid license key. This page covers how to buy the license, where the key comes from, the two ways to set it, and exactly what happens when a subscription lapses or the key can't be checked.
Buy a license¶
JiraBundle is sold as a 49 €/year subscription. Purchase it here: Buy JiraBundle — 49 €/year.
After checkout, the signed license key arrives by email. Paste it in Kimai under System → Settings → Jira — Setting the key below covers both ways to provide it and which one wins.
A listing on the Kimai marketplace has been submitted but is not yet live; until then, the checkout link above is the way to buy.
Where the key comes from¶
You receive the license key by email when you purchase the subscription — the same delivery as the
release ZIP. It is a signed token (v1.<payload>.<signature>); paste it verbatim, including the
v1. prefix.
Setting the key¶
There are two ways to provide it, and they have a deliberate precedence:
- Environment variable
JIRA_LICENSE_KEY— for container and automated deploys. This wins. If it is set and non-empty, the plugin uses it and ignores the system-configuration value. - System configuration — as an admin, open System → Settings → Jira and paste the key into
the license key field. Used whenever
JIRA_LICENSE_KEYis unset or empty.
The environment variable overrides the settings field
If JIRA_LICENSE_KEY is set, editing the key under System → Settings → Jira has no effect —
the env var is read first and short-circuits the lookup. On a containerised deploy, manage the
key through the env var and leave the settings field blank to avoid confusion.
Offline verification¶
The key is verified entirely offline. It carries an Ed25519 signature that the plugin checks against an embedded public key — no call to any server is needed to run the plugin. An air-gapped install with a valid, unexpired key works with no outbound network at all (subject to the offline-staleness clock below).
The grace window: what stops, and when¶
When a license expires, is revoked, or goes stale (see below), Jira features do not cut off immediately. There is a 14-day grace window: features keep working, and Kimai surfaces an escalating banner counting down the days remaining. The banner reads:
Jira subscription lapsed — sync keeps working for N more day(s), then Jira features are disabled. Renew and update the license key under System settings.
Once the 14 days pass, the plugin's Jira features switch off:
- Worklog sync (inline on timesheet save, and the
kimai:jira:syncreconciler) pauses. Pending worklogs are not lost — they stay queued and drain once a valid key is active again. - Import (
kimai:jira:import) is disabled and exits without importing. - Live issue lookup (the advisory issue-key validation on the timesheet form) goes quiet — it returns nothing, exactly like an unreachable Jira, and never blocks saving a timesheet.
Kimai core, timesheet entry, and all existing data are never touched. This gate only ever decides whether the plugin's own Jira behaviour runs.
If no key is configured at all (rather than an expired one), the same features are off, and the banner instead prompts you to paste the key you received on purchase.
The daily revocation heartbeat rides kimai:jira:sync¶
Verification is offline, but the plugin still needs a way to notice a revoked subscription (a
refund or chargeback). It does this with a once-per-day revocation heartbeat that runs from the
kimai:jira:sync cron. The heartbeat is fail-open: only an explicit "revoked/inactive" answer
from the licensing service starts the grace clock. An unreachable endpoint, a non-2xx response, or
unparsable JSON is recorded as "unknown" and never disables a working instance.
Schedule kimai:jira:sync, or your paid install degrades on its own
The kimai:jira:sync cron is the only thing that resets the offline-staleness clock (below).
The plugin's live features — inline worklog sync on timesheet save, issue lookup — work without
the cron, so it is easy to leave it unscheduled. But then a paid, online install still degrades
its Jira features after roughly 44 days, computed as 30 days offline-staleness + 14 days
grace — because it never checks in. Schedule the cron (see Configure → Cron),
or set JIRA_LICENSE_OFFLINE_GRACE_DAYS=0 to disable the offline clock entirely.
The offline-staleness clock (air-gapped installs)¶
Fail-open on its own would let a copy that permanently blocks the licensing host evade revocation forever. To bound that, the plugin runs an offline-staleness clock: after 30 days with no successful contact with the licensing service, staleness starts the same 14-day grace-then-disable window. That is where the ~44-day figure comes from — 30 (stale) + 14 (grace).
- The clock is anchored to when this install first checked in (its first-seen time), not to when the key was issued — so restoring from a backup with an older key never starts you already-lapsed.
- Any successful daily heartbeat resets it, so a normally-connected install never trips it.
- The window is set by
JIRA_LICENSE_OFFLINE_GRACE_DAYS(default30):- raise it for intermittently-connected sites, or
- set it to
0to disable the offline clock entirely for a legitimately air-gapped install.
Air-gapped installs
On a deliberately offline install, set JIRA_LICENSE_OFFLINE_GRACE_DAYS=0. The signed key stays
authoritative for its full lifetime, and the offline clock never applies. You will not receive
revocation updates — that is the trade for running fully decoupled from the licensing service.
Renewal and expiry¶
- Renew by updating the key — paste the new key under System → Settings → Jira, or update
the
JIRA_LICENSE_KEYenv var. On the nextkimai:jira:syncrun the heartbeat re-checks the subscription and re-activates features; any queued worklogs then drain. - A prolonged outage of the licensing service itself (~44 days: 30 stale + 14 grace) will
eventually disable Jira features on otherwise-healthy, online, paid installs. Kimai and your data
stay untouched, and the plugin self-heals on the next successful check. If that trade-off
matters — air-gapped, deliberately offline, or you want to fully decouple from vendor-side
availability — set
JIRA_LICENSE_OFFLINE_GRACE_DAYS=0.
If Jira features stop unexpectedly, see Troubleshooting → Jira features stopped working.