Jira integration
One-way import from Jira Cloud into sprintrr. Encrypted token storage, idempotent re-imports, no write-back to Jira.
sprintrr's M4 feature is a one-way import from Jira Cloud. Connect a workspace, pick a project, preview the field mapping, import. Re-running the import updates existing tasks instead of duplicating them.
When to use it
- You already use Jira and want to evaluate sprintrr's AI features (status updates, transcripts → tasks, risk register, date cascades) on your real data — without re-typing 80 issues.
- You want a one-time migration into sprintrr but keep Jira as the archival source for past work.
- You want to use sprintrr as a sandbox / what-if planner alongside Jira, with periodic re-syncs.
What we do NOT do (yet)
- Two-way sync — sprintrr never writes back to Jira. Out of scope for v1; in roadmap for later if there's customer pull.
- OAuth 2.0 (3LO) — v1 uses API token + email. OAuth is M4.5.
- JQL filters / sprint scoping — v1 imports the top N issues
ordered by
updated DESC. Custom JQL is M4.5. - Custom field mapping — we map the standard fields (see below) and ignore custom fields in v1.
- Auto-create milestones — we map Jira epics to existing milestones by title. We don't create new milestones from epics automatically to avoid silently spawning rows.
Setup
- Go to Settings → Jira integration.
- Paste your Jira Cloud URL (e.g.
https://yourcompany.atlassian.net). - Create an Atlassian API token:
- Open id.atlassian.com/manage-profile/security/api-tokens.
- Click Create API token. (Atlassian also exposes a separate
Create API token with scopes button — both work. Scopes are
optional but recommended; if you scope, grant
read:jira-userandread:jira-workfor full import coverage.) - Give the token a name (e.g. "sprintrr").
- Set an expiry. As of December 15, 2024 the default is 1 year; you can choose 1–365 days. Pre-2024 perpetual tokens have all been auto-expired by Atlassian.
- Atlassian may prompt you for a one-time passcode (password / 3rd-party logins only — SSO and service accounts skip this).
- Copy the token immediately — it's only shown once.
- Paste your Atlassian email + the token into sprintrr.
- Click Connect & verify — sprintrr calls
/rest/api/3/myselfto validate the credentials before persisting. If Atlassian rejects them, you get the exact error inline.
The token is encrypted at rest with AES-256-GCM (the same
BYOK_ENCRYPTION_KEY used for user-supplied AI keys). It never leaves
the server decrypted. When the token expires (1 year by default), sprintrr
will surface a clear connection-failed error on the next import — generate
a new token and reconnect.
Running an import
- Click Import on the integration card.
- Wizard: Pick Jira project → Preview mapping → Pick destination sprintrr project → Run.
- Imports cap at 100 issues by default (hard cap 200 in v1). Status bar reports counts when done.
Re-importing the same Jira project updates existing tasks (matched by
the Jira issue key stored in tasks.external_id). The mapped fields
get overwritten with the latest values from Jira.
Field mapping
| Jira | → sprintrr |
|---|---|
summary | title (truncated to 200 chars) |
description (ADF) | description (flattened to plain text) |
status.statusCategory (done / indeterminate / new) | status (Completed / In Progress / Not Started) |
status name matching block / impediment, or label blocked | status = Blocked |
priority.name | priority (Highest/Critical → High, Low/Trivial → Low, else Medium) |
issuetype.name | category (Bug → Testing, Story → Development, Epic → Strategy, …) |
assignee.emailAddress | assigned_to[] (only matched if the email exists in user_profiles) |
duedate | due_date |
parent.fields.summary (epic) | milestone_id (matched against existing milestones by title) |
key + browse URL | external_id + external_url (renders the "Imported from Jira" badge) |
MCP usage
Imports aren't currently exposed via MCP — the wizard is the only
interface. We may add an MCP import-from-jira action in a later
pass if there's demand from Claude Desktop / Cursor users.
Security + audit
- Token: AES-256-GCM encrypted with
BYOK_ENCRYPTION_KEY, stored asbyteainjira_integrations.encrypted_api_token. Decrypted only in-memory for each Jira API call. - All actions audited:
JIRA_CONNECTED,JIRA_REVOKED,JIRA_IMPORT_STARTED,JIRA_IMPORT_COMPLETED,JIRA_IMPORT_FAILED. - Import emits an
imported_from_jiraactivity event on the destination sprintrr project. - Job history visible at Settings → Jira integration → Recent imports.
- RLS: only the owning user can see their integration row or import job rows.
Roadmap
- JQL filter on the import wizard for projects with thousands of issues.
- Background-job chunking for >200-issue imports.
- OAuth 2.0 (3LO) instead of API token.
- Asana / Linear / ClickUp importers built on the same external_* provenance contract.
- Two-way sync — only if customers ask. Bidirectional sync is a large surface (webhooks, conflict UX, sync state) and not always what users want.