Guide
How Sereno works
Everything the product does, in plain English. If a word here needs explaining and does not get explained, that is our mistake — tell us and we will fix the page.
The one line you paste
A website is built from a file of text that your browser reads. Somewhere in that
file, near the top, there is a line that says </head>. You paste one line
just above it:
<script defer data-site="example.com" src="https://serenoanalytics.com/s.js"></script>
Your own copy, with your domain already filled in, is on your site's setup page. Most website builders have a box for this called "custom code", "code injection" or "header scripts" — paste it there and you are finished.
That is the whole installation. Nothing else is ever added, and everything below on this page is optional.
Each time somebody opens a page, that line sends us six small things: which page, which website sent them, which country they are in, roughly how wide their screen is, and what kind of device and browser they used. It never sends their address, their name, their IP, or anything that could be traced back to a person, and it stores nothing on their computer. That is why your visitors never see a cookie banner.
Where it shows up. Immediately. Visitors, page views, top pages, where they came from and countries all start filling in within a minute of the first person arriving.
What an attribute is
This word comes up in the next section, so it is worth thirty seconds.
A web page is made of tags. A tag is a piece of text that says "this bit is a button" or "this bit is a heading". A button on your site is written like this:
<button>Sign up</button>
A tag, wrapped around the words on the button.
An attribute is an extra word written inside a tag that already exists. Not a new tag, not a new file, not another script to install — just extra text tucked inside the one that is already there:
<button data-sereno-action="Signup">Sign up</button>
The same button. It looks identical to a visitor and behaves identically. It is just carrying a label now.
Counting what matters, not just visits
A visit is not the same as an enquiry. Sereno can count the moment that your site exists for — somebody signing up, buying, sending a contact form — and show it beside how many people came. We call those actions.
If the moment is a click, add the attribute to the thing being clicked and you are done. The script already on your page notices it:
<button data-sereno-action="Signup">Sign up</button> <a data-sereno-action="Enquiry" href="/contact">Get in touch</a>
Signup and Enquiry are names you choose. Whatever you write is what appears on your dashboard.
If the moment is not a click — a form that passed validation, a payment that actually cleared — then somebody who looks after your site can call it directly instead:
sereno("Purchase")
One line, wherever your site already knows the thing succeeded.
Being straight with you: this is the one part of Sereno that needs somebody willing to edit their site, and on some website builders that is genuinely awkward. If it is beyond you, skip it. Everything else works without it.
Where it shows up. The Actions card. It sits at the bottom of your dashboard, explaining itself, until the first one arrives — then it moves to the top, above the traffic, because how many people did the thing matters more than how many people looked. You get the number of times it happened and the share of visitors who did it at least once.
Knowing which of your links people came from
This one confuses everybody, so here is the problem before the solution.
You write a newsletter. In it you put a link to your site. Forty people click it. On your dashboard those forty appear under Direct — the same place as people who typed your web address from memory. Not because Sereno is bad at its job: email programs do not tell a website where a click came from. The information does not exist. The same is true of links in WhatsApp, in a PDF, or in an app.
So you put the answer into the link yourself, before you share it. Instead of pasting this into the newsletter:
https://example.com
Forty visitors, all filed under Direct.
you paste this:
https://example.com/?utm_source=newsletter
The same page. The visitor notices nothing at all — it opens exactly as before. But the link is now carrying a note saying where it was shared, and Sereno reads it.
Nothing here touches your website. There is no code to add and nothing to install. It is only ever the link you paste into a newsletter, a post or an advert.
There are three of these notes and all are optional. utm_source is
where — newsletter, instagram, a podcast. utm_medium is
how it reached them — email, social, paid. utm_campaign is
which push it belonged to — march-launch, summer-sale. You invent the
names; they are for you to recognise later. utm is not a Sereno invention, by
the way — every analytics tool reads these, so a link you tag today still works if you ever
leave us.
You do not have to write any of that by hand. Your site's setup page has a small builder: press Newsletter, type a name for the campaign, and copy the finished link.
Where it shows up. Three cards — Campaign source, Medium and Campaign. They stay at the bottom of the dashboard explaining themselves until your first tagged link is clicked, then they move up and behave like every other card. Use the same spelling each time and the counts add up; a different spelling gives you two rows, which is why the builder tidies capitals and spaces for you.
A worked example
You run a small guitar shop. You have pasted the one line into your site. Then:
- You add
data-sereno-action="Enquiry"to the "Ask us a question" button on your contact page. - You are about to send your monthly email. You open your site's setup page, press Newsletter, type august as the campaign, and copy the link it gives you into the email.
- You also post about it on Instagram, so you go back, press Instagram, type august again, and copy that link into your post.
A week later your dashboard tells you: 340 visitors. Under Campaign source, newsletter 90 and instagram 210. Under Actions, Enquiry 14 — four per cent of visitors. Click the instagram row and the whole screen re-answers for those 210 people alone, so you can see which pages they read and what they were using.
Which tells you the thing worth knowing: Instagram brought more than twice the traffic, and now you can see whether it brought more enquiries or just more browsing.
Reading the numbers
- Visitors — how many different people. Somebody who reads five pages is one visitor. Over a range of several days, somebody who comes back on a second day counts twice; the explanation is in the last section and it is the same reason you need no cookie banner.
- Views — how many pages were opened in total.
- Pages each — views divided by visitors. Roughly how far people go before they leave.
- People here — how many are reading right now, in the last five minutes.
- Top pages — which pages were opened, most first.
- Where they came from — the website that sent them. Direct means no website did: typed from memory, a bookmark, an email, a message. It is normally one of the largest rows and that is healthy.
- Countries — worked out from the request and then thrown away. We never store an IP address.
- Devices, browsers, operating systems — phone or laptop, Chrome or Safari, Windows or Mac.
Every row is a link. Click one and the entire screen re-answers for it: click United Kingdom and the top pages become the pages British visitors read, the chart becomes British visitors a day. Filters stack, so you can ask for British visitors on a phone who came from Instagram. Click the row again, or the × on the chip at the top, to let it go.
Reading your numbers from your own code
Everything on the dashboard can also be fetched as data, so you can put your own figures on your own page — a live counter in a footer, a weekly digest built by a script, a client report assembled without anybody logging in.
Make a key in Settings, give it a name that says what it is for, and copy it. It is shown once: we store only a one-way hash, so if it is lost nobody here can look it up — you revoke it and make another.
curl https://serenoanalytics.com/api/v1/stats?site=example.com \
-H "Authorization: Bearer srn_your_key_here"
One request, one answer. Add &days=30 for a longer window — anything
from 1 to 365.
What comes back is the same set of figures the dashboard draws: visitors, page views, views per visit, a day-by-day series, and the breakdowns — top pages, referrers, countries, devices, browsers, systems and your actions.
How hard you may work it: 500 requests an hour on Starter, 1,500 requests an hour on Growth. A ceiling on hammering rather than an allowance to spend — the
top one is twenty-five requests a minute, far beyond any honest use. Every answer carries three
headers — X-RateLimit-Limit, X-RateLimit-Remaining and
X-RateLimit-Reset — so a script can pace itself rather than finding out by
being refused. The count resets on the hour, not on a rolling window, so a quiet hour
never has to be waited out.
An hourly ceiling rather than a monthly allowance is deliberate. A monthly quota means somebody’s script stops working on the fourth of the month and they find out from a customer. This one stops hammering and never produces that surprise.
The API needs a paid plan. It is the one thing held back from Free, and the only feature difference between any two plans: an unpaid key is the single thing somebody can point a script at and forget about, and the traffic that costs is real. Starter at $10 a month is where it starts.
Where it shows up. Nowhere on the dashboard — it is for your code. Keys, and when each was last used, are in Settings.
What Sereno will never be able to tell you
Worth knowing now rather than being disappointed later. These are not features waiting to be built — they are the deliberate cost of not needing a cookie banner.
- Who somebody is. No names, no email addresses, no company names, no profiles. We store nothing that identifies a person, so there is nothing to look up.
- What one person did. There is no journey to follow, because there is nothing tying one page view to the next beyond the same day.
- Whether somebody came back next week. The way we recognise a repeat view is deliberately forgotten every night at midnight, so a visitor on Monday and the same visitor on Thursday are two visitors to us. That single fact is what removes the need for a cookie.
- What kind of laptop they own. Browsers stopped saying. Every Mac reports the same operating system version regardless of what it is running, and Windows 10 and Windows 11 are indistinguishable. Anyone showing you that breakdown is guessing at it.
Everything Sereno does record is listed in full in the privacy policy, which is short for the same reason.
Still stuck? Write to hello@serenoanalytics.com and a person will answer.