---
title: "Как сделать ссылку в WhatsApp и Telegram с уже готовым текстом (и QR-код)"
description: "Как перестать терять клиентов, которым лень сохранять ваш номер в телефон. Бесплатный генератор прямых ссылок и готовых QR-кодов для визиток и рекламы."
date: 2026-09-10
tags: ["маркетинг", "инструменты", "whatsapp", "telegram", "бизнес"]
author: "Иван Чистин"
---

Вы наверняка встречали это на сайтах, визитках и вывесках: длинный номер телефона `+7 (999) 000-00-00` и приписка: *«Пишите в WhatsApp»*.

Что в этот момент требуется от потенциального клиента:
1. Вручную перепечатать 11 цифр в записную книжку телефона.
2. Придумать имя контакта (например, «Ремонт окон»).
3. Открыть мессенджер, обновить список контактов, найти диалог.
4. Сформулировать первый вопрос.

На этой цепочке действий отваливается заметная часть обращений: людям просто некогда или неудобно вбивать цифры на бегу.

Хотя в мессенджерах есть простая механика: **одна прямая ссылка**, которая моментально открывает диалог, а в строке ввода **уже напечатан заготовленный вами текст**.

---

## 1. Как устроена прямая ссылка

И WhatsApp, и Telegram поддерживают официальные интернет-адреса для быстрого старта диалога:

- **Для WhatsApp:** `https://wa.me/79991234567?text=Привет`  
  Человек переходит по ссылке — у него сразу открывается чат именно с вами, а слово «Привет» уже напечатано в поле ввода. Остается только нажать стрелку отправки.
- **Для Telegram:** `https://t.me/ваш_юзернейм?text=Здравствуйте`  
  Работает по тому же принципу: открывает личный профиль или бота с предзаполненным сообщением.

### Практическая польза заготовленного текста:
1. **Клиент экономит время:** не нужно думать над приветствием. Если вы сдаете апартаменты, зашейте текст: *«Здравствуйте! Хочу узнать свободна ли студия на выходные»*.
2. **Маркировка источников:** на визитку можно зашить один текст (*«Здравствуйте, я по визитке...»*), а на сайт — другой (*«Здравствуйте, вопрос по услугам с сайта...»*). Вы сразу поймете контекст обращения без сложных систем сквозной аналитики.

Единственный нюанс — пробелы и русские буквы в ссылках должны быть закодированы по стандартам URL (`%20`, `%D0%9F...`), иначе ссылка оборвется. 

Ниже собран генератор в фирменном стиле IChis, который делает всё автоматически.

---

## 2. Интерактивный генератор ссылок и QR-кодов

Заполните номер или юзернейм и введите первое сообщение. Генератор сразу соберет рабочую ссылку, проверит ее и нарисует четкий QR-код для печати на визитках или наклейках.

<div class="my-8 max-w-3xl mx-auto rounded-3xl border border-[#EAD5E6] bg-white shadow-md overflow-hidden text-[#18141F] font-sans">
  {/* Верхняя строка: компактная плашка переключения */}
  <div class="px-5 py-3 bg-[#FAF5F9] border-b border-[#EAD5E6] flex flex-wrap items-center justify-between gap-3">
    <div class="flex items-center gap-2">
      <div class="flex items-center gap-1.5">
        <span class="w-2.5 h-2.5 rounded-full bg-[#EAD5E6]"></span>
        <span class="w-2.5 h-2.5 rounded-full bg-[#CA9CE1]"></span>
        <span class="w-2.5 h-2.5 rounded-full bg-[#685F74]"></span>
      </div>
      <span class="text-xs font-black uppercase tracking-wider text-[#685F74] ml-1">Генератор ссылок и QR</span>
    </div>

    {/* Переключатель сервиса */}
    <div class="inline-flex p-1 bg-white rounded-2xl border border-[#EAD5E6] shadow-2xs">
      <button
        type="button"
        id="btn-app-wa"
        class="py-1 px-3.5 rounded-xl font-bold text-xs transition-all flex items-center gap-1.5 cursor-pointer bg-[#18141F] text-white shadow-xs"
      >
        <svg class="w-3.5 h-3.5 shrink-0" viewBox="0 0 32 32" fill="none">
          <circle cx="16" cy="16" r="14" fill="#25D366"></circle>
          <path d="M22.5 19.3c-.3-.2-1.8-.9-2.1-1-.3-.1-.5-.2-.7.2s-.8 1-1 1.2c-.2.2-.4.2-.7.1-.3-.1-1.3-.5-2.5-1.5-.9-.8-1.5-1.8-1.7-2.1-.2-.3 0-.5.1-.7.1-.1.3-.3.4-.5.1-.2.2-.3.3-.5.1-.2 0-.4 0-.5s-.7-1.7-1-2.3c-.3-.6-.5-.5-.7-.5h-.6c-.2 0-.6.1-.9.4-.3.3-1.2 1.2-1.2 2.9 0 1.7 1.2 3.3 1.4 3.6.2.2 2.4 3.7 5.9 5.2.8.4 1.5.6 2 .7.8.3 1.6.2 2.2.1.7-.1 2.1-.9 2.4-1.7.3-.8.3-1.6.2-1.7-.1-.2-.3-.3-.6-.4z" fill="white"></path>
        </svg>
        <span>WhatsApp</span>
      </button>

      <button
        type="button"
        id="btn-app-tg"
        class="py-1 px-3.5 rounded-xl font-bold text-xs transition-all flex items-center gap-1.5 cursor-pointer text-[#685F74] hover:text-[#18141F]"
      >
        <svg class="w-3.5 h-3.5 shrink-0" viewBox="0 0 32 32" fill="none">
          <circle cx="16" cy="16" r="14" fill="url(#paint0_linear_tg_btn)"></circle>
          <path d="M22.9866 10.2088C23.1112 9.40332 22.3454 8.76755 21.6292 9.082L7.36482 15.3448C6.85123 15.5703 6.8888 16.3483 7.42147 16.5179L10.3631 17.4547C10.9246 17.6335 11.5325 17.541 12.0228 17.2023L18.655 12.6203C18.855 12.4821 19.073 12.7665 18.9021 12.9426L14.1281 17.8646C13.665 18.3421 13.7569 19.1512 14.314 19.5005L19.659 22.8523C20.2585 23.2282 21.0297 22.8506 21.1418 22.1261L22.9866 10.2088Z" fill="white"></path>
          <defs>
            <linearGradient id="paint0_linear_tg_btn" x1="16" y1="2" x2="16" y2="30" gradientUnits="userSpaceOnUse">
              <stop stop-color="#37BBFE"></stop>
              <stop offset="1" stop-color="#007DBB"></stop>
            </linearGradient>
          </defs>
        </svg>
        <span>Telegram</span>
      </button>
    </div>
  </div>

  {/* Рабочая область */}
  <div class="p-5 sm:p-6">
    <div class="grid grid-cols-1 md:grid-cols-12 gap-5 items-stretch">
      
      {/* Левая часть: поля ввода (7 колонок) */}
      <div class="md:col-span-7 flex flex-col space-y-3.5">
        
        {/* Поле 1: Контакт */}
        <div>
          <div class="flex items-center justify-between mb-1">
            <label class="text-xs font-bold uppercase tracking-wider text-[#685F74]" id="label-contact">
              Номер телефона
            </label>
            <span class="text-[11px] text-[#685F74]" id="hint-contact">код страны без +</span>
          </div>
          <div class="flex items-center flex-nowrap rounded-2xl border border-[#EAD5E6] bg-[#FAF5F9]/70 px-3 py-2 focus-within:border-[#CA9CE1] focus-within:bg-white focus-within:ring-2 focus-within:ring-[#CA9CE1]/20 transition-all overflow-hidden">
            <span class="text-xs sm:text-sm font-mono font-bold text-[#685F74] shrink-0 select-none whitespace-nowrap mr-1.5" id="link-prefix">https://wa.me/</span>
            <input
              type="text"
              id="input-contact"
              value="79991234567"
              placeholder="79991234567"
              class="min-w-0 flex-1 text-xs sm:text-sm font-mono font-bold text-[#18141F] bg-transparent border-0 p-0 m-0 focus:outline-none focus:ring-0"
            />
          </div>
        </div>

        {/* Поле 2: Текст сообщения */}
        <div class="flex-1 flex flex-col">
          <div class="flex items-center justify-between mb-1">
            <label class="text-xs font-bold uppercase tracking-wider text-[#685F74]">
              Текст сообщения
            </label>
            <span class="text-[11px] text-[#685F74]">подставится в чат</span>
          </div>
          <div class="flex-1 rounded-2xl border border-[#EAD5E6] bg-[#FAF5F9]/70 p-2.5 focus-within:border-[#CA9CE1] focus-within:bg-white focus-within:ring-2 focus-within:ring-[#CA9CE1]/20 transition-all flex flex-col">
            <textarea
              id="input-text"
              rows="4"
              placeholder="Здравствуйте! Хочу рассчитать стоимость..."
              class="w-full flex-1 text-xs sm:text-sm font-medium text-[#18141F] bg-transparent border-0 p-0 m-0 focus:outline-none focus:ring-0 resize-none leading-relaxed"
              defaultValue="Здравствуйте! Хочу рассчитать стоимость заказа"
            ></textarea>
          </div>
        </div>

      </div>

      {/* Правая часть: QR-код, ссылка и кнопки действий (5 колонок) */}
      <div class="md:col-span-5 flex flex-col items-center justify-between p-4 bg-[#FAF5F9]/70 rounded-2xl border border-[#EAD5E6] gap-3">
        <div class="w-full flex items-center justify-between px-1">
          <span class="text-xs font-bold uppercase tracking-wider text-[#685F74]">QR для печати</span>
          <span class="text-[11px] text-[#685F74]">скан камерой</span>
        </div>

        {/* Карточка QR-кода */}
        <div class="p-2.5 bg-white rounded-2xl border border-[#EAD5E6] shadow-xs flex items-center justify-center">
          <div id="qrcode-box" class="w-[125px] h-[125px] flex items-center justify-center overflow-hidden"></div>
        </div>

        {/* Превью готовой ссылки прямо под QR */}
        <div class="w-full p-2 bg-white rounded-xl border border-[#EAD5E6] flex items-center gap-1.5 overflow-hidden shadow-2xs">
          <span class="text-[11px] font-bold uppercase text-[#685F74] shrink-0 select-none">URL:</span>
          <span id="display-url" class="text-xs font-mono font-medium text-[#18141F] truncate flex-1" title="https://wa.me/79991234567">
            https://wa.me/79991234567
          </span>
        </div>

        {/* Блок из двух кнопок в одну строчку */}
        <div class="w-full relative">
          <div class="grid grid-cols-2 gap-2">
            {/* Кнопка 1: Скачать QR */}
            <button
              type="button"
              id="btn-download-qr"
              class="w-full py-2 px-2 bg-white hover:bg-[#FAF5F9] text-[#18141F] border border-[#EAD5E6] hover:border-[#CA9CE1] rounded-xl text-xs font-bold transition-all cursor-pointer flex items-center justify-center gap-1.5 shadow-2xs active:scale-[0.98]"
            >
              <svg class="w-3.5 h-3.5 text-[#685F74] shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="2">
                <path stroke-linecap="round" stroke-linejoin="round" d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4"></path>
              </svg>
              <span class="truncate">Скачать QR</span>
            </button>

            {/* Кнопка 2: Скопировать URL */}
            <button
              type="button"
              id="btn-copy-link"
              class="w-full py-2 px-2 bg-[#18141F] hover:bg-[#2E2738] text-white rounded-xl text-xs font-bold transition-all cursor-pointer flex items-center justify-center gap-1.5 shadow-xs active:scale-[0.98]"
            >
              <svg id="copy-icon" class="w-3.5 h-3.5 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="2">
                <path stroke-linecap="round" stroke-linejoin="round" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"></path>
              </svg>
              <span id="copy-btn-text" class="truncate">Скопировать URL</span>
            </button>
          </div>

          {/* Всплывающее уведомление (Toast) */}
          <div
            id="copy-toast"
            class="hidden absolute -top-10 left-1/2 -translate-x-1/2 px-3 py-1 bg-[#18141F] text-white text-[11px] font-bold rounded-lg shadow-lg flex items-center gap-1.5 pointer-events-none z-10 whitespace-nowrap"
          >
            <svg class="w-3 h-3 text-[#5BD066]" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="3">
              <path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7"></path>
            </svg>
            <span>URL скопирован!</span>
          </div>

        </div>
      </div>

    </div>
  </div>
</div>

<script is:inline>
  {`
  var currentApp = 'wa';
  var qrCodeInstance = null;
  var toastTimer = null;

  function loadQrLibrary(done) {
    if (typeof QRCode !== 'undefined') {
      done();
      return;
    }
    var s = document.createElement('script');
    s.src = 'https://cdnjs.cloudflare.com/ajax/libs/qrcodejs/1.0.0/qrcode.min.js';
    s.onload = done;
    document.head.appendChild(s);
  }

  function initQR() {
    var box = document.getElementById('qrcode-box');
    if (!box) return;
    box.innerHTML = '';
    loadQrLibrary(function() {
      if (typeof QRCode === 'undefined') return;
      qrCodeInstance = new QRCode(box, {
        text: "https://wa.me/79991234567",
        width: 125,
        height: 125,
        colorDark: "#18141F",
        colorLight: "#ffffff",
        correctLevel: QRCode.CorrectLevel.M
      });
      updateLinkAndQR();
    });
  }

  function getGeneratedUrl() {
    var contactInput = document.getElementById('input-contact');
    var textInput = document.getElementById('input-text');

    if (!contactInput || !textInput) return '';

    var contactVal = contactInput.value.trim();
    var textVal = textInput.value.trim();
    var encodedText = encodeURIComponent(textVal);

    if (currentApp === 'wa') {
      var cleanPhone = contactVal.replace(/[^0-9]/g, '');
      return 'https://wa.me/' + cleanPhone + (encodedText ? '?text=' + encodedText : '');
    } else {
      var cleanUsername = contactVal.replace(/^@/, '').trim();
      return 'https://t.me/' + cleanUsername + (encodedText ? '?text=' + encodedText : '');
    }
  }

  function updateLinkAndQR() {
    var displayUrl = document.getElementById('display-url');
    var finalUrl = getGeneratedUrl();

    if (displayUrl) {
      displayUrl.textContent = finalUrl || 'Заполните поля...';
      displayUrl.title = finalUrl || '';
    }

    if (qrCodeInstance && finalUrl) {
      qrCodeInstance.clear();
      qrCodeInstance.makeCode(finalUrl);
    }
  }

  function setupAppSwitch() {
    var btnWa = document.getElementById('btn-app-wa');
    var btnTg = document.getElementById('btn-app-tg');
    var linkPrefix = document.getElementById('link-prefix');
    var contactInput = document.getElementById('input-contact');
    var labelContact = document.getElementById('label-contact');
    var hintContact = document.getElementById('hint-contact');

    if (!btnWa || !btnTg) return;

    btnWa.onclick = function() {
      currentApp = 'wa';
      btnWa.className = 'py-1 px-3.5 rounded-xl font-bold text-xs transition-all flex items-center gap-1.5 cursor-pointer bg-[#18141F] text-white shadow-xs';
      btnTg.className = 'py-1 px-3.5 rounded-xl font-bold text-xs transition-all flex items-center gap-1.5 cursor-pointer text-[#685F74] hover:text-[#18141F]';
      if (linkPrefix) linkPrefix.textContent = 'https://wa.me/';
      if (labelContact) labelContact.textContent = 'Номер телефона';
      if (hintContact) hintContact.textContent = 'код страны без +';
      if (contactInput) {
        contactInput.placeholder = '79991234567';
        if (contactInput.value.indexOf('@') !== -1 || contactInput.value === 'username' || contactInput.value.length <= 4) {
          contactInput.value = '79991234567';
        }
      }
      updateLinkAndQR();
    };

    btnTg.onclick = function() {
      currentApp = 'tg';
      btnTg.className = 'py-1 px-3.5 rounded-xl font-bold text-xs transition-all flex items-center gap-1.5 cursor-pointer bg-[#18141F] text-white shadow-xs';
      btnWa.className = 'py-1 px-3.5 rounded-xl font-bold text-xs transition-all flex items-center gap-1.5 cursor-pointer text-[#685F74] hover:text-[#18141F]';
      if (linkPrefix) linkPrefix.textContent = 'https://t.me/';
      if (labelContact) labelContact.textContent = 'Юзернейм в Telegram';
      if (hintContact) hintContact.textContent = 'без символа @';
      if (contactInput) {
        contactInput.placeholder = 'username';
        if (/^[0-9]+$/.test(contactInput.value)) {
          contactInput.value = 'username';
        }
      }
      updateLinkAndQR();
    };
  }

  function showCopyToast() {
    var toast = document.getElementById('copy-toast');
    var btnText = document.getElementById('copy-btn-text');
    
    if (btnText) {
      var oldText = btnText.textContent;
      btnText.textContent = 'Скопировано! ✅';
      setTimeout(function() {
        btnText.textContent = oldText;
      }, 2000);
    }

    if (!toast) return;
    toast.classList.remove('hidden');
    if (toastTimer) clearTimeout(toastTimer);
    toastTimer = setTimeout(function() {
      toast.classList.add('hidden');
    }, 2000);
  }

  function setupCopyAndDownload() {
    var copyBtn = document.getElementById('btn-copy-link');
    var dlBtn = document.getElementById('btn-download-qr');

    if (copyBtn) {
      copyBtn.onclick = function() {
        var finalUrl = getGeneratedUrl();
        if (!finalUrl) return;

        try {
          navigator.clipboard.writeText(finalUrl).then(function() {
            showCopyToast();
          }).catch(function() {
            fallbackCopy(finalUrl);
          });
        } catch (e) {
          fallbackCopy(finalUrl);
        }
      };
    }

    function fallbackCopy(text) {
      var t = document.createElement('textarea');
      t.value = text;
      t.style.position = 'fixed';
      t.style.left = '-9999px';
      document.body.appendChild(t);
      t.select();
      document.execCommand('copy');
      document.body.removeChild(t);
      showCopyToast();
    }

    if (dlBtn) {
      dlBtn.onclick = function() {
        var img = document.querySelector('#qrcode-box img');
        var canvas = document.querySelector('#qrcode-box canvas');
        var src = img ? img.src : (canvas ? canvas.toDataURL("image/png") : null);

        if (!src) return;

        var a = document.createElement('a');
        a.href = src;
        a.download = (currentApp === 'wa' ? 'whatsapp-qr' : 'telegram-qr') + '.png';
        document.body.appendChild(a);
        a.click();
        document.body.removeChild(a);
      };
    }

    var contactInput = document.getElementById('input-contact');
    var textInput = document.getElementById('input-text');
    if (contactInput) contactInput.addEventListener('input', updateLinkAndQR);
    if (textInput) textInput.addEventListener('input', updateLinkAndQR);
  }

  function startApp() {
    var linkPrefix = document.getElementById('link-prefix');
    if (linkPrefix) linkPrefix.textContent = currentApp === 'wa' ? 'https://wa.me/' : 'https://t.me/';
    initQR();
    setupAppSwitch();
    setupCopyAndDownload();
    updateLinkAndQR();
  }

  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', startApp);
  } else {
    startApp();
  }
  `}
</script>

---

## 3. Где использовать прямую ссылку и QR-код

- **На кнопках сайта:** повесьте прямую ссылку на кнопку «Задать быстрый вопрос в WhatsApp». Посетитель с телефона сразу попадает в диалог без заполнения длинных полей.
- **В соцсетях и рекламе:** ставьте в шапку профиля, под посты или в рассылки.
- **В полиграфии и офлайне:** скачайте готовый QR-код и отдайте в печать. Посетителю салона, магазина или кафе достаточно навести камеру, чтобы сразу спросить о наличии, скидке или брони.

---

## Итог

Чем меньше барьеров между клиентом и диалогом, тем выше конверсия в реальную заявку. 

Этот генератор работает полностью в браузере без тяжелых сторонних сервисов и платных подписок. Если вам нужны аккуратные технические решения для бизнеса — от интеграции мессенджеров до разработки автономных сайтов и скриптов — напишите мне, сделаем надежное решение под вашу задачу.
