CAHABA FORGE
  • Home
  • Features
  • Docs
  • Data Center
  • About
  • Contact

Privacy Policy

Business Sign-off & Approval for Jira Cloud

Effective Date: February 17, 2026
Last Updated: April 25, 2026
Vendor: Cahaba Forge LLC

Overview

Business Sign-off & Approval for Jira Cloud is built on the Atlassian Forge platform and runs entirely within Atlassian’s cloud infrastructure. The app does not transmit any data to Cahaba Forge LLC, third-party services, or any external endpoint. All data is stored using Atlassian Forge Storage and Jira Cloud APIs, and resides within Atlassian’s infrastructure in the same region as your Jira Cloud site.

In the event of any conflict between this Privacy Policy and the Cahaba Forge Data Processing Addendum (DPA) with respect to the processing of Personal Data on behalf of a Licensee, the DPA shall control.

1. Information We Collect

Business Sign-off reads and writes data exclusively within Atlassian’s platform. It does not collect, transmit, or store data outside Atlassian’s infrastructure.

Data Read from Jira (Not Stored by the App)

The app reads the following Jira data during normal operation. This data is accessed via Jira Cloud REST APIs and is never transmitted outside the Atlassian platform:

  • User information: Account IDs, display names, email addresses (transient — see note below), group memberships, and project role assignments (used for approver management, permission checks, eligible approver filtering, and email notifications)
  • Issue information: Issue keys, IDs, summaries, types, priorities, statuses, reporter, and assignee (used for panel display, Separation of Duties checks, and audit context)
  • Project information: Project keys, IDs, and project role configurations (used for permission checks and project-level configuration)
  • Workflow information: Transition context during workflow post function and validator execution

Note on email addresses: The app reads email addresses from the Jira user API at runtime for display purposes in the issue panel. Email addresses are not persisted in Forge Storage or any app-managed data store. They are transient — fetched on demand and discarded after the response is sent.

Data Stored by the App

The app stores data using Atlassian Forge Storage (a managed key-value store provided by Atlassian) and Jira issue properties. All storage keys are prefixed with bsf: for Forge Storage or bso. for Jira issue properties.

Approver Records

One record per approver assignment on each issue.

Field Data Purpose
issueId Jira issue internal ID Links approver to issue
accountId Atlassian account ID (opaque identifier) Identifies the approver
status ADDED, PENDING, APPROVED, RETURNED Tracks decision state
decisionComment Free-text (up to 450 characters) Approver’s decision comment
createdDate ISO timestamp When the approver was assigned
createdByAccountId Atlassian account ID Who assigned the approver
decisionDate ISO timestamp When the decision was made
lastNotifiedDate ISO timestamp When the approver was last emailed
decisionAtStatusId Jira status ID Issue status at time of decision (for decision locking)
sodViolation Boolean Whether a Separation of Duties conflict exists
sodReason Text Reason for SoD conflict (e.g., “assignee”)
pseudonymizedAt ISO timestamp (optional) When the record was pseudonymized for GDPR compliance

Approval History (Audit Trail)

Append-only audit trail records for compliance. Each record captures a point-in-time snapshot of the action context and is integrity-protected with a SHA-256 hash.

Field Data Purpose
id UUID Unique record identifier
issueId, projectKey, issueKey Issue identifiers Links record to issue
issueSummary, issueType, issuePriority, issueStatus Issue snapshot Captures issue state at action time
action Action type (e.g., DECISION_APPROVED, APPROVER_ADDED) What happened
timestamp ISO timestamp When it happened
actorAccountId, actorDisplayName Actor snapshot Who performed the action
targetAccountId, targetDisplayName Target snapshot The approver acted upon
reporterAccountId, reporterDisplayName Reporter snapshot Issue reporter at action time
assigneeAccountId, assigneeDisplayName Assignee snapshot Issue assignee at action time
previousApprovalStatus, newApprovalStatus State change Before/after values
source UI, WORKFLOW_POST_FUNCTION, EVENT_TRIGGER How the action was initiated
sodResult PASS, FAIL, NOT_APPLICABLE SoD validation outcome
comment Decision comment Text provided with the decision
integrityHash SHA-256 hex string Tamper-detection hash
pseudonymizedAt ISO timestamp (optional) When the record was pseudonymized for GDPR compliance

Note on display names in audit records: The audit trail intentionally stores user display names as point-in-time snapshots. This is a compliance requirement — auditors need to see who acted and how they were identified at the time of the action, even if the user’s details later change. Email addresses are not stored in audit records. The Forge version uses Atlassian account IDs (opaque, non-PII identifiers) as the primary user reference.

Admin Audit Log

Records administrative actions (configuration changes, plugin enable/disable) for accountability.

Field Data Purpose
id UUID Unique record identifier
action Action type (e.g., GLOBAL_CONFIG_CHANGED, PLUGIN_DISABLED) What happened
timestamp ISO timestamp When it happened
actorAccountId Atlassian account ID Who performed the action
actorDisplayName Display name snapshot Actor identity at action time
source UI, WORKFLOW_POST_FUNCTION, EVENT_TRIGGER How the action was initiated
affectedObject, affectedObjectType Text What was changed
projectKey Project key or null For project-scoped changes
changedFields Array of {field, fieldKey, from, to} Configuration changes (old → new values)
details Text or null Additional context for the action
integrityHash SHA-256 hex string Tamper-detection hash
pseudonymizedAt ISO timestamp (optional) When the record was pseudonymized for GDPR compliance

Global and Project Configuration

Plugin configuration settings. These contain no personal data — only feature toggles, thresholds, and permission rules.

  • Global configuration: Plugin enabled/disabled, approval thresholds, SoD rules, comment requirements, eligible approver mode and filters, approver management permissions, decision locking, diagnostic logging toggle
  • Project configuration: Per-project overrides for the above settings, plus panel visibility, issue type filtering, and email notification preferences

Export Task Records

Tracks background CSV export operations. Records are transient — those older than 72 hours are purged when the admin page is next accessed.

Field Data Purpose
taskId UUID Task identifier
state RUNNING, COMPLETED, FAILED Task progress
progress Number (0–100) Completion percentage
progressMessage Text or null Current progress description
requestedByAccountId Atlassian account ID Who initiated the export
request Export parameters (project keys, date range, decisions-only filter) Query criteria
createdAt ISO timestamp When the export was initiated
completedAt ISO timestamp or null When the export finished
recordCount Number or null Total records exported
chunkCount Number or null Number of CSV data chunks
errorMessage Text or null Error details if the export failed
CSV data chunks Serialized CSV (up to 30KB per chunk) Export output

Jira Custom Fields

The app creates two Jira custom fields that are visible on issues:

  • BSO – Approvers: A user-type field containing the list of approver account IDs for the issue. Data is synced from Forge Storage to enable JQL search and column display.
  • BSO – Status: A read-only string field showing the current approval status (e.g., “Awaiting Decisions”, “Approval Passed”). Contains no personal data.

Jira Issue Properties

The app writes a single issue property (bso-signoff) containing approval statistics:

Field Data Contains PII?
status Approval status string No
approvedCount, returnedCount, pendingCount, totalApprovers Counts No
percentage, threshold Numbers No
approvalRequired, pluginActive Booleans No
lastUpdated ISO timestamp No

This property contains no personal data — only aggregate statistics. It enables JQL queries on approval status.

Jira Issue Properties — Immutable Audit Trail

In addition to the bso-signoff statistics property, the app writes compliance-critical approval decision events to individual issue properties using the key pattern bso.approval.audit.NNNN (4-digit zero-padded sequence).

An additional index property (bso.approval.audit.index) tracks the current sequence number.

Each audit event property contains a JSON record with:

Field Data Purpose
schemaVersion Number Property schema version for forward compatibility
sequence Number Zero-padded sequence within the issue
eventType DECISION_APPROVED, DECISION_RETURNED, DECISION_CHANGED, DECISION_RESET, STATUS_CHANGED, RE_REVIEW_REQUESTED What happened
eventSource UI, WORKFLOW_POST_FUNCTION, EVENT_TRIGGER How the action was initiated
eventTime ISO timestamp When it happened
issueContext Issue ID, key, project key, summary, type, priority, status, reporter, assignee Issue state snapshot at action time
actor Account ID and display name Who performed the action
target Account ID and display name, or null The approver acted upon
previousApprovalStatus, newApprovalStatus State change Before/after values
sodResult PASS, FAIL, NOT_APPLICABLE, or null SoD validation outcome
comment Decision comment text or null Text provided with the decision
recordHash SHA-256 hex string Hash of this event’s content
previousHash SHA-256 hex string or null Hash of the preceding event (chain integrity)
pseudonymizedAt ISO timestamp (optional) When the record was pseudonymized for GDPR compliance

These properties are native Jira data and survive app uninstall. They are designed to provide a permanent, verifiable audit trail within the customer’s Jira instance.

Approver Index

A per-issue list of Atlassian account IDs (bsf:issue-approvers:{issueId}) used for efficient lookup. Contains the same account IDs as the individual approver records.

Known Accounts Registry

The app maintains a single record (bsf:known-accounts) listing every Atlassian account ID that appears anywhere in the app’s stored data, along with an ISO timestamp of the last time the app touched data for that account. This registry is used solely to feed Atlassian’s Personal Data Reporting API on a weekly basis, as required for Marketplace apps that store personal data. The registry contains only opaque Atlassian account IDs — no display names, email addresses, or other personal information. Account IDs are removed from the registry once the corresponding user has been closed by Atlassian and the app has completed pseudonymization for that account.

Licensing

Licensing is managed entirely by Atlassian through the Jira Cloud Marketplace. The app does not store license keys, license validation data, or licensing-related personal data. The app checks license status at runtime via the Forge licensing API.

2. How We Use Information

All data processing occurs within Atlassian’s platform for the following purposes:

  • Approver management: Assigning, removing, and tracking approval decisions on issues
  • Permission enforcement: Verifying that users have appropriate Jira permissions and meet eligibility criteria before performing actions
  • Segregation of Duties: Preventing reporters/assignees from serving as approvers when SoD rules are configured
  • Audit trail: Recording every approval-related action with full context for compliance reporting
  • Email notifications: Sending approval-related notifications to approvers, reporters, and assignees using Jira’s built-in notification API (/rest/api/3/issue/{key}/notify)
  • Status calculation: Computing approval pass/fail status based on configured thresholds
  • Custom field sync: Keeping BSO custom fields and issue properties in sync with Forge Storage for JQL search and reporting
  • Workflow integration: Evaluating approval conditions and validators during Jira workflow transitions
  • Personal data reporting: Reporting stored Atlassian account IDs to Atlassian’s Personal Data Reporting API on a weekly basis, as required for Marketplace apps that store personal data. This enables Atlassian to route account lifecycle events (account closure, profile updates) back to the app.
  • Account lifecycle handling: When Atlassian notifies the app that a user account has been closed, the app pseudonymizes stored data for that user — replacing display names with “Deleted user” and clearing decision comments authored by that user. Atlassian account IDs and integrity hashes are preserved to maintain audit trail continuity. When Atlassian notifies the app that a user’s profile has been updated, the app takes no action — historical audit records are point-in-time snapshots by design.

3. Data Storage

  • Location: All app data is stored in Atlassian Forge Storage and Jira Cloud (issue properties, custom fields). Data resides in Atlassian’s infrastructure in the same region as your Jira Cloud site, subject to Atlassian’s data residency policies.
  • Encryption at rest and in transit: Managed by Atlassian as part of the Forge platform, in accordance with Atlassian’s published security standards (see Atlassian Trust). The app does not implement its own encryption layer and does not make external network calls outside the Atlassian platform other than the weekly Personal Data Reporting call described in Section 5.
  • Isolation: Forge provides per-tenant data isolation. Each Jira Cloud site’s app data is isolated from all other sites. There is no cross-tenant data access.
  • Backup: Forge Storage backup and recovery is managed by Atlassian. Jira issue properties and custom field values are included in Atlassian’s standard Jira Cloud backup mechanisms.

4. Data Retention

  • Approver records: Retained as long as the associated Jira issue exists. When an issue is deleted, all approver records for that issue are automatically deleted via an event trigger.
  • Audit history records: Retained as long as the associated Jira issue exists. Deleted automatically when the parent issue is deleted. There is no separate retention period or automatic purging — records persist for the life of the issue to support compliance requirements.
  • Project configuration: Retained as long as the Jira project exists. Cleaned up when a project is deleted (lazy cleanup on next access).
  • Export task records: Transient. Records older than 72 hours are purged when the admin page is next accessed (cleanup is not scheduled — it runs on demand).
  • Admin audit log: Retained in Forge Storage for the lifetime of the app installation. When a user account referenced in admin audit records is closed by Atlassian, the corresponding records are pseudonymized (display names replaced with “Deleted user”) in line with the approach described in the “Pseudonymized records” bullet below.
  • Custom fields and issue properties: Managed by Jira Cloud. Custom field values and issue properties persist independently of the app — they are native Jira data.
  • App uninstall: When the app is uninstalled, all Forge Storage data (approver records, history, configuration, admin audit log, export data) is deleted by Atlassian as part of the standard Forge app uninstall process. Jira custom field values and issue properties are not deleted on uninstall — they remain as native Jira data within the customer’s site.
  • Pseudonymized records: When a user account is closed by Atlassian, the app pseudonymizes their data (replaces display names with “Deleted user”, clears decision comments authored by them) but does not delete the underlying records. This preserves the integrity of the audit trail and the SHA-256 hash chain while removing personally identifiable information. A pseudonymizedAt timestamp is added to each modified record to indicate when compliance action was taken.
  • Known accounts registry: Account IDs are removed from the bsf:known-accounts registry once Atlassian reports the account as closed and pseudonymization for that account has completed. This prevents the app from continuing to report closed accounts in subsequent weekly Personal Data Reporting cycles.

5. Third-Party Sharing

None outside the Atlassian platform. Business Sign-off does not transmit any data to Cahaba Forge LLC, or any third party. All processing occurs within Atlassian’s Forge platform and Jira Cloud.

Business Sign-off makes a single category of outbound call to an Atlassian-operated endpoint outside the Jira REST API: a weekly POST to https://api.atlassian.com/app/report-accounts/. This call submits the list of Atlassian account IDs the app has stored data for, so that Atlassian can route account lifecycle events (closure, profile updates) back to the app. This is an Atlassian Marketplace requirement for apps that store personal data. Only opaque Atlassian account IDs and ISO timestamps are transmitted — no display names, email addresses, comments, or other personal information.

Atlassian, as the infrastructure provider, has access to Forge Storage and Jira Cloud data in accordance with Atlassian’s own Privacy Policy and Cloud Terms of Service.

AI and Machine Learning

Cahaba Forge does not use Licensee data, Data Subject information, approval decisions, or audit records for training, tuning, fine-tuning, or evaluating any artificial intelligence or machine learning models. The App does not employ AI or ML in any form. Cahaba Forge does not make Licensee data available to any third party for AI or ML purposes.

6. Cookies and Tracking Technologies

Business Sign-off does not use cookies, web beacons, tracking pixels, browser fingerprinting, or any client-side tracking technologies. The app does not set or read any cookies in the user’s browser. The issue panel renders natively within Jira (UI Kit, no iframe). The admin and project settings pages render within a Forge-managed iframe and do not include any analytics, telemetry, or tracking scripts.

7. User Rights

Data Access and Visibility

  • Approvers: Users can view their own approver assignments and decision history through the Jira issue panel
  • Administrators: Can view all approver data, audit history, and admin audit log through the app’s admin page
  • Export: The audit CSV export feature enables administrators to export approval history data for specified projects and date ranges
  • User Data Report (DSAR): Jira system administrators can request a summary report of all data the app stores for a specific Atlassian account ID via the getUserDataReport resolver. The report returns counts (approver records, history entries, admin audit entries) and the list of issues the user has interacted with — never the underlying record contents or display names. Admins can use the existing audit CSV export to retrieve full content if needed.

Data Deletion

  • Issue deletion: Deleting a Jira issue automatically removes all associated approver records and audit history from Forge Storage (via event trigger)
  • App uninstall: Uninstalling the app removes all Forge Storage data (approver records, history, configuration, admin audit log)
  • Custom fields: BSO custom field values on issues persist after app uninstall as native Jira data. A Jira administrator can remove these fields via Jira’s field management
  • Issue property audit trail (bso.approval.audit.NNNN): These properties are native Jira data and persist independently of the app — they survive app uninstall. They are deleted only when the parent Jira issue is deleted.

GDPR Considerations

  • Right to access: Users can view their approver assignments and decision history through the Jira issue panel. Administrators can export audit data via CSV export and use the User Data Report feature (see Section 7, Data Access) to view a summary of all data stored for a specific user.
  • Right to erasure: When a user account is closed through Atlassian, the app automatically pseudonymizes the user’s data — display names are replaced with “Deleted user” and decision comments authored by the user are cleared. Audit records are preserved in pseudonymized form to maintain the integrity of the SHA-256 hash chain and satisfy compliance audit trail requirements. Full deletion of a user’s data occurs only when the associated Jira issues are deleted or when the app itself is uninstalled. Issue property audit records (bso.approval.audit.NNNN) persist after app uninstall as native Jira data and are deleted only when the parent issue is deleted. Note: Pseudonymization (rather than full deletion) of audit records is the standard approach for compliance tools where regulatory retention obligations may apply. Erasure of audit records may conflict with such obligations — consult your Data Protection Officer.
  • Right to rectification: Current approver assignments can be removed and re-added. Historical audit records are point-in-time snapshots by design and are not updated when a user’s display name changes; the live Jira REST API will return current display names for any non-historical lookup.
  • Data portability: The audit CSV export provides data in a portable format.
  • Data minimization: The app stores only the data necessary for approval workflow management and compliance audit trails. User email addresses are not stored — only Atlassian account IDs (opaque identifiers) and display name snapshots in audit records.
  • Personal Data Reporting: The app participates in Atlassian’s Personal Data Reporting program. On a weekly basis, the app reports stored Atlassian account IDs to Atlassian’s /app/report-accounts/ API. Atlassian uses this report to identify accounts that have been closed or updated, and the app responds by pseudonymizing data for closed accounts. This satisfies the Atlassian Marketplace requirement for apps that store personal data.

Data Processing Roles

a) Data Controller: You (the Licensee) are the data controller for all personal data processed by the app within your Jira Cloud site.

b) Data Processor / Sub-Processor: Cahaba Forge LLC is the data processor. The app runs on Atlassian’s Forge platform, and Cahaba Forge LLC does not directly access, process, or store your data — the app code runs within Atlassian’s isolated Forge runtime. Atlassian acts as a sub-processor for infrastructure, hosting, and data storage.

c) Legal Basis for Processing: The legal basis for Cahaba Forge’s processing is performance of its contract with Licensee (GDPR Article 6(1)(b)) and compliance with its obligations as a processor under GDPR Article 28. The legal basis for the underlying processing of Data Subject information is determined by Licensee as Controller, typically legitimate interests in maintaining compliance audit trails and approval workflow integrity (Article 6(1)(f)), or legal obligation where compliance with laws such as SOX, SOC 2, or equivalent frameworks is applicable (Article 6(1)(c)). Licensee is responsible for ensuring an appropriate legal basis exists for its processing activities.

d) Personal Data Processed: The app processes Atlassian account IDs and display names as part of approver management and audit trail recording. Email addresses are read at runtime for UI display but are not persisted by the app.

e) Data Retention: Data is stored in Forge Storage for the lifetime of the associated Jira issue (or app installation for configuration data) and is automatically deleted when the issue is deleted or the app is uninstalled.

f) Data Subject Rights: You are responsible for fulfilling data subject requests (access, erasure, rectification, portability) using the app’s audit export, issue deletion, and app uninstall capabilities.

g) Sub-Processors: Atlassian Pty Ltd (Forge platform and Jira Cloud infrastructure). No other sub-processors.

h) International Transfers: Data resides in Atlassian’s infrastructure, subject to Atlassian’s data residency and international transfer policies.

Data Processing Addendum

A Data Processing Addendum (DPA) is available for customers requiring GDPR compliance documentation. To request a signed copy, contact privacy@cahabaforge.com.

8. California Privacy Rights (CCPA)

For Licensees and Data Subjects subject to the California Consumer Privacy Act of 2018 as amended (“CCPA”):

  • Cahaba Forge acts as a “service provider” to the Licensee (as “business”) with respect to all Personal Data processed by the App.
  • Cahaba Forge does not “sell” or “share” Personal Data as those terms are defined under the CCPA.
  • Cahaba Forge does not retain, use, or disclose Personal Data for any purpose other than the specific business purposes set out in the Agreement and the Data Processing Addendum.
  • Cahaba Forge does not combine Personal Data received from Licensee with Personal Data received from any other source, except as permitted by the CCPA.
  • California Data Subjects seeking to exercise access, deletion, correction, or opt-out rights should contact the Licensee, as the Licensee is the business responsible for responding to such requests. Cahaba Forge will assist the Licensee in fulfilling verified requests through the App’s export, deletion, and pseudonymization features as described in Section 7.

For detailed CCPA terms, see the Cahaba Forge Data Processing Addendum.

9. Diagnostic Logging

The app includes a diagnostic logging toggle on the global configuration page. When enabled by an administrator, the app emits detailed trace logs to the Forge runtime. These logs:

  • May include Atlassian account IDs and issue keys (for troubleshooting context)
  • Do not include email addresses, display names, or decision comments
  • Are accessible to the app developer via the Atlassian Developer Console (Forge’s centralized logging infrastructure)
  • Auto-expire after the configured duration (1–8 hours) to prevent prolonged logging

Standard operational logs (errors, warnings) are always active and may include account IDs and issue keys for debugging purposes. These logs are managed by the Forge platform and are subject to Atlassian’s log retention policies.

When the weekly Personal Data Reporting trigger pseudonymizes data for a closed user account, the app emits operational log lines summarizing the number of records modified per storage location and any errors encountered. These logs include the affected Atlassian account ID (which is already pseudonymous because the account has been closed) but never include display names, email addresses, or decision comment text.

10. Children’s Privacy

Business Sign-off is enterprise software designed for use in organizational settings. It is not intended for use by individuals under the age of 16 (or such younger age as permitted by applicable law). The app does not knowingly collect data from children.

11. Changes to This Privacy Policy

We may update this privacy policy to reflect changes in the app’s data handling practices. Material changes will be communicated with at least thirty (30) days’ prior notice through the Cahaba Forge website and/or email notification. The “Last Updated” date at the top of this document indicates when the policy was last revised.

12. Contact Information

For privacy-related questions or concerns:

Cahaba Forge LLC Email: privacy@cahabaforge.com
Website: https://cahabaforge.com

13. Information Cahaba Forge Collects Directly

This Privacy Policy primarily covers Personal Data processed by the App on behalf of Licensees. Separately, Cahaba Forge acts as a controller for a limited category of data collected directly in the course of its business:

  • Support and inquiry correspondence: When you contact Cahaba Forge at any of the email addresses listed in Section 12, we receive the name, email address, and message content you provide. We use this information solely to respond to your inquiry and to maintain records of support interactions. This correspondence is retained for no longer than reasonably necessary for support and recordkeeping purposes.
  • Website visitors: The Cahaba Forge website (https://cahabaforge.com) does not use tracking cookies, analytics tools, or advertising technologies. Standard web server logs (IP address, user-agent, request path, timestamp) may be retained by Cahaba Forge’s hosting provider for security and operational purposes for a limited period.
  • Marketplace-provided information: Atlassian shares limited information with Cahaba Forge about Marketplace transactions (such as license records and technical contact details for the Licensee). This information is used only to fulfill Cahaba Forge’s obligations under the Agreement.

Cahaba Forge does not sell, rent, or share this directly-collected data with third parties except as necessary to operate its business (for example, email service providers used to deliver correspondence) or as required by law.

This privacy policy applies to Business Sign-off & Approval for Jira Cloud. The app runs on Atlassian’s Forge platform — all data processing occurs within Atlassian’s infrastructure. Cahaba Forge LLC does not have direct access to your Jira instance or its data.

Cahaba Forge
  • Home
  • Features
  • About
  • Contact
  • EULA
  • Privacy Policy
  • Support Policy
  • DPA
  • Security
  • Copyright Notices

© 2026 Cahaba Forge LLC. All rights reserved. Cahaba Forge™ is a trademark of Cahaba Forge LLC.