AlfaLinks
AlfaLinksЗарегистрироваться

Руководство по настройке

Счётчик обратных ссылок для дашборда SaaS: пошаговое руководство

Рабочий счётчик требует одного серверного маршрута и одного небольшого компонента. В этом руководстве мы создадим оба, включая состояния ошибок, которые часто упускают в первых версиях.

Мастер, собирающий пять механических шестерней на деревянной верстаке, символизирующий шаги дашборда
Область применения этого руководства

Мы предполагаем наличие бэкенда на Node или Python и любую фронтенд-фреймворк. Каждый из приведенных ниже запросов обращается к документированному API, а базовый URL — это собственный URL вашего бренда: alfalinks.net/api.php.

Пять шагов в порядке их реализации

01

1. Создайте ключ и сохраните его как секрет

Войдите через Google по адресу /auth/google.php, скопируйте ключ sk_ со страницы аккаунта и поместите его в переменные окружения сервера. Фронтенд его не видит.

02

2. Добавьте один прокси-маршрут

Откройте доступ к чему-то вроде /internal/links?domain=..., который проверяет домен, обращается к нашему API и возвращает только те поля, которые использует ваш UI. Валидация важна, так как пользователи могут вводить что угодно.

03

3. Начните с бесплатного действия

Действие overview стоит бесплатно, поэтому первая версия счётчика вообще не несет рисков биллинга. Переходите к платным действиям, когда в интерфейсе они понадобятся.

04

4. Отобразите три состояния

Загрузка, данные и недоступность. Состояние «недоступно» охватывает HTTP 401, HTTP 402 и сбой сети, и оно никогда не должно показывать ноль.

05

5. Добавьте метку актуальности

Наш индекс обновляется примерно раз в месяц. Серая строка «данные по ссылкам обновляются ежемесячно» предотвращает создание тикета в поддержку с вопросом «Я добавил ссылку вчера».

Прокси-маршрут на Node

Достаточно короткий, чтобы прочитать за один экран. Кэш здесь — это обычный Map; замените его на Redis, когда запустите более одного процесса.

js
const cache = new Map();
const MONTH = 30 * 24 * 3600 * 1000;

app.get('/internal/links', async (req, res) => {
  const domain = String(req.query.domain || '').toLowerCase().trim();
  if (!/^[a-z0-9.-]+\.[a-z]{2,}$/.test(domain)) return res.status(400).json({ok:false});
  const hit = cache.get(domain);
  if (hit && Date.now() - hit.t < MONTH) return res.json(hit.v);
  const r = await fetch(`https://alfalinks.net/api.php?action=overview&q=${domain}`);
  if (!r.ok) return res.status(502).json({ok:false});
  const v = await r.json();
  cache.set(domain, {t: Date.now(), v});
  res.json(v);
});
Садовник, использующий широкую сеть для ловли стаи птиц, символизирующий пакетные запросы доменов

Добавление бейджа DR после того, как счётчик заработает

Счётчик — это легкая половина. Бейджу нужен один дополнительный вызов.

Для таблицы доменов клиентов отправьте один запрос bulk_dr с количеством доменов до 2000 вместо отдельного вызова для каждой строки. Он стоит 1 кредит независимо от количества строк, а ответ сопоставляет каждый домен с его показателем от 0 до 100, который вы сохраняете рядом с кэшированным обзором.

Сопоставляйте домены по нормализованному имени хоста. Удалите схему, путь и ведущее www, иначе половина ваших строк не найдет совпадений и покажет пустоту.

Прочитайте заметки о рейтинге для формулировок меток и рецепт кэширования для TTL этих вызовов.

Покажите значение сначала, затем предложите настройку

Новые пользователи редко читают страницу настройки. Они хотят увидеть, стоит ли функция усилий, и счётчик обратных ссылок, показывающий реальную цифру, отвечает на этот вопрос быстрее любой формы. Поместите значение на первое место. Конфигурация — на второе.

Поскольку бесплатное действие overview не требует ключа, ваш первый экран может показывать цифру еще до того, как пользователь что-либо настроит.

Что нужно для первого рендера?

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

Пользователь видит, что он получит, прежде чем кто-либо попросит карту, ключ или вторую форму. Ничто на первом рендере не должно выглядеть как барьер.

Где должно располагаться предложение по настройке?

Сразу после цифры, а не перед ней. Короткая строка, такая как «Подключите домен, чтобы отслеживать его каждый месяц», подходит под счетчиком. Если одно и то же предложение находится над цифрой, пользователи воспринимают его как барьер и уходят.

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

Тестирование перед запуском

Сначала протестируйте сценарии ошибок. Успешные сценарии тестируются сами собой.

Отозвите ключ в тестовой среде и убедитесь, что карточка показывает «недоступно», а не ноль. Затем опустошите тестовый баланс, чтобы вызвать 402, и вставьте некорректный ввод, например домен со схемой и завершающим путем, чтобы доказать, что валидатор отклоняет его до того, как будет потрачен кредит.

Короткий дымовой тест должен быть в CI. Один бесплатный вызов overview на nytimes.com, запускаемый ежедневно, скажет вам, работают ли маршрут и ключ.

Три железных ключа, висящие на тяжелой дубовой двери, символизирующие правила доступа и лимиты доменов

Кто может запрашивать какой домен и по какой цене

Счётчик, принимающий любую строку, — это открытая дверь к вашему балансу. Решите, кто может запрашивать что, до того, как маршрут выйдет в продакшн, и запишите ответ в код, а не в вики-страницу, которую никто не открывает.

Три вопроса возникают всегда: какие домены, какой лимит и где хранится ключ.

Какие домены пользователь должен иметь право вводить?

Только те, к которым у рабочего пространства есть права, плюс любые публичные запросы, которые вы решили предложить. Скажем, рабочее пространство владеет двумя сайтами. Маршрут может принимать эти два и отклонять все остальное с четким сообщением, что не позволит одному арендатору тратить кредиты на домены, которые ему не принадлежат.

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

Как остановить одного пользователя, сливающего баланс?

Установите квоту на рабочее пространство в своем хранилище и считайте вызовы там. Баланс на нашей стороне — это единый предоплаченный пул, поэтому он не может сказать вам, кто и сколько потратил. Заметки на странице поиска охватывают публичную сторону той же проблемы. Когда рабочее пространство достигнет лимита, верните простое сообщение и пусть кэш продолжает отвечать тем, что уже хранится.

Выберите лимит из арифметики в заметках по тарифам, а не из догадок, и пересматривайте его при изменении плана. Протестируйте маршрут с вторым рабочим пространством, прежде чем доверять квоте.

Должен ли браузер когда-либо хранить ключ?

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

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

Что должен говорить счетчик и чего не должен

Говорите меньше, чем знаете. Счётчик с меткой «обратные ссылки» провоцирует вопрос «почему Ahrefs показывает другую цифру?», и честный ответ заключается в том, что два краулера видят два разных среза веба.

Подпишите цифру источником и месяцем. Что-то вроде «Ссылочные домены, индекс AlfaLinks, октябрь 2026» длиннее, но это прекращает спор до его начала, и это хорошо читается в маленькой карточке.

Округляйте для отображения. Пользователь, который видит 12 481 в понедельник и 12 481 в пятницу, больше доверяет инструменту, чем тот, кто видит колебания, а наше ежемесячное обновление дает вам эту стабильность бесплатно.

Если вы хотите показать цифру 0-100 рядом, сначала прочитайте заметки о рейтинге обратных ссылок. Это наш собственный метрик, поэтому название имеет значение.

Состояния ошибок и поведение интерфейса

Коды HTTP — это то, что возвращает API; колонка UI — наше предложение.
СигналЗначениеЧто видит пользовательЧто вы делаете
HTTP 401Отсутствующий или неверный ключ«Данные по ссылкам недоступны»Проверьте себя: разверните баг
HTTP 402Кредиты закончились«Данные по ссылкам недоступны»Пополните через USDT (TRC-20)
ok: falseЗапрос отклоненСсылка для повторной попыткиЗапишите домен и действие
Тайм-аутПроблемы с сетьюКэшированное значение, если оно естьПовторите попытку один раз, затем увеличьте интервал

Поддержание честности счетчика в поддержке и логах

Счётчик чаще молча выходит из строя, чем шумно. Логируйте достаточно, чтобы ответить на следующий вопрос клиента, и полностью исключайте персональные данные из логов. Короткие строки выигрывают. Строка, отвечающая на вопрос поддержки, экономит больше времени, чем любое оповещение, которое вы можете написать.

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

Что должна записывать каждая строка лога?

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

Оставьте API-ключ вне каждой строки, включая трассировки ошибок. Маскируйте его в логгере, потому что одна утечка может слить весь аккаунт.

Как узнать, что счетчик здоров каждую неделю?

Следите за тремя числами: долей состояний недоступности, трендом баланса кредитов и процентом попаданий в кэш. Внезапный скачок состояний недоступности обычно указывает на проблему с ключом или балансом. Медленное падение баланса обычно указывает на слишком специфичный ключ кэша.

У каждого чтения есть свое исправление, поэтому одна плитка дашборда для всех трех редко кому-то помогает. Поместите три чтения в одну строку в вашей еженедельной заметке, с последним значением и изменением по сравнению с прошлой неделей. Числа, прочитанные изолированно, провоцируют догадки, тогда как короткий тренд держит разговор на одних фактах.