Goals
Define the conversions that matter, with or without code, and see which sources and pages actually produce them.
A goal counts a conversion whenever a visitor does something you care about. Once one exists, every breakdown gains conversions and conversion rate, so you can stop guessing which channel produces sign-ups rather than merely traffic.
New to goals? Track goals is the five-minute version. This page is the reference.
Goal kinds
| Kind | Pattern means | Example |
|---|---|---|
| Pageview | A page to match, using the match type below. | /thank-you |
| Custom event | The event name your code sends with statsy.goal(). | signup |
| Click | A CSS selector for the element clicked. | #buy-button |
| Scroll depth | A page to match, plus the depth as a percentage. | /pricing |
| Outbound link | The destination host. Use * for any outbound link. | github.com |
Match types
Pageview and scroll goals also choose how the pattern is matched:
- Path matches this path and everything under it.
/checkoutalso matches/checkout/success. - Wildcard uses
*./blog/*matches every post;/docs/*/installmatches every install page. - Exact matches that path only, ignoring the query string.
Default value
A goal can carry a default value, credited when the event itself carries none. It is useful for putting a rough number on a demo request or a trial start. Real money still comes from payments, and the two are reported separately, so a goal value never inflates your revenue.
Tracking from code
statsy.goal('signup', { plan: 'pro' });
// Queue calls made before the script has loaded:
window.statsyq = window.statsyq || [];
statsyq.push(['goal', 'signup', { plan: 'pro' }]);Properties are optional and may be strings, numbers or booleans. The same goal can also be fired straight from markup, with no JavaScript of your own:
<button data-statsy-goal="signup" data-statsy-prop-plan="pro">Start free</button>The attribute works on the element or anything inside it, and every data-statsy-prop-* attribute becomes a property.
Goals you get for free
| Name | Fires on | Turn off with |
|---|---|---|
outbound | A click on a link to any other host. | data-track-outbound="false" |
download | A click on a link ending in pdf, zip, dmg, exe, csv, xlsx, docx, mp3 or mp4. | data-track-downloads="false" |
checkout_start | A click on a hosted checkout link, recorded with the provider name. | — |
Scroll depth is also recorded on every page without a goal existing, which is what scroll goals and heatmaps read. Turn it off with data-track-scroll="false".
Using a goal
- Open it for a breakdown of the sources and pages that drive it.
- Filter any report by goal, or make it the last step of a funnel.
- Fire an alert when it completes.
Goals can also be created through the REST API and by an AI assistant over MCP, and a server-side conversion can be sent from the CLI with statsy goals send.
Last updated · Markdown version