Content
- Creating structured categories
- JSON schema for structured categories
- Creating it yourself with an AI assistant
- Examples of structured tickets
In issue management, you can create structured categories to specifically request the most important information when a ticket is created. This speeds up the processing of requests and ensures efficient communication with residents.
Creating structured categories
To use this feature, you need the permissions "Platform settings | Manage settings" and "Issue management | Manage tickets (Team member)".
-
Access the micro-app settings:
- In Cockpit, navigate to Platform settings and then to Micro-apps.
- Select the "Service Center" micro-app.
-
Add a new category:
- Click "Add category".
- Enter a unique name for the new category.
-
Define the category as structured:
- Enable the "This is a structured category" option.
JSON schema for structured categories
To define the structured category, use a JSON schema. This schema determines which fields and information are requested when a ticket is created.
Steps to implement the JSON schema:
Adjust the schema: In the newly created category, click the "JSON schema" tab and adjust the JSON schema to your needs, or paste in one of the examples below.
View the preview: On the right you'll see a preview of the structured category based on the JSON schema.
Add translations: Click the "Translations" tab and add the corresponding translations for all languages.
Save and activate the category: Click "Save". Then activate the category by clicking the crossed-out eye icon.
Once the ticket category has been structured, all residents and team members are prompted to provide additional information when creating a ticket in that category.
Structured tickets can be created both via the app and directly in issue management in Cockpit: as soon as a structured category is selected in the creation form, the form automatically displays the corresponding additional fields.
This feature is currently only available in combination with JSON, so basic knowledge is required.
Creating it yourself with an AI assistant
You can also have an AI assistant (e.g. ChatGPT or Claude) generate the matching JSON schema for you. Copy the following prompt and paste it into a conversation with your AI assistant. The assistant will then ask you the key questions and, at the end, give you both the JSON schema and the matching translations, ready to paste directly into the "JSON schema" and "Translations" tabs — including chained fields if you want to create a "smart ticket".
You are an assistant helping an Allthings customer create a JSON schema for a "structured ticket" (optionally a "smart ticket" with chained/conditional dropdown fields) in the Allthings Cockpit.
Goal: at the end, provide me with two ready-to-paste JSON objects:
1. The "JSON schema" (the "JSON schema" tab in Cockpit) – a standard JSON Schema with "type": "object", "title", "description", "properties" (each field with a unique, short camelCase key such as fieldOne, roomType, damageDescription, a "type", and optionally "enum" for selection fields) and "required" (list of required field keys).
2. The "Translations" object (the "Translations" tab in Cockpit) – a flat object with one entry per required language and field, in this exact format:
- "<locale>": "<ticket title in that language>"
- "<locale>.description": "<description in that language>"
- "<locale>.fields.<fieldKey>": "<question/label for that field in that language>"
Use de_DE, en_US, fr_FR, it_IT as <locale> values (add nl_NL, pt_PT only if explicitly requested).
If chained/conditional fields are needed ("smart ticket", i.e. a field should only appear when a specific option was chosen in an earlier selection field), express this exclusively via the standard JSON Schema constructs "dependencies" and "oneOf" (there is no Allthings-specific syntax for this). Follow this pattern:
{
"type": "object",
"properties": {
"category": { "type": "string", "title": "...", "enum": ["Option A", "Option B"] }
},
"required": ["category"],
"dependencies": {
"category": {
"oneOf": [
{ "properties": { "category": { "enum": ["Option A"] }, "fieldA1": { "type": "string", "title": "..." } } },
{ "properties": { "category": { "enum": ["Option B"] }, "fieldB1": { "type": "string", "title": "..." } } }
]
}
}
}
For multi-level chaining (a conditional field itself triggers a further branch), nest the pattern accordingly by placing another "dependencies" object inside the relevant "oneOf" branch.
Before generating the JSON, ask me the following questions one at a time (not all at once) and wait for my answer each time:
1. What category/issue is this ticket for (e.g. "Report damage", "Order a key")? What should the title be?
2. What information do you want to collect from the requester? List every individual question/field.
3. Which of these fields are required, which are optional?
4. Are any fields meant to be a dropdown/selection (fixed options) instead of free text? If so, which exact options, per field?
5. Should any field's visibility depend on the value chosen in another field (chained/conditional field, "smart ticket")? If so, which field depends on which selection in which other field, and are there multiple levels of chaining?
6. Which languages does this ticket need (default: German, English, French, Italian)?
Only generate the JSON once you have all the answers. Provide both JSON objects each in its own, fully valid code block (no markdown outside the pure JSON structure, no comments inside the JSON, no trailing commas). Make sure every field key in the JSON schema exactly matches the key in the translation object (e.g. "fields.fieldOne" ⟷ "properties.fieldOne", including inside "dependencies"/"oneOf" branches).
You can then copy the JSON the assistant provides directly: the first block into the "JSON schema" tab, the second block into the "Translations" tab (see above).
If you still need support or your request is more complex, feel free to contact our Service Delivery team so we can carry out an initial effort estimate and help you as quickly as possible.
Examples of structured tickets
Below you'll find examples of structured tickets. You can copy these JSON schemas into your categories or customize them.
Damage in the apartment
Preview of the structured ticket:
JSON schema:
{
"type": "object",
"title": "Damage in the apartment",
"properties": {
"fieldOne": {
"type": "string",
"title": "Where is the damage located?"
},
"fieldTwo": {
"type": "string",
"title": "What is defective/damaged?"
}
},
"required": [
"fieldOne",
"fieldTwo"
]
}
Translations:
{
"en_US": "Damage in the apartment",
"en_US.fields.fieldOne": "Where is the damage located?",
"en_US.fields.fieldTwo": "What is defective/damaged?",
"de_DE": "Schaden in der Wohnung",
"de_DE.fields.fieldOne": "Wo befindet sich der Schaden?",
"de_DE.fields.fieldTwo": "Was ist defekt/beschädigt?",
"fr_FR": "Dommage appartement",
"fr_FR.fields.fieldOne": "Où sont les dégâts?",
"fr_FR.fields.fieldTwo": "Qu'est-ce qui est défectueux/endommagé?",
"it_IT": "Danno appartamento",
"it_IT.fields.fieldOne": "Dov'è il danno?",
"it_IT.fields.fieldTwo": "Cosa è difettoso/danneggiato?"
}
Appliance defect
Preview of the structured ticket:
JSON schema:
{
"type": "object",
"title": "Appliance defect",
"properties": {
"fieldOne": {
"type": "string",
"title": "Which appliance is defective?"
},
"fieldTwo": {
"type": "string",
"title": "Where is the appliance located?"
}
},
"required": [
"fieldOne",
"fieldTwo"
]
}
Translations:
{
"en_US": "Appliance defect",
"en_US.fields.fieldOne": "Which appliance is defective?",
"en_US.fields.fieldTwo": "Where is the appliance located?",
"de_DE": "Gerätedefekt",
"de_DE.fields.fieldOne": "Welches Gerät ist defekt?",
"de_DE.fields.fieldTwo": "Wo befindet sich das Gerät?",
"fr_FR": "Appareil défectueux",
"fr_FR.fields.fieldOne": "Quel appareil est défectueux ?",
"fr_FR.fields.fieldTwo": "Où se trouve l'appareil ?",
"it_IT": "Dispositivo difettoso",
"it_IT.fields.fieldOne": "Quale dispositivo è difettoso ?",
"it_IT.fields.fieldTwo": "Dov'è il dispositivo ?"
}
General damage
Preview of the structured ticket:
JSON schema:
{
"type": "object",
"title": "General damage",
"properties": {
"fieldOne": {
"type": "string",
"title": "Where is the damage located?"
},
"fieldTwo": {
"type": "string",
"title": "What is defective/damaged?"
}
},
"required": [
"fieldOne",
"fieldTwo"
]
}
Translations:
{
"en_US": "General damage",
"en_US.fields.fieldOne": "Where is the damage located?",
"en_US.fields.fieldTwo": "What is defective/damaged?",
"de_DE": "Schaden Allgemein",
"de_DE.fields.fieldOne": "Wo befindet sich der Schaden?",
"de_DE.fields.fieldTwo": "Was ist defekt/beschädigt?",
"fr_FR": "Dommages généraux",
"fr_FR.fields.fieldOne": "Où sont les dégâts?",
"fr_FR.fields.fieldTwo": "Qu'est-ce qui est défectueux/endommagé?",
"it_IT": "Danno generale",
"it_IT.fields.fieldOne": "Dov'è il danno?",
"it_IT.fields.fieldTwo": "Cosa è difettoso/danneggiato?"
}
Ordering a key
Preview of the structured ticket:
JSON schema:
{
"type": "object",
"title": "Order a key",
"description": "(If keys are lost, the corresponding locks will be replaced when you move out. The costs will be charged to you)",
"properties": {
"fieldOne": {
"type": "string",
"title": "Which key would you like to order?",
"enum": [
"Apartment",
"Letterbox",
"Cellar",
"Other"
]
},
"fieldTwo": {
"type": "string",
"title": "I will pay the costs.",
"enum": [
"Yes",
"No"
]
},
"fieldThree": {
"type": "string",
"title": "Manufacturer name and further information"
}
},
"required": [
"fieldOne",
"fieldTwo"
]
}
Translations:
{
"en_US": "Order a key",
"en_US.description": "(If keys are lost, the corresponding locks will be replaced when you move out. The costs will be charged to you)",
"en_US.fields.fieldOne": "Which key would you like to order? (e.g. flat, letterbox, ...)",
"en_US.fields.fieldTwo": "I will pay the costs. (Yes / No)",
"en_US.fields.fieldThree": "Please insert manufacturer name and all information about the existing key here.",
"de_DE": "Schlüssel bestellen",
"de_DE.description": "(Bei Schlüsselverlust werden die entsprechenden Schlösser beim Auszug ausgetauscht. Die Kosten werden Ihnen belastet)",
"de_DE.fields.fieldOne": "Welchen Schlüssel möchten Sie bestellen? (z. B. Wohnung, Briefkasten, ...)",
"de_DE.fields.fieldTwo": "Ich werde die Kosten übernehmen. (Ja / Nein)",
"de_DE.fields.fieldThree": "Bitte fügen Sie hier Herstellername und alle Informationen des bestehenden Schlüssels ein.",
"fr_FR": "Clé de commande",
"fr_FR.description": "(En cas de perte des clés, les serrures correspondantes seront remplacées lors de votre déménagement. Les coûts vous seront facturés)",
"fr_FR.fields.fieldOne": "Quelle clé souhaitez-vous commander ? ( ex. appartement, boîte aux lettres, ...)",
"fr_FR.fields.fieldTwo": "Je paierai les frais. (Oui / Non)",
"fr_FR.fields.fieldThree": "Veuillez insérer ici le nom du fabricant et toutes les informations relatives à la clé existante."
}