The development of the online cosmetics store rests not on design, but on variability: one product lives in three volumes and eight shades. We put together such a store on OpenCart - shades and volumes as card options, brand pages in a separate section, filter by skin type and purpose. On July 31, 2026, we took technical indicators from three live beauty shops: from 81 product pages to 5,561 items, the first server response from 126.3 to 801.2 ms. We name the amount after the price audit — it is a guess.
Price lives in Excel, and orders live in direct messages
The manager forwards the file every time, specifies the shade and branch address. The store transfers this to the checkout: the buyer chooses the shade on the card and the Nova Poshta branch from the list. Immediately about the border: integration with the carrier does not make delivery cheaper and does not save from the buyer who chose the wrong branch. It removes manual work - and turns into money only when the freed time of the manager is really redistributed somewhere.
We'll review your situation in a free audit
Scenario 2 of 4
Each product has shades and volumes
This is where it is decided how many pages the catalog will expand into. One tonal cream in eight shades and two volumes is sixteen combinations, and depending on whether you start them with options or separate cards, the term of import and further work with duplicates depends. The decision is made before assembly: it is expensive to redo after layout.
Scenario 3 of 4
The catalog grows by brands, not categories
In a beauty shop, the buyer is often looking for a brand rather than a product type. Therefore, brand pages should be a separate section in the sitemap and linked from product cards. In the wholesale beauty catalog, according to our measurement, there are 166 such pages — for 3,947 products and 47 categories.
Scenario 4 of 4
Retail and salons in one price
The salon buys multiples and at its own price, the retail buyer buys artificially and at the window price. OpenCart buyer groups keep both logics on the same catalog: the price depends on who is logged in. If your wholesale is the main volume, it is better to build the frame around it - this is already on the next page.
Cases
Tasks and results in numbers — all metrics measured by us
online store of professional cosmetics, catalog of over 5,000 items
Task
Consolidate a large assortment of professional cosmetics into one catalog with navigation by brands and types of products and with terms of payment and delivery that are understandable to the retail buyer.
Solution
Store on OpenCart: catalog by brands and types of means, free shipping from a specified amount, full prepayment on account or postpaid with a deposit, micromarking Organization and PostalAddress.
Result
5,561 products in the live catalog — counted by regular OpenCart search: 55 pages of 100 items plus 61 for the last one. TTFB 801.2ms, full load 930.7ms with 153.8KB markup, measured 07/31/2026. Found: sitemap.xml and product feed return HTTP 200 with empty body, no analytics counter on site and no carrier listed on shipping page.
wholesale store of cosmetics for the beauty industry, catalog of about 4,000 items
Task
Give professional buyers navigation by brands and categories — make-up, hair care, manicures, waxing — and quick checkout.
Solution
OpenCart with canonical sitemap declared in robots.txt. WayForPay, cash on delivery and bank account, Nova Poshta and Ukrposhta. Six JSON-LD types on main, two language versions with hreflang and switch.
Result
The canonical site map: 3,947 products, 166 brands, 47 categories, 6 information pages and the main one — a total of 4,167 addresses. TTFB 576.8 ms at 192.4 KB HTML, measured on 07/31/2026. Found: the old site map lives in parallel — 7,782 entries for 2,755 unique addresses, 2,454 of which are repeated three times, and there is not a single address of the second language version in it.
manufacturer of natural cosmetics based on beekeeping products
Task
Keep the story about the production next to the product card and do not bloat the page.
Solution
OpenCart, two language versions, LiqPay and PrivatBank card, cash on delivery, delivery by Nova Poshta, Store, Organization, ContactPoint and SearchAction markings.
Result
Fastest sampled first response 126.3ms, full load 172.4ms at 196.3KB HTML. The catalog is small: 91 pages, of which 10 are informative, i.e. 81 are product pages. Measured on 07/31/2026. Found: 271 records for 116 unique addresses in the site map, some products are duplicated 2-4 times; analytics stopped at Universal Analytics, GA4 is not in the code.
What's included
Complete list of work and what you get as a result
A catalog with two entrances — by type of product and by brand: the buyer for "tonic" and the buyer for a specific brand enter through different doors
Shades and volumes as options of one card with canonical to the main address - one page instead of a dozen almost identical
Filter by skin or hair type, purpose, brand and volume — by product characteristics, not by words in the description
Price import from CSV or XML with field mapping and price and balance update schedule: the manager does not kill the price with his hands
Payment: LiqPay, WayForPay, Privat24, monobank, post-payment with a deposit, cashless account for salons
Delivery: Nova Poshta with the choice of branch right at the checkout, Ukrposhta, courier, self-delivery - the address is no longer specified by calling
Technical SEO: CNC, canonical on variations, unique title, site map without repetitions
JSON-LD micro-markup: Store, Organization, Product, BreadcrumbList — so that the output includes price and availability if Google chooses to show them
Analytics: GTM, GA4, card viewing events, cart and purchases, product ID in advertising systems - otherwise there is nothing to optimize campaigns
Transfer: access, written instructions, passing the administration with your manager on a live order
Terms: 50% down payment, two rounds of edits at the design stage, warranty period of 30 calendar days
When this service isn't right
What's not included — so there are no surprises at delivery
Description of the composition and properties of the means — the invoice is provided by the brand or your technologist
Photography and retouching of swatches of shades
Post-launch advertising, influencer marketing and mailings
Filling the catalog manually beyond the agreed volume
Hosting, domain, acquiring
Process steps
Transparent stages with approval at every step
Total duration:28–48 days
1
Price audit and technical task
3-5 working days
We count variability: how many items have shades, volumes or sets and how many pages it unfolds. Here we analyze the current site, if there is one. The output is a TK, based on which the estimate is calculated and the work is accepted.
2
Catalog structure: types, brands, variations
4-6 working days
A tree of categories, a set of characteristics for the filter, the rule "option or a separate card" for each type of product, a list of filter combinations that we open in the index. We agree to the design.
3
Design
5-9 working days
Home, category, shade and volume selection card, brand page, cart, checkout. Here we fix the target weight of the page: in the measured beauty stores, the layout of the main page weighs from 153.8 to 196.3 KB.
4
Assembly of the store
8-13 working days
Theme layout, product catalog and options, shopping cart and checkout, admin roles, payment, delivery and return pages.
5
Catalog import and layout of variations
5-9 working days
Mapping of price fields, analysis of shades and volumes into attributes, test filling, reconciliation of the number of cards using two methods, schedule of updating prices and balances.
6
Integrations, analytics, transmission
3-6 working days
Payment and shipping, GTM and GA4 with cart and purchase events, JSON-LD, sitemap without duplicates, end-to-end order flow from cart to TTN, admin pass with your manager.
Free audit: we count how many pages your price will unfold
In the beauty catalog, the most expensive thing is not design, but variability. One tool lives in three volumes and eight shades — and the estimate and subsequent indexing depend on how you start it. The audit gives this figure before the start of work.
What we measure
Variability of the assortmentHow many items have shades, volumes or sets and how many pages they will give when expanded. In the professional cosmetics store we measured, the catalog includes 5,561 items, in the wholesale beauty store — 3,947 products and 166 brands.
Navigation by brandsAre there separate brand pages and do they fit into the sitemap? In the wholesale beauty catalog from our selection, 166 brand pages are a separate and working entry to the catalog.
Directory speedFirst server response and HTML weight. In a professional cosmetics store, we measured 801.2 ms first response with 153.8 KB of markup — the markup is light and the response is slow, and the reason is not in the design.
Site map and duplicatesHow many entries per unique address. In the store of natural cosmetics, we found 271 records at 116 addresses — individual products were duplicated 2-4 times.
Payment and post-payment rulesWhat is connected now and what are the terms of the deposit. In a niche with a high percentage of package rejections, this has a direct impact on money: in one of the measured stores, post-payment is only allowed with a deposit.
Analytics and advertisingAre the counters alive and are the basket events being transmitted? Cosmetics is an advertising niche, without correct events there is nothing to optimize campaigns.
What you get
The figure of how many pages your price will unfold, taking into account shades and volumes.
Document on the current site: addresses in the site map and duplicate, speed, HTML weight, payment and delivery.
A list of findings that should be closed before launch.
Conversation for 30–40 minutes on the document.
Timeline: 2-4 working days
Why is it free
Because without this number, the fork would be a fiction: the difference between a catalog with two and six thousand pages is different import terms, a different structure of filters, and different work with duplicates. Calculating is cheaper than guessing. The document is yours in any case.
What's next
After the audit - the amount and term by stages with dates, the contract, the bill and the report.
Short form: your contact and site URL
Contract, act and 30-day warranty
Every project gets a written contract: scope, deadlines, amount, acceptance procedure. After delivery — act and invoice, then 30 calendar days of warranty.
Sole proprietor & bank transfer
The contractor is a registered sole proprietor. Payment by invoice with closing documents.
Rights & access — yours
Code, design and materials transfer to you after full payment. Domain, hosting, repository and analytics are registered to you.
Client portal instead of email chains
During the project you get access to a portal: contracts, invoices, acts and project status in one place.
European clients
Among our work — projects for Norway, Bulgaria, Moldova and Spain.
Verifiable numbers
Every case in the portfolio comes with a link to a live site and a technical measurement.
Audit first, then pricing
There is no price list on the site intentionally: the scope of the same work differs multiples between clients.
We say "no" when unsure
If the task isn't ours or the deadline is unrealistic — we tell you upfront.
Did not find your case?
Describe how it works on your side — we will tell you whether “Development of an online cosmetics store” fits and what it means in your situation. No brief and no call: one question, one answer.
What affects the price
Why two seemingly identical tasks are priced differently
Variability of the assortmentThe main driver. A price for two thousand items after the deployment of shades and volumes becomes a catalog for several thousand addresses - this is a different import period, a different structure of filters and a different work with duplicates.
Price statusSeparate columns "brand", "volume", "shade", "article" - import is automatic. All in one text field like "Tone 03 beige, 50 ml" - the analysis is semi-automatic, and on several thousand items it is a separate line of the estimate.
Number of brandsEach brand is a page, a logo, a short text and a place in the sitemap. One hundred brands and six hundred is a different volume of handwork, although in the price it is one column.
Photos and swatchesShots on a uniform background and swatches of shades save weeks of assembly. There are no swatches - the buyer chooses at random, and there are more returns; At the same time, we do not do filming, this is a separate contractor.
Retail plus salonsTwo pricing logics on one catalog are buyer groups, separate multiplicity rules, and checking each combination on a live order, not a checkbox in the settings.
TempoThe accelerated queue comes at a premium and makes sense only when the content is ready at the start and approvals are invested in one business day. Otherwise, it doesn't get faster - it gets more expensive.
Technologies & integrations
What we build on and what it connects to
Stack
OpenCart 4.x is set by default, this is a branch that is being developed
OpenCart 3.x — when you need a module without assembly under 4.x; limit: the branch lives out its life, we update it manually
PHP and MySQL are the limit: variations live in product options, and for several thousand combinations, requests to the database have to be cached separately
nginx, HTTP/2, HTTPS + HSTS is the limit: the certificate encrypts the channel and does not make the store secure by itself
OCFilter or similar — filter by characteristics; border: generates combinatorial addresses that must be closed with canonicals and robots
Cloudflare is the limit: the cache covers page returns, but does not speed up administration and imports
Integrations
LiqPay
WayForPay
Privat24
monobank
postpaid with deposit
non-cash settlement
Nova Poshta
Ukrposhta
Google Tag Manager
GA4
Google Ads
Meta Pixel
Instagram Shopping
TikTok
eSputnik
Telegram
Your makeup store vs. Instagram showcase and marketplace trading
How this option differs from the alternative
Instagram storefront / marketplaceOur approach
Shades and volumesInstagram: list in the photo caption. Marketplace: its own scheme of variations, it cannot be changedoptions in the card plus a filter by purpose and skin type
Who owns the catalogInstagram: account may be blocked. Marketplace: site rulesfiles and database at your disposal, download at any time
Prices for salonsInstagram: price in a separate file. Marketplace: one price for allgroups of buyers, the wholesale column opens after logging in
Sales commissionInstagram: none. Marketplace: commission on each orderno, only hosting, domain and acquiring
Where does the demand come from?Instagram: Your followers. Marketplace: ready traffic of the sitesearch, advertising and direct measures - and you have to build this stream yourself
What we need from you
We can't start without this — best to prepare in advance
1Price in CSV or XML with fields: brand, name, volume, shade, article number, price, balance. It shows how many pages the catalog will expand into.
2Photos of the means and, if available, swatches of the shades - in this niche, the swatch sells more than the description.
3List of characteristics for the filter: skin or hair type, purpose, volume.
4Your post-payment and deposit rules, if they have already been formulated.
5Access to hosting and domain — or consent to have hosting selected by us.
6One person with the right to approve the catalog structure and layouts without additional agreements.
If something is missing — let us know, we'll help you gather it or do it as a separate task.
FAQ
Most frequently asked questions — with concrete answers
Are shades and volumes separate items or options on the same card?
Let's see how the buyer is looking. The shade is chosen inside the card - we make options, one address, canonical on it. A specific shade is searched for by a separate request, and it has its article number — a separate card, but then a separate title and a separate text must be written under it. How the opposite decision without rules ends is clearly visible in the measurement of a retail underwear store: there each size and color has a separate address, the catalog has grown to 115,456 items, and out of a sample of 150 addresses on the site map, 50 have been redirected to another item - another size or another color. In cosmetics, the shade replaces the size, the mechanism is the same. Our recommendation: variations inside the card by default, separate pages - only for requests that you see in your own statistics.
We have several hundred brands - how to submit them?
Separate pages that are located in the site map and are linked from the product cards. In the wholesale beauty catalog from our perspective, the canonical card holds 3,947 products, 166 brands, 47 categories and 6 information pages — a total of 4,167 addresses. The brand there works as a second full catalog entry, not a list of logos in the footer. Fair margin: the presence of a page in the sitemap does not mean either indexing or traffic. Google writes it directly, and a brand page without its own text and without demand may well be indexed and not receive a single visit.
Will the store be fast with several thousand items?
Speed depends on the setting, not the number of cards. In a 5,561-item professional cosmetics store, the main markup weighs 153.8KB — that's easy — and the first server response is 801.2ms. Nearby, in a natural cosmetics store, the page is heavier (196.3 KB), and the response is 126.3 ms. Slows down the server part and requests to the database, not the layout, and it is treated without redesign. What speed doesn't do: It doesn't make the offer more attractive. If the price is higher than the market or the item is not available, a fast site will simply give the buyer a reason to leave faster.
How not to get thousands of identical pages from filters?
Filtering by skin type, purpose, and volume generates a combinatorial number of addresses: each pair of ticks is technically a separate page. Therefore, the work includes a list of combinations that we open consciously - usually it is "brand + category" and "category + destination" - and the rest is closed by a canonical for the category and a rule in robots. Without it, you'll end up with thousands of nearly identical pages in the index, and that's a degradation, not an improvement. Separately: on a catalog with up to several hundred items, complex filtering gives little, there a clear category tree works better.
We need separate prices for salons - is that possible?
Yes, through groups of buyers: after entering, the salon sees its prices and multiples, the retail buyer - an ordinary shop window. The border here is not technical. An account on the website does not make you a supplier for a legal entity: the purchase is also based on a contract, payment deferment, availability of a personal manager according to the volume - the website closes only the first step. If your wholesale is the main volume, the frame should be built around it, and not completed on the side; then see the wholesale shop page.
What to do with postpaid and parcel rejections?
This is a commercial setting and should be fixed before launch, not after the first unclaimed parcels. In the measured store of professional cosmetics, post-payment is allowed only with a deposit, and free delivery begins with a certain amount of the order. We display such rules both in the checkout and on the payment page, so that the manager does not have to repeat them in every call. There is also a typical hole: in the same store, not a single carrier is named on the delivery page - neither Nova Poshta, nor Ukrposhta. At this stage, the buyer simply does not understand how the parcel will arrive.
How long will development take and what is stretching it?
28–48 working days from the approval of the TK. Layout: Price and TOR audit 3-5 days, catalog structure 4-6, design 5-9, assembly 8-13, import with variation layout 5-9, integration with testing and transfer 3-6. The longest stage is not assembly, but import. If the shades in the price list are in one text field, such as "Tone 03 beige, 50 ml", they have to be sorted into attributes semi-automatically, and it takes weeks for several thousand items. That is why the work begins with the analysis of the price, and not with layouts.
Analytics is just a counter, why talk about it separately?
Because traffic in cosmetics is almost always paid, and without cart and purchase events, there is nothing to optimize the campaign. Of the three measured beauty stores, one has no meter at all, the other has Universal Analytics, which has not collected data since July 2023, and GA4 is not in the code. What the meter doesn't do: It doesn't improve anything by itself, it just gives you an opportunity to see. Plus blockers, consent mode, and browser restrictions on cookies — GA4 shows a trend, not an accounting truth, and you need to consciously compare its numbers with the cash register.
Send the price - we will calculate how many pages it will expand.
In response - a figure from the catalog taking into account shades and volumes, a document on the current site and a work plan by stages with dates. If you don't need the store now, you will hear about it in the first email.
From measured cases5,561 products in the live catalog
There is no price list on the site on purpose: the same work differs several times over between two clients, and a “from” figure explains nothing in that case. First a free audit — we count your pages, duplicates and speed — then we name the sum and the deadline and fix both in the contract.