Skip to content

Ticket external synchronization

Versio.io tickets can be mirrored into an external issue or service management system. A ticket that is synchronized keeps a counterpart in the external system: Versio.io creates it on the first synchronization and updates it on every following change.

Synchronization is one-way. Versio.io is the leading system. Changes made in the external system are never read back and are overwritten with the next update.

How synchronization works

Every change to a ticket — a field edit, a comment, a task, a state transition — writes an activity entry and raises a ticket sync event. The ticketing service picks the event up and processes each external system the ticket's type is bound to.

sequenceDiagram
    participant U as User
    participant T as Versio.io ticketing
    participant S as ticketSync state
    participant E as External system

    U->>T: Change ticket
    T->>T: Read ticket, tasks, comments, reporter
    T->>S: Read sync state for external system
    alt No counterpart yet
        T->>E: Create ticket (title)
        E-->>T: External id and link
    end
    T->>E: Update ticket (fields and description)
    T->>S: Store last sync date, external reference, error

Figure: Synchronization of a ticket into an external system

For every ticket and every bound external system, Versio.io stores one synchronization state: the last synchronization date, the last successful synchronization date, the error text of the last failure, and the reference of the external ticket. This state feeds the External sync tile on the ticket details page.

A failed synchronization does not block the ticket. The error is stored and shown on the ticket, and the next ticket change triggers a new attempt.

Configuration

Synchronization is configured in two places. An external system describes how to reach the other side. A binding on a ticket type decides which types are pushed into that system.

External systems

Environment settingsTicketingExternal systems. Each entry describes one connection.

Field Required Description
Name yes Display name of the connection, shown on the ticket and in the ticket type binding.
Type yes The kind of external system. The type selects the adapter Versio.io uses to talk to it, see Supported external systems.
Base URL yes The host the adapter connects to. The meaning depends on the type, see the table below.
Project yes The container a ticket is created in. The label and the meaning depend on the type, see the table below.
Credential yes A credential from the credential vault holding the API token of the external system.
Icon / Color no Override the icon and color of the type in the ticket's External sync tile.
Enabled yes Off keeps the system configured but stops every ticket type from synchronizing with it.

Table: Configuration of an external system

Base URL and project differ per type:

Type Base URL Project Example project
GitLab Instance URL, e.g. https://gitlab.com Namespace path of the project group/subgroup/project
Jira Site URL, e.g. https://your-company.atlassian.net Project key OPS
GitHub API URL, e.g. https://api.github.com Owner and repository owner/repository
ServiceNow Instance URL, e.g. https://your-company.service-now.com Channel
TOPdesk Instance URL, e.g. https://your-company.topdesk.net
Versio.io Instance URL of the target, e.g. https://your-company.versio.io Environment the ticket is created in production

Table: Meaning of base URL and project per external system type

Credential

The credential MUST be created in the credential vault under Environment settingsAccess managementCredential vault before it can be selected.

Every shipped adapter reads its token from the password field of the credential. The user name is not used. GitLab and Jira send the token as a bearer token, Versio.io as an apiToken authorization.

Type Token to store in the password field
GitLab A personal, group or project access token with the api scope. It MUST be allowed to create and update work items in the configured namespace.
Jira An Atlassian API token of an account with permission to create and edit issues in the configured project.
Versio.io An API token of the target instance. Its user MUST be allowed to create and update tickets in the configured environment; the activity there is written in that user's name.

Table: Credential per external system type

Binding a ticket type

Environment settingsTicketingticket typeExternal sync. Add one of the configured external systems to bind the type to it.

Option Default Description
Enabled on Off keeps the binding but stops synchronizing tickets of this type.
Manual sync on Offers the sync button on the ticket.
Automatic sync off Synchronizes on ticket changes without asking.

Table: Options of a ticket type binding

A ticket is only synchronized when the external system and the binding are enabled. If either side is switched off, the system stays listed on the ticket with the status Disabled, so it remains visible that a target is configured but not synchronizing.

Note: Manual synchronization is not available yet. Tickets of an enabled binding are currently always synchronized on change, and the sync button on the ticket is inactive. See Current limitations.

Supported external systems

The type of an external system selects the adapter. Only the types below with the status available ship an adapter. The remaining types can already be selected in the configuration, but a ticket bound to them fails with No adapter found for external system type.

Type Status Interface Authentication Created object
GitLab available GraphQL API (/api/graphql) Bearer access token Work item of type issue
Jira available REST API v3 (Jira Cloud) Bearer API token Issue of type Incident
GitHub planned
ServiceNow planned
TOPdesk planned
Versio.io available Ticketing REST API (/api-versio.ticketing/1.0) API token Ticket of type Incident in state New

Table: External system types and their support status

Field support matrix

Not every Versio.io ticket field has a counterpart in every external system. A field that has no native counterpart is written into the description of the external ticket instead, so no information is lost.

Symbol Meaning
Synchronized into a native field of the external system.
Written into the generated description text, not into a native field.
Not synchronized.

Table: Legend of the field support matrix

Ticket field GitLab Jira Versio.io Remark
Title GitLab work item title, Jira issue summary, Versio.io ticket title.
Description Extended with a generated header, see Description content.
Ticket type The created object type is fixed per adapter, see Supported external systems.
Workflow state No state transition is executed in the external system.
Severity Written as the numeric value of the Versio.io 10-step severity scale.
Assigned user Written as e-mail address; no external user is assigned.
Due date GitLab start and due date widget, Jira duedate. Versio.io keeps it in the description.
Estimated work GitLab time tracking estimate.
Creation date
Creation user
Reporter Name, e-mail, phone and note.
Tasks Written as a nested Markdown checklist, including their done state.
Comments Written with author and date; internal comments are not excluded.
Tags
Watchers
Work times Only the estimate is synchronized, not the booked times.
Affected instances
Documents Attachments are not transferred.

Table: Support of Versio.io ticket fields per external system

Description content

The description of the external ticket is generated on every synchronization and overwrites what is there. It is assembled in this order:

  1. A header table with state, severity, assignee, due date, creation date and creator. Fields that the system stores natively are left out — GitLab therefore has no due date column.
  2. The Markdown description of the Versio.io ticket.
  3. A Reporter section, if any reporter field is filled.
  4. A Tasks section as a nested checklist, if the ticket has tasks.
  5. A Comments section with author, date and the quoted comment text.

Note: The header renders the workflow state as its configured state id (e.g. v1000), not as its display name.

Synchronization status on the ticket

The External sync tile on the ticket details page lists every external system the ticket's type is bound to, with the reference of the external ticket and the status reached for this ticket.

Status Meaning
In sync The last synchronization succeeded and the ticket has not changed since.
Out of sync The ticket changed after the last successful synchronization.
Sync failed The last synchronization ran into an error. Hover the status for the error text.
Not linked The ticket has never reached this system; no counterpart exists yet.
Disabled The external system or the binding is switched off. Hover the status to see which side.

Table: Synchronization status of a ticket

Current limitations

  • Synchronization is one-way. Changes in the external system are overwritten, and deleting a Versio.io ticket does not delete its counterpart.
  • Manual synchronization is not implemented. The sync button on the ticket is inactive, and an enabled binding always synchronizes on change regardless of the Automatic sync option.
  • Versio.io: the counterpart is always created as the delivered Incident type in its New state, so a target environment without them rejects the creation. Due date, severity, assignee and workflow state are only written into the description, not into the fields the target ticket has for them.
  • Jira: the issue type is fixed to Incident, the description is transferred as plain text so its Markdown is not rendered, the work estimate is not transferred, and comments and state transitions are not written as native Jira comments or transitions.