Skip to main content
9 min read

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 dashboardWhat countsCode needed
A page visitA visit opens a page whose address matchesNo
A click on a linkA visitor clicks a link whose destination address matchesNo
An event from your codeYour site sends zenovay('track', 'event_name')One line
A click on a button or elementA click on an element that matches a CSS selectorNo

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.

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:

Custom Event GoalJavaScript
// 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 #anchors never matter.
  • The query string only matters if your pattern contains one (?...). Contains also searches the query string, so utm_source=newsletter works 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 typeExample patternMatches
Is exactly/thank-you/thank-you, /Thank-You/
Starts with/blog//blog/post-1, /blog/news
Containscheckout/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/*/intro matches /docs/api/intro.
  • ** stands for anything, so /blog/** matches every page under /blog/.
  • {locale} stands for an optional language prefix such as /en, /de or /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:

  1. 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.
  2. 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/pricing into /{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.
  3. 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:

Goal with RevenueJavaScript
// 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:

Code-Based Goal TrackingJavaScript
// 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

React Goal TrackingJavaScript
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

PlanGoalsFunnels
FreeNo Journeys tabNo Journeys tab
Pro255
ScaleUnlimitedUnlimited
EnterpriseUnlimitedUnlimited

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.

  • 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_goals and get_goals create, change and report goals. See MCP Tools.
  • Public API: GET /api/v1/analytics/conversions returns your goals (completions, converting visits, conversion rate, total value) and funnels for the period.
  • For analytics summaries, see the Analytics Overview API.
Get Analytics via External APIBash
curl -X GET "https://api.zenovay.com/api/external/v1/analytics/{websiteId}" \
-H "X-API-Key: zv_YOUR_API_KEY"
Was this page helpful?