Flower Shop Website Development on 1C-Bitrix
An online flower shop is not just a catalog with a cart. A customer doesn't choose a product — they choose emotion. Half of orders are gifts where exact delivery timing, a personalized card, and presentation matter. The other half are customers wanting to assemble a bouquet themselves, mixing flowers to their taste. A bouquet builder is a competitive advantage that transforms the site from a showcase into a tool.
On 1C-Bitrix the project is built on trade catalog with SKU for ready bouquets, custom builder on Highload-blocks, sale module with extended delivery services, and CRM integration for repeat sales.
Bouquet and Arrangement Catalog
Ready bouquets are trade catalog products. Key feature — trade offers by size. One "Spring Mood" bouquet exists in three variants: S (5 tulips), M (11 tulips), L (21 tulips). Each SKU has its own price, photo, composition.
Bouquets infoblock element properties:
- Category — infoblock section: bouquets, box arrangements, baskets, mono bouquets, bridal
- Occasion — multiple reference property: birthday, wedding, anniversary, no occasion, March 8, February 14
- Main flowers — multiple reference: roses, tulips, peonies, chrysanthemums (for filtering)
- Color palette — multiple: red, white, pink, mix, pastels
- Durability — numeric property (days), displays as "lasts from X days"
- Availability — updated daily because flowers are perishable
For trade offers (S/M/L sizes) specify:
- Price
- Detailed photo (different size — visually different)
- Composition — text description ("7 red roses, 3 eucalyptus branches, felt, ribbon")
Filtering via CIBlockSmartFilter: by occasion, flower type, color palette, price range. Sorting: popular (by order count — field updated via agent), new, cheap/expensive.
Bouquet Builder
Central site element. Customer selects flowers, specifies quantity for each, chooses presentation — and sees visualization with final cost. This isn't Bitrix template functionality — custom development on Highload-blocks and JS component.
HL-block "Flowers for Builder":
| Field | Type | Purpose |
|---|---|---|
| UF_NAME | String | Red rose, White tulip, Pink peony |
| UF_PRICE | Number | Price per 1 piece |
| UF_IMAGE | File | Flower photo for builder catalog |
| UF_RENDER_IMAGE | File | Image for visualization (cutout flower on transparent background) |
| UF_CATEGORY | List | roses / tulips / peonies / chrysanthemums / greens / exotic |
| UF_AVAILABLE | Boolean | In stock today |
| UF_MIN_QTY | Integer | Minimum quantity (usually 1) |
| UF_STEP | Integer | Step (for roses often 1, for greens — 1 branch) |
| UF_SEASON | List (multiple) | Seasonality: spring / summer / autumn / winter / all |
HL-block "Presentation":
| Field | Type | Purpose |
|---|---|---|
| UF_TYPE | List | wrapping / ribbon / basket / box |
| UF_NAME | String | Kraft paper, Felt, Satin ribbon, Hat box |
| UF_PRICE | Number | Cost |
| UF_IMAGE | File | Preview |
| UF_RENDER_IMAGE | File | Visualization image |
| UF_COMPATIBLE | String | JSON — compatibility (hat box not for 51-rose bouquet) |
Builder Logic:
-
Select flowers. Two-column interface: left — available flowers catalog with category and season filter, right — builder cart. Customer clicks "+" / "−" or enters number. Minimum stem count for arrangement — 3 (client and server validation).
-
Select presentation. Cards with photos: wrapping type (kraft, felt, mesh, no wrap) and tie type (ribbon, twine, none). For boxes and baskets — separate section with stem count limits (
UF_COMPATIBLEcontainsmax_stems). -
Visualization. Two approaches depending on project budget:
Option A (optimal): Pre-prepared visualization templates. For each "bouquet size × presentation type" combination there's a base image. Selected flowers display as preview icons beside visualization, not inside. Sufficient for 90% of customers — they care about composition and overall style.
Option B (extended): Canvas render. Flower images (
UF_RENDER_IMAGE) with transparent background placed on canvas by algorithm: central flowers — larger, side flowers — angled, greens — background. Presentation draws as bottom layer. Result — unique visualization for each combination. Requires quality renders of all flowers in unified style. -
Card. Text field up to 200 characters. Customer enters text, sees preview on card template (choice of 4–5 designs). Card text saved as
saleorder property. -
Cost calculation:
Total = Σ(flower_price × quantity) + presentation_cost + card (fixed) + delivery_cost
Calculation is server-side via AJAX controller. Client JS shows approximate sum for instant feedback, but final price always comes from server.
-
Order placement. Bouquet configuration saves to JSON and added to
salecart as product with custom price (usingCSaleBasket::AddwithPRICEandCUSTOM_PRICE = Yparameters). Cart item properties include configuration — displays in confirmation email and admin panel when processing order.
Online Order with Delivery
Flower delivery is time-critical. Standard sale.delivery handler is extended with custom logic.
Delivery services:
- Standard — 2-hour window selection (10:00–12:00, 12:00–14:00, ..., 20:00–22:00). Available when ordered minimum 4 hours before window start
- Urgent — delivery within 90 minutes. Surcharge set in service settings. Available 09:00 to 20:00
- Exact time — higher surcharge, ±15 minute accuracy. For VIP orders (anniversaries, proposals)
- Pickup — from store, no surcharge
Date selection via custom calendar. Delivery available "today" (if windows exist) and 14 days forward. Holiday dates (March 8, February 14) marked in interface — "high demand, order in advance". On these days urgent delivery surcharge auto-increases via OnSaleDeliveryServiceCalculate handler, which checks date against holiday reference in HL-block.
Anonymous order. Flowers often ordered as surprise. Checkbox "Don't reveal sender" — delivery data shows only recipient.
CRM Integration and Reminders
Flower business lives on repeat sales. Customer ordering bouquet for wife's birthday likely repeats in a year. CRM Bitrix24 records each order as deal with fields: recipient, occasion, date.
7 days before order anniversary customer gets email reminder: "A year ago you ordered bouquet for [recipient name]. Want to repeat?" Mechanism — agent running daily, selecting deals with UF_DATE = current date + 7 days − 1 year, initiating send via messageservice.
To implement reminders, order card adds properties: recipient name, occasion, event date. Data filled by customer at checkout ("Deliver to" and "Occasion" fields already exist — just save them to CRM).
Technical Details
| Stage | Tasks | Timeline |
|---|---|---|
| Analytics | Catalog structure, builder logic, integrations | 3–4 days |
| Design | Builder UI, catalog, cart, mobile | 7–10 days |
| Markup | Responsive, canvas render (Option B) | 7–10 days |
| Backend | HL-blocks, controllers, delivery, CRM | 10–14 days |
| Content | Bouquet photos, flower renders for builder | 5–7 days |
| Testing | Calculations, delivery, payment, CRM chains | 4–5 days |
Composite cache for ready bouquet catalog and static pages. Builder, cart, delivery — AJAX. Product and AggregateOffer microdata for search engine product results. Integration with Yandex.Market / Google Merchant via standard Bitrix trade catalog export to YML/XML.







