What it does
YouTube never reports description-link clicks. You can see that a video got 40,000 views, but not that it produced eleven clicks, three leads and one closed deal — so the video that actually pays for the channel is invisible in YouTube Studio.
VidWorth closes that loop by owning the middle of it:
- Views come from the YouTube Data and Analytics APIs for channels you connect.
- Clicks are ours, because the link in the description is a VidWorth short link that redirects to your funnel and logs the click on the way through.
- Leads, calls and payments arrive from the tools you already use — GoHighLevel, Calendly, Cal.com, Typeform, Tally, ClickFunnels — carrying the UTM tags the redirect attached.
- The join happens on
utm_content, which holds the YouTube video id. That is what turns "a booking" into "a booking from that video".
One domain, on purpose
www.vidworth.co. There is no app. or go. subdomain to allow-list. Clients who want their own branded link host can point one at us instead — see Tracked links.Quick start
Roughly fifteen minutes, most of it waiting for the first YouTube sync. Everything below is expanded in its own section.
- Create an account at
https://www.vidworth.co/signup— Google or email and password. You get your own isolated workspace; nobody else can see it until you invite them. - Connect a YouTube channel. One OAuth consent per channel. We read videos and view stats, and only write to a video when you explicitly ask us to.
- Create a tracked link pointing at the funnel, booking page or offer the channel sends people to.
- Place it on a video — into the description, the pinned first comment, or both. Every edit is backed up for one-click undo.
- Connect where conversions happen — your GoHighLevel sub-account, Calendly, or a form tool — so bookings and opt-ins flow back in automatically.
- Read the dashboard. Views, unique clicks, CTR, leads, booked calls and booking rate, per video and per channel.
Connect a YouTube channel
Settings → Channels → Connect channel starts a Google sign-in. Pick the Google account that manages the channel — for a Brand Account, that is an account listed as an owner or manager of the channel, not merely a subscriber.
What we ask for and why
| Permission | What we do with it |
|---|---|
| Read your channel and videos | List uploads, titles, thumbnails and view counts |
| Read YouTube Analytics | Per-day view figures, so CTR is measured against the right window |
| Manage your YouTube account | Two explicit actions only: writing a tracked link into a description, and posting a comment or reply when you write one |
Description edits are non-destructive
Disconnecting
Disconnect a channel from Settings at any time. Historical clicks and bookings stay so past reports remain readable; syncing stops immediately. You can also revoke access from your Google account's security page — we treat a revoked token as a disconnect on the next sync rather than retrying forever.
Tracked links
A tracked link is a short URL on our domain that logs a click and immediately redirects to your destination. It looks like this:
https://www.vidworth.co/r/abc123When someone follows it, we append the attribution tags to your destination URL and send them on with a 302:
https://your-funnel.com/offer
?utm_source=youtube
&utm_medium=organic
&utm_campaign=<channel>
&utm_content=<youtube video id>
&tid=<click id>- Parameters you already set win. If your destination URL already has a
utm_campaign, we leave it alone rather than overwriting your own tagging. utm_contentcarries the video id — that single parameter is what makes per-video attribution possible, so don't strip it in a redirect chain.tidis a click id and gives exact one-to-one attribution when your form or scheduler passes it through.
Unique clicks and bots
The headline click number is unique, non-bot clicks. We de-duplicate repeats from the same visitor within 24 hours, and known crawlers and link-preview fetchers are excluded — otherwise pasting a link into a chat app would inflate the count before a human ever saw it. Raw IP addresses are never stored; an IP is hashed with a daily-rotating salt purely to tell two visitors apart.
Branded link domains
An unfamiliar agency domain in a description costs clicks. A client can point their own host — say go.clientbrand.com — at us with a CNAME and set it on their channel; their links then use their own brand while everything else stays identical. The exact CNAME target is shown on the channel's link-domain screen.
Placing links on videos
From a video's page, or in bulk from the Videos list, you can:
- Add to description — inserts the tracked link, keeping the rest of the description intact.
- Post as first comment — posts as the channel, ready to pin.
- Undo — restores the description exactly as it was before our edit.
Bulk placement runs across a selection of videos and reports per-video success or failure rather than stopping at the first error. Each video gets its own link, so a click can always be traced to the video that produced it.
Placement is never automatic without you
GoHighLevel
Connecting your HighLevel sub-account sends contacts, form submissions and appointments into VidWorth as they happen, attributed to the video that produced them. We only ever read from HighLevel — nothing in your CRM is created, edited or deleted by this app.
Installing is free
Install it
- In HighLevel, open Settings → Integrations (or the App Marketplace) and install VidWorth.
- Choose the sub-account (location) you want to connect, and approve the read-only permissions on the consent screen.
- You land back in VidWorth with the location connected. If you started from VidWorth instead, use Integrations → GoHighLevel → Connect and pick the same sub-account.
- Pick the channel this sub-account belongs to. One HighLevel location can feed several channels — each gets its own copy of every conversion.
What we read
| Permission | Why |
|---|---|
| Locations (read-only) | Confirm which sub-account was connected and label it |
| Contacts (read-only) | Receive new contacts and form submissions as leads |
| Forms (read-only) | Name the form a submission came from |
| Calendar events (read-only) | Receive appointments as booked calls, including cancellations |
Read-only, and revocable
Making the attribution work
HighLevel needs to receive the UTM tags for a lead to land on the right video. Two things make that happen:
- Send traffic through a tracked link so the destination page is loaded with
utm_contentandtidin the URL. - Let HighLevel capture them. HighLevel records UTM parameters on the contact automatically as its attribution source. For the strongest match, add hidden fields named
utm_contentandtidto your form or survey and let HighLevel pre-fill them from the query string.
A conversion that arrives with no usable tags is not thrown away or guessed at — it shows up in an honest bucket like YouTube, unattributed or Direct / unknown, described under Reading the numbers.
Wiring it by hand instead
If you would rather not install the app, a HighLevel Workflow → Webhook action works too. The Integrations page shows a per-channel URL of the form:
https://www.vidworth.co/api/webhooks/ghl/<channelId>POST the contact or appointment payload there. This path is for manual wiring only — the installed app uses a single app-wide endpoint and routes each delivery by the location id inside the payload.
Other integrations
Every integration is connected per channel, from Integrations. OAuth connections register their own webhook automatically; the rest give you a URL to paste.
| Tool | Connect by | What arrives |
|---|---|---|
| Calendly | OAuth | Booked and cancelled invitees, with intake answers |
| Cal.com | OAuth | Bookings and cancellations, signature-verified |
| Typeform | OAuth | Form responses as leads |
| Tally | Webhook URL | Form submissions as leads |
| ClickFunnels 2.0 | Webhook URL | Opt-ins and orders |
| Anything else | Generic webhook URL | Opt-ins, bookings or payments you POST to us |
Signatures matter
Duplicate protection
Deliveries are idempotent per conversion. If a vendor retries, or you run both the tracking script and a webhook for the same tool, the conversion is recorded once. The de-duplication key is the conversion, never the person — a lead's second booking is a second booking, not a redelivery of the first.
Site tracking script
The optional tracking script stitches a visitor's journey together across pages and captures form submissions on sites we have no integration for. Copy it from Integrations → Tracking script and paste it into your site's <head>. It is scoped to one channel:
<script defer src="https://www.vidworth.co/api/script/<channelId>"></script>It stores the click id from the URL so a form submitted three pages later still carries it, and posts submissions to your channel's tracking endpoint. It sets no advertising cookies and follows no one across other sites.
Reading the numbers
The metrics
| Metric | Definition |
|---|---|
| Views | YouTube's own figure for the video, over the selected range |
| Unique clicks | Distinct non-bot visitors who followed the tracked link |
| CTR | Unique clicks ÷ views |
| Leads | Form opt-ins and contacts received from connected tools |
| Booked calls | Appointments received, cancellations excluded |
| Booking rate | Booked calls ÷ unique clicks |
Attribution buckets
Every conversion lands in exactly one bucket, and all buckets are always shown. Hiding the unattributed ones would make the attributed numbers look better and the totals wrong:
| Bucket | When |
|---|---|
| Video | utm_content matches a video we know — full credit to that video |
| YouTube, unattributed | Came from YouTube (utm_source=youtube) but no video id survived |
| Other source | Carried UTM tags from somewhere that isn't YouTube |
| Direct / unknown | Arrived with no tags at all — typed the URL, or the tags were stripped |
A big unattributed bucket is a fixable problem
Leads, bookings & revenue
Leads is the person-level view: every contact we have seen for a channel, the video that produced them, the answers they gave, and every touch in between. Two conversions that share an email or a click id are recognised as the same person rather than counted as two.
Bookings lists calls with their attribution bucket and their intake answers. Transactions records payments received from connected checkout tools, so a video's row can carry revenue and not just call volume.
Every list exports to CSV from the button in its header, honouring the filters and date range you have applied.
Syncing & automation
Conversions arrive in real time over webhooks. YouTube data is pulled on a schedule, because YouTube's APIs are quota-limited and its analytics figures settle over hours rather than seconds:
| Job | Frequency | What it does |
|---|---|---|
| New uploads | Every 15 minutes | Notices videos published since the last check |
| Views | Hourly | Refreshes view counts for recent videos |
| Full video sync | Nightly | Reconciles the whole catalogue |
| Daily stats | Nightly | Pulls per-day analytics for accurate ranges |
Sync now on any channel forces an immediate refresh. View counts you see in YouTube Studio can lead ours by up to a few hours — YouTube's public figure and its analytics figure disagree with each other too, and we report the analytics one because it is the one that can be sliced by date.
AI assistant & MCP
The console has a built-in assistant that answers questions about your own data — "which video produced the most booked calls last month?" — and can prepare actions like a bulk placement for you to approve. It never writes to YouTube without an explicit approval step.
VidWorth also exposes a remote MCP endpoint, so an external client such as Claude can query your workspace directly. Settings shows the endpoint URL for your deployment along with the connection steps. It authenticates with OAuth and is scoped to your workspace — the same data you can see in the dashboard, and nothing else.
Data & security
- Tokens are encrypted at rest with AES-256-GCM, and are never logged or displayed.
- No raw IP addresses. An IP is one-way hashed with a rotating daily salt to estimate unique clicks, then discarded.
- Emails are stored as a one-way hash, so a lead can be recognised across tools without us keeping a readable address list.
- Workspace isolation. Data is visible only to members of the workspace that owns the channel. Sign-in is open; access is governed by membership and invites.
- Webhook signatures are verified for every vendor that signs its deliveries.
- Google data is handled under the Google API Services User Data Policy, including the Limited Use requirements. It is never sold and never used for advertising.
Full detail is in the Privacy Policy and Terms of Service. Deletion requests go to support.
Troubleshooting
Clicks are showing but leads are not
The conversion tool isn't reaching us, or it is reaching us and being bucketed as unattributed. Check the integration's status on the Integrations page — it records the last delivery it received and any error. If deliveries are arriving, the tags are being lost between the click and the form; see the tip under Reading the numbers.
Everything lands in "Direct / unknown"
Traffic is reaching your funnel without going through a tracked link, or a redirect on your side is dropping the query string. Open the tracked link yourself and confirm the parameters survive all the way to the page with the form on it.
A channel stopped syncing
Google access was revoked, or the account no longer manages the channel. Reconnect it from Settings — history is preserved.
The connect button for a tool is missing
That integration has no credentials configured on this deployment, so it is hidden rather than shown broken. Ask us to enable it.
A booking was counted twice
Usually two paths for the same tool — the tracking script and a webhook, or two workflows pointing at the same endpoint. Tell us which conversion and we'll trace the delivery.
Get help
Open the support page and tell us what you expected and what happened instead. Your request is confirmed by email the moment you send it, with a reference to quote. If it involves a specific lead, booking or video, include its link.
