Proposal · Social & Growth

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-x

Our 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/coinmarketcap

This 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.

LinkChannelGoes to
/go/claude-xPost on Xclaude.ai/directory/coinmarketcap?utm_source=…&utm_campaign=cmc_claude
/go/claude-nlNewsletter
/go/claude-tgTelegram

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

BitlyOur own links
How the link looksbit.ly/4iwItgacoinmarketcap.com/go/claude-x
Who keeps the dataBitlyCMC, next to our other analytics
TrustUnknown domain, the reader can't see where it goesOur own domain
CostMonthly planA few days of engineering, then near zero to run
Link nameRandom code, unless paidReadable, chosen by us
Effort to startNone, already in useNeeds a WebCore ticket

What engineering would build

Link table

Name, destination, owner, campaign, created date. A simple form or a Google Sheet to add links is enough to start.

Redirect route

/go/<name> on coinmarketcap.com. An unknown name goes to the homepage.

302, not 301

A 301 is cached by the browser, so repeat clicks skip our server and stop being counted.

Bot filter

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.

No cookies, no raw IPs

Unique people are counted from a daily hash of IP and browser. The IP itself is never stored.

Only our destinations

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.

Dashboard

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

  1. Check what happens to our existing bit.ly links if we cancel the plan. Links already posted must keep working.
  2. Confirm the setup with WebCore: Cloudflare or another CDN, and which analytics the clicks should go to.
  3. Agree the path (/go/) and a naming rule: destination, then channel, as in claude-x.
  4. Open the CWEB ticket with the build list above.
  5. Run both in parallel for one campaign, compare our counts with Bitly's, then switch.