Goals
A goal counts the visits in which something important happens: a sign-up, a purchase, a visit to your pricing page, a click on a link. Zenovay shows how many visits completed it, the conversion rate and, if you give it a value, what it is worth.
Looking for multi-step journeys? See Conversion Funnels.
Where goals live
Open Domains → your site → Journeys → Goals. The Journeys tab has four sub-tabs: Goals, Funnels, Flows and Users.
- The Journeys tab is available on the Pro plan and above.
- Goals and Funnels share one period selector: Last 24 hours, 7, 14, 30 and 90 days, 6 months and 12 months. Longer periods depend on your plan's history window.
- Every number is for the selected period and is compared with the period before.
- Your dashboard filters and saved segments apply to goals too.
- An open goal is a link: you can share it, and it survives a reload.
How goals count
- A goal counts visits. Each visit counts at most once per goal, even if it happens several times in that visit.
- Conversion rate = visits that completed the goal divided by all visits in the selected period.
Goal types
| Type in the dashboard | What counts | Code needed |
|---|---|---|
| A page visit | A visit opens a page whose address matches | No |
| A click on a link | A visitor clicks a link whose destination address matches | No |
| An event from your code | Your site sends zenovay('track', 'event_name') | One line |
| A click on a button or element | A click on an element that matches a CSS selector | No |
A page visit
Counts a visit as soon as it opens a page whose address matches your rule, for example /thank-you or /{locale}/pricing. No code is needed. See Address matching below.
A click on a link
Counts a visit in which someone clicks a link whose destination address matches your rule, for example a link to your app's sign-up page or to a partner site. This covers outbound links and links tracked by auto-capture. No code is needed.
An event from your code
Counts a visit in which your site sends the event:
// Track the event
zenovay('track', 'purchase', {
product_id: 'pro-plan',
value: 99.99
});Event names are matched without regard to upper/lower case, and spaces count as underscores: Sign Up and sign_up are the same event. Names may use letters, numbers, spaces and _ . : / -, up to 64 characters.
A click on a button or element
Counts a click on an element that matches a CSS selector, such as #signup-button or [data-track="cta-click"]. A click on the element or on anything inside it counts.
- Element click goals count from the moment you create them. There is no history for element clicks.
- Up to 20 active click goals per site are sent to the tracker.
Address matching
These rules apply to page goals, link goals and the page steps of funnels.
- Upper/lower case, a trailing slash,
www.and#anchorsnever matter. - The query string only matters if your pattern contains one (
?...). Contains also searches the query string, soutm_source=newsletterworks with Contains. - A pattern may start with a host, such as
docs.example.com/intro, to restrict it to that host. Without a host it matches any host of the site.
| Match type | Example pattern | Matches |
|---|---|---|
| Is exactly | /thank-you | /thank-you, /Thank-You/ |
| Starts with | /blog/ | /blog/post-1, /blog/news |
| Contains | checkout | /checkout, /shop/checkout/confirm |
| Ends with | /success | /payment/success, /signup/success |
| Matches a pattern | /{locale}/pricing | /pricing, /en/pricing, /pt-BR/pricing |
| Matches a pattern | /blog/** | /blog/post-1, /blog/2026/10/post |
| Regular expression | /order/\d+ | /order/123, /order/456 |
In Matches a pattern:
*stands for one path segment, so/docs/*/intromatches/docs/api/intro.**stands for anything, so/blog/**matches every page under/blog/.{locale}stands for an optional language prefix such as/en,/deor/pt-BR.
Regular expression is for advanced cases. It is case-insensitive, and patterns that could backtrack forever are rejected.
Create a goal
Open Journeys → Goals and click New goal. A three-step assistant guides you:
- What should count. Pick one of the four goal types, or start from a template: Sign-ups, Purchases, Contact form, Pricing page visits or Click on a link.
- Set it up.
- For page goals, a page picker lists your site's real pages with their view counts. Search it and pick a page. On multi-language sites, the switch Include every language version turns
/en/pricinginto/{locale}/pricing. On sites with several hosts, the host is kept. - A live preview shows "Matches N pages with X visits in the selected period". If nothing matches, it suggests similar real pages.
- For event goals, an event picker lists the events your site has already sent, with their counts. It shows the one line of code to add, and a live check turns green when the first event arrives.
- For page goals, a page picker lists your site's real pages with their view counts. Search it and pick a page. On multi-language sites, the switch Include every language version turns
- Name and value. Give the goal a name, an optional description and an optional value per conversion (amount and currency). Count past visits too is on by default.
History
- A new goal is applied to the last 12 months of collected data immediately, so you see its numbers right away. Element click goals are the exception: they count from the moment you create them.
- When you change what a goal counts (address, match type, event or selector), the switch Recount past visits with the new rule recounts the last 12 months with the new rule. The previous numbers are archived, not lost.
- Renaming a goal or changing its value does not recount anything.
Goal values
Give every conversion a fixed value in the assistant (amount and currency), or let your code send the value of each conversion:
// An event can send its own value
zenovay('track', 'purchase', { value: 49 });
// A goal from your code with a dynamic value
zenovay('goal', 'purchase', {
value: orderTotal,
currency: 'USD'
});Manage goals
Every goal row (a card on phones) has a … menu that is always visible, also on touch screens:
- View details opens the detail panel.
- Edit opens the assistant with the current rule.
- Rename changes the name only.
- Duplicate creates "Name (copy)" with the same rule and counts its history.
- Pause / Resume: a paused goal keeps its history and stops counting new visits.
- Delete deletes the goal and its counted conversions. This cannot be undone. A goal that is a step in a funnel cannot be deleted until you remove it from that funnel.
Goal details
Click a goal to open its detail panel:
- Conversions and conversion rate, compared with the previous period
- Visitors who converted
- The value, or the time of the last conversion
- A trend chart over the selected period
- Where conversions come from, by source, device, country, page and entry page
- The real pages this goal counts, so you can check your rule against real addresses
- The latest conversions, each with a link to the visitor's timeline in the Users tab
- A Build a funnel to this goal button
Goals from your code
zenovay('goal', 'goal_name', { value, currency }) records a goal from your code. The first time a goal name arrives, Zenovay creates the goal automatically:
// Track a goal by name (created automatically the first time)
zenovay('goal', 'checkout_complete', {
value: 99.99,
currency: 'USD'
});
// Simple goal without value
zenovay('goal', 'newsletter_signup');
// Goal with custom properties
zenovay('goal', 'plan_upgrade', {
from_plan: 'free',
to_plan: 'pro',
value: 29
});- Goals created this way are marked From your code. You can edit, rename or pause them like any other goal.
- They count toward your plan's goal limit.
- When a goal stops arriving, it is flagged Not seen in your code for 7 days.
React integration
import { useEffect } from 'react';
function CheckoutComplete({ order }) {
useEffect(() => {
// Use the global zenovay object from the tracking script
if (window.zenovay) {
window.zenovay('goal', 'checkout_complete', {
order_id: order.id,
value: order.total,
items: order.items.length
});
}
}, []);
return <div>Thank you for your order!</div>;
}Plan limits
| Plan | Goals | Funnels |
|---|---|---|
| Free | No Journeys tab | No Journeys tab |
| Pro | 25 | 5 |
| Scale | Unlimited | Unlimited |
| Enterprise | Unlimited | Unlimited |
Best practices
Naming
Use short, descriptive names such as checkout_complete or "Newsletter signup". Upper/lower case and spaces do not change which event a goal counts, but one consistent style keeps your reports easy to read.
Recommended goals to track
- Signup/Registration: new user conversions
- Purchase/Checkout: revenue tracking
- Form submissions: lead generation
- Pricing page visits: buying intent
- Clicks on key links: for example to your app, a booking page or a partner
- Upgrade/Downgrade: subscription changes
Troubleshooting
- A page goal shows 0. Open Edit and look at the live preview. If it matches 0 pages, pick a real page with the page picker or use one of the suggested pages.
- An event goal shows 0. The event picker in the editor shows whether the event has arrived and with which name. Event names ignore upper/lower case, and spaces count as underscores.
- An element click goal shows no history. That is expected: element clicks count from the moment you create the goal.
- You want to see what the tracker sends. Turn on debug mode with
data-debug="true"on the script tag (see Tracking Script) or use the Debug Overlay.
API and MCP
- MCP:
create_goal,update_goal,list_goalsandget_goalscreate, change and report goals. See MCP Tools. - Public API:
GET /api/v1/analytics/conversionsreturns your goals (completions, converting visits, conversion rate, total value) and funnels for the period. - For analytics summaries, see the Analytics Overview API.
curl -X GET "https://api.zenovay.com/api/external/v1/analytics/{websiteId}" \
-H "X-API-Key: zv_YOUR_API_KEY"On this page