Free tool
Event tracking plan builder
Decide what to measure before you install analytics. List each event, the question it answers and the moment to send it, then copy the calls for your developers and share the plan as Markdown.
What a tracking plan is for
Analytics answers only the questions you planned for. A tracking plan is the short list of things your app will count, written down before anyone adds code, so the product team agrees on what each event means and developers send it in the same place every time. Each row says:
- The event name — what happened, in the past tense and one style:
signup_completed, notSignupin one place anduser-signed-upin another. - The question it answers — if nobody can say which decision the number feeds, leave the event out. A short plan that is used beats a long one that is not.
- When to send it — the exact moment, so two developers do not count two different things.
- Example properties — optional details that split the count: a category, a number, a yes or no. Never something that identifies a person.
Send completion events after the application confirms success. A click on Sign up or a submitted form is an attempt: the server may refuse it, the payment may fail, the visitor may leave. Send signup_completed once the account exists — when the server has answered and the app moves on — and count attempts, if you need them, as a separate event. The click and form tags count attempts without code; completion events come from your app's own code.
The example below is a plan for Tallybook, a fictional invoicing app for small studios. Its three events cover the usual first questions about a product: do people finish signing up, do they reach their first useful result, and do they take something away. Edit it into your own.
The plan
Properties: one key: value per line. true, false and plain numbers are sent as booleans and numbers; anything else is text. Put a value in quotes to keep it text, as in plan_code: "42".
The calls
One call per event, ready to paste where your app confirms each action succeeded. Events with a problem are left out until it is fixed. Text is escaped, so whatever you type stays a string.
// When the server has created the account and the app shows the signed-in screen — not when the signup button is clicked or the form is submitted.
lytics('event', 'signup_completed', { plan: 'trial', invited_by_teammate: false })
// When the app confirms the account’s first invoice was sent. Send it once per account, the first time only.
lytics('event', 'first_invoice_sent', { template: 'simple', line_items: 3, days_since_signup: 1 })
// When the export file has been generated and its download starts — not when the Export button is clicked.
lytics('event', 'report_exported', { format: 'csv', rows: 1200, scheduled: false })These calls need the lytics snippet on the page first — on their own they send nothing. Install it as the docs describe, or follow the Astro or Next.js guide; the calls are explained under Users and events.
Share the plan
Copy the plan as Markdown into an issue, a pull request or a wiki page, or download it as a file to send to your team. It includes the table, the calls, a link back to this page and a short Implement this plan with lytics link.
Preview the Markdown
# Event tracking plan
Made with the free lytics event tracking-plan builder: https://lytics.lp-data.cloud/tools/event-tracking-plan
| Event | Question it answers | When to send it | Example properties |
| --- | --- | --- | --- |
| `signup_completed` | How many people finish creating an account each week, and on which plan do they start? | When the server has created the account and the app shows the signed-in screen — not when the signup button is clicked or the form is submitted. | plan: 'trial'<br>invited\_by\_teammate: false |
| `first_invoice_sent` | How many new accounts reach their first useful result, and how soon after signing up? | When the app confirms the account’s first invoice was sent. Send it once per account, the first time only. | template: 'simple'<br>line\_items: 3<br>days\_since\_signup: 1 |
| `report_exported` | Which export formats do people rely on, and how large are the reports they take away? | When the export file has been generated and its download starts — not when the Export button is clicked. | format: 'csv'<br>rows: 1200<br>scheduled: false |
## Calls
Send each event only after the application has confirmed the action succeeded — not on a click or a submitted form.
Never put personal data, credentials or tokens in an event name or property.
```js
// When the server has created the account and the app shows the signed-in screen — not when the signup button is clicked or the form is submitted.
lytics('event', 'signup_completed', { plan: 'trial', invited_by_teammate: false })
// When the app confirms the account’s first invoice was sent. Send it once per account, the first time only.
lytics('event', 'first_invoice_sent', { template: 'simple', line_items: 3, days_since_signup: 1 })
// When the export file has been generated and its download starts — not when the Export button is clicked.
lytics('event', 'report_exported', { format: 'csv', rows: 1200, scheduled: false })
```
These calls need the lytics snippet on the page first; on their own they send nothing.
[Implement this plan with lytics](https://lytics.lp-data.cloud/tools/event-tracking-plan#implement)
Naming rules
The builder checks each row against what lytics keeps, because an event it cannot keep is dropped without an error in your app:
| What | Allowed | Otherwise |
|---|---|---|
| Event name | Letters, digits, spaces and _ . : - $, up to 64 characters. Unique in the plan, ignoring capitals. Not pageview or login, which lytics counts as pageviews and sign-ins. | The event is dropped. |
| Property key | Letters, digits and _ . -, up to 40 characters. | That property is skipped. |
| Property value | Text up to 200 characters, a number, or true / false. No lists or nested objects. | Longer text is cut. |
| Properties per event | Up to 20, about 2,000 characters in all. | Extra ones are skipped; over the size, all are dropped. |
Implement this plan with lytics
The builder does not install anything. To start counting these events in your own app:
- Create an account, or sign in. It is free and takes an email address and a password.
- Add an app on Your apps — a property, with its name and the domains it runs on. Its page opens on a setup that gives you the snippet.
- Install the snippet in the
<head>every page shares and deploy, until the setup confirms the first pageview. How to install. - Add the calls from this plan where your app confirms each action, then watch them arrive under Live and Events on the app's page. The event calls, and Track button clicks and form submissions for the attempts you can tag without code.
Not ready to sign up? Explore a sample dashboard with illustrative data.