Когда мне понадобилось синхронизировать каталог цветочного магазина с ВКонтакте, первоначальная идея выглядела просто: получить товары из 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
});
Последовательность получается такой:
- Apps Script получает данные из Posiflora.
- Проверяет и нормализует их.
- Находит строку в Google Sheets по
source_id. - Создаёт или обновляет строку.
- Определяет, действительно ли товар изменился.
- Вызывает webhook Albato.
- Albato отправляет подготовленные данные в VK.
- В таблице сохраняется результат и 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 не изменился, синхронизацию можно пропустить.
Практический сценарий одного товара
- Триггер Apps Script запускает синхронизацию.
- Скрипт обращается к Posiflora API.
- Получает товар или букет.
- Преобразует данные в единый формат.
- По ID обновляет Google Sheets.
- Сравнивает новое состояние с предыдущим.
- Если есть изменения, отправляет POST в webhook Albato.
- Albato создаёт или обновляет карточку VK.
- Скрипт фиксирует результат, статус и 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.
Google Apps Script после получения данных из Posiflora, их обработки и обновления Google Sheets.
Таблица хранит промежуточное состояние синхронизации: ID товара Posiflora, цену, остаток, фото, ID карточки VK, hash данных и статус последней отправки.
Клиент попросил оптимизировать расходы на Albato. Поэтому получение данных, нормализацию, сравнение изменений и работу с таблицей я вынес в Google Apps Script, а платные операции Albato оставил только на финальной передаче данных в VK.
Связка строится по постоянному ID товара Posiflora и сохранённому ID карточки VK. Название товара не используется как ключ, поэтому переименование не создаёт новую карточку.
Да. Google Apps Script можно запускать по time-driven trigger. Webhook Albato при этом имеет смысл вызывать только для товаров, у которых действительно изменились данные.
Вывод
Posiflora хранит реальные данные магазина. Google Apps Script получает их через API и управляет логикой. Google Sheets хранит промежуточное состояние. После обновления Apps Script вызывает webhook. Albato выполняет только конечное действие для ВКонтакте.
Если вам нужно связать учётную систему, Google Sheets, CRM, Telegram или соцсеть через API и автоматизацию, опишите задачу A.S Groups.
Обсуждение
Вопросы и комментарии
Можно уточнить детали статьи или поделиться своим опытом. Первый комментарий проходит проверку.