User guide

Make a code once. Change where it goes forever.

Welcome to Cortalim — the friendly way to make QR codes and short links that you stay in control of. Everything starts from the left sidebar: "New code" to make one, "My codes" to edit, download, or check how they're doing, and "Overview" for your scans at a glance. This guide walks you through the screens in plain language and answers the questions people ask on day one.

Try it free Developer API

Getting Started with Cortalim: Your First Code and the Four Services

Cortalim turns any destination into a scannable QR or a short link you can change later without reprinting. Everything starts from the left sidebar: Overview shows your scans, New code builds one, and My codes is where every code you make lives. This section walks you through the four Services — QR code, Short link, Link-in-bio, and Smart rules — when to reach for each, and exactly how to make your first one from a blank screen to a downloaded file.

Create your first code, start to finish

Takes you from an empty New code screen to a live, downloadable code in about a minute.

  1. Click New code in the left sidebar (or the New code button on Overview)
  2. Under Service, leave QR code selected
  3. Under What kind of code?, keep Website selected
  4. In Where should it go?, type or paste your web address (e.g. your-site.com/spring)
  5. Optional: give it a Name (only you see this) so you can find it later
  6. Click Create QR code at the bottom
  7. You will see: Done — your code is live. Find it under My codes
  8. Click the PNG or SVG button that appears to download it
Tip. The live preview on the right redraws the moment you type a destination or change a style, so you always know what you are about to create before you hit the button.

Service: QR code

Makes a scannable square you can print, style, and point at almost anything — a website, Wi-Fi, a contact card, a menu, and more.

  1. New code → Service → QR code
  2. Pick from What kind of code? — Website, Wi-Fi, Contact, Menu, Event, PDF, Social, and more
  3. Fill in the destination or the details box that appears for that kind
  4. Style it in the Design studio if you like
  5. Click Create QR code (the button relabels to match the kind, e.g. Create page for a menu)
Tip. The What kind of code? picker only appears under the QR code service. Pick the kind FIRST — choosing Wi-Fi or Contact swaps the plain address box for the right fields, so you are never pasting a raw link where a phone number belongs.

Service: Short link

Turns a long, messy web address into a tidy short link you can drop into a text, email, or bio — no QR image, just the link.

  1. New code → Service → Short link
  2. In Where should it go?, paste the long URL you want to shorten
  3. Optional: open Advanced options → Access & lifecycle → Custom short code to choose your own ending (e.g. SPRING24)
  4. Click Create short link
  5. Use the Copy link action on My codes to grab it
Tip. Choose Short link when you need something to paste, not scan — the Design studio is hidden here on purpose because a bare short link has no image to style. You can still edit where it points later without the link ever changing.

Service: Link-in-bio

Builds a single mini-page of your links — perfect for the one 'link in bio' slot on Instagram or TikTok where you want to send people to several places.

  1. New code → Service → Link-in-bio
  2. In the details box, add a Title and Subtitle for the page
  3. Under Links, fill in a Label and URL for each destination, clicking + Add for more
  4. Style the QR in the Design studio if you plan to print it too
  5. Click Create page, then share the short link or the QR
Tip. Add your most important link first — it sits at the top of the page where people tap most. You can reorder or swap links anytime afterward and the page (and its QR) stay exactly the same.

Service: Smart rules

Sends different people to different places from one single code — by their phone type, country, city, language, the time of day, or how many times it has been scanned.

  1. New code → Service → Smart rules
  2. In Default destination (if no rule matches), set the fallback address
  3. Advanced options opens automatically — under Routing rules, click + Add a rule
  4. Choose a condition (e.g. Device is), type its value (iPhone), and the address to send them to
  5. Add more rules — they run top to bottom and the first match wins
  6. Set Timezone for time & day rules so '4pm' means your audience's local time
  7. Click Create smart link
Tip. Order matters: put your most specific rule at the top. Anyone who matches no rule lands on the Default destination, so always fill that in — it is your safety net.

Find and download your codes (My codes)

The home for every code you have made — search, download in PNG or SVG, copy the link, pause, edit the destination, or check its scans.

  1. Click My codes in the left sidebar
  2. Use the search box or the All folders filter to find a code
  3. Download HD PNG: click the download icon in that row's Actions
  4. For a vector file, open a code and use its download options, or on the create screen click the SVG button
  5. Other row actions: Analytics, Edit destination, Copy link, and Pause/Resume
  6. Click Export CSV to download the whole list at once
Tip. Use PNG for print and everyday sharing; choose SVG when a designer or printer needs to blow it up large without any blur. Because codes are dynamic, use Edit destination to change where a printed code points — you never have to reprint it.

What kind of code? Every content type, and how to fill it in

On the New code screen, keep the Service toggle on "QR code" and you'll see the "What kind of code?" row. Each button builds a different thing: some make a little mobile web page we host for you (change the words anytime, the printed code never changes), some make a one-tap action like dialing a number, and one holds a swappable file. Every type also gets the "Name (only you see this)" box and the Design studio, and you'll watch it build in the live preview on the right. Here's each one.

Website

Turns your QR or short link into a dynamic redirect to any web address — and because it's dynamic, you can point it somewhere new later without reprinting.

  1. New code
  2. Service: QR code (or Short link)
  3. What kind of code? → Website
  4. Type the address into "Where should it go?" (e.g. https://your-site.com/page)
  5. Create QR code
Tip. This is the only type with the "Details in the link — params" box and "Inject live scan info" chips. Tap a chip like {city} or {device} and that live value rides along on every scan — great for a support code that already knows where it was scanned.

Text

Makes a hosted page that simply shows a block of text — a note, a disclaimer, instructions — no app or website needed to read it.

  1. What kind of code? → Text
  2. Fill in Title (optional) and "Your text"
  3. Create page
Tip. The text is an editable hosted page, so you can rewrite the message anytime and every printed code updates instantly — the note that says "Details — change these anytime, the QR stays the same" is literally true here.

Email

Makes an action link that opens the scanner's email app with a message already started to your address.

  1. What kind of code? → Email
  2. Fill in Email address, plus Subject and Message if you want them prefilled
  3. Create code
Tip. Subject and Message are optional — fill only the ones you want. Leave them blank and it just opens a fresh email to you; add them to save people typing ("Subject: Booth inquiry").

Phone

Makes an action link that starts a phone call to your number the moment someone scans and taps.

  1. What kind of code? → Phone
  2. Enter the phone number with country code
  3. Create code
Tip. Always include the country code (e.g. +1 415…). We strip spaces and dashes automatically, so type it however's readable to you.

SMS

Makes an action link that opens a new text message to your number, optionally with the message pre-written.

  1. What kind of code? → SMS
  2. Enter the Phone number, and a Message if you want it prefilled
  3. Create code
Tip. A prefilled message like "JOIN" turns a poster into a one-tap opt-in — the person just hits send.

WhatsApp

Makes an action link that opens a WhatsApp chat with your number, optionally with an opening message ready to send.

  1. What kind of code? → WhatsApp
  2. Enter the Phone number (with country code) and a Prefilled message if you like
  3. Create code
Tip. This uses wa.me, so the number must be the full international format with country code — no zeros or symbols needed, just the digits.

Wi-Fi

Makes a hosted page that shows your network name and password and lets guests join — with a built-in scan-to-connect QR on the page.

  1. What kind of code? → Wi-Fi
  2. Fill in Network name (SSID), Password, and Security (type WPA, WEP, or nopass for an open network)
  3. Create page
Tip. For a password-free network type "nopass" in the Security field — the page then shows it as "Open" and skips the password. Guests can also tap "Copy password" instead of retyping it.

Location

Makes an action link that opens Google Maps to the address or place you name.

  1. What kind of code? → Location
  2. Type the address or place name (e.g. "Central Park" or a full street address)
  3. Create code
Tip. A place name works as well as an exact address — whatever you'd type into Maps yourself is fine, since it becomes a Maps search.

Video

Makes an action link that opens a video you host elsewhere — YouTube, Vimeo, or a direct MP4 link.

  1. What kind of code? → Video
  2. Paste the Video link
  3. Create code
Tip. You don't upload the video to us — you point at where it already lives. Because it's a dynamic link, swap in next month's video later and the same code plays it.

Social

Makes an action link that opens your profile on a social network from just the network name and your handle.

  1. What kind of code? → Social
  2. In Network type one of: instagram, tiktok, x, youtube, facebook, linkedin, github
  3. In Handle type your username
  4. Create code
Tip. Just the handle — no @ and no full URL. We assemble the profile address for you (e.g. instagram + yourname → instagram.com/yourname). Threads and Twitter/X names also work.

Contact (vCard)

Makes a hosted digital business card with a "Save contact" button that drops your details straight into the scanner's phone, plus tap-to-call and tap-to-email buttons.

  1. What kind of code? → Contact
  2. Fill in Full name, Job title, Company, Phone, Email, Website, and a Short note
  3. Create page
Tip. Only Full name is really needed — every other field is optional and simply hides its button if you leave it blank. "Save contact" downloads a proper .vcf file, so it lands in the phone's real address book, not just a web page.

Menu

Makes a hosted, mobile-friendly menu page with sections, item names, descriptions, and prices — ideal for restaurants and cafés.

  1. What kind of code? → Menu
  2. Fill in the Menu title and optional Subtitle
  3. Under Items, fill Item / Price / Description, and tap "+ Add" for each dish
  4. Create page
Tip. Prices live on the page, not on the code — so when a price changes you edit the menu and the QR on every table stays the same. No reprinting.

Business

Makes a hosted mini-storefront page with your name, tagline, hours, and one-tap Call / Email / Directions buttons, plus any extra links you add.

  1. What kind of code? → Business
  2. Fill in Business name, Tagline, Phone, Email, Address, and Hours
  3. Under Links, add any Label / URL rows you want (menu, booking, reviews…)
  4. Create page
Tip. The Address becomes a tap-for-directions button and Hours accepts multiple lines — paste your whole week and it keeps the line breaks.

Event

Makes a hosted event page with an "Add to calendar" button (a real .ics download) and, if you give a location, an "Open map" button.

  1. What kind of code? → Event
  2. Fill in Event name, Starts, Ends (optional), Location, and Description
  3. Create page
Tip. "Starts" and "Ends" are date-and-time pickers — set them and the calendar file carries the exact times, so guests get a proper reminder, not just a note.

PDF

Makes a code that opens a PDF you upload to us — a menu, flyer, spec sheet, or manual — hosted so it opens cleanly on any phone.

  1. What kind of code? → PDF
  2. Give it a Title (optional)
  3. Click "Upload PDF" and choose your file
  4. Create page
Tip. This is a swappable file: upload a new PDF later (the button becomes "Replace PDF") and the same printed code serves the new document — perfect for a menu or price list that changes seasonally. You must upload a file before Create will work.

Product · GS1

Makes a retail/supply-chain product code that encodes a GTIN barcode number along with batch, serial, and expiry details.

  1. What kind of code? → Product · GS1
  2. Enter the GTIN (the product barcode number)
  3. Add Batch / lot, Serial, and Expiry (YYYY-MM-DD) if you have them
  4. Create product code
Tip. Only the GTIN is required; batch, serial, and expiry are optional add-ons for traceability. Use the Expiry format exactly as YYYY-MM-DD (e.g. 2027-03-01).

The Design studio in depth: making your code look like yours

The Design studio is where you make a code look like yours instead of a plain black square. You'll find it on the New code screen, just below the Name field, labeled Design studio. It has five tabs across the top — Shape, Color, Logo, Frame, Level — and whatever you change shows up instantly in the live preview on the right. Nothing here changes where the code goes; it only changes how it looks and how tough it is to scan. Work left to right through the tabs, and keep one rule in mind: contrast and quiet backgrounds are what let a phone read it.

Shape — data pattern & corner eyes

Changes the little dots that make up the code and the three big squares in the corners, so your code feels sharp and geometric or soft and friendly.

  1. New code
  2. Design studio
  3. Shape tab (open by default)
  4. Under Data pattern, pick one: Square, Rounded, Smooth, Dots, or Diamond
  5. Under Corner eyes, pick one: the filled square, the rounded square, the circle, or the leaf
  6. Watch the preview on the right update
Tip. The three corner squares are the 'eyes' a phone uses to find and lock onto your code, so Cortalim always keeps them a reliable shape no matter how fancy your Data pattern is. Rounded (the default) and Smooth look modern and still scan beautifully; Dots and Diamond are the most decorative, so give them a quick test scan before you print a big run.

Color — code color, gradient fill & background

Sets the color of the dots, optionally blends them from one color into another, and sets the background behind them.

  1. New code
  2. Design studio
  3. Color tab
  4. For Code color, click one of the swatches (Black, Cobalt, Violet, Coral, Green, Navy) or use the color box beside them to dial in an exact brand color
  5. To blend two colors, tick Gradient fill, then pick a Gradient end color from its swatches or color box
  6. Under Background, use the color box to change the backdrop — but read the hint: 'Keep it light — dark backgrounds don't scan'
Tip. Scanners need strong contrast: a dark code on a light background. Keep your Background near-white and your Code color genuinely dark. Coral or Green can be too light on white — if the preview looks faint, choose a deeper color or you'll get failed scans. Gradient is a nice brand touch, but keep both ends dark so contrast holds.

Logo — drop your brand mark in the center

Places your logo in the middle of the code so it's unmistakably yours.

  1. New code
  2. Design studio
  3. Logo tab
  4. Click + Upload logo under Center logo
  5. Choose a PNG, JPG, GIF, or WebP file
  6. The preview redraws with your logo on a small white plate in the center
  7. To remove it, click the logo button again to clear it
Tip. When you add a logo, Cortalim automatically drops it on a clean white plate and forces error-correction up to the highest level so the covered dots don't break the scan — you don't have to touch the Level tab yourself. Use a simple, high-contrast logo and keep it small; a busy or pale mark makes the code harder to read.

Frame — add a 'SCAN ME' call to action

Wraps your code in a labeled frame so people actually know to scan it, instead of ignoring a bare square.

  1. New code
  2. Design studio
  3. Frame tab
  4. In the gallery, pick a style: None, Banner, Top, Button, Card, Badge, Ticket, or Corners
  5. Once you pick anything other than None, the Frame text and Frame color options appear
  6. Type your label in Frame text (default is SCAN ME, up to 24 characters)
  7. Set Frame color with the color box (default is a blue, #3457FF)
Tip. A frame with a clear prompt noticeably lifts how many people scan, so it's worth adding on anything printed. Banner and Top put a colored bar under or over the code; Button and Badge look like a tappable pill; Ticket and Corners are more decorative. Keep the text short and match the Frame color to your brand or the Code color for a tidy look.

Level — error-correction (L / M / Q / H)

Controls how much damage, dirt, or logo coverage the code can survive before it stops scanning.

  1. New code
  2. Design studio
  3. Level tab
  4. Under Error-correction level, choose one: L · 7%, M · 15% (the default), Q · 25%, or H · 30%
  5. Read the hint below the buttons for guidance
Tip. Higher levels can lose more of the code and still scan, but they pack in more dots so the pattern gets denser. The rule of thumb Cortalim gives you: use H for anything printed or anything with a logo, and you can leave it at M for a code that only lives on screens. If you added a logo on the Logo tab, error-correction is already maxed for you automatically.

Details in the Link: Params and Live Scan Info

Below the design studio on the New code screen, there's a box called "Details in the link — params." It lets you attach little bits of information to your destination web address so they ride along on every scan. There are two kinds: fixed details you type in yourself (params), and live details Cortalim fills in at the moment of each scan (Inject live scan info). Here's how to use both. Note: this box only appears when your code points to a web address (a QR code or short link to a URL); it doesn't show for a vCard, menu, or link-in-bio page.

Details in the link — params (fixed key = value)

Attaches a fixed piece of information — like a table number, a campaign name, or a location ID — to your web address, so it's included every single time someone scans, with no change from scan to scan.

  1. On the New code screen, choose your Service (QR code or Short link) and pick what kind of code in the "What kind of code?" picker, then paste or type your destination web address.
  2. Scroll to the box titled "Details in the link — params."
  3. Click the "+ Add a detail" button — a new row appears with a "key" field, an = sign, and a "value" field.
  4. In the "key" field type the name of the detail (for example, table), and in the "value" field type its value (for example, 12). The row reads table = 12.
  5. To remove a row, click the ✕ on the right of that row. Add as many rows as you need.
  6. Finish the rest of the form and save. Now every scan of that code arrives with ?table=12 on the end of your web address, so your ordering page knows the scan came from table 12.
Tip. Keep keys short, lowercase, and free of spaces (use table, ref, or loc_id rather than "Table Number") — they become part of a web address, and your destination page usually expects tidy names. Make a separate code for each table or poster and change only the value; that's how you tell scans apart later.

Auto-detect params from a pasted URL

If the web address you paste already has details after a "?", Cortalim notices them and fills in the params rows for you automatically — so you don't have to retype anything.

  1. In the destination address field, paste your full link including everything after the "?" — for example, https://shop.example.com/menu?utm_source=flyer&ref=spring.
  2. Look at the "Details in the link — params" box: Cortalim splits off each detail and drops it into its own key = value row (utm_source = flyer and ref = spring appear automatically).
  3. Edit any value, or click ✕ to drop a row you don't want.
  4. The base address (the part before the "?") is what Cortalim saves and points to; your params are managed in the rows, so you can adjust them without re-pasting the whole link.
Tip. You can paste the messy full link straight from your browser's address bar and let Cortalim tidy it up. It won't create duplicate rows for a detail that's already listed, so pasting again after an edit is safe.

Inject live scan info (live tokens)

Adds live values that are different for every scan — the visitor's city, device, time of day, and more — appended to your web address automatically at the moment they scan, so your destination page instantly knows the context.

  1. In the same box, find the "Inject live scan info" heading — below it is a row of chips: {city}, {device}, {os}, {browser}, {country}, {language}, {time}, {date}, {weekday}, and {code}.
  2. Click a chip to turn it on; it highlights to show it's active. Click it again to turn it off.
  3. Turn on the ones you want. Example for a support form: point the code at your support page and switch on {city} and {device}.
  4. Save. Now when someone scans, Cortalim appends the real values — for a scan from Denver on an iPhone, your support form opens with ?city=Denver&device=Mobile already filled in, so the visitor (or your team) doesn't have to explain where they are or what they're using.
  5. {code} is handy too — it appends the code's own short ID, so a page that serves many codes can tell exactly which one was scanned.
Tip. These values come from the visitor's connection and phone, so {country}, {city}, and {language} can occasionally be blank if location or language can't be detected — that's normal, and Cortalim simply leaves a blank one off rather than sending an empty value. Always scan your own finished code once and glance at the address that opens to confirm the details you expected are riding along.

Smart routing: send one code to different places

One QR or short link can send people to different destinations depending on who's scanning, when, and where. You build this with the rule builder tucked inside Advanced options on the New code screen. Rules run top to bottom and the first one that matches wins — so the order you list them in is the whole game.

Routing rules (the rule builder)

Lets one code point to several destinations, choosing between them at scan time based on device, place, language, day, time, date, or how many times it's been scanned.

  1. New code → pick your Service (QR code, Short link, or the Smart rules shortcut)
  2. Fill in Where should it go? — this is your safety net, the place people land when no rule matches
  3. Scroll down and click ⚙︎ Advanced options to expand it
  4. Find the Routing rules panel at the top
  5. Click + Add a rule to drop in your first rule row
  6. Finish the rest of the form and click Create code
Tip. Tip: click the Smart rules button in the Service row and Cortalim opens Advanced options for you and drops in the first empty rule automatically — and it renames the top box to 'Default destination (if no rule matches)' so it's crystal clear that box is your fallback.

How first-match-wins works (and the fallback)

Cortalim checks your rules from top to bottom on every single scan and stops at the very first one that fits; if none fit, it uses your default destination.

  1. Add your rules in priority order — most specific at the top
  2. Drag matters: a scan takes the first rule it satisfies, then stops looking
  3. Leave the top 'Where should it go?' / 'Default destination' box filled — that's where unmatched scans go
  4. To reorder, delete a rule with its ✕ and re-add it in the spot you want
Tip. Put narrow rules (a single city, a weekend, one language) above broad ones. If you list 'Country is US' above 'Device is iPhone', a US iPhone user never sees the iPhone rule — the US rule already caught them.

The condition menu (all the ways to match)

Each rule row is one condition: a dropdown on the left, a value box in the middle, and a 'send them to https://…' box on its own line underneath.

  1. Device is → type exactly iOS, Android, Desktop, or Other (iPhone and iPad both count as iOS)
  2. OS contains → type part of the system name, e.g. Windows, macOS, Android, Linux, iOS
  3. Country is → type the 2-letter country code in caps: US, GB, CA, MX, DE, ES, FR, AU, IN
  4. City is → type the full city name, e.g. Chicago
  5. Language starts → type the language prefix, e.g. es, fr, en, pt, de
  6. Day is (Mon,Sat) → type day abbreviations, comma-separated: Sat,Sun
  7. Time between (09:00-17:00) → type a 24-hour range: 17:00-23:59
  8. Before date → type a date; matches until that date arrives: 2026-09-01
  9. After date → type a date; matches from that date onward: 2026-09-01
  10. Scan count under → type a number; matches while total scans are below it: 100
  11. Scan count over → type a number; matches once total scans reach it: 100
Tip. A rule only saves if it has BOTH a value AND a destination — Cortalim silently skips any half-filled row. Also, whatever URL a rule picks still gets your params and UTM tags added on top, so tracking keeps working no matter which door a visitor goes through.

Timezone for time & day rules

Sets the clock your 'Time between' and 'Day is' rules read from, so '4pm' means 4pm for your audience instead of on a server somewhere.

  1. Inside Advanced options, look just below the rules for 'Timezone for time & day rules'
  2. Pick your zone from the dropdown (it pre-selects your own browser's timezone)
  3. Choose the city closest to your customers — e.g. America/New_York, Europe/London, Asia/Kolkata
Tip. This only affects time-of-day and weekday rules — device, country and language rules ignore it. If your brunch/lunch/dinner windows feel an hour off, this dropdown is almost always the fix.

Recipe — iPhone to the App Store, Android to Google Play

Sends Apple users to your App Store page, Android users to Google Play, and everyone on a laptop to your website.

  1. Advanced options → + Add a rule → set the dropdown to Device is, value iOS, send them to your App Store link
  2. + Add a rule again → Device is, value Android, send them to your Google Play link
  3. Leave the top destination box set to your normal website — that catches desktop and everything else
  4. Create code
Tip. If App/Play routing is literally all you want, skip the rule builder: on the New code screen pick What kind of code? → App and just fill the three boxes. Use the rule builder when you want to layer country or language on top of device.

Recipe — a different page at brunch, lunch and dinner

Points the same table QR at your brunch menu in the morning, lunch menu midday, and dinner menu in the evening.

  1. Set the Timezone dropdown to your restaurant's city first
  2. + Add a rule → Time between (09:00-17:00) style, value 06:00-11:00, send to your brunch menu
  3. + Add a rule → Time between, value 11:00-16:00, send to your lunch menu
  4. + Add a rule → Time between, value 16:00-23:00, send to your dinner menu
  5. Leave the default destination as your all-day/main menu for any gap hours
  6. Create code
Tip. Keep the windows from overlapping and remember first-match-wins — if two ranges touch, the higher one on the list takes that minute. Same trick for 'evenings only': one rule, Time between 17:00-23:59 → your booking page, everything else → the normal site.

Recipe — weekends, language and country tweaks

Small targeting touches: a weekend-only landing page, a Spanish page for Spanish browsers, or a country-specific store.

  1. Weekend page: + Add a rule → Day is (Mon,Sat), value Sat,Sun, send to your weekend promo
  2. Spanish speakers: + Add a rule → Language starts, value es, send to your Spanish page
  3. Country store: + Add a rule → Country is, value US (or GB, CA…), send to that region's store
  4. Stack as many as you like, most specific at the top, and keep a default for everyone else
  5. Create code
Tip. Country and City rules rely on the visitor's location being detectable — when it can't be read, that scan simply falls through to your default, so always keep the default box pointed somewhere sensible.

Recipe — first 100 scans get early-bird pricing

Rewards early scanners with one page, then automatically flips everyone after to the regular page — great for limited drops and date-based campaigns.

  1. Early-bird: + Add a rule → Scan count under, value 100, send to your early-bird offer
  2. Leave the default destination as the regular-price page — scans 101 onward land there automatically
  3. Date flip instead: + Add a rule → Before date, value 2026-09-01, send to your teaser page (default becomes the live page once that date passes)
  4. Or After date, value 2026-09-01, to switch a page ON at launch
  5. Create code
Tip. 'Scan count' counts real, non-bot scans of this code only. Pair it with a 'Max scans' limit under Access & lifecycle if you also want the code to fully retire after the campaign.

A/B split testing

Splits scanners roughly 50/50 between two destinations at random so you can see which landing page actually converts better.

  1. Set up two destination URLs you want to compare
  2. This isn't in the rule dropdown yet — turn it on via the API (POST /api/links with rules type 'ab', an 'a' URL and a 'b' URL) or ask support to flip it on for a code
  3. Then open My codes → the chart icon (Analytics) on that row
  4. Read the 'Split test — which variant is winning' panel — variant A and B show side by side, with the front-runner tagged 'Leading'
Tip. Let it run until each variant has a few hundred scans before you trust the 'Leading' badge — a 12-vs-9 lead on day one is just noise.

Rotation (round-robin)

Cycles through a list of destinations one after another as scans come in — perfect for spreading traffic across reps, booking links, or affiliate URLs evenly.

  1. List the destination URLs you want to rotate through, in order
  2. Like A/B, it's set via the API (POST /api/links with rules type 'rotation' and a 'urls' list) or by asking support
  3. Each new scan advances to the next URL and loops back to the first at the end of the list
  4. Track how each is doing in My codes → Analytics, where they appear as URL 1, URL 2, URL 3 in the split-test panel
Tip. Rotation walks the list evenly by scan order, so it's fairer than random A/B for things like 'send each new lead to the next salesperson.' If you'd rather weight it (more traffic to one URL), duplicate that URL in the list.

Access & lifecycle: control who can use a code, and for how long

These settings live inside every code you build. From the left sidebar open New code, fill in where the code should go, then scroll down and click the "⚙︎ Advanced options" bar to expand it — the "Access & lifecycle" block sits just below Routing rules. Because Cortalim codes are dynamic, you can change any of these later from My codes without reprinting the QR. Here's what each control does and when to switch it on.

Custom short code

Lets you choose the memorable ending of your link (like yourbrand.link/SPRING24) instead of the random letters Cortalim would assign, so it's easy to say, type, and print.

  1. Open New code in the left sidebar and enter your destination
  2. Click the ⚙︎ Advanced options bar to expand it
  3. Under Access & lifecycle, find the 'Custom short code' box
  4. Type your word, e.g. SPRING24
  5. Click Create code
Tip. Use 3–24 letters and numbers only — spaces and symbols are dropped and it's saved in capitals. If someone already grabbed that word you'll see a 'code taken' message, so just try another. Leave it blank and we'll invent a short one for you.

Expires on

Sets the calendar date the code stops working — ideal for a limited-time offer, an event, or a coupon you don't want redeemed forever.

  1. Open New code and enter your destination
  2. Expand ⚙︎ Advanced options
  3. Under Access & lifecycle, click the 'Expires on' date field
  4. Pick a date from the calendar
  5. Click Create code
Tip. Pair it with a Failure-forward URL so anyone who scans after the date lands on an 'offer ended' page instead of a dead end. You can always push the date back later from My codes.

Max scans

Caps how many times the code can be used; once it reaches your number it stops. Perfect for 'first 500 people' giveaways or limited passes.

  1. Open New code and enter your destination
  2. Expand ⚙︎ Advanced options
  3. Under Access & lifecycle, click the 'Max scans' box
  4. Type a number, e.g. 500
  5. Click Create code
Tip. Only real scans count toward the limit — bots and previews you've blocked don't eat into it. Watch the live scan count on My codes so you know when you're getting close.

Password

Asks every visitor to type a password before they're forwarded, so only the people you've shared it with can get through.

  1. Open New code and enter your destination
  2. Expand ⚙︎ Advanced options
  3. Under Access & lifecycle, click the 'Password' field
  4. Type the word or phrase visitors will need
  5. Click Create code
Tip. Once someone enters the right password, their device stays unlocked for about an hour so they aren't asked again. Share the password separately — don't print it next to the QR.

One-time (self-destructs after first scan)

Makes the code work exactly once and then retire itself — great for a single-use ticket, a one-time reveal, or a 'for your eyes only' link.

  1. Open New code and enter your destination
  2. Expand ⚙︎ Advanced options
  3. Under Access & lifecycle, tick 'One-time (self-destructs after first scan)'
  4. Click Create code
Tip. The very first scan wins — including an accidental one. Add a Failure-forward URL so the second visitor (and everyone after) is sent somewhere friendly instead of an 'already used' notice.

Drop bots & previews

Silently turns away automated traffic — search crawlers, scrapers, and the link-preview fetchers from WhatsApp, Slack, iMessage and Telegram — so they don't inflate your numbers.

  1. Open New code and enter your destination
  2. Expand ⚙︎ Advanced options
  3. Under Access & lifecycle, tick 'Drop bots & previews'
  4. Click Create code
Tip. Switch this on for any campaign where accurate scan counts matter. Blocked visits aren't redirected and never count toward your stats or your Max scans limit.

Block datacenter IPs

Blocks visits coming from cloud and server networks — the addresses behind VPNs, scanners and click farms — rather than real phones and laptops.

  1. Open New code and enter your destination
  2. Expand ⚙︎ Advanced options
  3. Under Access & lifecycle, tick 'Block datacenter IPs'
  4. Click Create code
Tip. Use it alongside 'Drop bots & previews' when you're worried about fake or fraudulent clicks. Genuine visitors on home and mobile networks are unaffected.

Failure-forward URL

A backup web address where people are sent whenever the code can't do its normal job — after it has expired, hit its scan cap, been used up as one-time, or been paused.

  1. Open New code and enter your destination
  2. Expand ⚙︎ Advanced options
  3. Under Access & lifecycle, find 'Failure-forward URL'
  4. Paste the backup address, e.g. https://yoursite.com/offer-ended
  5. Click Create code
Tip. This is your safety net for anything printed — set it and a scanned flyer never dead-ends. Without it, latecomers just see a plain 'unavailable' page.

Folder / campaign

A label that files this code under a campaign name so you can group and find related codes later.

  1. Open New code and enter your destination
  2. Expand ⚙︎ Advanced options
  3. Under Access & lifecycle, click the 'Folder / campaign' box
  4. Type a name, e.g. Spring 2026
  5. Click Create code
Tip. Reuse the exact same name across codes to keep them together, then filter by it using the 'All folders' dropdown on the My codes screen. Keep names under about 40 characters.

Marketing & analytics: pixels, conversions, and reading your numbers

Every scan of a Cortalim code can quietly do marketing work for you — drop people into your ad-retargeting audiences, tag a click so you can prove a sale came from it, and stamp campaign tags on the link. Then the Overview and per-code Analytics screens show you exactly what happened: how many scans, from what phones, and which country and city. Here's how to set each piece up and where to read the results.

Retargeting pixels (Meta, Google, TikTok)

Adds your ad-platform pixel to a code so that everyone who scans it gets added to your retargeting audience — you can later show them ads even though they never filled anything in.

  1. In the left sidebar, click "New code" and build your code as usual (paste your destination in "Where should it go?")
  2. Scroll down and click "⚙︎ Advanced options" to expand it
  3. Find the "Marketing" section (it carries a "Paid" badge)
  4. Under "Retargeting pixels — build ad audiences from every scan," paste your ID into the matching box: "Meta Pixel ID", "Google Ads / GA ID (AW-… or G-…)", or "TikTok Pixel ID" — fill in only the ones you use
  5. Click "Create code". From now on, each scan briefly shows a "Taking you there…" page that fires your pixel, then forwards the visitor to your real destination a moment later
Tip. Pixels only fire on codes that redirect somewhere (a Website, Short link, App, etc.) — they can't attach to a hosted page like a vCard or menu, so the Marketing section hides itself for those. Also, retargeting is a paid feature: on the Free plan the pixel field is quietly ignored, so upgrade first if you need it. Paste only the ID (e.g. the number for Meta, or AW-/G- code for Google), not the whole script.

Conversion tracking (attribute sales back to a code)

Ties a real sale or signup back to the exact code that drove it, so your Analytics show Conversions and Revenue next to scans — not just traffic.

  1. In "New code" → "⚙︎ Advanced options" → "Marketing", tick the checkbox "Track conversions — attribute sales back to this code", then click "Create code"
  2. Now when someone scans, Cortalim adds a tag called "sh_id" to your landing-page URL (for example your-site.com/checkout?sh_id=ABC123). Keep that value with the visitor through to checkout — carry it in a hidden field or your cart session
  3. When the sale actually completes, have your website or store call the tracking endpoint: send a POST request to /api/track with your API key in the "X-API-Key" header (grab the key from the bottom-left of the dashboard) and a JSON body of {"click_id": "<the sh_id you captured>", "event": "sale", "amount": 49.00}
  4. Use "event": "lead" instead of "sale" for a free signup or form fill; "amount" can be left at 0 when there's no dollar value
  5. Open the code's Analytics (see below) — the "Conversions" and "Revenue" tiles now count what you sent in
Tip. The click_id must belong to a code on your own account or the endpoint returns "unknown_click" — you can't accidentally credit someone else's sale. Conversion tracking is a paid feature too; on Free the checkbox is stripped on save. If you're not a developer, ask whoever manages your website or Shopify/Stripe checkout to fire that one /api/track call on the order-confirmation step.

UTM builder

Automatically stamps utm_source, utm_medium, and utm_campaign tags onto your destination link so Google Analytics (and any other analytics tool on your site) records where the visit came from.

  1. In "New code" → "⚙︎ Advanced options" → "Marketing", find "UTM builder"
  2. Fill any of the three boxes: "utm_source" (e.g. flyer), "utm_medium" (e.g. qr), "utm_campaign" (e.g. spring2026)
  3. Click "Create code" — Cortalim appends those tags to your link on every scan, so your website's own analytics attribute the traffic correctly
Tip. You don't have to type the utm_ prefix — just put the value (flyer, qr, spring2026) in each box and Cortalim adds utm_source=, utm_medium=, etc. for you. The tags ride along on top of any "params" you already added in the "Details in the link" box, so you can combine campaign tags with your own custom values.

Overview dashboard (all your codes at a glance)

Your home screen — a rolled-up view of how every code on your account is performing right now.

  1. Click "Overview" at the top of the left sidebar (it's the default screen when you open the dashboard)
  2. Read the four tiles across the top: "Total scans", "Unique visitors", "Active codes", and "Scans today"
  3. Below them, the "Scans over the last 14 days" chart shows your trend line
  4. At the bottom, "Top codes" ranks your busiest codes and "Recent scans" lists the latest hits with their city and device
Tip. "Unique visitors" counts distinct visitors (by IP), so it's always lower than "Total scans" — the gap tells you how often the same people are re-scanning. What you see is automatically scoped to your role, so a team member sees only the codes they're allowed to.

Per-code stats (device, country, city breakdown)

A deep dive on a single code — total and unique scans plus who's scanning, broken down by phone type, country, and city.

  1. Click "My codes" in the left sidebar
  2. Find your code in the table and click the small chart/analytics icon in its "Actions" column (its tooltip reads "Analytics")
  3. A panel opens titled "Analytics · <your code>" with "Total scans" and "Unique" tiles at the top (plus "Conversions" and "Revenue" if you turned tracking on)
  4. Scroll to see the ranked breakdowns: "By device", "By country", "By city", and "By browser" — each lists the top five
  5. Use the "↓ Download QR" link at the bottom of the panel if you need the high-res image again
Tip. The breakdowns only show what's actually been recorded — a fresh code, or one only you've tested from your own computer, will read "No data yet" or "Unknown" until real visitors start scanning.

A/B split-test panel ("which variant is winning")

When a code sends different people to different places, this panel shows how scans are splitting across each option and flags the current leader.

  1. Set up a code that branches — on the New code screen use the "Smart rules" service, or add "Routing rules" under Advanced options (for example an A/B split, a rotation between several URLs, or country/time rules)
  2. Let it collect some real scans
  3. Open that code's Analytics from "My codes" (the chart icon)
  4. Read the "Split test — which variant is winning" box: each branch is listed with its scan count, and the top one is marked with a green "Leading" badge
Tip. The panel appears only for codes that actually branch — a plain single-destination code has nothing to split, so you won't see it. The variant names mirror how you set it up ("A" / "B" for a split, "rule 1" / "default" for routing rules, a country code for geo rules), which makes it easy to see exactly which branch is pulling ahead.

Geolocation needs an edge/GeoIP layer in production

The "By country" and "By city" breakdowns depend on your server being able to tell where a visitor's IP is — which requires a bit of setup when you deploy, not something you toggle in the dashboard.

  1. Understand the honest default: if the server can't resolve a location, Cortalim shows "Unknown" — it never invents a city or country
  2. In production, put Cortalim behind an edge/CDN or proxy that adds geo headers: Cloudflare (which sends CF-IPCountry) is the easiest, or nginx with the GeoIP2 module, or a bundled MaxMind GeoLite2 database
  3. Once that layer is live, real scans start filling in "By country" and "By city" automatically — no change needed inside the app
  4. Don't be alarmed that local testing always says "Unknown": scans from your own machine (localhost / 127.0.0.1) have no public location to look up
Tip. If your city/country charts are stubbornly empty on a live site, it's almost always because no geo layer is in front of the app — check that Cloudflare (or your GeoIP module) is actually enabled and passing headers, rather than assuming the analytics are broken. This is a one-time deploy task for whoever hosts the site.

Team, Brand & Plans

Once your codes are working, this is where you bring in teammates, put your own name on your links, and pick the plan that fits. Everything here lives in the left sidebar of your dashboard — the Team area only appears if you're an Admin, and a few pieces (like a branded domain) are part of the Business plan.

Invite teammates (Member / Developer / Admin)

Adds coworkers to your account, each with their own login and API key, and controls how much they can see and change.

  1. In the left sidebar, click "Team" (you'll only see it if you're an Admin)
  2. On the "Team & brand" page, find the invite row
  3. Type the person's address in the "Email" box
  4. Open the "Role" dropdown and pick Member, Developer, or Admin
  5. Click "Invite" — they're added right away and appear in the table below
Tip. Pick the role by how much reach they need: a Member sees and manages only the codes they create; a Developer sees every code on the account and gets an API key for building integrations; an Admin can do all that plus invite people, set the branded domain, and handle billing. When in doubt, start someone as a Member — you can always change it later.

Branded short domain (Business)

Makes your QR codes and short links carry your own web address (like links.yourbrand.com) instead of the default Cortalim one, so every scan looks like you.

  1. Ask whoever manages your website's DNS to point a CNAME record for your chosen subdomain (e.g. links.yourbrand.com) at Cortalim
  2. In the left sidebar, click "Team"
  3. In the "Branded short domain" card, type your domain into the "Domain" box — you can just enter links.yourbrand.com
  4. Click "Save domain"
Tip. This is a Business-plan feature, so set it up before printing anything. Do the CNAME step first and give it a little time to take effect — if you set the domain here before the CNAME is live, the encoded links won't resolve. Once it's saved, every new code uses your address automatically.

Bulk create (paste URLs or a CSV)

Turns a whole list of web addresses into codes or short links in one pass, instead of building them one at a time.

  1. In the left sidebar, click "Bulk create"
  2. In the big "URLs — one per line" box, paste one address per line — or use url,name on each line to also give each code a name
  3. Choose "QR codes" or "Short links" with the toggle
  4. Optionally type a name in the "Folder (optional)" box to keep the batch together
  5. Click "Create all" — results appear on the right
Tip. You can do up to 500 rows at once, but it still respects your plan's total limit — on Free that's 2, so bulk really shines on Pro (100) or Business (unlimited). Adding a folder name makes the whole batch easy to filter and export later.

Export CSV

Downloads a spreadsheet of all your codes — their short link, destination, scan counts, status, and folder — for reporting or record-keeping.

  1. In the left sidebar, click "My codes"
  2. Click the "Export CSV" button at the top-right of the list
  3. A file named shareable-codes.csv downloads to your computer
Tip. The search and folder filters above the list don't limit the export — you always get the full set of your codes, so open it in Excel or Google Sheets and sort there. It's a handy monthly snapshot to keep alongside your scan analytics.

Choosing a plan (Free / $60 5-Year / Pro / Business)

Sets how many codes and short links you can have, how many teammates you can add, and which power features you unlock.

  1. In the left sidebar, click "Plans" (or go to /pricing)
  2. Compare the four cards: Free ($0 — 2 QR + 2 links, 1 seat), 5-Year Starter ($60 once — 5 QR + 5 links, kept live 5 years, 1 seat), Pro ($9/mo — 100 + 100, 3 seats, full API), Business ($29/mo — unlimited codes, team seats, branded domain)
  3. Click the button on the plan you want: "Start free", "Buy once", "Choose Pro", or "Choose Business"
  4. Finish payment through the secure Stripe checkout (monthly plans cancel anytime; the five-year plan is a single charge)
Tip. Every price already includes tax, so what you see is what you pay. Upgrading carries all your existing codes and history with you — nothing is lost — and team seats scale with the plan: Free and the 5-Year are single-user, Pro fits a small team of 3, and Business is unlimited seats.

Price-lock & price-match

Guarantees the rate you sign up at never goes up, and lets you ask us to match a competitor's price.

  1. Price-lock is automatic: when you start a paid subscription, today's rate is locked to your account and never raised — you'll see "price locked at …" on your billing card
  2. To request a match, click your name or "Profile" (bottom-left), then scroll to the "Plan & billing" card
  3. Click "Price match"
  4. When prompted, type the competitor's name (e.g. QRFY) and their price
  5. Submit — you'll see a confirmation, and we review it and lock in a matched price by email
Tip. Because your rate is locked the day you subscribe, it's worth locking in sooner rather than later. Found a lower price elsewhere? Send the price-match request with the competitor and amount — the more specific you are, the faster we can confirm the new locked-in rate.

For developers and the platform admin: API, webhooks, MCP, and the admin console

This section is for two people: the developer who wants Cortalim to talk to their own app (a REST API, signed webhooks, and an MCP server for AI agents), and the platform owner who runs the whole service from the built-in admin console. Everything below is grounded in the real screens and endpoints — the admin console is visible only to the platform owner (the system_admin account).

Find and copy your API key

Every API, webhook, and MCP request is authenticated with your personal API key, which lives in the dashboard sidebar.

  1. Sign in and look at the bottom-left corner of the sidebar, under your name and plan
  2. Find the "API key" label with a "Reveal" link beside it
  3. Click "Reveal" to unmask the key (it starts with sk_live_)
  4. Click the copy icon to the right of the key to put it on your clipboard
Tip. Send it as an "X-API-Key" header (the API also accepts "?key=" or a Bearer token). Each invited teammate gets their own key, and everything they read or change is automatically scoped to what their role is allowed to see — so hand out a teammate key instead of sharing yours.

REST API — create, list, update and delete codes

A plain REST API at the /api base lets your app mint codes, repoint them, list them, and pull analytics without ever touching the dashboard.

  1. Create: POST /api/links with a JSON body like {"base_url":"https://your-site.com","service":"qr","title":"Spring flyer"} — service is "qr" or "link"
  2. List: GET /api/links (add ?format=csv to download the same list as a spreadsheet)
  3. Read one: GET /api/links/ABCDE — Update/repoint: PATCH /api/links/ABCDE with {"base_url":"https://new-destination.com"} or {"active":false} to pause
  4. Delete: DELETE /api/links/ABCDE deactivates it (still reclaimable); add ?hard=1 to remove it permanently
  5. Bulk: POST /api/links/bulk with items[], urls[], or a csv field (up to 500 at once)
  6. Always include your key: header "X-API-Key: sk_live_…"
Tip. PATCH to a new base_url is the whole point of a dynamic code — the printed QR never changes, only where it points. Call GET /api/me first to see your plan and how many QR codes vs. short links you've used against your limit, so you don't get a 402 "plan_limit_reached" mid-batch.

REST API — analytics and conversion tracking

Pull scan counts, unique visitors, device/country/city breakdowns, time-series, and revenue for one code or the whole account.

  1. One code: GET /api/links/ABCDE/analytics — returns total and unique scans, a 14-day timeseries, by_device / by_browser / by_country / by_city, split-test variants, and the last 10 scans
  2. Whole account: GET /api/analytics — same shape plus active_links, scans_today, and your top codes
  3. Record a sale or lead: POST /api/track with {"click_id":"…","event":"sale","amount":49} to attribute revenue back to the code that drove it
Tip. Conversion tracking (/track and the revenue figures) is a paid-plan feature — on the Free plan the tracking flag is quietly dropped. The click_id you pass to /track is the one Cortalim appended on the redirect, so capture it on your landing page.

Signed webhooks — real-time scan and click events

Instead of polling, have Cortalim POST an event to your server the instant a code is scanned or a short link is clicked.

  1. In the sidebar click "Webhooks" (visible to Admin/Company-admin accounts), under the "Developers" heading
  2. Type your receiving URL in "Endpoint URL" (e.g. https://your-app.com/webhooks/shareable) and click "Add"
  3. Copy the signing secret shown on creation — it starts with whsec_ and is your shared key for verifying requests
  4. Cortalim will POST a JSON body for the events qr.scanned and link.clicked
  5. Developers can also manage endpoints via the API: POST /api/account/webhooks, GET the list, or DELETE /api/account/webhooks/{id}
Tip. Verify every delivery: read the "X-Cortalim-Signature" header, which is "sha256=" followed by an HMAC-SHA256 of the exact raw request body keyed with your whsec_ secret. Recompute that HMAC on your side over the untouched body and compare — if it doesn't match, reject the request. Grab the secret when you create the endpoint; it isn't shown again.

MCP server — let AI agents drive Cortalim

A Model Context Protocol server lets AI assistants (Claude, ChatGPT, Cursor, Perplexity) create and manage codes and read analytics in natural language.

  1. Point your agent's MCP settings at the endpoint: POST https://your-domain/mcp (Streamable HTTP, JSON-RPC 2.0)
  2. Authenticate with the header "Authorization: Bearer sk_live_…" using your API key from the sidebar
  3. The agent gets four tools automatically: create_link, list_links, update_link, and get_analytics
  4. Now you can say things like "make a QR code for our menu" or "how many scans did SPRING get?" and the agent calls the right tool
Tip. The MCP tools honor the exact same role scope and plan limits as the API — an agent using a teammate's key can only touch that teammate's codes, and "create_link" will refuse past your plan cap. Give an agent a low-privilege member key if you only want it minting and reading, not administering.

Admin console — Accounts (platform owner only)

The owner's control room for every customer account: change plans, lock in a price, apply a discount, set a branded domain, or pause/cancel a subscription.

  1. Click "Admin" at the bottom of the sidebar (only the system_admin account sees this) to open /admin
  2. You land on the "Accounts" tab — a table of every account with Type, Plan, Price lock, Discount %, Branded domain, Status and Codes
  3. Edit a row inline: change the plan, type a locked price, set a discount %, or fill in a branded domain
  4. Click "Save" on that row to write the changes
Tip. "Price lock" pins the amount an account is billed regardless of future list-price changes — use it to honor a legacy deal or a price-match. Leave it blank to let the account follow the normal plan price.

Admin console — Refunds

Issue a refund to any account and record it in the billing log, right from the Accounts table.

  1. On the "Accounts" tab, find the customer's row
  2. Click the "Refund" button at the end of the row
  3. Enter the refund amount in USD when prompted and confirm
Tip. This writes a refund entry to the billing log immediately; wiring it to actually move money through Stripe is the one production step to finish (the endpoint is where the Stripe Refunds call belongs). Until then, treat the log entry as your record and process the money-movement in Stripe directly.

Admin console — Coupons

Create promo codes that customers can self-apply for a percentage discount.

  1. In the Admin sidebar click "Coupons"
  2. Enter a Code (e.g. LAUNCH50), a "% off" value (1–100), and choose "Applies to": Both, Monthly, or One-time
  3. Click "Create"
  4. The coupon appears in the list below and customers can now redeem it from their own billing screen
Tip. Set a max-uses cap and an expiry when you create a code so a launch promo can't be shared forever — expired or used-up coupons are refused automatically at redemption.

Admin console — Brand & links and SMTP (Settings)

White-label the whole app — its name, logo, and the domains your codes encode — and set the mail server used for outgoing email.

  1. In the Admin sidebar click "Settings"
  2. Under "Brand & links": upload a Logo, set the "App name", the "Main link — app domain", and the "Short link — the domain your QR codes encode", then click "Save brand"
  3. Under "SMTP — outgoing email": fill in Host, Port, Username, Password, From address, and Encryption (TLS/SSL/None), then click "Save SMTP"
Tip. The "Short link" domain is what every new QR code and short link actually bakes in, so set it before you print anything at scale. If a field shows "Locked by environment variable," it's pinned by server config and can't be changed from this screen — edit the env var instead. Saving SMTP with a blank password keeps the existing one.

Admin console — Run billing cycle

Manually trigger the billing run that charges active subscriptions, applies discounts and price locks, and advances each account's period.

  1. In the Admin sidebar click "Settings"
  2. Scroll to the "Billing lifecycle" section at the bottom
  3. Click "Run billing cycle now" and watch the status line for the result
Tip. This is normally a scheduled job — run it by hand only to catch up after downtime or to test a pricing change end-to-end. Check the billing log afterward (every plan change, discount, refund and charge is recorded there) to confirm the run did what you expected.

Frequently asked

The questions people ask on day one.

Can I change a code after I've already printed it?

Yes — that's the whole point. Your QR encodes a short Cortalim link, not your actual web address, so the printed dots never need to change. To point it somewhere new, go to "My codes" in the sidebar, find the row, and click the pencil (Edit destination). Change the "Destination" field and hit "Save changes" — the next person who scans the same flyer lands on the new page. You can also pause it here by unchecking "Live."

Will my code stop working if I stop paying?

Your codes keep working — we never delete or resell them, so nothing you printed goes to waste. If a plan lapses, a code shows a short holding page instead of your link, and the moment you're back it switches straight on again. You'll never come back to find a code gone.

Which error-correction level should I use?

You'll find this in the "New code" screen under "Design studio," on the "Level" tab. The choices are L (7%), M (15%, the default), Q (25%), and H (30%) — the percentage is how much of the code can be scratched, smudged, or covered and still scan. For anything printed, or any code with a logo in the middle, choose H. If it's only ever on a screen, M is plenty.

Why isn't my code scanning?

Almost always it's contrast or size. Keep the background light — on the Design studio's "Color" tab you'll even see the reminder "Keep it light — dark backgrounds don't scan." Make sure there's strong contrast between the code color and the background, print it at least about an inch square, and leave a little white margin around it. If it's on a poster, printed on fabric, or has a logo, bump the "Level" tab up to Q or H so it survives real-world wear.

Can I add my logo?

Yes. In "New code," open "Design studio" and go to the "Logo" tab, then click "+ Upload logo" (PNG, JPG, GIF, or WebP). We drop it onto a small white plate in the center and automatically raise the error-correction so the code still scans. As a habit, pair a logo with the "Level" tab set to H.

How do I track which flyer actually worked?

Give each one its own code. When you create it, use the "Name (only you see this)" field and the "Folder / campaign" box under Advanced options so you can tell them apart. To split the same destination across places, add a detail in the "Details in the link — params" box (like campaign=flyer-a) or fill in the UTM builder under Advanced options. Then in "My codes," click the chart icon (Analytics) on any row to see its scans, unique visitors, and breakdowns by device, city, and country. Making a batch at once? Use "Bulk create" and paste url,name on each line.

Can I use my own domain?

Yes, on the Business plan. Go to "Team" in the sidebar, find "Branded short domain," point a CNAME at Cortalim as described there, then enter your domain (for example links.yourbrand.com) and click "Save domain." From then on every new code and short link encodes your address instead of ours.

Is there an API?

Yes. See "API docs" in the sidebar (or /docs). It's a plain-JSON REST API — you send your key as an X-API-Key header and can create codes, repoint or pause them, and read scan analytics. Your API key lives at the bottom of the left sidebar; click "Reveal" to see it and the copy button to grab it. There's also an MCP server so AI assistants can drive it for you.

Ready?

Make your first code.

It takes about a minute — and you can change where it goes for as long as you keep it.

Get started free