Paying by invoice is common in Switzerland, and stores that offer it check the customer's credit first. On Ecofort, that check runs through Intrum. The problem I was asked to fix was subtle and expensive: when Intrum had an outage, the customer was told their credit check had failed.

Two answers that looked the same

From the checkout's point of view there were only two outcomes: approved, or not approved. "Intrum looked at this customer and said no" and "Intrum did not answer at all" both ended up as not approved. A perfectly good customer, during a provider hiccup, saw a decline.

The fix had three parts:

  1. The backend says whether a decision exists. It now reports whether Intrum actually returned a decision, separately from what the decision was.
  2. Every call has a timeout, so a slow provider can never leave checkout hanging.
  3. Checkout tells the truth. When there was no decision, the customer sees a neutral "temporarily unavailable" message instead of a decline.

Nobody gets approved who should not be. Nobody gets turned away because a server somewhere was slow.

The rest of the storefront

As the main developer on Ecofort, the credit check was one part of a broader pass over the store:

  • Performance: critical CSS extracted, theme scripts deferred, the largest image and the fonts preloaded, and the product image slider rebuilt so it no longer shifts the layout on mobile.
  • Accessibility: colour contrast, link names and iframe titles.
  • Content: collection loading with skeleton states, and an advice and news loader with per-article SEO, a proper 404 for empty pages and inactive articles filtered out.
  • Trust and tracking: Trusted Shops ratings, a delivery status indicator on the product page, and legacy product IDs carried through the cart into checkout for tracking.

I also set up the theme repositories for the sister stores, Infrarotheizung and Luftentfeuchter. Ecofort itself is in Switzerland's top 5,000 sites by Chrome traffic, in the same band as Dyson and Jura.

The general lesson

Any checkout step that calls an outside service has three outcomes, not two: yes, no, and no answer. Treating the third like the second is an easy bug to miss in payment and verification flows, and it is always worth checking for.

Further reading