ARTstil: online store for an advertising agency with 1C integration
- Storefront languages
- 3
- Currencies
- 4
- Migration
- WordPress → Next.js
Task
Replace an advertising agency's WordPress site with a custom store: products with prices go to the cart and checkout, services priced on request become lead forms, and every order and lead reaches 1C.
Solution
A pnpm monorepo with Next.js 16 (App Router) and a NestJS 11 REST API on PostgreSQL and Prisma; orders and leads reach 1C and email through a transactional outbox; Docker Compose and Nginx on a single cloud VM with nightly backups.
Architecture
The catalog holds two kinds of items. Products with a price, such as every road sign, go into the cart and become an order; services priced "from" or on request become a lead with the customer's preferred contact methods. The storefront is in Russian, Romanian and English with a language prefix in every URL, and the first visit picks the language from a cookie, the visitor's country and browser settings. Prices are shown in four currencies with exchange rates pulled from the national bank, and the server always recalculates the total.
Orders and leads are written together with an outbox event in one database transaction, and a background worker delivers them to 1C and email with retries and backoff, so nothing is lost if 1C is temporarily down. The admin panel covers the catalog with photos and video, orders, leads, customers and company details, site colors, and the 1C exchange status with manual retry. Customers can sign in with Google and keep a wishlist.
The project runs in Docker Compose behind Nginx on one cloud VM. The database and uploaded media are backed up every night, with copies also sent to Google Drive, and there are written instructions for restoring the whole site on another server.
