<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Porcele</title>
    <description>The latest articles on DEV Community by Porcele (@porcele).</description>
    <link>https://dev.to/porcele</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4157559%2Fea14ebc8-ea4e-442e-9016-9b9e5dd0a6bc.png</url>
      <title>DEV Community: Porcele</title>
      <link>https://dev.to/porcele</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/porcele"/>
    <language>en</language>
    <item>
      <title>How We Built PORCELE: A Modern Next.js E-Commerce Platform for Smart Bathroom Technology</title>
      <dc:creator>Porcele</dc:creator>
      <pubDate>Fri, 02 Oct 2026 13:30:21 +0000</pubDate>
      <link>https://dev.to/porcele/how-we-built-porcele-a-modern-nextjs-e-commerce-platform-for-smart-bathroom-technology-4058</link>
      <guid>https://dev.to/porcele/how-we-built-porcele-a-modern-nextjs-e-commerce-platform-for-smart-bathroom-technology-4058</guid>
      <description>&lt;p&gt;How We Built PORCELE: A Modern Next.js E-Commerce Platform for Smart Bathroom Technology&lt;br&gt;
How We Built PORCELE: A Modern Next.js E-Commerce Platform for Smart Bathroom Technology&lt;/p&gt;

&lt;p&gt;Building an e-commerce website for a physical product is very different from building a typical marketing website.&lt;/p&gt;

&lt;p&gt;For PORCELE, the goal was to create a premium digital experience for smart toilets while also building the technical foundation required for dynamic products, shopping carts, checkout, payments, responsive interfaces, SEO, and scalable content.&lt;/p&gt;

&lt;p&gt;PORCELE focuses on intelligent bathroom technology, with products that combine traditional bathroom functionality with features such as heated seating, warm-water washing, warm-air drying, automatic flushing, touchless controls, night lighting, and other smart features.&lt;/p&gt;

&lt;p&gt;In this post, I'll walk through some of the technical decisions and challenges involved in building the platform.&lt;/p&gt;

&lt;p&gt;The Goal&lt;/p&gt;

&lt;p&gt;The main goal was to create a modern e-commerce experience where users could:&lt;/p&gt;

&lt;p&gt;Explore different smart toilet models&lt;br&gt;
Compare products and features&lt;br&gt;
View detailed product information&lt;br&gt;
Select available options&lt;br&gt;
Add products to a cart&lt;br&gt;
Manage cart items&lt;br&gt;
Proceed through checkout&lt;br&gt;
Select a payment method&lt;br&gt;
Complete an order&lt;br&gt;
Access the website easily from mobile and desktop devices&lt;/p&gt;

&lt;p&gt;At the same time, the platform needed to be optimized for search engines and structured so that product information could come from the backend rather than being hardcoded throughout the frontend.&lt;/p&gt;

&lt;p&gt;Technology Stack&lt;/p&gt;

&lt;p&gt;The frontend was built using a modern React-based stack:&lt;/p&gt;

&lt;p&gt;Next.js&lt;br&gt;
React&lt;br&gt;
TypeScript&lt;br&gt;
Tailwind CSS&lt;br&gt;
Next.js App Router&lt;br&gt;
REST APIs&lt;br&gt;
GitHub&lt;br&gt;
Vercel&lt;/p&gt;

&lt;p&gt;The combination of Next.js and TypeScript gave us a good foundation for building reusable components while maintaining type safety as the application became more complex.&lt;/p&gt;

&lt;p&gt;Designing the Product Architecture&lt;/p&gt;

&lt;p&gt;One of the first challenges was deciding how products should be represented.&lt;/p&gt;

&lt;p&gt;PORCELE currently has multiple product models, including:&lt;/p&gt;

&lt;p&gt;PORCELE ONE&lt;br&gt;
PORCELE ELITE&lt;br&gt;
PORCELE SIGNATURE&lt;br&gt;
PORCELE ROYALE&lt;br&gt;
ADA model options&lt;/p&gt;

&lt;p&gt;Instead of building separate hardcoded pricing logic for every page, we wanted the backend to act as the source of truth.&lt;/p&gt;

&lt;p&gt;A simplified product structure looks like this:&lt;/p&gt;

&lt;p&gt;Product&lt;br&gt;
 ├── id&lt;br&gt;
 ├── name&lt;br&gt;
 ├── price&lt;br&gt;
 ├── MSRP&lt;br&gt;
 ├── discount&lt;br&gt;
 ├── images&lt;br&gt;
 ├── ADA option&lt;br&gt;
 ├── availability&lt;br&gt;
 └── additional product information&lt;/p&gt;

&lt;p&gt;This approach makes it easier to update pricing, product images, discounts, and availability without having to modify multiple frontend components.&lt;/p&gt;

&lt;p&gt;The public product catalog can be explored at:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://porcele.com/products" rel="noopener noreferrer"&gt;https://porcele.com/products&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dynamic Product Data&lt;/p&gt;

&lt;p&gt;One of the important parts of the implementation was connecting the frontend to the product API.&lt;/p&gt;

&lt;p&gt;Instead of defining values such as:&lt;/p&gt;

&lt;p&gt;price = "$1,599"&lt;/p&gt;

&lt;p&gt;directly inside the UI, the frontend retrieves product information from the backend.&lt;/p&gt;

&lt;p&gt;The flow is approximately:&lt;/p&gt;

&lt;p&gt;Backend API&lt;br&gt;
     ↓&lt;br&gt;
Product Data&lt;br&gt;
     ↓&lt;br&gt;
Next.js Application&lt;br&gt;
     ↓&lt;br&gt;
Product Components&lt;br&gt;
     ↓&lt;br&gt;
Product Details / Cart / Checkout&lt;/p&gt;

&lt;p&gt;This gives us a single source of truth for product information.&lt;/p&gt;

&lt;p&gt;It also prevents a common e-commerce problem where the product page displays one price while the checkout system uses another value.&lt;/p&gt;

&lt;p&gt;Building Reusable Product Components&lt;/p&gt;

&lt;p&gt;The product pages share many common elements.&lt;/p&gt;

&lt;p&gt;Instead of creating completely separate components for every model, we designed reusable UI components that receive product data as properties.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;
  product={product}&lt;br&gt;
/&amp;gt;&lt;/p&gt;

&lt;p&gt;The component can then display the appropriate:&lt;/p&gt;

&lt;p&gt;Product image&lt;br&gt;
Product name&lt;br&gt;
Pricing&lt;br&gt;
Discount&lt;br&gt;
Features&lt;br&gt;
Availability&lt;br&gt;
Product link&lt;/p&gt;

&lt;p&gt;This makes the frontend easier to maintain as new models are added.&lt;/p&gt;

&lt;p&gt;Responsive UI&lt;/p&gt;

&lt;p&gt;Another major focus was responsive design.&lt;/p&gt;

&lt;p&gt;A premium product website needs to work just as well on a mobile phone as it does on a large desktop monitor.&lt;/p&gt;

&lt;p&gt;The interface was designed around responsive layouts using Tailwind CSS.&lt;/p&gt;

&lt;p&gt;The goal was to make sure that:&lt;/p&gt;

&lt;p&gt;Mobile&lt;br&gt;
   ↓&lt;br&gt;
Tablet&lt;br&gt;
   ↓&lt;br&gt;
Laptop&lt;br&gt;
   ↓&lt;br&gt;
Desktop&lt;/p&gt;

&lt;p&gt;all provide a consistent experience without simply shrinking the desktop interface.&lt;/p&gt;

&lt;p&gt;This required paying attention to:&lt;/p&gt;

&lt;p&gt;Product card layouts&lt;br&gt;
Navigation&lt;br&gt;
Images&lt;br&gt;
Typography&lt;br&gt;
Buttons&lt;br&gt;
Spacing&lt;br&gt;
Product comparison sections&lt;br&gt;
Checkout components&lt;br&gt;
Managing the Shopping Cart&lt;/p&gt;

&lt;p&gt;The cart required its own state-management approach.&lt;/p&gt;

&lt;p&gt;We created a cart context and reducer-based architecture so different parts of the application could access and update cart state.&lt;/p&gt;

&lt;p&gt;The simplified flow looks like:&lt;/p&gt;

&lt;p&gt;Product Page&lt;br&gt;
     ↓&lt;br&gt;
Add to Cart&lt;br&gt;
     ↓&lt;br&gt;
Cart Context&lt;br&gt;
     ↓&lt;br&gt;
Cart Reducer&lt;br&gt;
     ↓&lt;br&gt;
Local Storage&lt;br&gt;
     ↓&lt;br&gt;
Checkout&lt;/p&gt;

&lt;p&gt;Persisting the cart locally means that a user can navigate between pages without losing the items they have selected.&lt;/p&gt;

&lt;p&gt;The cart also needs to handle product IDs consistently because product information is coming from the backend.&lt;/p&gt;

&lt;p&gt;This became particularly important when moving from static frontend product data to dynamically retrieved backend products.&lt;/p&gt;

&lt;p&gt;Handling Product Options&lt;/p&gt;

&lt;p&gt;Some products have additional configuration options.&lt;/p&gt;

&lt;p&gt;For example, the PORCELE ROYALE model includes an ADA-related option.&lt;/p&gt;

&lt;p&gt;Instead of treating every variation as an entirely different product, the frontend can use product configuration data to determine which options should be displayed.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;/p&gt;

&lt;p&gt;Product&lt;br&gt;
   │&lt;br&gt;
   ├── Standard configuration&lt;br&gt;
   │&lt;br&gt;
   └── ADA configuration&lt;br&gt;
          │&lt;br&gt;
          └── Additional pricing&lt;/p&gt;

&lt;p&gt;This makes the UI flexible enough to support product-specific options without duplicating the entire product page.&lt;/p&gt;

&lt;p&gt;Checkout and Payments&lt;/p&gt;

&lt;p&gt;The checkout experience was another major part of the platform.&lt;/p&gt;

&lt;p&gt;The general flow is:&lt;/p&gt;

&lt;p&gt;Cart&lt;br&gt;
  ↓&lt;br&gt;
Checkout&lt;br&gt;
  ↓&lt;br&gt;
Shipping Information&lt;br&gt;
  ↓&lt;br&gt;
Shipping Method&lt;br&gt;
  ↓&lt;br&gt;
Payment&lt;br&gt;
  ↓&lt;br&gt;
Create Order&lt;br&gt;
  ↓&lt;br&gt;
Order Confirmation&lt;/p&gt;

&lt;p&gt;Payment integration was implemented with PayPal, while the checkout interface was designed to accommodate card/payment options.&lt;/p&gt;

&lt;p&gt;The important engineering consideration here is that the frontend should not be treated as the final authority for order values.&lt;/p&gt;

&lt;p&gt;Before an order is processed, important product and pricing information should be validated against trusted backend data.&lt;/p&gt;

&lt;p&gt;API-Based Order Processing&lt;/p&gt;

&lt;p&gt;The application also uses API routes for order-related operations.&lt;/p&gt;

&lt;p&gt;A simplified architecture looks like:&lt;/p&gt;

&lt;p&gt;Next.js Frontend&lt;br&gt;
       ↓&lt;br&gt;
API Route&lt;br&gt;
       ↓&lt;br&gt;
Backend / Payment Provider&lt;br&gt;
       ↓&lt;br&gt;
Order Processing&lt;br&gt;
       ↓&lt;br&gt;
Order Response&lt;br&gt;
       ↓&lt;br&gt;
Frontend&lt;/p&gt;

&lt;p&gt;This separation makes the application easier to maintain and allows payment/order logic to remain separate from presentation components.&lt;/p&gt;

&lt;p&gt;Building for SEO&lt;/p&gt;

&lt;p&gt;Because PORCELE is also a product discovery platform, SEO was an important part of the implementation.&lt;/p&gt;

&lt;p&gt;The website includes:&lt;/p&gt;

&lt;p&gt;Metadata&lt;br&gt;
Product-specific pages&lt;br&gt;
Sitemap&lt;br&gt;
robots.txt&lt;br&gt;
Internal linking&lt;br&gt;
Search-engine indexing configuration&lt;br&gt;
Structured public URLs&lt;/p&gt;

&lt;p&gt;Some of the main public pages include:&lt;/p&gt;

&lt;p&gt;/&lt;br&gt;
 /products&lt;br&gt;
 /one-model&lt;br&gt;
 /elite-model&lt;br&gt;
 /signature-model&lt;br&gt;
 /royale-model&lt;br&gt;
 /ada-model&lt;br&gt;
 /how-it-works&lt;br&gt;
 /experience&lt;br&gt;
 /safety&lt;br&gt;
 /faq&lt;/p&gt;

&lt;p&gt;Each important product and informational page should be accessible through a crawlable URL rather than being hidden behind client-side interactions.&lt;/p&gt;

&lt;p&gt;The goal is to make the site useful for both users and search engines.&lt;/p&gt;

&lt;p&gt;Sitemap and Robots.txt&lt;/p&gt;

&lt;p&gt;The sitemap contains the main public product and informational pages.&lt;/p&gt;

&lt;p&gt;Private transactional routes such as checkout and order-related pages should not be treated like public marketing pages.&lt;/p&gt;

&lt;p&gt;The basic concept is:&lt;/p&gt;

&lt;p&gt;Public Pages&lt;br&gt;
     ↓&lt;br&gt;
Crawlable&lt;br&gt;
     ↓&lt;br&gt;
Search Engine&lt;/p&gt;

&lt;p&gt;Private / Transactional Pages&lt;br&gt;
     ↓&lt;br&gt;
Restricted&lt;/p&gt;

&lt;p&gt;This keeps the technical SEO structure aligned with the actual purpose of each page.&lt;/p&gt;

&lt;p&gt;Indexing and Search Visibility&lt;/p&gt;

&lt;p&gt;We also worked with search-engine webmaster tools and URL indexing systems.&lt;/p&gt;

&lt;p&gt;PORCELE uses:&lt;/p&gt;

&lt;p&gt;Google SEO tools&lt;br&gt;
Bing Webmaster Tools&lt;br&gt;
Sitemap submission&lt;br&gt;
IndexNow&lt;br&gt;
Metadata&lt;br&gt;
Internal linking&lt;/p&gt;

&lt;p&gt;IndexNow is particularly useful for notifying participating search engines when URLs are updated.&lt;/p&gt;

&lt;p&gt;The goal isn't simply to get pages indexed. The larger goal is to build a website structure where search engines can understand the relationship between products, educational content, and the overall brand.&lt;/p&gt;

&lt;p&gt;Image Optimization&lt;/p&gt;

&lt;p&gt;A product-focused website depends heavily on high-quality imagery.&lt;/p&gt;

&lt;p&gt;At the same time, large product images can negatively affect page performance if they are not handled correctly.&lt;/p&gt;

&lt;p&gt;Next.js provides image optimization capabilities through next/image.&lt;/p&gt;

&lt;p&gt;The general approach is:&lt;/p&gt;

&lt;p&gt;
  src={product.image}&lt;br&gt;
  alt={product.name}&lt;br&gt;
  width={800}&lt;br&gt;
  height={800}&lt;br&gt;
/&amp;gt;&lt;/p&gt;

&lt;p&gt;Using descriptive alternative text also helps accessibility and gives search engines additional context about product imagery.&lt;/p&gt;

&lt;p&gt;What We Learned&lt;/p&gt;

&lt;p&gt;Building PORCELE highlighted several lessons that apply to many e-commerce projects.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Keep the backend as the source of truth&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Prices, discounts, product IDs, and availability should not be duplicated across many frontend components.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Build reusable components early&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Product cards, buttons, navigation elements, and checkout components become much easier to maintain when they are designed for reuse.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;TypeScript becomes increasingly valuable as the project grows&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once the application has products, carts, APIs, payment data, and multiple UI states, type safety helps catch inconsistencies earlier.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;E-commerce state needs careful design&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A shopping cart looks simple from the UI, but handling persistence, product IDs, quantities, pricing, and checkout transitions requires a consistent data model.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;SEO should be considered during development&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sitemap structure, metadata, URLs, internal links, image optimization, and crawlability shouldn't be added as an afterthought.&lt;/p&gt;

&lt;p&gt;What's Next?&lt;/p&gt;

&lt;p&gt;As the platform evolves, there are several areas that can continue to improve:&lt;/p&gt;

&lt;p&gt;More product comparison functionality&lt;br&gt;
Additional product configuration options&lt;br&gt;
Improved checkout flows&lt;br&gt;
Better performance monitoring&lt;br&gt;
More educational content&lt;br&gt;
More structured product information&lt;br&gt;
Additional accessibility improvements&lt;br&gt;
Further SEO optimization&lt;/p&gt;

&lt;p&gt;The goal is to continue improving both the engineering foundation and the customer experience.&lt;/p&gt;

&lt;p&gt;Final Thoughts&lt;/p&gt;

&lt;p&gt;Building PORCELE was more than creating a product landing page.&lt;/p&gt;

&lt;p&gt;It required combining a modern frontend architecture with dynamic product data, state management, responsive UI, checkout functionality, payment integration, and technical SEO.&lt;/p&gt;

&lt;p&gt;The project also demonstrates how a physical product brand can use modern web technologies to create a digital experience that feels as carefully designed as the products themselves.&lt;/p&gt;

&lt;p&gt;You can explore the live PORCELE platform here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://porcele.com/" rel="noopener noreferrer"&gt;https://porcele.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And the product catalog here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://porcele.com/products" rel="noopener noreferrer"&gt;https://porcele.com/products&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading. If you're also building a Next.js e-commerce project, I'd be interested to hear what architectural decisions you've made and what challenges you've encountered.&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>react</category>
      <category>typescript</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
