Skip to content
Hazelsong is still being built.Skip to content
Hazelsong

Publish

Whether anybody is actually reading them

How often each widget was seen, how often a video was played, how often somebody clicked through. Per widget and per wall, so you can tell which page is doing the work, and by the site and the campaign readers arrived from, so you can tell which link is.

PlanEvery plan. Client share links: Starter and Pro (3 requests an hour across the account's links). “Prepared by” on a link or a summary: Pro.

How it works

Analytics, step by step

  1. Counted per widget and per wall

    Not one number for the whole project.

  2. Plays are counted separately from views

    A video wall that nobody plays is a different problem from one nobody sees.

  3. A month of counted events, shared by your projects

    Every view, play, click and press of a wall's button, and every step a collection form reports (opened, started, media added, a review site opened), is one of the account's counted events — 100 a month on Free, 2,200 on Starter, 8,000 on Pro, the lift test drawing on the same month — and one carrying a campaign tag counts as two, because it writes one more row. Your report shows how much is used, you are emailed at 80%, and when it is spent the walls and widgets stop reporting until the month turns while they go on showing your testimonials, and the forms' steps are not counted while they go on taking testimonials.

  4. Day by day, with notes

    The report draws last month and this one a bar a day, for showings, plays, clicks or testimonials arrived, read by pointing at a day or with the arrow keys, and as a table. A note marks a day: yours, one sent through the API, or one Hazelsong writes the moment it happens — a pasted list sent or scheduled, a lift test started or stopped, asking after a purchase switched on, a store connection made, a button added to a wall. Each says who wrote it. The project keeps its 200 latest notes, and the CSV has every one.

  5. A sharp drop in views

    Every day, each widget and hosted wall with at least 100 views in the seven days before last week is compared with the last seven. When they fell by more than 60%, the report's "Is anything broken?" list says which one, by how much and from what to what, with where to look; switch on "Tell me when views drop sharply" and it is emailed too, sharing one week with the alert about the wall not being shown.

  6. Rates, and this month against last

    Plays and clicks as a share of showings, for the whole project and for each widget and wall, and this month's showings against last month's as a signed percentage — a dash when last month counted nothing.

  7. Where readers came from

    Each showing, play and click is counted under the site the reader's browser says they were on before — its name only, like news.ycombinator.com, never the page — or under "direct" when it names no other site. The report lists this month's busiest sites with their rates.

  8. Campaigns

    The utm_source on the address of the page your wall is shown on, with its utm_campaign when there is one, is counted as a campaign, so a newsletter link and a social post can be told apart.

  9. Readers from AI assistants

    Readers who arrive from ChatGPT, Perplexity, Claude, Gemini, Copilot, You.com or Phind — by the site's name or by the tag those assistants put on their links — are added up on one line, and still counted under their own site.

  10. AI crawlers reading your hosted wall

    When a company's crawler that names itself — GPTBot, ClaudeBot, PerplexityBot and eleven more — asks for a wall we host for you, one is added for that crawler, and the report says how many times each read it this month. Nothing else about the request is kept.

  11. Download as CSV

    This month and the twelve before it, from the report: each widget and wall month by month, then each site, campaign and the AI assistants line, with presses of a wall's button as the last column. Free on every plan, and any cell a spreadsheet would run as a formula is made text.

  12. How often a wall's button was pressed

    A named wall can carry a button of your own. The report lists each wall that has one, with its showings, its presses and the presses as a share of the showings, counted with the site and campaign the reader came from like every other event.

  13. Or in your own analytics as well

    With forward=1 on the widget's script tag, each view, play and click counted here is also sent to the Google Analytics 4, Tag Manager, Plausible, Fathom or Umami your page already loads, with the layout and the testimonial's public id, so you can set it against your own conversions there.

  14. Robots and your own visits are left out

    Crawlers, link previews, monitors and automated browsers that say what they are are not counted. Open your own site once with ?hazelsong=ignore and your own browser stops being counted too; the wall still shows.

  15. A summary by email, and alerts

    A summary every Monday or on the first of the month, to up to five addresses. Every email to you about your projects, of every kind, counts toward one month for the account: 2 on Free, 20 on Starter, 50 on Pro, one per address; past it the dashboard still shows everything a message would have said. Three alerts you switch on by giving them a number of days: no new testimonial, one waiting in Pending, the wall not shown — and a sharp drop in views, which shares the last one's week. Each at most once a week, and none carries your dashboard link.

  16. All your projects on one page

    The owner sees every project on one page: how many wait in Pending, how many arrived this month, how often its wall was shown this month and how many things its health check lists, with the account's allowances once at the top. The figures come from what each project already counts, and each row is kept for five minutes, so the page can be that much behind a project's own report.

  17. One summary for several projects

    Choose two or more of your projects and one summary email goes out for all of them, weekly or monthly, with each project's figures in a section of its own and up to five addresses. While a project is in it, its own summary email stops; its channel still gets its own post.

  18. Told when one arrives

    Choose which new testimonials you hear about: any, those rated 2 stars or lower, those scored 6 or lower out of 10, those the risk reading flagged, or those with a video. The first goes at once; any more in the next hour wait and go together, at most one message an hour and 8 a day. Each says who wrote (a first name), the stars, the score, which kinds of thing the reading flagged, whether there is a video and how many wait in Pending. A low rating is there so you can reach the customer yourself: the form, the permission, what is published and what they see are the same whatever the rating.

  19. Posted to Slack, Discord or Microsoft Teams

    Paste one channel's incoming-webhook address — a Slack Incoming Webhook, a Discord channel webhook, or a Teams workflow made from "Post to a channel when a webhook request is received" — and the summary, the alerts and new testimonials are posted there as well, in each platform's own format. A test button, the last ten posts with what the channel answered, at most 12 posts an hour, and 20 failed posts in a row switch it off with one email to you; a test that is answered switches it back on. The address is kept as a secret: the dashboard shows its host and last four characters.

  20. Is anything broken?

    The report opens with a list of what has stopped and how to fix it — a wall no longer shown, a widget or wall whose views fell sharply, a page where the widget could not draw (no element to draw into, drawn at no size, a layout that does not exist, an error), testimonials waiting too long, an endpoint switched off, a lift test whose purchase line is silent, an allowance spent. And at 80% of any monthly allowance, the person paying is told once, before the pause.

  21. Only your own sites counted

    With a list of your own sites on Walls and widgets, a view, a play or a click from any other page — a staging copy, a preview, somebody who copied the tag — is not counted, and neither is localhost. Leave the list empty and every page counts, as before.

  22. Where people stop on your forms

    Each collection form, month by month: opened, a field touched, a video or photo added, sent, and — where the form offers review sites after sending — a review site opened. The step where people leave is a number, so you know which question to cut. Which review site was opened is not counted.

  23. Reached each question

    Under each form, a list of its questions as it asks them now, then the recorder and the permission box: how many visits reached each one — its field touched for the first time — and how many of those visits went on to send, with the share. The question where the count drops is the one to look at. The steps of one visit are sent together, once, when the page is left or the form is sent.

  24. And by labeled link

    Give a link a label on Your forms — a receipt, a signature, a card in the box — and the report counts the same five steps for each label, this month and last, so you can see which place brings people to the form and which loses them on the way.

  25. Share the figures with a client

    From the report, the owner or an administrator makes a read-only address for a client or a partner who has no seat: a label, a password if you want one, a day it stops working if you want one, and a Revoke button — up to 25 per project. The page shows the wall's showings, plays and clicks with their rates, by month, day by day for last month and this one, and by widget or wall, this month's referring sites and campaigns, where people stop on your forms, and your lift test's verdict and group figures — and the notes on the chart only if you check "Show notes on shared links", which is off until you do. The address is shown to you once and stored only as a fingerprint; a password is stored as a slow, salted hash and stops being checked after 10 wrong tries in an hour; a revoked or expired address answers like one that never existed. The page is never indexed, cannot be put in a frame, and tells no other site its address.

  26. Your own name on a client's figures

    On Pro, an agency sets “Prepared by” once for a project — a name of 2 to 60 characters, a mark, a color and an address a client may write to — and checks it for each share link and each summary email it should be on. On the link it is drawn above the figures once the password, if there is one, has been given. The color is moved only as far as it must to be read, as a wall's button is; the mark is kept once, as it was sent, in the project's own storage, and counts toward the month's delivery each time a client's page shows it. In the email, the name and the address are its first lines, as text.

Safe by design

The rule that makes it safe to have

Clear boundaries

What it will not do

Every capability page ends with this list. It is the part that says what you are actually buying.

  • A note never claims a cause. It says what happened on a day, beside the figures; it does not say the figures moved because of it, and neither does the chart. The notes Hazelsong writes are only things it knows happened: a widget's layout lives in the code on your page, so a change of layout is not one of them.
  • The drop alert is a ratio of counts, not a diagnosis. It says a widget's or wall's views fell by more than 60% week on week and from what to what; "the script may have left a page" is the commonest reason and a place to look, not a finding. A quieter week reads the same way.
  • It does not look for a drop while the month's counted events are paused, which counts nothing and would read as one, or in a widget's views while a lift test changes who is shown the widget.
  • It does not follow a visitor across sites.
  • A labeled link counts steps under its label only when the address carried it, and never who: no cookie, no identifier, no pixel, and no redirect of ours between the person and the page.
  • It does not identify anybody. A referring site and a campaign are labels shared by everybody who came the same way; no identifier is made, nothing is kept in the reader's browser for them, and only the referring site's name leaves the browser, never the page they were on.
  • It does not know where a reader came from when the browser does not say. A referrer is whatever the browser chooses to send, and many send nothing — an app, a strict privacy setting, a typed address — so "direct" also holds the ones nobody named.
  • It does not read a campaign from anywhere but the address of the page the wall is shown on. A reader who arrives with a tag and reads the wall on the next page has left the tag behind.
  • It does not count an AI crawler that does not name itself, or one reading a widget on your own site: those crawlers read a page without running the script that draws the widget. Only your hosted walls are counted, and a crawler that names itself is counted whether or not it is who it says.
  • It does not catch a machine that pretends to be a person. Robots that name themselves are most of them, and those are left out; the figures still decide nothing.
  • Leaving pages that are not on your list of sites out of the figures is not a lock: it reads the address the browser says it is on, which a program can leave out or write itself.
  • forward=1 sends your own analytics nothing about the reader and loads no script: it calls only the tools your page already loaded, with the layout and the testimonial's public id, and only for an event Hazelsong counts too.
  • A press of a wall's button is a count, not a person, and the share link shows each wall's presses and showings — never the button's words or where it goes.
  • A page listed under "Is anything broken?" because the widget could not draw there carries nothing about the reader who loaded it — only the page, what went wrong and when it was last seen.
  • A message about a new testimonial does not carry its words — not the whole, not a first line. Nobody has read it when it arrives, the reading exists to catch a private detail before anything is published, and an inbox or a channel keeps what it is sent for years. The words are one log-in away.
  • A low rating or score changes nothing for the person who gave it. It decides whom you are told about, not what they are asked, what is published, or where they are sent: nothing is routed by score.
  • Emails about new testimonials have a figure: 20 a month on Starter and 50 on Pro (2 on the free plan), counted per address and shared by the account's projects, inside the month of emails to you about your projects (20 on Starter, 50 on Pro). They do not use up the emails to your customers, and past the month's figure the channel is still posted to.
  • All projects is the owner's page: a seat, an administrator included, sees the one project it was given and nothing of the others.
  • A project's row on All projects is never counted for the page itself: it reads what the project already counts, and a figure can be up to five minutes behind its own report.
  • The channel is not a general webhook. Only Slack, Discord and Microsoft Teams addresses are accepted, and the allowance warnings stay email to whoever pays. For any other system, use a webhook on the API page.
  • A share link will not show a testimonial's words, the name or the email address of anybody who wrote one, what the risk reading found, your dashboard link or your API, and nothing on it can change anything. It shows counted figures and nothing else.
  • It does not count past the month's figure: once the account's counted events are spent, views, plays, clicks and form steps are not counted until the month turns, and the report and an email at 80% say so beforehand.
  • Reaching a question is counted, never what was typed, which answer was chosen or who reached it, and a question is numbered by where the form asks it now: move one, and its earlier figures stay with the number.
  • A share link is not a login and is not a seat: it opens one page of figures, and whoever holds the address can read it until you revoke it or it expires. A password is the way to make holding the address not enough.
  • A share link answers up to a figure: all of an account's links together answer 2 requests an hour, and past that the page says to come back in an hour rather than counting anything. The figures on it are counted again at most every thirty minutes.
  • “Prepared by”: it is not shown on a protected link before its password is given: that page names neither the project nor you.
  • “Prepared by”: your mark is never put in an email, because an image fetched from us when a message is opened would tell us it was opened.
  • “Prepared by”: your reply-to address is shown as text, never set as the email's Reply-To and never made a link: nobody has checked that it is yours.
  • “Prepared by”: it does not change who sends the email or remove our name from its last line, and it adds nothing to a page a reader of your wall sees.

Where it lives in the code: lib/analytics.ts · lib/question-funnel-rules.ts · lib/wall-stats.ts · lib/wall-cta.ts · lib/forward.ts · lib/allowed-sites.ts · lib/widget-faults.ts · lib/origins.ts · lib/bots.ts · lib/ai-crawl.ts · proxy.ts · lib/csv-cell.ts · lib/form-funnel.ts · lib/care.ts · lib/overview-rules.ts · lib/overview.ts · app/api/projects/overview/route.ts · components/ProjectsOverview.tsx · scripts/overview.mjs · lib/owner-mail.ts · lib/arrivals.ts · lib/arrival-notices.ts · lib/channel.ts · app/api/channel/route.ts · app/api/cron/arrivals/route.ts · components/CarePanel.tsx · scripts/arrivals.mjs · lib/shares.ts · lib/share-rules.ts · lib/share-terms.ts · app/api/track/route.ts · app/api/report/csv/route.ts · app/api/care/route.ts · app/api/shares/route.ts · app/share/[id]/page.tsx · components/SharesPanel.tsx · components/SharedReport.tsx · scripts/share.mjs · lib/notes.ts · lib/notes-rules.ts · app/api/notes/route.ts · components/DayChart.tsx · scripts/notes.mjs · scripts/drop-alert.mjs · lib/prepared-by-rules.ts · app/api/prepared-by/route.ts · components/PreparedByPanel.tsx · components/PreparedBand.tsx · scripts/prepared-by.mjs

Questions

Asked about this

From Help, where every answer is written from the product as it runs.

How much code is it?

Two lines: a script tag and a div. The layout is a query string on the script tag, or a data attribute on the div — both of which live in your page, so turning a wall into a marquee later means editing those two lines where you pasted them. There is nothing to rebuild at this end.

It shows nothing on my page.

Three usual causes, in order of likelihood: nothing is published yet (Pending is not published); the builder you are using strips script tags from block content, in which case the tag goes in the theme footer; or you are looking at the editor preview rather than the live page, which is normal on Webflow, Framer, Elementor and Squarespace.

Can I embed it in Notion or a newsletter?

No, and not because of us: neither runs a third-party script. Link the hosted wall in Notion, and use a testimonial image in the newsletter. Email has not run JavaScript for twenty years.

Does the widget slow my page down?

It is one small script with no framework behind it and no font to fetch. It draws after your page has drawn.

More on putting them on your site

This is running now

Open a project and use it. Nothing on this page is a roadmap.