Countdown Tile

Last update: August 17, 2026
•
1 min to read

Overview

A Countdown Tile shows one live timer: either a countdown to a date, or the elapsed time since one. It points at a date field on an entity. The big digits tick toward that field’s value, and the footer names the entity and its type.

A Countdown Tile on case 2026-001 showing 026 days, 11 hours, 49 minutes and 04 seconds remaining, captioned UNTIL PARTY · TASK with the date 2026.06.29

The tile in countdown mode. The footer is the default {EntityName} · {EntityTypeLabel} caption — here a task named Party — followed by the target date as {Date}.

Because the tile points at a field rather than a fixed date, it works on the entity that owns the date (a task) or on that entity’s parent (the case the task belongs to).

The tile’s Properties JSON is configured in the admin. It’s evaluated on the server, against the source entity (the one you’re on) and its closest-linked entities. If more than one date matches, Strategy picks the one to show.

The Properties shape

{
  "Type": "CountdownTileContainer",
  "Properties": {
    "Strategy":  "Soonest" | "MostRecent" | "Furthest" | "FirstMatch",
    "NameField": "Name",
    "Targets": [
      {
        "Field": "<EntityType>.<datetime field>"  |  "<datetime field>",
        "Scope": "Source" | "Closest" | "Any",
        "Mode":  "countdown" | "elapsed",
        "Label": "{EntityName} · {EntityTypeLabel}"
      }
    ]
  }
}

Strategy — which date wins

ValuePicksUse it for
Soonest (default)the nearest future date. If none are in the future, the most overdue past one, shown as OVERDUE“the next due date”
MostRecentthe latest past date (<= now)“the last time this changed”
Furthestthe latest date overall“the final milestone or end date”
FirstMatchthe first candidate in Targets orderone fixed target

NameField — where {EntityName} comes from

The field that holds the entity’s display name. It defaults to Name. Change it to match your model — Title or Subject, for example.

Targets — the dates to choose from

KeyMeaning
FieldThe date field. <EntityType>.<field> (e.g. Task.DueDate) applies only to that type. A bare field (e.g. ModifiedDate) applies to every type. Both parts must be exact.
ScopeSource is the entity you’re on, Closest is the entities linked to it, Any (or leaving it out) is both.
Modecountdown counts down, then shows OVERDUE. elapsed counts up.
LabelCaption template. Defaults to {EntityName} · {EntityTypeLabel}.

Label tokens

TokenShows
{EntityName}the entity’s NameField value (e.g. “Renew Acme contract”)
{EntityTypeLabel}the type’s display label (e.g. type Investigation shows as “Case”)
{EntityType}the raw type name (e.g. Investigation)
{Date}the chosen date, formatted yyyy.MM.dd
{Field:<column>}any other field on the same entity (e.g. {Field:ModifiedBy}). That column is fetched for you

How the date reaches the tile

The server sends TileInfo.Data = { TargetDate, Label, Mode }. TargetDate is ISO-8601 UTC (round-trip "o"), so the browser always parses it. The timer then ticks once a second.

Examples

An upcoming task due date

The classic countdown.

{
  "Strategy": "Soonest",
  "NameField": "Name",
  "Targets": [
    { "Field": "Task.DueDate", "Scope": "Any", "Mode": "countdown", "Label": "{EntityName} · {EntityTypeLabel}" }
  ]
}

This shows the nearest upcoming Task.DueDate on the entity you’re on or its linked tasks. Once it passes, the tile flips to OVERDUE.

The last time this changed, and who changed it

{
  "Strategy": "MostRecent",
  "Targets": [
    { "Field": "ModifiedDate", "Scope": "Any", "Mode": "elapsed", "Label": "{EntityName} · {EntityTypeLabel} — {Field:ModifiedBy}" }
  ]
}

ModifiedDate is a bare field, so it applies to every type. MostRecent picks the latest edit across the source and closest entities, and elapsed counts up from it. {Field:ModifiedBy} adds who last touched it — swap in your own audit column, such as LastModifiedBy.

Days until a case deadline

Source entity only.

{
  "Strategy": "Soonest",
  "Targets": [
    { "Field": "Investigation.DeadlineDate", "Scope": "Source", "Mode": "countdown", "Label": "{EntityName} · {EntityTypeLabel}" }
  ]
}

Contract start or renewal, whichever matters

{
  "Strategy": "Soonest",
  "Targets": [
    { "Field": "Contract.RenewalDate", "Scope": "Any", "Mode": "countdown", "Label": "Renews: {EntityName}" },
    { "Field": "Contract.StartDate",   "Scope": "Any", "Mode": "elapsed",   "Label": "Active: {EntityName}" }
  ]
}

Both dates are candidates. Soonest shows the nearest upcoming one, the renewal. If no renewal is coming up, it shows the most overdue date instead. Each target keeps its own mode and label.

Countdown to a linked meeting

{
  "Strategy": "Soonest",
  "Targets": [
    { "Field": "Appointment.StartTime", "Scope": "Closest", "Mode": "countdown", "Label": "{EntityName} · {EntityTypeLabel}" }
  ]
}

Common gotchas

  • The type prefix and field name must be exact. Case.Due does nothing if the type is Investigation and the field is DueDate. Use Investigation.DueDate.
  • The field must hold a date, or a string that parses as one. Anything else is skipped.
  • No date means no tile. If you expect a tile and get nothing, check that a target’s Field exists on an in-scope entity and has a value.
  • Soonest shows OVERDUE when every candidate is in the past. That’s intended, so a missed date still surfaces. Use MostRecent with elapsed for a “time since” tile.
  • {EntityTypeLabel} falls back to the raw type name until the metadata label accessor is confirmed on the build. See the generator’s GetEntityTypeLabel note.