Система дропшипинга для 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
Автоматизация процессов
Хотите создать похожий проект?
Расскажите о вашей идее, и мы поможем её реализовать