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


//SEIBERT/MEDIA means app development. And as app developers, usage data helps us greatly to improve our apps. We collect only anonymous usage data of the Linchpin Intranet Suite and its apps.

All apps on the Atlassian Marketplace provided by //SEIBERT/MEDIA are affected by this decision, and only those very apps can potentially transmit data to us. It's important for us to keep such policies transparent. We also want everyone to understand what data we may collect, why we do this and what your options are.



With the installation of any //SEIBERT/MEDIA Linchpin app, a so called "child app" named Linchpin App Usage is installed in the background. This app transmits information defined in a JSON schema (explained further down on this page). It can not transmit any other information.

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. Collection of such data is thus not governed by the GDPR.


1. Can I disable the Linchpin App Usage app?

Yes, you can disable the Linchpin App Usage app.

The administration of the Linchpin App Usage app is located inside the Confluence administration. To get there, navigate to Confluence administration > Linchpin App Usage > Configuration.

If you wish to disable Linchpin App Usage, move the slider to the left (it will turn red). To do so, click on the slider.

The configuration offers a brief explanation of Linchpin App Usage's functionality. Furthermore, all apps which use Linchpin App Usage will be listed under the Usage section.





2. What is the purpose of the Linchpin App Usage app?

As developers, we use the anonymous usage data to learn how our software is actually used. Usually, we do regular user tests, gather feedback and try to take away lessons learnt from every project. The anonymous usage data is a great addition to our analysis tools.

It might sound harsh, but we do not really care who uses which app. We care for the question how an app is used. That's why all the data is anonymous - it doesn't matter which user clicks on a button. The only thing that matters is was the button clicked at all? And if yes, then how often?

What functions of our apps are used the most? Do people click on all the buttons, or are there functions which are (almost) never used and which we could improve or replace with better ones? Such anonymous tracking helps us greatly to improve the quality of the app and helps us in 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".

View data

View data is used to monitor certain events which are observed over a span of time. Such events could be "loading time" or "average time spent using the app".

Interaction data

An interaction is a single one-off action which must be triggered. A click on a button or a link are examples for interaction data.



3.2 What kinds of data can be collected?

Only data conforming to a fixed JSON schema can be written to the database. This means that the database won't accept any data which is not defined in the code you see below.

Any other information communicated by the browser can neither be stored nor saved or transmitted anywhere in any form.


The JSON schema used by Linchpin App Usage:

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
          }
        }
      }
    }
  }
}

Currently tracked events:

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

3.3 How would an example set of data look like?

The table below shows three complete data 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"}}


3.3.1 Data evaluation at //SEIBERT/MEDIA

On the right side, you can see an image showing a possible analysis of the collected usage data.

In this sample an "Interaction event" was processed with the Google Data Studio.



3.4 How frequently is data stored and transmitted?

The collected anonymous data is kept in the session's 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, which means that they never contain personal data.

A data package is sent to the database whenever five events (interaction and/or view) have been registered. All remaining data is sent to the database upon leaving a page with relevant events.


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. This proxy validates the transmitted information according to the JSON schema described above. This procedure ensures that we can only gather data defined in the JSON schema.

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