Optimizing Your Cart Page to Reduce Abandoned Carts

Imagine your online store losing up to 70% of carts. Half of those losses are due to technical and UX issues that can be resolved at the development level. For example, an electronics store with an average order value of $100 implemented a shipping calculator and abandoned cart emails, reducing aban

Development and maintenance of all types of websites:

Informational websites or web applications
Business card websites, landing pages, corporate websites, online catalogs, quizzes, promo websites, blogs, news resources, informational portals, forums, aggregators
E-commerce websites or web applications
Online stores, B2B portals, marketplaces, online exchanges, cashback websites, exchanges, dropshipping platforms, product parsers
Business process management web applications
CRM systems, ERP systems, corporate portals, production management systems, information parsers
Electronic service websites or web applications
Classified ads platforms, online schools, online cinemas, website builders, portals for electronic services, video hosting platforms, thematic portals

These are just some of the technical types of websites we work with, and each of them can have its own specific features and functionality, as well as be customized to meet the specific needs and goals of the client.

Our competencies:

Frequently Asked Questions

Latest works

  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1281
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1237
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    977
  • image_crm_chasseurs_493_0.webp
    CRM development for Chasseurs
    1027
  • image_website-sbh_0.webp
    Website development for SBH Partners
    1103
  • image_website-_0.webp
    Website development for Red Pear
    550

Imagine your online store losing up to 70% of carts. Half of those losses are due to technical and UX issues that can be resolved at the development level. For example, an electronics store with an average order value of $100 implemented a shipping calculator and abandoned cart emails, reducing abandonment from 75% to 52%, gaining an additional $5,000 in monthly revenue. According to Baymard Institute, the average cart abandonment rate is 70.19%. The main cause: unexpected costs. Our approach is to remove every obstacle to purchase: hidden costs, missing cart persistence, complex checkout. Over years of experience optimizing carts for 50+ e-commerce projects, we achieve a 20–40% reduction in abandoned carts.

Main Causes of Cart Abandonment and the Role of Shipping

Cause % of Users
Unexpected costs (shipping, taxes) 48%
Forced account creation 26%
Slow loading / technical errors 17%
Distrust in card entry 19%
Complicated checkout process 18%

The first item is most critical. Hidden shipping costs are the biggest conversion killer.

Why Is Shipping Cost Critical?

Shipping should be calculated right in the cart, before checkout. A "Calculate Shipping" widget with city/zip field:

const ShippingCalculator: React.FC<{ cartTotal: number }> = ({ cartTotal }) => { const [zip, setZip] = useState(''); const [rates, setRates] = useState<ShippingRate[]>([]); const calculate = async () => { const result = await api.post('/shipping/rates', { zip, items: cartItems, total: cartTotal, }); setRates(result.data); }; return ( <div className="shipping-calculator"> <input placeholder="Enter zip or city" value={zip} onChange={e => setZip(e.target.value)} onBlur={calculate} /> {rates.map(rate => ( <ShippingOption key={rate.id} rate={rate} /> ))} {cartTotal >= FREE_SHIPPING_THRESHOLD && ( <FreeShippingBadge /> )} </div> ); }; 

Free shipping at a threshold X is a strong incentive to add more items. A progress bar toward that threshold:

const threshold = 5000; // in your currency const remaining = threshold - cartTotal; <div className="free-shipping-progress"> <progress value={cartTotal} max={threshold} /> {remaining > 0 ? <span>Add {remaining} more for free shipping</span> : <span>You've got free shipping!</span> } </div> 

Such a progress bar increases average order value by 10–30% among users who initially planned to spend below the threshold.

Cart Persistence and Abandoned Cart Emails

Persisting the Cart Between Sessions

The cart must be saved. For authenticated users, persist in the database; for guests, use localStorage with synchronization upon login. On login, merge the guest cart with the server cart using updateOrCreate by product_id and variant_id.

How to Set Up Abandoned Cart Emails?

An email sent 1 hour after the user leaves with items in the cart is one of the highest-converting triggers (recovery rate 5–15%).

Trigger: When an item is added to the cart, create a record with abandoned_at = NULL. If the user hasn't completed the order within 60 minutes and the last activity was > 60 minutes ago, mark the cart as abandoned.

// Scheduled Job (every 15 minutes) Cart::query() ->where('updated_at', '<', now()->subMinutes(60)) ->whereNull('order_id') ->whereNull('abandoned_email_sent_at') ->with('user', 'items.product') ->chunk(100, function ($carts) { foreach ($carts as $cart) { SendAbandonedCartEmail::dispatch($cart); $cart->update(['abandoned_email_sent_at' => now()]); } }); 

The email contains: product list with images and prices, a "Return to Order" button (link with UTM tags), and social proof (reviews for items in the cart). Email series: after 1 hour, 24 hours, and 72 hours. The third email may include a discount — but only if the first two didn't work.

To set up abandoned cart emails, follow these steps:

  1. Add an abandoned_email_sent_at field to the carts table.
  2. Implement a scheduled job that every 15 minutes finds carts older than 60 minutes without an order.
  3. Send the email via an email service (SendGrid, Mailgun) or built-in mail.
  4. Schedule a second email after 24 hours, a third after 72 hours.

Upsell and Cross-sell: Increasing Average Order Value

Recommendations must be relevant. Algorithms: "Frequently bought together" — based on co-occurrence in historical orders:

SELECT oi2.product_id, COUNT(*) AS together_count FROM order_items oi1 JOIN order_items oi2 ON oi1.order_id = oi2.order_id AND oi1.product_id != oi2.product_id WHERE oi1.product_id = $current_product_id GROUP BY oi2.product_id ORDER BY together_count DESC LIMIT 5; 

"Upgrade your bundle" — if the cart contains a budget option, offer a premium version with the price difference. Conversion on upgrades is 8–15%.

Technical Cart Optimizations

Optimistic UI

Optimistic UI when changing quantity. User clicks "+" — quantity updates instantly in the UI, API request runs in background. If the request fails, rollback:

const updateQuantity = async (itemId: number, newQty: number) => { const prevQty = item.quantity; setItems(prev => prev.map(i => i.id === itemId ? {...i, quantity: newQty} : i)); try { await api.patch(`/cart/items/${itemId}`, { quantity: newQty }); } catch { setItems(prev => prev.map(i => i.id === itemId ? {...i, quantity: prevQty} : i)); toast.error('Failed to update quantity'); } }; 

This approach reduces interface response time to 150 ms, which is 4x faster than synchronous page reload.

Minimizing Checkout Steps

The "Checkout" button should be visible without scrolling. On mobile, the checkout button is fixed at the bottom using CSS position: fixed and z-index: 100.

Stock Indicators

If stock is <= 5, show a warning "Only N left." This creates gentle pressure without appearing manipulative — it's simply useful information.

Extra optimization: bundle splitting Split the cart code into a separate chunk, so it loads only when the user adds an item. This reduces initial bundle size and improves LCP.

Process and Timelines

Work Phases

  • Audit current cart and checkout implementation (UX, performance, error analysis)
  • Implement shipping calculator with free shipping progress bar
  • Set up abandoned cart emails (triggers, templates, series)
  • Integrate recommendation algorithms (cross-sell, upsell)
  • Document changes and train your team
  • 30-day post-launch support

Timelines

Task Time
Shipping calculator + progress bar 1 day
Cart persistence for guests 1 day
Abandoned cart emails 1–2 days
Recommendations (cross-sell) 1–2 days

Total: 3–5 working days.

Why Choose Us?

We specialize in e-commerce optimization with years of experience. Our projects handle loads up to 10,000 requests per minute. We use a modern stack: React 18, Next.js, Laravel 11, PHP 8.3, PostgreSQL, Redis. Solutions are guaranteed to be compatible with your architecture. All changes undergo load testing.

Get a consultation on optimizing your cart. Contact us for a cost estimate and work plan.