6 live links · 99,205 clicks in the demo dataset, last 7 days

Every click,
on the record.

A free link shortener that writes 28 fields into our own Postgres on every redirect. The panel below runs that query for real, over a demo dataset we seeded — the software is live, the visitors are not.

  • No account, ever
  • No tracking cookies
  • 50 links a day per IP
  • Raw IPs deleted after 90 days
Talk to us

Live

Not a screenshot. Not real visitors either.

The numbers are a demo dataset we seeded — nobody clicked these links this many times. Everything around them is the product: the shipped code, running its real SQL against the real Postgres table, with the answer never more than a minute old. Open a link in a new tab, come back a minute later, and your own click lands in here on top of it.

Demo datasetSeeded demo rows, not real clicks. The queries, the database and this panel are real.

Clicks

45,677

Unique visitors

31,225

Clicks per day10,582
09/0209/0309/0409/0509/0609/0709/08
Clicks per day
2026-09-027630
2026-09-038287
2026-09-0410582
2026-09-056541
2026-09-062539
2026-09-079516
2026-09-08582

Country

  • TR28,164 · 62%
  • DE3,600 · 8%
  • US2,965 · 6%
  • GB1,327 · 3%
  • NL1,116 · 2%

Device

  • Mobile24,816 · 54%
  • Desktop19,288 · 42%
  • Tablet1,187 · 3%
  • Unknown269 · 1%
  • TV65 · 0%

Browser

  • Chrome28,747 · 63%
  • Mobile Safari7,040 · 15%
  • Samsung Internet2,544 · 6%
  • Edge2,447 · 5%
  • Safari1,598 · 3%

Referrer

  • Direct / none19,940 · 44%
  • google.com6,109 · 13%
  • google.com.tr4,285 · 9%
  • instagram.com2,656 · 6%
  • t.co2,078 · 5%

What one click records

28 fields, per click, in one row

There is no sampling and no rollup table. A click is a single INSERT into a partitioned click_events table, and every column below is filled from the request itself: the IP, the User-Agent, the Referer header and the query string.

It is written inside after(), once the 308 has already gone out. Analytics cannot slow a redirect down here, because it does not start until the redirect is finished. Measured from inside the cluster, with the network taken out, the origin’s own share of a redirect is 3.0 ms at the 90th percentile and 2.3 ms at the median, pooled over 60 requests from 3 separate runs. Individual requests still land well outside that — the slowest we recorded was 25.9 ms — and this is a warm process on a single node under no load, so read it as the floor rather than a guarantee. What a visitor waits is that plus the round trip to them, and the round trip is nearly all of it.

The raw IP is the one field with a clock on it. A retention job runs every night and clears the address out of every click row older than 90 days — to the second, not to the nearest month. click_events is also partitioned by month, so once an entire month is past retention its partition is dropped whole and the storage that held those addresses is released as DDL rather than by a DELETE somebody has to remember to run. That second step lands up to a month after the first; the clearing is what the 90 days rests on.

Time
  • clicked_atTimestamp
Identity
  • ipIP addresscleared at 90 days
  • ip_hashIP hash, daily salt
  • visitor_keyVisitor key
Geography
  • countryCountry
  • regionRegion
  • cityCity
  • continentContinent
  • latitudeLatitude
  • longitudeLongitude
Device and software
  • device_typeDevice type
  • device_vendorDevice vendor
  • device_modelDevice model
  • browserBrowser
  • browser_versionBrowser version
  • osOperating system
  • os_versionOS version
  • engineRendering engine
  • uaRaw User-Agent
Source
  • refererReferrer domain
  • referer_urlReferrer URL
Campaign
  • utm_sourceCampaign source
  • utm_mediumCampaign medium
  • utm_campaignCampaign name
  • utm_termCampaign term
  • utm_contentCampaign content
Classification
  • triggerTrigger
  • is_botBot flag

Column names as they appear in the schema.

Compare

Five rows, read off their own pages

These are the differences that survive a look at the other vendors’ own documentation — including the one that goes against us: Rebrandly throws the visitor’s IP away immediately, which is stricter than our 90 days. The rows where we lose outright are on the per-competitor pages, not hidden.

A dashed cell is one we could not confirm from the vendor’s own pages — some of them publish their pricing and legal pages as JavaScript only, and a page we cannot read is not a page we can quote. We leave the gap rather than fill it from a review site.

Feature comparison between gecis.in and other link shorteners
Capabilitygecis.inBitlyDubShort.ioTinyURLRebrandly
Click analytics on the free tierSupportedNot supportedSupportedSupportedNot verified yetFirst 100 clicks a month
City-level geography on the free tierSupportedNot supportedSupportedSupportedNot supportedNot supported
Unique visitors, counted without cookiesSupportedPaid plans onlyNot supportedNot supportedSupportedPaid plans only
Where your click data livesOur own hardware, GermanyUnited StatesUnited StatesContested: their own pages disagreeNot verified yetUnited States
Published raw-IP retention limit90 days, then hashes onlyNot publishedNot publishedClick stream kept a yearNot verified yetDiscarded immediately
  • Supported
  • Not supported
  • Not verified yet

FAQ

The questions people actually ask

Do I need an account?
No, and you could not make one if you wanted to — there is no account system yet. You paste a URL, you get a short link, and that link keeps working. The trade-off is in the next answer.
Where do I see the analytics for a link I create?
Through the API, if you hold a token — and today only the operator does. Every field is recorded against your link from its first click, and the v1 API reads the aggregates back, per link or across an account. What does not exist yet is a way for you to get a credential, because there are no accounts. So if you need a dashboard you can log into this week, we are still not the right tool; say so on the waitlist form and we will let you know when accounts land.
Can I put my own domain in front of it?
Not yet. Every link is gecis.in plus a seven-character slug. Custom domains are on the roadmap and we have not put a date on them, so treat it as unavailable when you are deciding.
Is there an API?
Yes, as of this release. A versioned REST surface under /api/v1 covers creating links one at a time or in bulk, listing, updating and deleting them, analytics per link and across an account, token management, and QR codes as PNG or SVG. It is documented at /docs/api and machine-readable at /api/v1/openapi.json, and that document is generated from the same schemas the handlers validate with, so the two cannot drift apart. Authentication is one bearer token. The honest caveat: there is no signup, so the only token in existence is the operator’s. Holding one is not a way around anything either — the API runs the same target validation, the same private-range refusal and the same reserved-slug list as the public form. The one older public endpoint, /api/stats/:slug, is still there and still answers only for the six demo links.
What exactly happens to my visitors' IP addresses?
The raw address goes into the click row, so a per-IP breakdown is possible, and it is separately hashed with a salt that rotates every day. A nightly retention job clears the raw address out of any click row older than 90 days, and because click_events is partitioned by month, the partition holding those rows is later dropped whole — which releases the storage as well, up to a month after the clearing. What survives is the hash, and a hash does not turn back into an address.
How do you count unique visitors without cookies?
The IP hash and a hash of the User-Agent are combined into a visitor key. Five clicks from one person on one day are five clicks and one visitor. The salt rotates at midnight, so the same person tomorrow is a different key — which is the point. It counts a day, it does not follow a person.
What stops someone shortening a phishing link?
Cloudflare Turnstile on the create endpoint; 10 links an hour and 50 a day per IP address; a hard refusal of any target that resolves to a private or reserved range, including a hostname that resolves there later; and noindex plus nofollow on every redirect, so we cannot be used to launder SEO. Whatever still gets through, report it and we look within 48 hours.
Where does this actually run?
On our own hardware in Germany, with Cloudflare in front of it. Postgres 17, no third-party analytics vendor in the request path, and no data sold or shared for advertising.
What will it cost?
Nothing today. There is no payment integration on this site. When the plans open, the waitlist hears first and gets the launch price.
How fast is the redirect?
Two numbers, and they measure different things. The server’s own share, timed from inside our cluster against the service address so the internet is out of the picture: median 2.3 ms and 3.0 ms at the 90th percentile, pooled over 60 requests across 3 separate runs to a warm process with nothing else running. The full spread ran from 1.8 ms to 25.9 ms — occasional outliers in the tens of milliseconds are real, a short run simply never samples one, and we would rather publish the ugly maximum than a tidy one we cannot reproduce. That is the part we control and the only figure we will quote as ours. End to end is another matter — from a client in Turkey, through Cloudflare, the median over 10 requests was 282 ms, and almost all of that is the round trip to you, which no shortener can shrink. Both were measured on the same day with scripts/measure-redirect-latency.sh, which is in the repository so you can run it yourself.
Are the numbers on this page real clicks?
The clicks are not; everything else is. The panel is filled from a demo dataset we seeded across 90 days, marked in the database with a visitor key that starts with demo: — because six links with three clicks between them tell you nothing about what the product does at volume. The schema, the SQL, the aggregation and the rendering are the shipped ones, running per request against the real table. Real clicks on those links land in the same table and are counted alongside. When accounts ship, your own links will show your own clicks and none of this.
Do I get a QR code for a link?
Yes, from the API: PNG or SVG, at a size and error-correction level you choose. The image encodes the short link with qr=1 on the end, which is what makes a scan record itself as a scan rather than as a click. The redirect strips that marker again before sending the visitor on, so the destination never sees it.
Report a link