Tests Custom Reports

Report Input Reference

The Report Input holds the candidate, dates, task and step, the scored result with sections, dimensions and answers by Reporting Name, the benchmark comparison, and the test's reporting settings; result, normy and testReporting can be missing.

Published 2026/10/15

The Report Input is the object passed to your function — or straight to the template if the handler has no function. To see a real one, open a completed session and choose Report Input in its actions; dimension names, section titles and Reporting Names are specific to your test, so always build against your own data.

Fields marked may be missing are absent in some situations — an unscored session, a delivery without a benchmark, or some export paths. Guard them in your function.
Important

Session, candidate and context

FieldTypeNotes
tiidstringTest session ID.
statusstringFor example "COMPLETE".
testReferenceobjectorganizationId, testId of the test taken.
info.testTitle, info.taskTitle, info.stepTitlestringDisplay titles.
initiator.taskId, initiator.roomId, initiator.step.id, initiator.step.titlestringWhere the session came from.
initiator.roomFormobjectAnswers to the access form, keyed by field label: roomForm["Employee No"].
ticket.infoobjectCandidate: fullname, email, credential1 and other identity fields. May be missing.
meta.group, meta.folder, meta.labels, meta.tagMap—The session's group, folder, labels and tags.
dates.created.text / .timestampstring / msFormatted in the delivery's timezone, e.g. 2026-10-14 09:12 GMT+03:00.
dates.completedobject or nullnull until the session is completed.
dates.timezone.utc, dates.timezone.labelnumber / stringFor example 3 and "+03:00".

result — the scored result

result is missing until the session is scored. All scores are raw points; compute percentages yourself (and guard against a totalPoint of 0).

FieldNotes
result.statspoint, totalPoint, noOfQuestions, noOfAnswered, noOf100 (full marks), noOf0, noOfPartial, noOfNegative, noOfEmpty (never answered), noOfNotAnswered, negative (sum of negative points).
result.dimensionsA map keyed by dimension path — "Aptitude", "Aptitude/Verbal" — each value { stats: { point, totalPoint, … } }. Parent paths aggregate their children.
result.sections[]title, sectionIndex (order in the test design), sectionInstanceIndex (order shown to the candidate after shuffling), sectionInstanceUUID, stats, dimensions, pages[].
result.effectsA map of effects, each { score, count, max }.
result.tagsA map of tag name → { stats, values: { value → { stats } } }.
result.extractedAnswers keyed by each question's Reporting Name: selected choice names, typed text, or recording URLs.
result.serveStatsstartsAt, endsAt, timeLimit, timeSpent and activeDuration (seconds), noOfServes, noOfAnswers.

normy — benchmark comparison

normy is missing when the delivery has no benchmark, and in some export paths.

FieldNotes
normy.normativeResult.test{ count, rank, percentile, sten } for the whole test.
normy.normativeResult.dimensions[name]The same shape, per dimension path.
normy.normativeResult.sections[uuid]The same shape, per section.

testReporting — the test's reporting settings

testReporting mirrors the test's Reporting tab. It is missing in some export paths.

FieldNotes
testReporting.passFail{ active, pass: { min: { score, inclusive }, content: { label, description } }, fail: { content: { label, description } } }. min.score is a fraction from 0 to 1 — 0.6 means 60%.
testReporting.level{ active, items: [{ from: { value, inclusive }, to: { value, inclusive }, content: { label, description, color } }] }. Values are percentages from 0 to 100.
testReporting.interpretationsThe raw interpretation rules. Matched labels and notes are not included — evaluate the rules in your function if you need them.

Pass/fail and levels are matched against the rounded overall percentage. Use Math.round(point / totalPoint * 100) to get the same verdict and level as the Standard report. Ready-made matchers are in Recipes.