Розробка інтернет-магазину на Spree Commerce: від моноліту до headless

Як побудувати інтернет-магазин на Spree: від моноліту до headless

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Розробка інтернет-магазину на Spree Commerce: від моноліту до headless
Складний
від 2 тижнів до 3 місяців

Наші компетенції:

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1422
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1288
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    984
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1250
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    987
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Розробка веб-сайту для компанії ФІКСПЕР
    1001

Як побудувати інтернет-магазин на Spree: від моноліту до headless

Замовник попросив додати акцію «купи 3, четвертий у подарунок» з перевіркою за історією замовлень. У Shopify це вимагало б стороннього застосунку з окремою підпискою, у Spree — 50 рядків декоратора. Spree Commerce — це Rails Engine з відкритим кодом, який ми використовуємо для проектів з глибокою кастомізацією. У статті покажемо, як налаштувати монолітну або headless-архітектуру, і розберемо реальні приклади.

Чому обирають Spree: моноліт чи headless?

Spree вбудовується в Rails-застосунок як Engine і працює з тією ж базою даних. Починаючи з версії 4.3 додався headless-режим через REST API v2, що дозволяє використовувати Spree як backend для React/Vue фронтенду. Це дає можливість будувати як прості магазини з серверним рендерингом, так і складні SPA. Розглянемо обидва варіанти.

Критерій Monolith (класичний) Headless
Архітектура Rails Engine всередині застосунку, storefront рендериться сервером (ERB + Turbo) Spree надає API, фронтенд деплоїться окремо (Next.js, Nuxt)
Команда Rails-розробники + можливо фронтенд Фронтенд-команда окремо, бекенд — Ruby
Продуктивність SSR, легко кешувати Гнучкість, можна використовувати Edge functions
Час розробки Швидше, менше рухомих частин Довше, але гнучкіше для масштабування
Коли обирати Невеликі команди, прості магазини, немає вимог до мобільних застосунків Складні проекти, декілька клієнтських застосунків, високі навантаження

Як налаштувати Spree під проект?

Налаштування середовища включає встановлення необхідних гемів і запуск генераторів. Встановлення стандартне: додаємо геми, запускаємо генератори, мігруємо базу. Типові помилки на цьому етапі — невірне налаштування бази даних або конфлікти версій гемів.

# Gemfile gem 'spree', '~> 4.10' gem 'spree_auth_devise', '~> 4.6' gem 'spree_gateway', '~> 3.10' gem 'spree_backend', '~> 4.10' gem 'spree_sample', '~> 4.10' # тестові дані # Для headless: gem 'spree_api', '~> 4.10' 
bundle install bin/rails g spree:install bin/rails g spree:auth:install bin/rails db:migrate bin/rails db:seed 

Після встановлення доступні:

  • /admin — панель управління
  • /api/v2/storefront — REST API для фронтенду
  • / — класичний storefront (якщо встановлено spree_frontend)

Модель даних Spree

База даних Spree побудована навколо ключових сутностей: магазини (мультимагазинність), категорії (вкладені через ancestry), товари з варіантами (SKU, ціна, опції), замовлення з елементами, оплатами та відвантаженнями, користувачі.

Spree::Store ├── Spree::Taxon (категорії через ancestry) ├── Spree::Product │ ├── Spree::Variant │ ├── Spree::Price │ └── Spree::Image ├── Spree::Order │ ├── Spree::LineItem │ ├── Spree::Payment │ └── Spree::Shipment └── Spree::User (через spree_auth_devise) 

Як побудувати headless-магазин на Next.js і Spree API?

Для headless-проекту підключаємо @spree/storefront-api-v2-sdk і працюємо через REST API. В одному проекті ми замінили монолітний storefront на Next.js 14 з ISR і досягли LCP менше 0.8 секунди, що значно покращило метрики Core Web Vitals. Використання React Server Components дозволяє швидко рендерити сторінки товарів на сервері.

// lib/spreeClient.ts import { makeClient } from "@spree/storefront-api-v2-sdk"; export const client = makeClient({ host: process.env.NEXT_PUBLIC_SPREE_URL! }); // Отримати товари const products = await client.products.list( { include: "default_variant,images,taxons", filter: { taxons: taxonId } }, { sort: "name", page: 1, per_page: 24 } ); // Створити кошик const cart = await client.cart.create(); const orderToken = cart.success().data.attributes.token; await client.cart.addItem({ orderToken }, { variant_id: variantId, quantity: 1 }); 

Як кастомізувати бізнес-логіку без форку?

Spree використовує decorator pattern — ми додаємо методи та асоціації в модулі, який підмішується в модель. Це дозволяє розширювати функціональність, не зачіпаючи ядро.

# app/models/spree/product_decorator.rb module Spree module ProductDecorator def self.prepended(base) base.has_many :bundle_parts, class_name: "Spree::BundlePart", foreign_key: :bundle_product_id end def bundle? bundle_parts.any? end def effective_price_for(quantity) if quantity >= 10 then price * 0.9 elsif quantity >= 5 then price * 0.95 else price; end end end end Spree::Product.prepend(Spree::ProductDecorator) 

Для промоакцій використовуємо вбудовану систему Spree::Promotion. Наприклад, можна налаштувати правило «сума замовлення від 2000 грн → знижка 15%»:

promotion = Spree::Promotion.create!( name: "Літня знижка 15%", code: "SUMMER15", starts_at: Date.today, expires_at: 3.months.from_now, usage_limit: 1000 ) promotion.actions.create!( type: "Spree::Promotion::Actions::CreateAdjustment", calculator: Spree::Calculator::FlatPercentItemTotal.create!(preferred_flat_percent: 15.0) ) promotion.rules.create!( type: "Spree::Promotion::Rules::ItemTotal", preferred_operator: "gte", preferred_amount: 2000.0 ) 

Така гнучкість дозволяє реалізувати складні акції без встановлення додаткових плагінів.

Що входить в роботу: повний цикл розробки

Ми пропонуємо розробку під ключ. Етапи проекту:

Етап Опис Термін (днів)
Встановлення та конфігурація Rails-застосунок, Spree Engine, база даних 2–3
Каталог + імпорт товарів Rake-задачі, CSV/API імпорт 4–8
Кастомна бізнес-логіка Декоратори, промоції, доставка 5–10
Фронтенд (Headless) Next.js + Spree SDK 10–20
Платіжні інтеграції 2–3 провайдери 4–6
Кастомізація адмінки Додаткові розділи, звіти 3–5
Разом 28–52

У результат входить: документація API, доступ до репозиторію та сервера, навчання команди замовника, гарантія 30 днів на виявлені баги. Досвід наших інженерів — понад 10 комерційних проектів на Spree.

Інтеграція платежів і мультивалютність

spree_gateway надає готові адаптери для Stripe, Braintree, PayPal. Для YooKasa або Тінькофф пишеться кастомний gateway (реалізує інтерфейс Spree::Gateway). Мультивалютність налаштовується через атрибути магазину: вказуємо supported_currencies і supported_locales. Ціни прив'язуються до валюти варіанту.

Типові помилки при старті на Spree

  • Не використовувати декоратори — правити ядро Spree напряму. Це робить оновлення неможливими.
  • Забувати про N+1 запити в API — включати include в запити.
  • Ігнорувати продуктивність адмінки — для великого каталогу потрібен Elasticsearch.
  • Не налаштовувати кешування — Redis обов'язковий для продакшену. Без нього магазин гальмує при 1000+ товарів.

Як вибрати між monolith і headless?

Якщо ваша команда сильна в Rails і ви робите типовий магазин — беріть моноліт. Він швидше на старті. Якщо плануєте мобільний застосунок, складний фронтенд або високі навантаження — headless дає гнучкість, але вимагає більше ресурсів на розробку. Замовте розробку Spree-магазину — ми зв'яжемося з вами протягом дня. Отримати консультацію можна через форму на сайті або в месенджерах.