Skip to content

Progression Tracking

Track player progression through levels, quests, tutorials, or any sequential content. The SDK automatically calculates duration between start and completion/failure.

QuestData.start_progression(location: String, tier: String = "")
ParameterTypeDefaultDescription
locationStringrequiredLevel or area identifier (e.g. "level_5", "tutorial", "boss_dragon")
tierString""Optional difficulty or sub-category (e.g. "hard", "nightmare")

Starts tracking time for this progression. Internally sends a progression_start event.

QuestData.complete_progression(location: String, score: int = 0)
ParameterTypeDefaultDescription
locationStringrequiredMust match the location from start_progression()
scoreint0Optional score achieved

Completes the progression and automatically calculates the duration since start_progression() was called. Sends a progression_complete event.

QuestData.fail_progression(location: String, reason: String = "dead")
ParameterTypeDefaultDescription
locationStringrequiredMust match the location from start_progression()
reasonString"dead"Why the player failed (e.g. "timeout", "out_of_moves")

Fails the progression and calculates duration. Sends a progression_fail event.

# Player enters a level
func _on_level_entered(level_name: String, difficulty: String):
QuestData.start_progression(level_name, difficulty)
# Player beats the level
func _on_level_completed(level_name: String, score: int):
QuestData.complete_progression(level_name, score)
# Player dies or runs out of time
func _on_level_failed(level_name: String, reason: String):
QuestData.fail_progression(level_name, reason)
# Track tutorial steps as progressions
QuestData.start_progression("tutorial_movement")
# ... player completes movement tutorial ...
QuestData.complete_progression("tutorial_movement")
QuestData.start_progression("tutorial_combat")
# ... player skips combat tutorial ...
QuestData.fail_progression("tutorial_combat", "skipped")
  1. start_progression() records the current timestamp internally
  2. When complete_progression() or fail_progression() is called, the SDK calculates duration_seconds automatically
  3. The event properties include location, tier (if set), duration_seconds, and score/reason
  4. If complete_progression() is called without a matching start_progression(), the duration will be 0

The SDK sends these properties automatically:

EventProperties
progression_startlocation, tier
progression_completelocation, tier, duration_seconds, score
progression_faillocation, tier, duration_seconds, reason

View progression data in the dashboard under Analytics > Dashboard. The overview shows:

  • Completion rates per level
  • Average duration per level
  • Most common failure reasons
  • Difficulty distribution
  1. Use consistent location names"level_5" is better than "Level 5" or "lvl5"
  2. Always call start before complete/fail — Without a start, duration is 0
  3. Use tier for difficulty — This lets you compare completion rates across difficulties
  4. Track boss fights as progressions — Great for finding difficulty spikes