Pochtoy & Prostobox: Speeding up the storefronts of two brands on one platform


- Role
- Fullstack Developer
- Team
- 3 fullstack developers and a PM
- Timeline
- 10.2023 – 01.2025
- Status
- The sites are live
What I did
- Loading speedPagination, lazy-loaded images, separate JS and CSS for every page instead of one shared bundle, and a lighter library bundle for the Pochtoy home page.
- Storefront frontendMarkup from a ready-made design in Tailwind CSS. The delivery calculator runs as a separate Vue 3 widget inside a server-rendered page.
- Storefront database queriesReviews with the list, pagination and the map, the calculator and rates, home page banners, city search. Only the needed fields are selected from the database.
- Review CashbackA TypeScript module that pays customers to their balance for a review of the service. The frontend and the queries are mine.
Context
Business
Pochtoy LLC delivers purchases from US stores. Parcels arrive at a warehouse in tax-free Delaware, an operator can buy the item on the customer's request, and then the parcel goes to Russia, Kazakhstan, Belarus, the Middle East or another country. The sites work in English, Russian, Arabic and Spanish.
The company runs two brands on one platform. Pochtoy.com has been operating since 2008. Prostobox is the budget brand with delivery from $3.99 per parcel, and 79% of its shipments come from resellers and entrepreneurs.
- 2.6Mparcels shipped by Pochtoy.com since 2008
- 200k+parcels shipped by Prostobox
- 7,000+parcels a week
- 20,000+Pochtoy.com customers
The sites' statistics for October 2026 are shown as an example.
The situation
The team maintained and developed the sites of both brands. There were two main goals. The first was stability: the sites had to run without failures in all four languages, and new features must not break the code shared by the two brands. The second was speed: the storefront had to serve pages faster, especially on mobile internet.
Storefront pages took more than 5 seconds to load. Lists such as reviews were rendered in full with no pagination, all images loaded at once, and scripts and styles came in one shared bundle: on the Pochtoy home page the libraries alone weighed 930 KB.
Process, architecture and decisions
Architecture
I started working on the problems with the architecture: it determined what could be sped up without breaking the other brand. Both brands run on one Laravel backend: a shared session, the same paths and the same functions in the scripts, so any change to the shared code affects both sites. Each brand kept its own domain, with its styles and scripts layered on top of the shared ones. This made it possible to split resources by page and brand, and to plug in new interactive parts as separate Vue 3 widgets without rewriting the server pages.
- BRANDSTwo brands
Pochtoy.com and Prostobox: their own styles and scripts on top of the shared ones.
assets/guestassets/pochtoyassets/prostobox
- STOREFRONTStorefront
Server rendering and jQuery, Vue 3 as separate widgets. Built with Laravel Mix.
- APIStorefront API
Rates and delivery calculation, the customer's region, home page banners, city search.
/api/guest/calculator/*/api/guest/client-region/get/api/guest/index-banners/get/city/search
- DATAData and static files
PostgreSQL, Redis for cache, static files on Bunny CDN.
Review Cashback
Review Cashback is a feature that motivates customers to talk about the service on external platforms: for a review, the customer gets money to their balance. For the client, it brings a stream of genuine reviews where new customers read them — on maps, social networks and Trustpilot. Reviews with a photo and a tracking number build trust in the service, and the money stays on the balance and comes back with the next parcel. I built this TypeScript module: the frontend and the queries.
- 01Review200 characters or more, with a photo and a tracking number
- 02LinkThe customer pastes the link to the review into a form on the site
- 03CheckAn operator checks the review
- 04Cashback$3 or $5 to the balance depending on the platform
There are six platforms: Yandex Maps, VK, Otzovik, Trustpilot, Google Maps and Facebook, with one review counted on each. For all six the customer gets up to $22.
Speed for real users
I wrote the perf-rum.js script that collects speed metrics from real users. For 25% of visits it records TTFB, FCP, LCP, INP and CLS for each page, along with the page weight and the number of requests, images and XHR calls, and sends them to the server.
Quality and releases
I wrote three kinds of tests: component tests in Vitest, visual regression tests against reference screenshots of blocks and E2E tests in Playwright for the critical scenarios.
Each task is done in its own branch, passes CI checks and goes to a test stand. On the planned release date the finished tasks move to a preprod stand identical to production, and after acceptance they roll out to production without downtime. Production errors are tracked constantly, and in case of trouble the release is rolled back to the previous stable version.
- develop test stand
- preprod acceptance
- master production without downtime
We worked in two-week sprints. At the end of each sprint we showed the client what was done, what was not and why, and what we were taking on for the next two weeks.
Challenges
Slow page loading
- Problem
- Some pages took more than 5 seconds to load: lists had no pagination, all images loaded at once, and scripts and styles came in one shared bundle.
- Solution
- I added pagination and lazy loading of images and split JS and CSS by page. For the Pochtoy home page I built a lighter library bundle: about 700 KB against 930 KB for the full one. I plugged in the delivery calculator as a separate Vue 3 widget. In the storefront database queries I selected only the needed fields instead of SELECT *.
- Result
- Reviews are split into pages, images below the fold load as the user scrolls, and every page gets only its own scripts and styles. There were no before and after measurements, so the result is described as a list of what was done, without numbers.
Slow delivery of new features
- Problem
- The storefront was built with outdated tools: jQuery, Laravel Mix and one shared bundle with no typing and no tests. Every new feature needed manual checks on both brands, so it took a long time to reach production.
- Solution
- I started building new interactive parts as Vue 3 and TypeScript widgets: they plug into the server page and do not touch the rest of the code. I added component, visual and E2E tests so changes are checked automatically instead of by hand on two sites.
- Result
- The delivery calculator and Review Cashback shipped as separate modules without affecting the rest of the storefront. Regressions are caught by tests before the release.
Metrics and results
- ~700 KBlibrary bundle of the Pochtoy home page instead of 930 KB
- < 5 sstorefront page load, down from more than 5 seconds
- 7,000+parcels a week handled by both sites without failures, while they used to slow down and crash under load
- 3 test typescomponent, visual and E2E tests catch regressions before the release and replace manual checks of two brands
The storefronts of both brands got pagination, lazy-loaded images and separate scripts and styles for every page. Pages now load in under 5 seconds, and the sites handle more than 7,000 parcels a week without failures, while they used to slow down and sometimes crash under such load.
Your site already brings in orders but loads slowly?
I will find what slows it down, split scripts and styles by page, add pagination and lazy loading and set up speed tracking for real users.