lytics

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.

No account needed. The plan stays in this browser tab: it is not saved, not put in the address bar and not sent to lytics or anyone else, so reloading the page starts again from the example. Building a plan installs nothing — the calls do something only once a developer adds them to an app with lytics installed.
No personal data, credentials or tokens — not in event names, not in properties, not in the plan. Email addresses, names, phone numbers, passwords and API keys do not belong in analytics. Use categories, counts and yes/no values instead.

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:

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".

Event 1
    Event 2
      Event 3
        3 events, all ready.

        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.

        lytics('event', name, properties)
        // 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:

        WhatAllowedOtherwise
        Event nameLetters, 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 keyLetters, digits and _ . -, up to 40 characters.That property is skipped.
        Property valueText up to 200 characters, a number, or true / false. No lists or nested objects.Longer text is cut.
        Properties per eventUp 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:

        1. Create an account, or sign in. It is free and takes an email address and a password.
        2. 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.
        3. Install the snippet in the <head> every page shares and deploy, until the setup confirms the first pageview. How to install.
        4. 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.

        Track these events

        Not ready to sign up? Explore a sample dashboard with illustrative data.