Статья A.S Groups

Как я синхронизировал товары Posiflora с ВКонтакте: Google Apps Script, Sheets и Albato

Схема синхронизации товаров Posiflora с ВКонтакте через Google Apps Script, Google Sheets, webhook Albato и VK

Навигация по статье

Услуги A.S Groups

Нужен сайт, магазин или автоматизация?

Помогаю бизнесу запускать и дорабатывать WordPress-проекты: от посадочной страницы до WooCommerce, CRM и Telegram-уведомлений.

Обсудить проект Telegram
WordPress под ключ Лендинги, корпоративные сайты и структура под заявки. WooCommerce Интернет-магазины, каталог, оплата, доставка и интеграции. Доработка сайта Правки, скорость, формы, баги и развитие текущего проекта. CRM / Telegram / AI Автоматизация заявок, уведомлений и ручных процессов.

Когда мне понадобилось синхронизировать каталог цветочного магазина с ВКонтакте, первоначальная идея выглядела просто: получить товары из Posiflora и отправить их в VK через Albato. На практике быстро выяснилось, что критичную часть лучше контролировать своим кодом — особенно авторизацию, получение остатков, нормализацию данных и защиту от дублей.

В итоге рабочую схему я разделил на понятные зоны ответственности: Google Apps Script получает данные из Posiflora, обновляет Google Sheets и затем вызывает webhook Albato. Albato в этой архитектуре занимается только последним участком — отправкой подготовленных данных в ВКонтакте.

Финальная цепочка: Posiflora → Google Apps Script → Google Sheets → webhook Albato → VK.

Какая была задача

В Posiflora уже находятся товары, букеты, цены и данные учёта. Дублировать это вручную во ВКонтакте нет смысла: каталог быстро перестаёт соответствовать реальности. Нужно было автоматически передавать название, цену, остаток, описание, фотографию и при этом не создавать одинаковые карточки при каждом запуске.

Компонент Роль в схеме Чего не делает
Posiflora Источник товаров и данных учёта Не отправляет карточки напрямую в VK
Google Apps Script Получает данные через API, нормализует их, обновляет таблицу и вызывает webhook Не создаёт товары VK напрямую
Google Sheets Хранит подготовленный каталог, состояния и соответствия ID Не заменяет Posiflora
Albato Принимает готовое событие и выполняет действие для VK Не ходит в Posiflora и не управляет таблицей
ВКонтакте Получает созданные или обновлённые карточки Не является источником остатков

Почему я не оставил всю интеграцию внутри Albato

Для простой связки «получить событие → передать данные» Albato удобен. Но каталог — это уже интеграция с состоянием: нужно понимать, создавался ли товар раньше, изменилась ли цена, какой ID присвоил VK, нужно ли повторно грузить фото и требуется ли вообще запускать обновление.

На ранних тестах я сталкивался с ответами Posiflora 401 Authentication required, сообщением о ненайденном токене и ошибками 500. Поэтому получение данных из Posiflora я перенёс в Google Apps Script, где можно полностью контролировать HTTP-запрос, headers, ответ и обработку ошибок.

Как я оптимизировал расходы на Albato

Клиент отдельно попросил снизить расходы на Albato. Если пропускать через автоматизатор получение каждого товара, проверку остатков, работу с таблицей и все промежуточные действия, количество операций быстро растёт. Поэтому я специально сократил роль Albato до одного понятного участка цепочки.

  • Google Apps Script сам получает данные из Posiflora;
  • сам нормализует товары, цены и остатки;
  • сам создаёт или обновляет строки в Google Sheets;
  • не дёргает Albato, если по товару ничего не изменилось;
  • webhook Albato вызывается только для подготовленных данных, которые действительно нужно отправить в VK.

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

Шаг 1. Google Apps Script получает данные из Posiflora

Официальная документация Posiflora описывает создание сессии и работу с защищёнными endpoint через Bearer-авторизацию. В API есть методы каталога, категорий, букетов и других сущностей.

В Apps Script для внешних запросов используется UrlFetchApp. Он поддерживает HTTP/HTTPS-запросы, headers, payload и методы GET, POST, PUT, PATCH и DELETE.

const response = UrlFetchApp.fetch(url, {
  method: 'get',
  headers: {
    Authorization: 'Bearer ' + accessToken,
    Accept: 'application/vnd.api+json'
  },
  muteHttpExceptions: true
});

const code = response.getResponseCode();
const body = response.getContentText();

Что я проверяю после ответа API

  • HTTP-код;
  • валидность JSON;
  • постоянный ID товара;
  • название и цену;
  • остаток или доступность;
  • URL изображения;
  • ошибки авторизации и временные 5xx.

Токены и другие секреты не должны храниться в Google Sheets или попадать в открытый код и логи.

Шаг 2. Скрипт нормализует данные

Сырые объекты Posiflora я не передаю дальше один в один. Apps Script формирует собственный набор полей, например: source_id, title, price, stock, image_url, description, vk_item_id и sync_status.

Так бизнес-логика не зависит от структуры следующего сервиса. Если формат ответа Posiflora изменится, достаточно поправить один слой преобразования.

Шаг 3. Google Sheets хранит промежуточное состояние

После обработки Apps Script записывает или обновляет строку в Google Sheets. Таблица здесь нужна не как основная база магазина, а как прозрачный промежуточный каталог и журнал синхронизации.

Поле Для чего
source_id Постоянный ID Posiflora
title Название карточки
price Актуальная цена
stock Остаток или доступность
image_url Источник фото
vk_item_id ID уже созданной карточки VK
payload_hash Проверка, изменились ли данные
sync_status pending / sent / error
synced_at Время последней успешной синхронизации

Шаг 4. Apps Script дёргает webhook Albato

Это принципиальная часть моей схемы: webhook Albato вызывает сам Google Apps Script после того, как данные из Posiflora уже получены, проверены и записаны в Google Sheets.

UrlFetchApp.fetch(ALBATO_WEBHOOK_URL, {
  method: 'post',
  contentType: 'application/json',
  payload: JSON.stringify({
    source_id: item.source_id,
    title: item.title,
    price: item.price,
    stock: item.stock,
    image_url: item.image_url,
    vk_item_id: item.vk_item_id
  }),
  muteHttpExceptions: true
});

Последовательность получается такой:

  1. Apps Script получает данные из Posiflora.
  2. Проверяет и нормализует их.
  3. Находит строку в Google Sheets по source_id.
  4. Создаёт или обновляет строку.
  5. Определяет, действительно ли товар изменился.
  6. Вызывает webhook Albato.
  7. Albato отправляет подготовленные данные в VK.
  8. В таблице сохраняется результат и ID карточки.

Шаг 5. Albato отвечает только за ВКонтакте

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

Так проще искать ошибки: если неверные товары или остатки — проверяю Apps Script и ответ Posiflora; если таблица правильная, но карточка не дошла — проверяю webhook и сценарий Albato.

Как не создавать дубли

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

Posiflora source_id → строка Google Sheets → VK item_id

После первого успешного создания карточки нужно сохранить ID VK. При следующих запусках этот ID используется для обновления существующего товара.

Проверка изменений через hash

Чтобы не вызывать webhook без необходимости, можно вычислять hash из полей, влияющих на карточку: название, цена, остаток, описание и фото. Если hash не изменился, синхронизацию можно пропустить.

Практический сценарий одного товара

  1. Триггер Apps Script запускает синхронизацию.
  2. Скрипт обращается к Posiflora API.
  3. Получает товар или букет.
  4. Преобразует данные в единый формат.
  5. По ID обновляет Google Sheets.
  6. Сравнивает новое состояние с предыдущим.
  7. Если есть изменения, отправляет POST в webhook Albato.
  8. Albato создаёт или обновляет карточку VK.
  9. Скрипт фиксирует результат, статус и ID VK в таблице.

Что делать с ошибками 401 и 500

401 Authentication required

Проверяю создание сессии, актуальность access token, Authorization header и доступ к нужному endpoint. В этой архитектуре фактический ответ Posiflora виден прямо в Apps Script, поэтому проблему не нужно искать внутри Albato.

500 Internal Server Error

Для 5xx важны логирование и ограниченные повторные попытки. Ошибка одного товара не должна заново создавать уже успешно обработанные карточки. Проблемную строку можно оставить со статусом error и обработать позже.

Изображения

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

Безопасность

  • не хранить логины, пароли и access token Posiflora в таблице;
  • не публиковать webhook Albato;
  • не писать токены целиком в Logger;
  • использовать HTTPS;
  • проверять HTTP-коды каждого внешнего запроса;
  • ограничивать повторные попытки;
  • иметь флаг для временного отключения синхронизации.

Когда это решение подходит

  • Posiflora остаётся основной системой учёта;
  • нужен автоматически обновляемый каталог VK;
  • нужно видеть промежуточное состояние в Google Sheets;
  • важна собственная логика фильтрации и сопоставления;
  • не хочется разворачивать VPS ради небольшой интеграции;
  • Albato удобно использовать как готовый последний коннектор до VK.

Когда лучше выбрать другой вариант

  • товаров очень много и Apps Script упирается в квоты;
  • нужна высокая частота обновлений;
  • требуется сложная двусторонняя синхронизация;
  • нужны очереди, блокировки и подробный аудит;
  • Google Sheets становится узким местом.

Чек-лист перед запуском

  • ☐ Авторизация Posiflora работает стабильно.
  • ☐ У каждого товара есть постоянный source_id.
  • ☐ Apps Script проверяет HTTP-коды и JSON.
  • ☐ Google Sheets обновляется по ID, а не по названию.
  • ☐ Сохраняется vk_item_id.
  • ☐ Webhook вызывается только после подготовки данных.
  • ☐ Albato отвечает только за участок до VK.
  • ☐ Повторный запуск не создаёт дубль.
  • ☐ Ошибка одной строки не ломает весь цикл.
  • ☐ Секреты не попадают в таблицу и логи.

Связанные материалы

В этом же проекте я отдельно разобрал VK-бота для цветочного магазина без VPS. Для более общих схем интеграций есть материал про AI-автоматизацию заявок и страница автоматизации бизнес-процессов.

FAQ

Нет. Данные из Posiflora получает Google Apps Script. Он обрабатывает их, обновляет Google Sheets и только после этого вызывает webhook Albato. Albato отвечает за последний этап — передачу подготовленных данных в VK.

Вывод

Posiflora хранит реальные данные магазина. Google Apps Script получает их через API и управляет логикой. Google Sheets хранит промежуточное состояние. После обновления Apps Script вызывает webhook. Albato выполняет только конечное действие для ВКонтакте.

Если вам нужно связать учётную систему, Google Sheets, CRM, Telegram или соцсеть через API и автоматизацию, опишите задачу A.S Groups.

Официальные источники

Следующий шаг

Нужно решить похожую задачу?

Предложить разработку API-интеграции и автоматизации каталога под бизнес-задачу.

Обсудить задачу

Источники

Обсуждение

Вопросы и комментарии

Можно уточнить детали статьи или поделиться своим опытом. Первый комментарий проходит проверку.

Оставить комментарий

Email не публикуется. Ссылки и HTML в тексте удаляются.

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

Используем необходимые cookies, аналитику и данные форм, чтобы сайт работал корректно и заявки доходили.