Система дропшипинга для Reflaunt на базе Shopify Flow и Custom Flows
Нужно было построить механизм, который автоматически решает, принимать ли Reflaunt интегрированные товары от партнёров, и дальше маршрутизирует их по правильной цепочке (публикация, отправка в канал Reflaunt, карантин/ручная проверка, снятие с витрины). Основа — стандартные триггеры Shopify Flow + набор кастомных действий (Custom Flows) через приложение-коннектор.
Принцип работы (high-level)
- Триггеры:
Product created/updated
,Inventory changed
,Product published/unpublished
,Order created
(для маршрутизации заказов). - Правила принятия (решение “eligible / not eligible”):
- Теги товара/варианта:
partner:<id>
,condition:<A|B|C>
,images:<n>
,brand:<slug>
,reflaunt:blocked
,reflaunt:eligible
. - Метаполя (metafields):
qa.required_filled
(bool),qa.images_count
(int),compliance.authenticity
(enum),pricing.vat_included
(bool). - Белый/чёрный списки брендов, условия (pre-owned grade), ограничения логистики, минимальный набор фото/полей.
- Теги товара/варианта:
- Действия: присвоение тегов/метаполей статуса, добавление в коллекции (
Reflaunt — Eligible
,Reflaunt — Quarantine
), вызов Webhook к внутреннему оркестратору/Reflaunt-коннектору, уведомления в Email/внутренний inbox.
Схема правил (decision matrix)
При каждом событии обновления товара:
- Если
tags
содержитreflaunt:blocked
→ Not eligible (статус:rejected
| причина:manual_block
). - Иначе, если
images_count >= 3
и заполнены ≥ 95% критичных полей (title, brand, condition, price, sku, size/material, описание) иcondition ∈ {A, B}
и бренд в whitelist → Eligible. - Иначе, если недозаполнено > 3 критичных поля или
images_count < 1
→ Quarantine (на доработку). - Доп. фильтры:
brand ∈ blacklist
→ reject.pricing.vat_included = false
для регионов, требующих VAT-включения → quarantine с автозадачей пересчёта.duplicate(SKU)
или совпадение по (brand+title+img-fingerprint) → quarantine с меткойduplicate
.
Таксономия тегов (рекомендуемая)
- Идентификация источника:
partner:<id>
(напр.partner:reflaunt
,partner:xyz
). - Качество/состояние:
condition:A|B|C
,images:<n>
,incomplete:>3_fields
. - Решение движка:
reflaunt:eligible
|reflaunt:quarantine
|reflaunt:rejected
. - Служебные:
duplicate
,blocked:brand
,blocked:policy
,needs:vat_recalc
.
Метаполя (namespaces → keys → тип)
reflaunt.status
→eligible | quarantine | rejected
(single-line text / enum).reflaunt.reason
→manual_block | low_quality | missing_fields | duplicate | policy_mismatch
(enum).qa.images_count
→ int;qa.required_filled
→ bool;qa.score
→ int (0–100).compliance.authenticity
→unknown | verified | pending
.pricing.vat_included
→ bool;pricing.country
→ ISO-код.
Shopify Flow — базовые сценарии
Flow 1 — «Product Intake»
Trigger: Product created/updated
Conditions:
- If tag
partner:*
exists → proceed - Compute (через Custom Action)
qa.score
,qa.images_count
,qa.required_filled
- If
reflaunt:blocked
→ setreflaunt.status=rejected
, addreflaunt:rejected
- Else if
score ≥ 80 && images_count ≥ 3 && condition ∈ {A,B} && brand ∈ whitelist
→ setreflaunt.status=eligible
, add to collection «Reflaunt — Eligible», add tagreflaunt:eligible
, call webhook «push_to_reflaunt» - Else
→ setreflaunt.status=quarantine
, addreflaunt:quarantine
, add to collection «Reflaunt — Quarantine», notify Ops
Flow 2 — «Inventory/Price Drift»
Trigger: Inventory quantity changed OR Price changed
Logic: при выходе за пределы политики (минимум фото, цена ниже порога бренда, региональные VAT-правила) → вернуть в quarantine
, создать задачу доработки.
Flow 3 — «Order Routing»
Trigger: Order created
Conditions: Если все позиции в заказе имеют reflaunt.status=eligible
и fulfillment_service=Reflaunt
→ присвоить маршрут «Reflaunt DS», отправить payload в коннектор (идемпотентно), добавить note о внешнем партнёре.
Если смешанный заказ → split/partial route (гибридная логика, уведомить Ops).
Custom Flows (через приложение-коннектор)
Потребовались кастомные действия для Flow:
Compute QA
: рассчитатьqa.score
, заполненность полей, посчитатьimages_count
, распознать дубль (по индексам).Policy Check
: применять матрицу брендов/регионов (VAT-режим, запрещённые категории, габариты).Push to Reflaunt
: упаковать данные в целевой контракт, отправить вебхук/GraphQL-вызов, обработать ответы/ретраи.
Требования к интеграции:
- Идемпотентность (ключи на SKU/VariantID + хеш payload).
- Ретраи с экспоненциальной задержкой, DLQ для «залипших» пакетов.
- Лимиты скорости: очереди и троттлинг, чтобы не уткнуться в rate-limit внешней стороны.
Мониторинг и отчётность
- Дашборд: доля
eligible/quarantine/rejected
, причины отбраковки, время обработки. - Алерты: всплеск дублей, много
policy_mismatch
, падение конверсииquarantine → eligible
. - Аудит: кто/когда изменил решение (ручное «unblock», корректировка тегов/метаполей).
Карантин и ручная доработка
Товары в quarantine
не публикуются в канал Reflaunt; им назначается список задач:
- загрузить недостающие фото;
- заполнить ≥ 3 пропущенных критичных поля;
- исправить несоответствие бренду/категории/политике;
- устранить дубли (мердж/удаление).
После исправлений Flow автоматически пересчитает статус и, при успехе, переведёт товар вeligible
.
Кейсы и тонкости
- Вариант-уровень: решение вычисляется на уровне варианта; товар получает агрегированный статус (если есть хотя бы один eligible — можно частично публиковать).
- Переопределения: тег
reflaunt:force-eligible
для исключительных случаев (логируется). - Региональная политика: VAT/логистика различаются по рынкам; правило применяет
pricing.country
.
Что получил бизнес
- Автоматическое решение «принимать/не принимать» для интегрированных SKU без ручной рутины.
- Прозрачный карантин с причинами и коротким путём доработки.
- Надёжная маршрутизация заказов в сценарии дропшипинга Reflaunt.
- Масштабируемость: добавление новых партнёров — это новые профили правил, а не переписывание логики.
Использованные технологии
Достигнутые результаты
Легкая интеграция
Простое управление через Flow
Автоматизация процессов
Хотите создать похожий проект?
Расскажите о вашей идее, и мы поможем её реализовать