Homearrow-rightCasesarrow-rightHolm

HOLM Case Study: E-commerce Platform With Product Draws

/img/cases/holm.png

Brief description

A marketplace with draws and live streams, where products are sold directly or through lotteries

Task

Create an e-commerce platform combining purchases and product draws with transparent mechanics and live streams, while running lotteries legally without licenses and without falling under gambling regulation.

About the project

We built a flexible e-commerce platform with unique functionality — a marketplace combined with a draw mechanism and live streams. Holmegy lets users not only buy products directly, but also join lotteries where prizes are real items published by sellers.

Business benefits

REVENUE GROWTH DYNAMICS STAYED AT 500% EACH QUARTER THANKS TO TWO INCOME SOURCES: PRODUCT SALES + DRAW TICKETS
AVERAGE ORDER VALUE INCREASED BY 30% THANKS TO CLEAR CALLS TO ACTION: “BUY NOW” AND “JOIN WITH A TICKET”
ADDITIONAL SALES GREW BY 44% THANKS TO LIVE STREAMS AND A PUBLIC WINNERS HISTORY
macbookmacbook

Features

Registration and authorization
toggle

Creating a user account and signing into the personal cabinet

Password recovery

Managing basic profile data

User personal cabinet
toggle

Profile: contacts, delivery address(es), notification settings

Order history and delivery statuses

Lottery participation history and purchased tickets

Viewing wins and prize issuance status

Product listing
toggle

Product listing by the administrator

Creating a product card: name, description, photo/gallery, specifications

Availability management: stock, limits, unpublishing

Product categorization (binding to categories and tags)

Product catalog
toggle

Product showcase with sorting and quick card preview

Display of price, availability, purchase and delivery terms

Catalog search

Category and filter system
toggle

Category and subcategory hierarchy

Filters by parameters (category, price, availability, brand/type — based on product logic)

Sorting (popular, new, price)

Product page
toggle

Full description, photo gallery, specifications

Display of availability and purchase terms

Add-to-cart button and quick transition to checkout

Cart and checkout
toggle

Cart: changing quantity, removing a product, recalculating the total

Checkout: delivery address, recipient details, delivery method selection

Order confirmation and “accepted for processing” status

Payment and order statuses
toggle

Order payment via a payment solution

Order statuses: created, paid, processing, shipped, delivered, cancelled

Status change notifications (email/push/in-app)

Creating a product draw
toggle

Creating a draw for any product

Setting conditions: period, number of tickets, ticket price, participation limits

Lottery showcase
toggle

List of active draws

Draw card: product, description, dates, ticket cost, participation progress

Search and filtering by lotteries (by category/status/dates)

Draw page
toggle

Prize description, photos, participation terms

Draw dates and status

Progress: tickets sold / remaining

Participation button: buy ticket(s)

Participation via ticket purchase
toggle

Buying one or several tickets

Limits on the number of tickets per user (if set)

Binding tickets to the account and displaying them in participation history

Payment confirmation and fixing participation in the draw

Lottery history and results
toggle

History of completed draws

Display of winners for each draw

Showing winners on the main page and in lottery history

Prize issuance status for the winner

Transparent winner selection mechanism
toggle

Fixing the winner selection rules

Determining the winner when the draw ends

Displaying the result in the interface (who won, which draw, when)

Draw broadcasts (YouTube Live)
toggle

Embedding a YouTube Live broadcast on the draw page

Binding a specific broadcast to a specific draw

Public viewing of the broadcast by platform users

“Live draw” scenario
toggle

Starting the draw at a scheduled time

Publishing the winner after the broadcast ends

Marketplace product delivery
toggle

Delivery management for purchases: creating a shipment, tracking, receipt confirmation

Logistics statuses and user notifications

Prize issuance to winners
toggle

Collecting winner data for delivery/issuance

Confirming prize handover and fixing the result in the system

Issuance history and statuses for each prize

Product management
toggle

Manual product addition, card editing, photo and description management

Unpublishing, availability and category management

Lottery management
toggle

Creating and configuring draw conditions: time, mechanics, limits, ticket cost

Control of active and completed draws

Publishing results and displaying winners

Orders and deliveries
toggle

Viewing and managing product orders

Managing order statuses and logistics

Receipt confirmation and order completion

Financial analytics
toggle

Revenue by products

Revenue by lotteries

Platform commission accounting

Period reports and key metrics

User behavior analytics
toggle

Viewing carts

Purchase history and lottery participation

Ticket system and ticket distribution
toggle

Creating tickets within a draw

A fixed or dynamic number of tickets is created for each draw

Each ticket has a unique identifier

Tickets are bound to a specific draw and a specific product

Ticket uniquification
toggle

Each ticket receives a unique number

Duplication is excluded

The number is fixed in the database and assigned to the user after purchase

Ticket purchase
toggle

The user selects the number of tickets

The cost is calculated automatically

After successful payment, tickets are assigned to the user’s account

Participation limits
toggle

Ability to set a ticket limit per user

Ability to set a total ticket limit for the draw

Automatic sale closure when the limit is reached

Ticket distribution logic
toggle

Tickets are distributed in purchase order

When buying several tickets, the user is assigned a number range

Distribution transparency
toggle

Each user sees their ticket list

The interface displays the number of purchased tickets

Ticket-to-user binding is preserved until the draw ends

Sales completion
toggle

Ticket sales stop when the limit is reached or by time

The final number of sold tickets is fixed

Automatic winner determination
toggle

The system calculates the winning number

The winner is determined automatically based on the ticket number binding to the user

The result is fixed in the system

Results display
toggle

The winner is displayed on the draw page

The result appears in lottery history

The winner can be shown on the main page

Ticket history
toggle

Information is stored about the number of sold tickets

Number ranges

Winning number

History is available for viewing after the draw ends

System control and protection
toggle

Protection against re-generation

After the winner is determined, the draw is locked

Retroactive data changes are impossible

Operation logs

Recording the purchase time of each ticket

Logs of winning number formation

Recording all system actions for audit

Technology stack

1. Frontend:
toggle

React

MobX

2. Backend:
toggle

ASP.NET Core 8.0 — the basis of the server application.

Entity Framework Core 8.0.3 — ORM for working with the database.

Hangfire — a tool for background tasks.

MailKit and MimeKit — for working with email.

3. API:
toggle

MediatR — an implementation of the CQRS pattern for managing requests and commands.

Swashbuckle — for automatic generation of API documentation (OpenAPI/Swagger).

4. Integrations:
toggle

AWS SDK — for integration with Amazon S3 services.

Twilio — for working with WhatsApp.

5. Databases:
toggle

PostgreSQL — the main database.

6. Development tools:
toggle

Docker — for application containerization.

Serilog — for logging and monitoring.

Work with the client

*Important: this is not project work — it is work with the client specifically, and it is not included in the estimate or commercial proposal. This is what we do to increase the probability of product success.Code and design are only the tip of the iceberg. What we really transfer is an understanding of how the product earns, loses, and scales. We trained the client’s team not only to work with the admin panel, but also to understand product analytics at the level of “where to look and what to click when something goes wrong.”Our goal is not just development — it is our client’s success.

Design goals:

BUILD A PLATFORM THAT MEETS REGULATOR REQUIREMENTS WHILE NOT BEING A GAMBLING PRODUCT
INCREASE THE SHARE OF COMPLETED PURCHASES AND PARTICIPATIONS BY 90% THROUGH A SHORT CHOOSE-AND-PAY PATH
KEEP THE FOCUS ON THE PRODUCT: PHOTO, PRICE, AVAILABILITY, AND PARTICIPATION TERMS — ALL ON ONE CLEAR SCREEN

Design results:

FOCUS ON DRAWS: THE MAIN PAGE STREAMS LOTTERY LIVE BROADCASTS AND PUBLICLY SHOWS WINNERS. THIS CREATES EXCITEMENT AND ATTENTION, WHILE PUBLISHING WINNERS STRENGTHENS TRUST.
A SIMPLE MARKETPLACE: PRODUCTS AND LOTTERY PARTICIPATION ARE DESCRIBED CLEARLY, WITHOUT UNNECESSARY COMPLEXITY, WHICH SIMPLIFIES PURCHASES AND ENGAGEMENT IN PROMOTIONS.
VISUAL ACCENTS ON NEW PRODUCTS AND PROMOTIONS STIMULATE INTEREST AND HOLD USER ATTENTION. EVERYTHING IS DESIGNED SO THE CUSTOMER FEELS THE PLEASURE OF A PURCHASE OR A GAME.