Page tree
Skip to end of metadata
Go to start of metadata

Seibert Media collects only anonymous usage data of Linchpin and its other apps. All Seibert-Media-provided apps on the Atlassian Marketplace (https://marketplace.atlassian.com/vendors/9093/seibert-media) are considered here, and only those can potentially transmit data to Seibert Media. 

When installing a Seibert Media app, a so-called "child app" Linchpin Usage will also be installed. This child app allows transmitting information defined in a JSON schema which is explained on this page, and cannot transmit anything beyond that.
The transmitted data can in no way contain information regarding users, companies, specific Confluence instances, or any other type of user-related or personal data. Its sole purpose is to provide statistical analysis of interactions with an app as described below. Collecting such data is thus not governed by the GDPR.

As Seibert Media, we still wish to provide transparent and openly available information regarding the data we collect, as well as how it is being used and processed by us.

1. Can I disable Linchpin App Usage?

Yes, the app configuration is available in your Linchpin/Confluence administration under "Linchpin Usage".

In addition to a brief explanation of its functionality, there's a list of all currently installed apps that are able to make use of Linchpin Usage Tracking.
There you will also find a global switch to disable the tracking provided by Linchpin App Usage. When disabled that way, no app can send tracking data to our servers.


2. What is the purpose of Linchpin App Usage?

By means of (absolutely anonymous) usage data we, as developers, can learn how our software products are actually used. All such data serves as a supplement to regular user tests, project lessons learnt in the field as well as feedback from our customers.

This wide range of usage input allows us to more quickly decide which functionality is useful. Anonymous tracking helps us to make informed decisions regarding our future app development.


3. How does Linchpin App Usage work? 

3.1 Types of data

We distinguish between two kinds of collected data: "view" and "interaction".

3.1.1 View

Used to monitor certain events observed over a span of time, such as loading time or average staying time.

3.1.2 Interaction

A single, one-off action that is triggered e.g. by clicking a button or a link.

3.2 What kinds of data can be collected?

Only data conforming to a fixed JSON schema can be written to the database.

Anything else communicated or sent by the browser is neither stored nor saved or transmitted anywhere in any form.

Currently tracked events:

AppEventtechnical Event-Name
Microblogging for ConfluenceClick on Edit-post Buttonedit-micropost
[...]


The schema is included below:

JSON Schema
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "http://usage.seibert-media.io/event.json",
  "type": "object",
  "title": "The JSON Schema for validating events sent to usage.seibert-media.io",
  "required": ["metadata", "events", "apps"],
  "properties": {
    "metadata": {
      "type": "object",
      "required": ["sessionID", "environment"],
      "properties": {
        "sessionID": {
          "type": "string",
          "description": "A unique sessionID to link events"
        },
        "environment": {
          "type": "object",
          "required": ["browser", "resolution", "hostVersion", "maxUsers"],
          "properties": {
            "browser": {
              "type": "string"
            },
            "resolution": {
              "type": "string"
            },
            "hostVersion": {
              "type": "string"
            },
            "maxUsers": {
              "type": "integer"
            }
          }
        }
      }
    },
    "apps": {
      "type": "object",
      "additionalProperties": {
        "type": "object",
        "required": ["version"],
        "properties": {
          "sen": {
            "type": "string"
          },
          "version": {
            "type": "string"
          }
        }
      }
    },
    "events": {
      "type": "array",
      "items": {
        "type": "object",
        "required": ["kind", "name", "timestamp", "app"],
        "if": {
          "properties": { "kind": { "const": "view" } }
        },
        "then": {
          "required": ["kind", "name", "timestamp", "app", "loadDuration"]
        },
        "properties": {
          "kind": {
            "enum": ["view", "interaction"]
          },
          "name": {
            "type": "string"
          },
          "timestamp": {
            "type": "string"
          },
          "app": {
            "type": "string"
          },
          "loadDuration": {
            "type": "number"
          },
          "data": {
            "type": "object",
            "required": [],
            "properties": {},
            "additionalProperties": true
          }
        }
      }
    }
  }
}

3.3 How would an example set of data look like?

The table below shows three complete records, containing all information that is written to the database.

timestamp

name

sessionID

browser

resolution

maxUsers

hostVersion

plugin

pluginVersion

plugins

app

appVersion

apps

2019-10-24 10:29:06.985 UTC

edit-micropost

333b6eca-919d-4a4d-8479-c0ae5dd993d9

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/76.0.3803.0 Safari/537.36

800x600

-1

6.12.4




net.seibertmedia.plugin.confluence.microblog

5.0.1-UPCOMING.1-X-license-inactive

{"net.seibertmedia.plugin.confluence.microblog":{"pluginKey":"net.seibertmedia.plugin.confluence.microblog","name":"Microblogging for Confluence (for internal use only)","version":"5.0.1-UPCOMING.1-X-license-inactive"}}

2019-10-24 08:54:47.948 UTC

edit-micropost

7b4de886-0c29-4b06-af85-c89cdcdbbc41

Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36

1024x1280

-1

7.0.1




net.seibertmedia.plugin.confluence.microblog

5.0.0

{"net.seibertmedia.plugin.confluence.microblog":{"pluginKey":"net.seibertmedia.plugin.confluence.microblog","name":"Microblogging for Confluence ","version":"5.0.0"}}

2019-10-24 06:21:40.981 UTC

edit-micropost

e0c80db6-e800-4d4c-8a13-f82478dbef7b

Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36

1920x1040

-1

7.0.1




net.seibertmedia.plugin.confluence.microblog

5.0.0

{"net.seibertmedia.plugin.confluence.microblog":{"pluginKey":"net.seibertmedia.plugin.confluence.microblog","name":"Microblogging for Confluence ","version":"5.0.0"}}

How is this data evaluated by Seibert Media?


A sample "interaction" event processed with Google Data Studio

3.4 How frequently is data stored and transmitted?

The collected information is kept in the session storage and assigned a random session ID. This ID is assigned per browser tab. Sessions can never be associated with more than the session ID itself, i.e. they never contain personal data.
A data packet is sent to the database whenever five (interaction or view) events have been registered. Upon leaving a page with events, the remaining data is sent.

Sent data is not visible in the cache or in sessions after being transmitted ("fire and forget"). The data is sent to a proxy maintained by Seibert Media. It validates the transmitted information according to the schema described above, and thus ensures that we can only gather data in accordance with that schema.

All information validated by our proxy is written to the database, which is hosted on a Google Cloud server.


  • No labels