Our own short links on coinmarketcap.com
Replace Bitly with links like coinmarketcap.com/go/claude-x. Every click is counted on our side, and the data stays with us.
What happens when someone clicks
They tap the link
In a post, newsletter or email.
coinmarketcap.com/go/claude-xOur server looks it up
It finds claude-x in our link table and gets its destination.
It records the click
Time, link, country, device, where it came from, and whether it's a bot.
It sends them on
A 302 redirect to the destination, in a few milliseconds.
claude.ai/directory/coinmarketcapThis is exactly what Bitly does. The only difference is whose server sits in the middle, and therefore who keeps the data.
One destination, one link per channel
The channel lives in the link name. All three go to the same Claude directory page, and the dashboard shows the clicks from each.
| Link | Channel | Goes to |
|---|---|---|
| /go/claude-x | Post on X | claude.ai/directory/coinmarketcap?utm_source=…&utm_campaign=cmc_claude |
| /go/claude-nl | Newsletter | |
| /go/claude-tg | Telegram |
Link length doesn't matter on X: it wraps every link in t.co and counts it as 23 characters.
What it tells us
We can see
- How many people we sent to Claude, ChatGPT or any partner
- Clicks per channel, per day, per country and device
- Totals across X, newsletter, email and Telegram in one place
- Unique people per day, with no cookies
We can't see
- What they do on the partner's site, such as signing up or installing a connector
- UTMs on the destination only reach the partner's analytics, not ours
- For actual usage of the CMC MCP in Claude, the MCP server logs are the better source
Bitly vs our own links
| Bitly | Our own links | |
|---|---|---|
| How the link looks | bit.ly/4iwItga | coinmarketcap.com/go/claude-x |
| Who keeps the data | Bitly | CMC, next to our other analytics |
| Trust | Unknown domain, the reader can't see where it goes | Our own domain |
| Cost | Monthly plan | A few days of engineering, then near zero to run |
| Link name | Random code, unless paid | Readable, chosen by us |
| Effort to start | None, already in use | Needs a WebCore ticket |
What engineering would build
Name, destination, owner, campaign, created date. A simple form or a Google Sheet to add links is enough to start.
/go/<name> on coinmarketcap.com. An unknown name goes to the homepage.
A 301 is cached by the browser, so repeat clicks skip our server and stop being counted.
X, Telegram, Slack, Discord, LinkedIn and Facebook open every link to build the preview. They still get redirected, but are marked as bots and left out of the counts.
Unique people are counted from a daily hash of IP and browser. The IP itself is never stored.
The server only redirects to destinations in the link table, never to a URL passed in the link (?url=…). Otherwise anyone could use our domain to send people to phishing sites.
Clicks go into the analytics we already use, so they can sit beside site traffic.
How small it is
If our site runs behind Cloudflare (to confirm with engineering), the whole redirect is a Worker like this sketch:
const BOTS = /twitterbot|facebookexternalhit|slackbot|telegrambot|discordbot|linkedinbot|whatsapp/i;
export default {
async fetch(req, env, ctx) {
const name = new URL(req.url).pathname.split("/")[2];
const dest = await env.LINKS.get(name); // link table
if (!dest) return Response.redirect("https://coinmarketcap.com/", 302);
const ua = req.headers.get("user-agent") || "";
ctx.waitUntil(env.CLICKS.writeDataPoint({ // click log
blobs: [name, req.cf?.country || "", req.headers.get("referer") || "",
BOTS.test(ua) ? "bot" : "human"],
indexes: [name],
}));
return Response.redirect(dest, 302);
},
};
Next steps
- Check what happens to our existing bit.ly links if we cancel the plan. Links already posted must keep working.
- Confirm the setup with WebCore: Cloudflare or another CDN, and which analytics the clicks should go to.
- Agree the path (
/go/) and a naming rule: destination, then channel, as inclaude-x. - Open the CWEB ticket with the build list above.
- Run both in parallel for one campaign, compare our counts with Bitly's, then switch.