Free tool Tracking plan generator: start from an industry template, not a blank sheet
A tracking plan is the list of events your product sends and the properties each one carries. Pick one of 10 industry templates — the same event definitions TapCub installs in the product — keep the events you need, add your own, and download the plan as CSV or Markdown for the team that writes the code.
- 10 templates · 111 events
- CSV + Markdown
- Runs locally
Pick a template, tick the events
Required events are marked: the template’s dashboards and funnels depend on them. “Sent from” is where the event should be reported; payments and refunds are server-only so ad blockers and retries cannot distort them.
The core e-commerce path: search / view item → add to cart → checkout → purchase → refund. Event names match the default mapping of the Commerce & Revenue module (view_item / add_to_cart / begin_checkout / purchase / refund), so it shows data right after install. purchase / refund must be reported server-side, deduplicated by order number via insert_id. Multi-store retail uses the store as a group.
One event per line: event_name | Display name | property:type, property:type!. Types: string, number, boolean, array; ! marks a required property. Names follow the TapCub event catalog rule: lowercase letters, digits and underscores, starting with a letter, up to 40 characters, not starting with $, _ or tc_.
Events
9
Properties
36
Required events
4
Server-only events
2
Event table
| Event | Display name | Category | Required | Sent from | Properties | Notes |
|---|---|---|---|---|---|---|
search | Site search | Discovery | Optional | Web, Mini program, App | 2 | |
view_item | View item | Discovery | Required | Web, Mini program, App | 4 | |
add_to_wishlist | Add to wishlist | Discovery | Optional | Web, Mini program, App | 1 | |
add_to_cart | Add to cart | Cart | Required | Web, Mini program, App | 4 | |
remove_from_cart | Remove from cart | Cart | Optional | Web, Mini program, App | 1 | |
view_cart | View cart | Cart | Optional | Web, Mini program, App | 2 | |
begin_checkout | Begin checkout | Checkout | Required | Web, Mini program, App | 3 | |
purchase | Purchase | Checkout | Required | Server | 10 | Reported server-side when the order is paid; insert_id = order number; revenue is the amount paid; multi-store adds group=store:<store ID> |
refund | Refund | After sale | Optional | Server | 3 |
Property table
Rows written as items[].price are the fields of each element in an array property.
| Event | Property | Type | Required | Unit | Allowed values | Description |
|---|---|---|---|---|---|---|
search | query | string | Required | — | — | |
search | results | number | Optional | — | — | Number of results; 0 = no-result search |
view_item | item_id | string | Required | — | — | |
view_item | category | string | Optional | — | — | |
view_item | price | number | Optional | currency amount | — | |
view_item | currency | string | Optional | — | — | |
add_to_wishlist | item_id | string | Required | — | — | |
add_to_cart | item_id | string | Required | — | — | |
add_to_cart | quantity | number | Optional | — | — | |
add_to_cart | value | number | Optional | currency amount | — | |
add_to_cart | currency | string | Optional | — | — | |
remove_from_cart | item_id | string | Required | — | — | |
view_cart | value | number | Optional | — | — | |
view_cart | items_count | number | Optional | — | — | |
begin_checkout | value | number | Optional | currency amount | — | |
begin_checkout | items_count | number | Optional | — | — | |
begin_checkout | coupon | string | Optional | — | — | |
purchase | order_id | string | Required | — | — | |
purchase | revenue | number | Required | currency amount | — | |
purchase | currency | string | Required | — | — | |
purchase | items_count | number | Optional | — | — | |
purchase | coupon | string | Recommended | — | — | Order-level coupon code; promotion reports group by this |
purchase | payment_method | string | Optional | — | wechat / alipay / card / cod / other | |
purchase | store_id | string | Optional | — | — | |
purchase | items | array of objects | Recommended | — | — | Order line items [{item_id, name, category, price, quantity, coupon?}]; without them, product / promotion reports can only use the order-level coupon |
purchase | items[].item_id | string | Required | — | — | |
purchase | items[].name | string | Optional | — | — | |
purchase | items[].category | string | Optional | — | — | |
purchase | items[].price | number | Optional | currency amount | — | |
purchase | items[].quantity | number | Optional | — | — | |
purchase | items[].coupon | string | Optional | — | — | |
purchase | promotion | string | Recommended | — | — | Promotion name (e.g. Black Friday / spend-and-save) |
purchase | discount | number | Optional | currency amount | — | Discount amount |
refund | order_id | string | Required | — | — | |
refund | revenue | number | Required | currency amount | — | |
refund | reason | string | Optional | — | quality / size / changed_mind / delay / other |
Opens the data layer generator with these events and properties loaded, for GA4 dataLayer / GTM or the TapCub web, mini-program, app and server SDKs.
Version v1.0Updated Update history
What each part of the plan is for
Two tables are enough for most teams: one row per event, one row per property. Everything else — owners, release dates, screenshots — can be added as extra columns in your spreadsheet.
Required events
The ones the template’s dashboards, funnels and metrics are built on. In the e-commerce template that is view_item, add_to_cart, begin_checkout and purchase. Leave one out and a funnel step stays empty.
Sent from
Where the event should be reported. Web and app events describe what a person did on screen; server events record facts — a payment, a refund, a renewal — that must not be lost to an ad blocker or counted twice by a retry.
Required and recommended properties
Required properties are what the metrics read (revenue and currency for revenue, order_id for de-duplication). Recommended ones unlock extra reports, such as line items for product and promotion reports.
Server-only events
Send them with a server SDK and use the order or document number as insert_id, so a retried request does not create a second order.
The template is a starting point. Remove what you will never analyse: every extra event is something to test, document and keep working.
From template to a plan the team can build
Ten minutes for a first version; then review it with whoever writes the code.
-
1
Pick the closest industry
Selling online is e-commerce, subscriptions are B2B / SaaS, forms and calls are lead generation. Several templates can be combined later.
-
2
Keep what you will use
Start with “Required only”, then add the events behind questions you actually ask. Fewer, well-defined events beat a long list nobody maintains.
-
3
Add your own events
One line each, with properties and types. The tool checks names against the TapCub event catalog rule as you type.
-
4
Export and hand over
Download the CSV for a spreadsheet, the Markdown for a wiki or pull request, or open the data layer generator to get the code.
What goes into each column
The columns follow the industry pack format the product uses, so a plan written here maps one to one to what TapCub installs. See tracking plan and event properties in the glossary.
- Event name: the key stored with every event. Lowercase snake_case, starting with a letter, up to 40 characters;
$,_andtc_prefixes are reserved. - Display name: what people see in reports. It can change later; the event name should not.
- Property type: string, number, boolean, or an array of objects such as order lines. The website script keeps only strings, numbers and booleans, so arrays belong on server events.
- Units: amounts are marked as currency amounts and always travel with a currency property; durations are in seconds.
| Column | Meaning | Example |
|---|---|---|
| Event | Name sent in code | purchase |
| Required | Dashboards and funnels depend on it | Required |
| Sent from | Web, mini program, app or server | Server |
| Property | Key inside the event | revenue |
| Type / unit | How the value is stored | number · currency amount |
| Allowed values | Fixed list, when there is one | wechat / alipay / card |
The purchase event in the e-commerce template
This is how the default template describes a paid order, straight from the product’s pack definition.
| Property | Type | Required | Why it is there |
|---|---|---|---|
order_id | string | Required | Also used as insert_id, so a retried request is not a second order |
revenue | number (currency amount) | Required | Amount paid; revenue reports and average order value read it |
currency | string | Required | Needed to convert mixed currencies |
items | array of objects | Recommended | Line items with item_id, name, category, price, quantity — without them product reports only see the order |
coupon | string | Recommended | Promotion reports group by it |
The defaults here — purchase, revenue, currency, order_id — are also the default mapping of the commerce report, so an order sent this way shows up there without extra settings.
Where tracking plans go wrong
Most problems are not missing events but events nobody can trust.
Renaming live events
Once an event is collecting, its name is the key in your data. Rename the display name instead, or every chart splits in two.
Tracking revenue in the browser only
Ad blockers, closed tabs and double clicks all distort a front-end purchase event. Record payments on the server with the order number as the de-duplication key.
One event per button
button_1_click, button_2_click… makes analysis impossible. One event with a property (which button, which plan) is easier to chart and to maintain.
Raw personal data in properties
Email addresses, phone numbers and free-text input do not belong in event properties. Hash identifiers or leave them out.
The same templates, installed in one click
Every template on this page is an industry pack inside the product. Installing it creates the event definitions, metrics, funnels and dashboards together.
Industry templates
See exactly what each pack installs — events, metric formulas, dashboards and funnels — and install it from the console.
Learn moreValidated on arrival
Events are checked as they arrive: unexpected names, missing properties and wrong types are flagged before they skew a report.
Learn moreAutocapture first
Clicks and submits are recorded from day one; you confirm the ones worth naming in the event inbox, plan or no plan.
Learn moreTracking plan questions
Still have a question?
Chat with the team behind TapCub — we usually reply within a few hours on business days.
What is a tracking plan?
A shared document listing every event your product sends, the properties each one carries, their types and where they are sent from. It is the contract between the people who ask questions of the data and the people who write the tracking code. See tracking plan.
Is there a tracking plan template for Excel or Google Sheets?
Yes — download the event table and property table here as CSV and open them in Excel, Numbers or Google Sheets. Keep the BOM option on if Excel shows garbled characters.
How many events should a tracking plan have?
As few as answer your questions. The templates here have 9 to 14 events each, with 2 to 6 marked required. Add events when a real question needs them, not in case.
Should events be sent from the browser or the server?
Behaviour on screen (views, clicks, add to cart) from the browser or app SDK; money and state changes (payments, refunds, renewals) from the server, where they cannot be blocked and can be de-duplicated.
Does this tool suggest event names?
No. It checks the format of the names you write against the TapCub event catalog rule. The template events already follow one naming style you can copy.
How do I turn the plan into code?
Click “Generate the tracking code”. The data layer generator opens with your events and properties, and writes GA4 dataLayer / GTM steps or the TapCub SDK call for web, mini program, app or server.
Do I need a tracking plan before installing TapCub?
No. The script records pageviews, sources and clicks from the start, and an industry template can be installed later. A plan helps most when several teams send events by hand.
Is anything I type uploaded?
No. The templates are built into the page and everything is generated in your browser.
Update history
New features, fixes and data refreshes for this tool, newest first.
-
· v1.0
LaunchedFirst release.
Missing something or found an error? Tell us — requests that come up often go into the next update. All tool updates
From plan to data
Turn the plan into code, install the matching template, and check the first events arrive.