Skip to main content
summer-analytics is a skill from the Summer skill library: a guide your AI agent reads when the task matches, so it builds the good version on the first try. Send game events to Summer analytics from the authority or client: fire-and-forget, never blocking gameplay.

When your agent uses it

  • Adding analytics, telemetry or event tracking to a Summer game: level completed, coin collected, tutorial funnel
  • Deciding what to track on the client versus the authority, and how to name analytics events and properties
  • Analytics capture fails with unavailable, capacity_exceeded or analytics_storage_limit_exceeded

Install

summer setup installs every skill for your agent. To add only this one:
Swap claude-code for your agent, such as codex or cursor. See Skills for every option.

The skill

Overview

Summer analytics stores named events, such as level_completed or coin_collected, for the creator to query in Studio. There are two ways in: Analytics is for looking at your game, never for running it:
  • Capture returns immediately.
  • Gameplay never waits for capture and never depends on its result.
  • Capture is never retried. An unavailable result may already have stored the event, and capturing again records a second event.
Where it works: hosted only. Under Local Play both calls complete with ok == false and code unavailable, and nothing is stored. Also print each event while testing, so you can check it in the logs.

Steps

1. Choose a small set of events

Name events after things that happened, in the past tense: match_started, coin_collected, tutorial_step_completed.
  • Names:
    • 1 to 64 characters, matching ^[A-Za-z][A-Za-z0-9_.:-]{0,63}$.
    • Case-sensitive, and never starting with summer..
  • Never put changing values in names (coin_7_collected). Put them in properties: {"coin": 7}.
    • New event names are rate-limited per player and per game per day.
    • Known names keep working after that limit.
  • Properties are a JSON Dictionary:
    • at most 64 scalar values;
    • nesting at most 4 deep;
    • property names up to 128 bytes;
    • one event at most 16 KiB.
  • Never send personal data or secrets. Names such as email, password, phone, address, ip_address and *_token are rejected at any depth, as is anything starting with $summer_.
Capture authoritative facts on the authority, where the game decided them. Capture interface facts on the client: menu opened, tutorial step shown, settings changed.

2. Add a fire-and-forget helper

Authority, in authority/main.gd:
Client, in client/main.gd, the same shape with the client facade:

3. Call it without awaiting

Call _track(...) as a statement and do not await it, so the caller continues immediately. For example, in the authority’s _collect, after the coin is applied:
On the client, after a menu choice:

4. Read the results

analytics.summary (hosted, after summer login) returns the game’s top custom events next to its store page views, launches and play time; the grow-analytics skill says how to read them. In Studio: studio.open with target game, params gameId (your game’s id) and section: "analytics". Events show up after a short delay.

Result codes

Every failure is final: none of them asks you to capture again.

Checklist

  • Every capture is a plain _track(...) call; no gameplay code awaits it.
  • Event names are fixed strings; values live in properties.
  • No personal data, tokens or free-typed player text in properties.
  • Authority-decided facts (won, collected, bought) are captured on the authority.
  • Under Local Play the game plays normally while captures report unavailable.

Common mistakes

See also

  • multiplayer — where the client and the authority run
  • multiplayer-state — the authority’s Command handlers, where most events happen
  • summer-match-results — results and ratings, which Summer records itself

From a shell

No Summer MCP tools in this session? Run each one as a command; when summer --version is missing or below 4.0, use npx -y summer-engine@latest in place of summer. Fields are flags in kebab-case (--scene-path res://main.tscn) or one --input '<json>', and summer ops describe <op> prints the exact input. The summer-cli skill has the rest.
  • multiplayer: Start here for Summer multiplayer: how authority, clients, Worlds and Sessions fit, and what comes next.
  • multiplayer-state: Authority-owned state in Summer multiplayer: shared and private State groups, Commands, Events.
  • summer-match-results: End a Summer match: report each player’s win, loss or draw, show results on clients, then close the World.
  • summer-store: Sell Summer items for Sparks in a multiplayer game: shop, checkout, owned items, authority entitlement checks.
  • grow-analytics: Read a creator’s Summer Grow numbers (page views, launches, sessions, play time), compare windows.

Source: library/skills/summer-analytics/SKILL.md, rendered from summer-engine@4.3.0 on npm.