Реализация автоматического постинга акций и скидок в социальные сети
Акционный пост должен выйти точно в момент старта акции — не через два часа, когда менеджер вспомнит, и не вчера, когда акция ещё не началась. Система сама отслеживает расписание скидок и публикует анонсы с нужным форматированием, обратным отсчётом и ссылкой на товары.
Что отличает акционные посты от товарных
Акционный пост — это не просто карточка товара. Он содержит:
- Срок действия — «только до пятницы», «осталось 3 дня»
- Размер скидки — в процентах или абсолютных значениях
- Список товаров или категорий под акцию
- CTA — ссылка на страницу акции или промокод
Если акция охватывает 20+ товаров, пост строится по шаблону акции, а не по шаблону товара.
Триггеры и расписание
В таблице акций (promotions) хранятся поля:
CREATE TABLE promotions (
id SERIAL PRIMARY KEY,
title VARCHAR(255),
discount_value NUMERIC(5,2),
discount_type ENUM('percent','fixed'),
starts_at TIMESTAMP NOT NULL,
ends_at TIMESTAMP,
social_post_at TIMESTAMP, -- когда публиковать
social_posted BOOLEAN DEFAULT FALSE,
notify_before INTERVAL DEFAULT '0', -- напр. '1 hour'
channels JSONB DEFAULT '[]' -- ['vk','telegram']
);
Cron-задача запускается каждую минуту и выбирает акции, у которых social_post_at <= NOW() и social_posted = false:
SELECT * FROM promotions
WHERE social_post_at <= NOW()
AND social_posted = FALSE
AND starts_at <= NOW() + notify_before;
Найденные акции ставятся в очередь, после успешной публикации social_posted выставляется в true.
Генерация медиа
Для акционных постов часто нужны баннеры с ценой и плашкой скидки — не просто фото товара. Два подхода:
Подход 1 — заготовленный баннер. Менеджер загружает баннер при создании акции. Простой, предсказуемый результат.
Подход 2 — генерация на лету. Используется Puppeteer или wkhtmltoimage: рендерим HTML-шаблон с данными акции в PNG.
const browser = await puppeteer.launch({ args: ['--no-sandbox'] });
const page = await browser.newPage();
await page.setViewport({ width: 1080, height: 1080 });
await page.setContent(renderTemplate('promo-banner', { promotion }));
await page.screenshot({ path: `/tmp/promo-${promotion.id}.png`, type: 'png' });
await browser.close();
Сгенерированный баннер кешируется в S3/MinIO с ключом promos/{id}/banner.png.
Текст поста
Шаблон учитывает тип акции:
🔥 СКИДКА {discount}% на {category_name}!
{description}
⏰ Акция действует до {ends_at_formatted}
📦 {products_count} товаров участвуют в акции
Смотреть все товары: {promo_url}
{hashtags}
Для акций с промокодом добавляется блок:
🎁 Промокод: {promo_code}
Удаление / архивирование поста
Некоторые платформы позволяют удалить пост через API после окончания акции. В ВКонтакте — wall.delete, в Telegram — deleteMessage. Функция опциональная, включается настройкой auto_delete_after_end = true на акции.
Сроки реализации
Базовая система с фиксированными шаблонами и двумя каналами (VK, Telegram) — 5–7 рабочих дней. Генерация баннеров через Puppeteer, удаление постов после окончания акции, управление через CMS — ещё 3–4 дня.







