Security & privacy

Written for the people who sign off on the app rather than use it: security review, data protection and works councils. Every answer here follows from how the app is built.

The short version

QuestionAnswer
Where does the app run?Entirely on the Atlassian Forge platform, inside your Atlassian tenant. There is no vendor-operated infrastructure in the path, and we as the vendor never receive your data.
Does any data leave Atlassian?Only to your own mail system, and only once an administrator connects it. Then names, mailbox addresses and absence dates go to your Microsoft 365 or Google Workspace tenant — the hosts are listed below. Never the absence type, never the private reason.
Are there sub-processors?We engage none. Microsoft or Google process the data as part of the Microsoft 365 or Google Workspace service you already use, under your own agreement with them. No analytics or telemetry is bundled.
What does the app read from mailboxes?For the optional import: the window of a scheduled automatic reply and the start and end of calendar entries marked out of office. Never messages, subjects, bodies, attendees or locations.
Whose mailbox can the app write to?Only a mailbox its owner linked — with a code sent to it, or, if an administrator allows it, through the Atlassian account’s own address within the allowed domains.
Where are credentials kept?In Forge secret storage, write-only: no screen and no API returns a stored client secret or key. Access tokens are kept in memory only and never logged.
Is “sick” visible to colleagues?No. For a type marked sensitive, the team view shows others only “Absent”, enforced on the server. No type is ever sent to a mailbox.
Can personal data be deleted?Yes. An administrator can delete all data of a person in one step — including their mailbox link, and the automatic reply and calendar entries the app wrote — also without an active subscription.
Runs on Atlassian?No, because the app connects to Microsoft or Google. The app itself still runs only on Forge.

Data residency

The app has no servers of its own. It reads and writes Jira through Atlassian’s own APIs and keeps absence records, configuration and credentials in Forge storage, so your Atlassian site’s data residency configuration governs that data, as it governs the rest of Jira. What the mail integration sends goes directly from Forge to your Microsoft 365 or Google Workspace tenant, where it is stored like any other automatic reply or calendar entry — under the data residency of that tenant. Nothing passes through, or is copied to, infrastructure of ours.

External connections

Every host the app may call, as declared in its manifest. Forge blocks any other. None is called before an administrator connects the mail system.

HostUsed forWhat it receives
login.microsoftonline.comMicrosoft 365: sign-in of the app (OAuth 2.0 client credentials)The app registration’s id and secret — no end-user data
graph.microsoft.comMicrosoft 365: e-mails, automatic replies, calendar entries; reading for the import; change notificationsNames, mailbox addresses, absence time windows, e-mail and automatic-reply texts
oauth2.googleapis.comGoogle Workspace: sign-in of the service account (domain-wide delegation)A signed assertion naming the mailbox the app acts as
gmail.googleapis.comGoogle Workspace: e-mails and the vacation responderNames, mailbox addresses, absence time windows, texts
www.googleapis.comGoogle Workspace: calendar entries; reading for the import; push channelsMailbox addresses, absence time windows, calendar-entry ids

Inbound: Microsoft and Google notify the app about calendar changes through a Forge web trigger. A call is accepted only with the secret of a channel the app opened itself (compared against a stored hash), and it can do nothing but prompt a fresh read of that one person’s calendar.

What is stored

People appear as Atlassian account IDs. Mailbox addresses are stored only for people who linked one.

DataPersonal data?Retention
Absence records: requester, approver, substitute and decider account IDs, dates, absence type, status, decision note, coverage projects, the team the request was routed throughYesUntil deleted: by an administrator, by the optional retention period, or when Atlassian reports the account as closed
Optional free-text reason on an absenceYes, potentially sensitive (for example sick leave). Never sent anywhereWith its absence record
Linked mailbox: address, how it was verified, the person’s own switches and automatic-reply textYesUntil the person unlinks it, or their data is deleted
Pending verification: address and a hash of the codeYes15 minutes
Sync and import bookkeeping: the mailbox written to, calendar-entry ids, what was sent, the dates of imported windowsYesWith the absence; import data on unlink, opt-out or deletion
Mail credentials: client secret or service-account keyNoIn Forge secret storage until an administrator deletes them
Configuration and its change history (who changed which setting, never the values)Account IDs of approvers and administratorsUntil you change it; history pruned with the retention period

Logs contain only event names, opaque IDs, counts and result codes; never names, addresses, texts, reasons or tokens. After uninstalling, Atlassian deletes the app’s storage: it is kept for 28 days, then permanently deleted. Automatic replies and calendar entries already written stay in the mailboxes, under your control; delete a person’s data beforehand to remove theirs.

Permissions (Forge scopes)

The app requests ten Atlassian scopes. None is specific to Jira Service Management, and there is no project-admin, board or dashboard scope. The two general Jira issue scopes, marked broad, grant more than the app uses; background changes are confined to the projects an administrator selected.

ScopeWhy it is needed
storage:appStore the app’s own data in Forge storage: configuration, absence records, mailbox links, sync and import bookkeeping, the change history; credentials in secret storage.
read:jira-workbroadFind a person’s open issues and read an issue’s assignee and project; verify Jira administrator permission and the requester’s Assign issues permission in the covered projects.
write:jira-workbroadReassign issues to the substitute, hand them back on return, post the warning comment (internal on Jira Service Management requests) and store its de-duplication marker.
read:jira-userLook up users and groups for the pickers, a person’s language for e-mails, and — only if an administrator allows it — the e-mail address Atlassian holds for an account.
report:personal-dataSend the weekly report Atlassian requires of apps that store account IDs, so the data of closed accounts can be deleted.
view:team:teamsSearch and read Atlassian Teams, so an administrator can link one of the app’s teams to one.
view:membership:teamsRead the members of a linked Atlassian Team, for approval routing and team visibility.
read:accountRead a team member’s account ID and account status, so only active accounts count.
read:app-data:jiraRead the app’s own cached answers for the absence search function, so they can be refreshed.
write:app-data:jiraRewrite those cached answers every hour, so a saved filter does not go on matching people who are already back.

In your mail system the app needs, depending on the provider: Microsoft Graph application permissions Mail.Send, MailboxSettings.ReadWrite and Calendars.ReadWrite (limit them to the relevant mailboxes with an Exchange Online application access policy), or Google scopes gmail.send, gmail.settings.basic and calendar.events via domain-wide delegation. The import needs no further permission.

Controls reviewers ask about

ControlImplementation
IdentityAlways re-derived from the Forge context on the server, never taken from the request. Self-service mail actions act on the signed-in person only.
Administrator actionsMail settings, credentials, the connection test and every other admin action re-verify Jira administrator permission on the server. Placement on an admin page is not treated as authorization.
Mailbox ownershipA random 6-digit code, stored only as a hash bound to account and address, compared in constant time, valid 15 minutes, 5 tries, a new one after 60 seconds. Every stored link is re-checked against the allowed domains at each use.
CredentialsValidated, stored with Forge secret storage, never returned. Tokens cached in memory only, never persisted or logged.
What is sentE-mail and automatic-reply texts are built on the server; every inserted value is escaped, subjects are single-line. The absence type and reason are never part of them.
ImportReads only time windows. What the app wrote itself is recognised and never imported back; imported absences are never written back to the mailbox.
Public web triggerAccepts only notifications that carry the secret of a channel the app opened, size-capped; a verified call only queues a fresh read, at most once per person and minute.
ApprovalsOnly the approver pool, the requester’s own team approvers or a Jira administrator may decide, never the requester. Re-checked against the stored record on every decision.
Sensitive absence typesIn the team view, the server replaces a sensitive type with “Absent” for everyone except the requester, an entitled approver and Jira administrators.
Background reassignmentRuns as the app, limited to the administrator-selected projects in which the requester held Assign issues when submitting the request.
Erasure and retention“Delete all data of a person” removes absences, mailbox link and the items the app wrote to their mailbox; weekly clean-up of closed accounts; optional retention period.
Input validationEvery payload is checked for type, length, allowed values and ID formats; e-mail addresses with a strict, linear-time pattern. User input is never interpolated into JQL or URLs unescaped.

What we do not claim

  • No certification is claimed here. If your process requires a specific attestation, ask us and you will get a straight answer about what does and does not exist.
  • The app is not “Runs on Atlassian”. Its purpose is to connect Jira with your mail system.
  • The app cannot prevent an assignment. Forge offers no blocking hook; the warning comes just after the change.
  • One automatic reply per mailbox. Microsoft and Google keep one automatic-reply setting per mailbox. Cancelling an absence switches it off — also one the person set by hand in the meantime.
  • Uninstalling does not remove what the app wrote. Automatic replies and calendar entries in mailboxes, warning comments on issues, stay under your control.

Reporting a security concern

Raise a request in our support portal and say in the subject that it is a security report, or e-mail support@vi2va.de. Please never include private absence reasons, client secrets, keys, passwords or other secrets; we will never ask for them.

Plan the next holiday season before it starts

Set up absence types and approvers, connect Microsoft 365 or Google Workspace and link a pilot group in under an hour. Jira keeps working while you do.