Iconica Society: a multilingual art print store running on Printify and Stripe
Iconica Society sells public domain masterpieces as posters, framed posters and objects, printed to order. The store was built from scratch in Next.js: Printify stayed the single source of truth on the production side, while the storefront reads from its own database. The heart of the work was not design but the link between payment and production: a paid order goes into production with no human involved, and an unpaid one cancels itself. Artworks are presented as art rather than as products, discoverable by painter, movement, room and colour.
The problem we solved
- Most made-to-order stores run on an off-the-shelf theme: plenty of product pages, very little content. For a store selling artworks that is not enough.
- Printify prints and ships, but it does not connect the store, the payment and the order. An unpaid order must not reach production, and a paid order must not sit waiting.
- Posters printed in the US were reaching Europe in 10–30 days.
- The same artwork existed as separate products for poster, framed poster and object, so visitors saw the same painting repeatedly in a listing.
- Turkish content cannot be held in Printify; product titles were English only.
Our goal
- Leave Printify as the single source of truth and build a fast storefront that reads from its own database.
- Connect payment and production automatically: a paid order goes to production, an unpaid one to cancellation.
- Present artworks as art rather than products: discovery by painter, movement, room and colour.
- Publish Turkish and English on separate addresses, at equal quality.
- Appear in search engines and AI assistants for both “Van Gogh poster” and “who was Van Gogh”.
Printify integration
- Products sync from Printify into the database: instantly by webhook when Printify publishes, plus a background pass every five minutes. The visitor never waits for Printify.
- Printify's columns and the store's own columns are kept separate in the table. Turkish titles, descriptions, featuring, ordering and image sequence are never overwritten by a sync.
- For products without a Turkish title, the title is generated automatically from the artwork and painter names in the catalogue.
- Poster, framed poster and canvas versions of one artwork are grouped under a single card and offered as a format switcher on the product page.
- Shipping cost is fetched live from Printify at checkout. Which countries each variant can ship to is stored, and an item that cannot be shipped raises a warning in the cart.
- European twins: for orders from Europe and the United Kingdom, every poster is swapped for its twin printed in Germany. The twins are never listed; they appear only in the shipping calculation and the order. Delivery time dropped from 10–30 days to 5–15 days.
Payments: Stripe
- Stripe Checkout with cards, Apple Pay and Google Pay. Card details never touch the site.
- The order opens in Printify on hold. When payment arrives, a webhook sends it into production; when an unpaid session expires after an hour, the order cancels itself in Printify.
- Webhook signatures are verified. Before anything goes to production, the amount and currency paid are compared against the order in the database.
- The whole flow can be exercised with test keys without charging anything; test payments never reach production.
- Stripe keys are entered from the panel and stored encrypted; the panel shows live and test mode separately.
- Each order stores the buyer's consent record: timestamp, IP, browser and a copy of the agreement texts as they stood at that moment.
Catalogue, collections and discovery
- The 167 artworks are linked to collections by painter, movement, period, style, room, decor style, theme, season, colour palette, museum, curated set and size: 171 collection pages in total.
- Artworks not yet on sale are listed as “coming soon”, so the catalogue grows alongside the products.
- 14 gallery sets: groups of artworks chosen to hang together.
- Recommendations answer a different taste signal in each row of the product page: same painter, same theme, same movement, same palette. The last row is scored by weighted overlap of shared collections.
- Favourites, recently viewed and a size guide.
- Suggesting search: collections, products and artworks appear as you type. It matches across languages, tolerates accents and single-character typos, and is keyboard navigable.
Accounts and orders
- Sign-up by email and password, or with Google and Facebook.
- Address book, order history and order status.
- Orders placed as a guest are added to the member's history once the email is verified.
- Verification, password reset and order confirmation emails are sent through Cloudflare Email Service.
Multilingual structure and currencies
- Turkish at the root, English under /en, with translated addresses as well (koleksiyonlar → collections, eser → artwork).
- Pages are written once; links are translated per language, and the language switcher goes to the same page in the other language.
- Currency follows the visitor's country: EUR in the eurozone, GBP in the United Kingdom, AUD in Australia, USD elsewhere. Visitors can change it.
Art guide and SEO
- 83 guide pages covering painters, movements, periods and styles. The guide page answers “who was”, the collection page answers “poster”. They link to each other instead of competing.
- Structured data for products, collections, guides, FAQs and breadcrumbs. Shipping and return policy live in the product data.
- A multilingual sitemap with hreflang: 984 addresses.
- llms.txt for AI assistants, with their crawlers allowed by name in robots.txt.
- Cart, checkout, account and search results are kept out of the index.
Admin panel and Instagram
- Orders: status, payment method, address, line items and consent record.
- Customers and products: Turkish title and description, featuring, ordering, image sequence.
- Payment settings: Stripe keys, webhook address and event list.
- Instagram: drafts for posts, carousels, reels and stories, with approval, scheduling and automatic publishing.
- Reach, likes, saves and shares of published posts are pulled regularly; the access token refreshes itself.
Problems that needed diagnosis
- Images loaded slowly: Printify sends no cache headers with its images. Resized copies expired every four hours, so the server regenerated the same image on every view. The cache lifetime was raised to a month and an image cache rule was written in Cloudflare.
- The sync reported “changed” every time: PostgreSQL reorders the keys inside jsonb fields. The comparison was made independent of key order, so only genuinely changed products are written.
- Unpaid orders could not be cancelled: Printify rejects cancellation in the first seconds after an order is created. Cancellation was moved to a queue that retries at increasing intervals.
Deployment and resilience
- A push to the main branch starts the deployment on the server: dependencies, database migrations, build and restart.
- Schema changes only reach production through migration files.
- Cloudflare: strict TLS, HTTPS redirection, real visitor IP and image caching.
- Payment provider keys and panel settings are encrypted in the database.
Result
Iconica Society is live as a multilingual art store that prints public domain masterpieces to order. Payment, production and cancellation run without human involvement: an order paid in Stripe goes into production in Printify, and an unpaid one cancels itself. Because the 167 artworks, 171 collections and 83 guide pages are all generated from one catalogue, every product added in Printify enters its own collections, the search and the sitemap automatically. European orders are fulfilled by twins printed in Germany, which brought delivery time down from 10–30 days to 5–15 days.



