Dulce Sorpresa: redesign, landings, tracking and ads · Case study
Gift e-commerce · Redesign, landings, tracking and ads · Aug – Oct 2026
Dulce Sorpresa has spent 20 years delivering breakfasts and gifts across Lima. I redesigned its store end to end, shipped it without pausing sales for a single minute, and then we sorted out tracking, Google Ads, Meta and SEO together.
Home page, catalogs, product page, cart and admin live since October 10, 2026; then three new landing pages, end-to-end sales tracking, a review of their campaigns and technical SEO, all handed over and documented to the Dulce Sorpresa team on October 26.
The starting point: A store with years of orders, ready for a refresh.
Dulce Sorpresa sells every day, with delivery dates and time slots that have to be met. The second stage covered 24 items: fixes, a new cart, catalog and product page, admin and mobile performance. On that basis I proposed the redesign and we refined it together, round by round, until every screen was approved.
What we agreed on
- Easy gifting Find the gift in a few steps, by occasion and recipient.
- Confident checkout A clear cart, with date, time slot and total always in view.
- Autonomy The team changes badges, banners and photos from the admin.
The store: The perfect gift, in three answers.

- Most gifted By occasion, with pills in the order the team chose.
- Trust badges “Your surprise arrives TODAY” and other trust messages, all editable.
- One card Catalogs and occasions share one design, with badges and icons for personalization, balloon and same-day delivery.
- A complete product page A gallery of up to 5 photos, date and time slot right on the page, and “Make it extra special” add-ons.
- Easy-to-read orders Order codes are now just letters and numbers, like GKND7.
- Made for phones Every screen reviewed on mobile, with no sideways scroll and a collapsible finder.





The cart: Four steps, with the summary always in view.
Order, delivery, details and payment on a single page. The date and time chosen on the product page carry over, shipping is priced by district, and the card and bank-transfer thank-you pages match the site.

Lighter: Measure first, then lighten.
- What I saw: Every site file changed its address on each visit, so the browser reused nothing. What I did: One version per release and bundled libraries: what doesn’t change stays cached. (21 → 1 — library requests)
- What I saw: Every photo on the home page asked for high priority at once. What I did: Priority only for what shows first, lazy loading for the rest. (−41% — image weight on the home page)
- What I saw: Photos customers upload with their orders took up gigabytes on the server. What I did: Inventory, backup and cleanup of those before June; new uploads resize themselves to 2000 px. (3.2 GB — freed, all backed up)
Before changing anything, every assumption was checked against what the browser actually downloaded, page by page.
The admin: Everything new on the site, editable.
- Badges Each product’s badges: New, Personalize it and more.
- Trust The badges on the home and product pages.
- Categories and occasions Title, text and header banner, with a mobile version.
- Products Card icons, up to 5 photos and alt text for each one.
- Dashboard Delivery revenue by day, week or month, and the most requested time slots.
- Corporate Banners, clients, case studies and catalogs, ready for the new business landing page.

Going live: Shipped without taking the store down.
The changes were applied to a copy of the database, and the site switched to it at the end with a single configuration change. We checked that no order came in during that window: the latest one is in both databases.
How it shipped
- Backup Files (4.3 GB) and database, stored off the server before touching anything.
- Rehearsal The full launch, on an exact copy of the live site, with two test purchases.
- Verification 16 screens on desktop and mobile, and a full purchase up to the Pay button.
- Rollback Going back to the previous version takes minutes: the old database is untouched.
Three landings: A page for every customer the store wasn’t speaking to.
With the store live, we built three pages for audiences with different needs: the Halloween season, Peruvians living abroad and companies. All three are edited from the admin, and every order that goes through them is tagged, so we know how much each one sells.
- Dulce Halloween A 3D cauldron in three.js that bubbles, shakes and pulls out the gift bag with the name the customer types, plus add-ons and the campaign code.
- Living far from Peru? Live clocks for New York, Madrid, Buenos Aires and Lima that tell you whether the gift can still arrive today, eight gifts, and a message that goes straight to the cart.
- Gifts for companies Logo products ready to buy in 5 to 15 units, a quote form that lands in the admin, case studies, catalogs and a dedicated WhatsApp line.




Each landing shipped with its own manual: what can be changed from the admin, where, and how to check it.
Tracking: Every sale counted once, paid, with its amount.
Before touching the campaigns we audited what Analytics, Google Ads and Meta saw against the store’s real orders. Sales arrived without amounts, declined payments and page reloads counted as sales, and there were two Meta pixels. I rebuilt tracking in Tag Manager and on the server, and we validated it order by order.
- What I saw: Tag Manager counted a sale every time someone opened the thank-you page, even when the payment was declined. What I did: The site reports the purchase only once the payment is approved, once, with amount, shipping and products. Bank deposits count when the team confirms them in the admin. (39 / 100 — container health in the audit)
- What I saw: Only two of the seven checkout steps were tracked, and only partly. What I did: Full GA4 funnel: catalog, product, cart, shipping, payment and sale with its order code. (2 → 7 — checkout steps tracked)
- What I saw: Meta received purchases without amounts, through a different pixel than the one configured. What I did: A single pixel plus the server-side Conversions API, deduplicated and with hashed data. (6.7 – 7.3 — Meta match quality, out of 10)
- Confirmed sale The conversion Google Ads learns from: paid orders, with their real amount.
- WhatsApp by line Clicks are split between sales and corporate, and we know which part of the site they came from.
- Order origin The site remembers for 7 days which campaign or landing the customer came from, and the dashboard matches it against spend.
Validated in production: of the first 16 orders after the change, the 13 paid ones were recorded as sales and the 3 unpaid ones were not counted.
Google Ads and Meta: Pay only for searches that sell.
With clean tracking we reviewed campaign by campaign, search by search, by hour and by device. Each change came with its numbers, a measurement date and a way back, and the Dulce Sorpresa team chose what to apply.
- Negative keywords Competitors and cities outside Lima that spent without selling, in shared lists and never on the brand campaign.
- Auctions How often each competitor outranks us, and why raising the budget wasn’t the fix.
- New ads Copy for the 20th anniversary, November alfajores and a corporate Christmas ad, each with its start and end date.
- Meta remarketing A catalog campaign with a spend cap, a fixed feed, photos without color bands and a line of copy for each product.
- Test abroad Facebook and Instagram for Peruvians in the United States for 4 weeks, with rules set in advance for switching it off.
- Handover calendar Every pending task with its date, where it’s done and copy ready to paste.
Working rule: one change at a time, logged with its date. If sales drop the next day, undo first and investigate later.
SEO: One official address per page.
- What I saw: The same product reached Google through up to 7 different addresses, and no page said which one was official. What I did: A canonical on every page, 301 redirects for old addresses and a sitemap with products and occasions. (50 → 61 — pages in the sitemap, read with no errors)
- What I saw: The titles of all 37 products ended with the URL slug, like “pack-amor”. What I did: Titles and descriptions built from the admin, filled out to about 155 characters without cutting words. (37 + 11 — products and occasions with their own title)
- What I saw: Google, Merchant Center and Meta were reading incomplete store data. What I did: Real structured data with shipping by zone and returns, feeds with the main photo and gallery, and editable FAQs. (9 — main pages submitted for reindexing)
Also: the Google Business Profile with November posts scheduled, and the “desayunos” ranking tracked monthly in Search Console.
Technologies: What I built the store with.
- Backend: PHP, CodeIgniter, MySQL
- Frontend: HTML, CSS, JavaScript, jQuery
- Payments: Niubiz
- 3D: Three.js
- Tracking: Tag Manager, GA4, Node.js
- Ads and SEO: Google Ads, Meta Ads, Search Console
- Delivery: Docker, Playwright
The result: A refreshed store, three new landings and sales tracked end to end, all run by the Dulce Sorpresa team on its own.
- 0 — orders lost at launch
- 3 — new landings, editable from the admin
- 13 / 13 — paid sales recorded during validation
- 249 — commits in three months