Skip to content

Export Templates

Export Configuration

Create and manage templates for exporting your requirements documentation.

About Export Templates

Export templates allow you to customize how your requirements are exported to Word documents. The templates use special tags that get replaced with actual values during export. While creating a polished template may take some iteration, we offer paid support to help create templates tailored to your needs.

ABOUT

The template is created in word, with the help of tags. The Tags like {projectName} are replaced by the real values during the export. To create a really good looking export, it will take a few tries – don’t hesitate to contact us for help, we provide a paid support to create these templates tailored to your needs.

To display the structure, on some templates you will have to switch on the Formatting Symbols ( ), otherwise the text could be hidden (depending on the creator of the template).

STRUCTURE / LOOPS

You can loop over values the following way:

{#epics}
{#stories}
{oneSentence}
{/stories}
{/epics}

(In a real document, you wouldn’t want to indent the loops, only if the output should be indented too) Start with the name of the array (in this case: epics) between {# and }, and end with the same name between { and }. Within these two tags, you can use the fields of the elements of the array - in this example, the {oneSentence} of stories is used. Notice that fields used for normal output are not prefixed with #! Estimations

IMAGES

The syntax for fields that represent images is a bit different from the syntax for “normal” fields. For example, for screens that have a screenPicture field, you should use {%screenPicture} instead of {screenPicture}. It’s also possible to set the width/height: for example, {%screenPicture<%width=200;height=50%>} would result in a 200x50px image, otherwise the original dimensions will be used.

CONDITIONS

You can impose certain conditions, e.g. if there are no comments for the document, you could show an info text:

{#comments.length == 0}There are no comments for this document.{/}

Similar to the iteration, the condition is found within {# and }, then follows the content that should be displayed if the condition is met, and all of this is ended with {/}.

EXAMPLES

List all stories of an epic

{#epics}
{#stories} As {persona} I want to {action} {# actiondescriptor.length > 0} to {actiondescriptor}{/} {/stories}
{/epics}

In this example, the actiondescriptor is only shown if there is a text given. It would look like this:

As User I want to reset my password to regain access to my account
As User I want to log in
As Administrator I want to deactivate a user to restrict access to the app

There are several ways to access the epics. The default array, epics, contains all stories that are NOT optional and NOT excluded in the offer. To access ALL epics, regardless of the priority, use the array allEpics. To access only the optional stories, use the array optionalEpics, to access only the stories omitted completely, use the array excludedEpics. There are several ways to access the stories of an epic. The default array, stories, contains all stories that are NOT optional and NOT excluded in the offer. To access ALL stories of an epic, regardless of the priority, use the array allStories. To access only the optional stories, use the array optionalStories, to access only the stories omitted completely, use the array excludedStories.

List all userInterface Criteria of a Story

{#epics}
{#stories}
{#acceptanceCriteria}
{#userInterface}
• {name}
{/userInterface}
{/acceptanceCriteria}
{/stories}
{/epics}

Would list all criterias like this:

• The button must be at least 3cm big on an iPhone 20 with normal zoom settings
• The button should be red

List all relations of all Stories

{#epics}
{#stories}
{#relatedStories.length == 1}Related Story: {/}{#relatedStories.length > 1}Related Stories: {/}{#relatedStories}
{#relatedStories}
• {#relationType == "dependsOn"}This story depends on {/}{#relationType == "excludes"}Excludes {/} {#relatedStory}{abbreviation} (As {persona} I want to {action}){/relatedStory}{#relationType == "excludes"} from this offer{/}{/relatedStories}
{/stories}
{/epics}

would look like this:

• This story depends on US45 (As Administrator I want to add a User)
• Excludes US34 (As System I want to automatically create users) from this offer

There are several ways to access the related stories of an epic. The default array, relatedStories, contains all stories that are NOT optional and NOT excluded in the offer. To access ALL stories of an epic, regardless of the priority, use the array allRelatedStories. To access only the optional stories, use the array optionalRelatedStories, to access only the stories omitted completely, use the array excludedRelatedStories.

List all Images in the appendix:

{#appendix}
{#screens} {%screenPicture} {/screens}
{#appendix}

To list the Images with a gives size:

{%screenPicture\<%width=600;height=100%\>}

Attention: Tags including Pictures always must stand alone in a line.

COMMENTS

Comments on the Document Level are displayed like this:

{#comments}
● {text}
by {userFirstName} {userLastName}
{/comments}{/}

The same loop inside of an epic/story would display the comments of the epic respectively the story.

APPENDIX:

{#appendix}
{# screens.length > 0}Screens:
{#screens}
{%screenPicture<%width=400;height=100%>}
{/screens}
{/}
Attention: Tags including Pictures always must stand alone in a line.
{# entities.length > 0}Entities:
{#entities}
● {name}
{/entities}{/}
{# personas.length > 0}Personas:
{#personas}
● {name}
{/personas}{/}
{# additionalInfo.length > 0}Additional Info:
{#additionalInfo}
{/additionalInfo}{/}
{/appendix}

ORIGINAL SENTENCES:

Original Sentences are the origin of the specification. This is the text someone writes, to give the experts an idea of what they want. To be able to refer to them can be important in the process. You can loop over the Original Sentences, and also loop over all connected stories – the full story is available (including estimations, etc):

{#originalSentences}
[Priorität: {priority}] {text}{#stories.length >0}
{#stories}Verlinkte Stories:
• {abbreviation} (Als {persona} möchte ich {action})
{/stories}{/}

FORMATTING

You can format in a tag like this:

{epicsTotalCost | toFixedFormatted: 4}

Available formatters:

  • toFixed(precision)
  • toFixedFormatted (precision) Also takes the project language into account.

SUPPORTED TAGS

Here is the list of tags with their hierarchy:
* `projectName`: string
* the name of the project, e.g. "storywi.se"
* `hourlyRate`: number
* the amount of (smallest entity) in the hourly rate. Must be converted to be something useful (e.g. cents in euro-based prices)
* `termsOfPayment`: string
* the text set under "Terms of payment"
* `documentVersion`: string
* e.g. "v1.0"
* `epicsTotalCost`: number
* the cost of all epics (all meaning: not archived, not excluded)
* `allEpicsTotalCost`: number
* the cost of all epics (all meaning: all)
* `optionalEpicsTotalCost`: number
* the cost of all optional epics
* `excludedEpicsTotalCost`: number
* the cost of all excluded epics
* `epics`: Array of all the epics in the document
* the properties of the epics are listed below
* `features`: including stories, like epics
* `accessRights`: (upcoming)
* `comments`: Array (only public comments)
* `text`: string
* `userFirstName`: string
* `userLastName`: string
* `appendix`:
* `screens`: Array
* `caption`: string
* `screenPicture`: Tag
* `type`: string
* `filename`: string | null
* `figmaCanvasName`: string | null
* `entities`: an Array of ``name: string``
* `personas`: Array
* `name`: string
* `stories`: Array of linked Stories
* `additionalInfo`: string | null
**Properties of an epic:**
* `name`: string | null
* e.g. "User Management"
* `description`: string | null
* this is the optional field containing the description text
* `oneSentence`: string | null
* this is the optional field containing the oneSentence
* `originalSentence`: string | null
* this is the sentence the user story originated from
* `abbreviation`: string | null
* like "EP01"
* `estimationsByName`: Record\<string, number\>, (Key: Estimation name, Value: estimated value) (expert value)
* e.g. `estimationsByName["storypoints"]` will be replaced by "15".
* Watch out: this does NOT read the chosen method (sum or fixed), only the fixed value!
* `estimations`: `{ estimatedAmount: number; estimatedUnit: string }[];` (expert value)
* this is a list of ALL the estimations – including the custom ones. You can loop over the values and output them.
* Watch out: this does NOT read the chosen method (sum or fixed), only the fixed value!
* You can also calculate here ( `{ estimationSumsByName["minutes"]/60}` )
* `estimationSums`: Record\<string, number\>, (Key: Estimation name, Value: estimated value) (expert value)
* this is a list of ALL the estimations – including the custom ones, together with their unit. You can loop over the values and output them.
* `estimationSumsByName`: Record\<string, number\>, (Key: Estimation name, Value: estimated value)
* e.g. `estimationSumsByName["storypoints"]` will be replaced by "85". The value shown will be influenced by the choice of the used calculation method: fixed or the total of the children.
* `estimationSumsByName["minutes"]` will display 480, `{ estimationSumsByName["minutes"]/60}` will display 8, `{ estimationSumsByName["hours"]}` will display 8, `{ estimationSumsByName["days"]}` will display 1
* `stories`: same like `epics`, minus "stories", plus the following fields
* `persona`: string | null
* like "User"
* `action`: string | null
* e.g. "reset my password"
* `actionDescriptor`: string | null
* e.g. "regain access to my account"
* `acceptanceCriteria`: 3 fields, each one an Array of ``name: string``
* `userInterface`
* `nonFunctional`
* `furtherSpecification`
* `screens`: Array
* `caption`: string
* `screenPicture`: Tag
* `type`: string
* `filename`: string | null
* `figmaCanvasName`: string | null
* `comments`: Array (only public comments)
* `text`: string
* `userFirstName`: string
* `userLastName`: string
* `relatedStories`: Array
* `relatedStoryName`: string | null
* `relationType`: "dependsOn" | "excludes"
* `totalCost`: number
* total cost of the story, including the hourly rate and the time needed
* `useDetailedEstimations`: Boolean
* if this is a detailed estimation (fixed value or sum of children values)
* `priority`: Priority | null