Skip to main content
Question

Theme of the Week: Working Smarter with TOPdesk

  • January 12, 2026
  • 2 replies
  • 29 views

Sanne van Opstal-Brakel
Community Manager
Forum|alt.badge.img+8

Welcome to our community! We’re here to help each other work faster and easier. This week is all about saving time with TOPdesk—whether it’s small tweaks or smart workflows that make a big difference in your day.

To kick things off, here’s a question for you:

Which automation in TOPdesk saves you the most time—and why?

We’d love to learn from your experience. Share your answer in the comments and keep it practical:

  • Before/after: what did you do manually before, and what’s automated now?
  • How to set it up: briefly describe the steps (trigger, macro, workflow).
  • Impact: how much time or clicks does it save, and for whom?
  • Pitfalls: what should others avoid—or definitely do?

Tip: even small automations count—they often deliver instant wins.

Let’s make each other better: feel free to tag someone who helped you or has a great example.

🔒 Important: don’t share confidential information or customer data. Screenshots are welcome, but please anonymize them.

2 replies

Forum|alt.badge.img
  • New Member
  • February 3, 2026

We use an automatic action with 2 nested while loops to contact all customers with a specific asset.

Style of the TOPdesk change

  • Change is linked with multiple ROUTER assets → 1st while loop in automatic action
  • ROUTER asset is linked with CABLE assets → 2nd while loop to gain customer Information on this CABLE asset

The TOPdesk gui didn’t gave the option to build nested while loops, so I exported my automatic action and inserted the 2nd while loop in it.
After that I could use the gui again to add more steps in this loop.

Benefit

Before we needed to search the customers manually to inform them that something happens with there business router or cables, now we can use this automatic action.


Forum|alt.badge.img
  • New Member
  • February 3, 2026

We use an automatic action to create custom issues in youtrack based on a topdesk-change.

Setup

Description

  • operatorgroup got 2 custom fields, one is the project-id and one is the json body with variables in it that fits to the mandatory fields in youtrack.
  • automatic action to collect data from topdesk, replace the variables and send it via youtrack api
  • extra field in youtrack to save the topdesk change-number
  • youtrack script to send all comments back to topdesk-change

operator-group

input field for the projectid and amemo-text field for the youtrack json body

{
"project": { "id": "%ProjektID%"},
"summary": "%CHANGE_NUMMER% - %CHANGE_TITEL%",
"description": "TOPdesk: [%CHANGE_NUMMER% - %CHANGE_TITEL%](%TOPDESKURL%/tas/secure/contained/newchange?unid=%CHANGE_ID%)\n\n%CHANGE_BESCHREIBUNG%",
"customFields": [
{
"name": "Status",
"$type": "StateIssueCustomField",
"value": {
"name": "Backlog"
}
},
{
"value": %CHANGE_ENDZEIT%,
"name": "Fälligkeitsdatum",
"$type": "DateIssueCustomField"
},
{
"value": "TOPdesk %CHANGE_NUMMER%",
"name": "Externe ID",
"$type": "SimpleIssueCustomField"
},
{
"name": "Kundenimpact",
"$type": "SingleEnumIssueCustomField",
"value": {
"name": "kein Kunde"
}
},
{
"name": "Dringlichkeit",
"$type": "SingleEnumIssueCustomField",
"value": {
"name": "1"
}
},
{
"name": "Ressourcenbedarf Intern",
"$type": "SingleEnumIssueCustomField",
"value": {
"name": "undefiniert"
}
},
{
"name": "Ressourcenbedarf Extern",
"$type": "SingleEnumIssueCustomField",
"value": {
"name": "undefiniert"
}
},
{
"name": "Betrieblicher Nutzen",
"$type": "SingleEnumIssueCustomField",
"value": {
"name": "Nein"
}
},
{
"name": "Vertrieblicher Nutzen",
"$type": "SingleEnumIssueCustomField",
"value": {
"name": "Nein"
}
}
]
}

automatic-action

Steps to gain the information from the two extra fields and save them into “local” variables

Replace variables with topdesk-data from the current change.

${_variables["Youtrack_Data"]
?replace('%TOPDESKURL%', _topdeskUrl)
?replace('%ProjektID%', _variables["ProjektID"])
?replace('%CHANGE_ID%', _card["unid"])
?replace('%CHANGE_NUMMER%', _card["number"])
?replace('%CHANGE_TITEL%', _card["briefdescription"])
?replace('%CHANGE_BESCHREIBUNG%', _variables["TP_CHANGE_BESCHREIBUNG"])
?replace('%CHANGE_ENDZEIT%', _card["plannedimpldate"]?long)
}

Last step → send it as POST to youtrack.

youtrack

  • add a field to your project
  • add a new workflow

file 1 - common

const http     = require('@jetbrains/youtrack-scripting-api/http');

exports.initConnection = function () {
const connection = new http.Connection('https://topdesk.example.com');
connection.basicAuth('TOPDESK_API_USER', 'TOPDESK_API_PASS');
connection.addHeader('Accept', 'application/json');
connection.addHeader('Content-Type', 'application/json');

return connection;
};

exports.initActionsTexts = function (ActionText) {
return {
memoText: ActionText,
type: "memo"
};
};

exports.getChangeNumber = function (externalID) {
if (externalID !== null) {
if ( externalID.includes("TOPdesk") ) {
return externalID.slice(8);
}
}
return false;
};

exports.getChangeID = function (connection, ChangeNumber) {
const response = connection.getSync('/tas/api/operatorChanges/' + ChangeNumber, '');

if (response && response.code === 200) {
return JSON.parse(response.response).id;
} else {
return false;
}
};

file 2 - update_topdesk_change

const entities = require('@jetbrains/youtrack-scripting-api/entities');
const workflow = require('@jetbrains/youtrack-scripting-api/workflow');
const common = require('./common');


exports.rule = entities.Issue.onChange({
title: 'Write Back to TOPdesk',
guard: (ctx) => {
return ctx.issue.becomesResolved && ctx.issue.comments.isNotEmpty();
},
action: function (ctx) {
//console.log("Debug: Workflow gestartet");

const issue = ctx.issue;
const ChangeNumber = common.getChangeNumber(issue.fields['Externe ID']);

if ( ChangeNumber && ChangeNumber != null ) {

const connection = common.initConnection();
const ChangeID = common.getChangeID(connection, ChangeNumber);

issue.comments.forEach(function(comment) {
const ActionsTexts = common.initActionsTexts(comment.text);
const response = connection.postSync('/tas/api/operatorChanges/' + ChangeID + '/progresstrail', [], ActionsTexts);

if (response && response.code === 201) {
workflow.message('Kommentar wurden als TOPdesk Aktion zu Change ' + ChangeNumber + ' übermittelt!');
} else {
workflow.message('Error für Change ' + ChangeNumber + ':\n ' + response);
}
});
}
},
requirements: {}
});

Benefit

Before you needed to create the youtrack issue by yourself and update the topdesk-change.
Now u don’t need it anymore