AboutProjectsSkillsBlogCareerHire MeContact
Journal
How I Built a Production E-commerce Platform for a Personalized Gifts Business
Next.jsReactNode.jsPostgreSQLPrismaRazorpayCloudinaryResendFreelancingFull Stack DevelopmentCase Study

How I Built a Production E-commerce Platform for a Personalized Gifts Business

Published

September 16, 2026

Reading

7 min read

Length

1,208 words

How I Built a Production E-commerce Platform for a Personalized Gifts Business

Building a project for a real business is very different from building a project for a portfolio.

You don't just need to make the UI look good. You need to understand how the business actually works, turn that workflow into software, handle real customer data and payments, deploy the application, and make sure everything works together in production.

The Craft Pallet was one of those projects for me.

It is a personalized gifts business that sells products such as Polaroid prints, photo frames, and other customized gifts. The business was receiving a significant portion of its orders through Instagram and WhatsApp, which made the ordering and management process increasingly difficult to handle manually.

I built a full-stack e-commerce and order management platform to solve that problem.


The Problem

Before the platform, the ordering process depended heavily on conversations through WhatsApp and Instagram.

A typical order could involve:

  1. Customer discovers the product through Instagram.

  2. Customer contacts the business.

  3. Product and quantity are discussed.

  4. Customization details are collected.

  5. Customer sends photos.

  6. Payment information is exchanged.

  7. The business manually tracks the order.

  8. Production status is communicated separately.

This works when the number of orders is small.

As the business grows, however, conversations become difficult to organize. Important information can get buried inside chats, and manually tracking order progress becomes time-consuming.

The goal wasn't simply to create an online store.

The goal was to create a structured digital workflow around the existing business process.


Designing the Solution

The platform was designed around two separate experiences.

Customer Side

Customers can:

  • Browse products

  • View product details

  • Select available options

  • Provide customization information

  • Upload required images

  • Create an order

  • Complete payment

  • Receive order information

Admin Side

The business can:

  • Manage products

  • Manage customers

  • View orders

  • Verify payments

  • Update order status

  • Track the production lifecycle

  • Manage business operations from one place

This separation made it possible to keep the customer experience simple while giving the business the tools required to manage the backend workflow.


The Order Lifecycle

One of the most important parts of the system was designing the order lifecycle.

Instead of treating an order as simply "paid" or "unpaid", the application uses business-specific states.

A simplified version of the workflow looks like this:

Awaiting Payment → Payment Verified → Approved → Production → Completed → Delivered

This provides a clear representation of where an order currently sits in the business process.

It also gives the admin dashboard a consistent way to communicate the state of every order.


Technology Stack

The application was built using a modern full-stack JavaScript/TypeScript stack.

Frontend

  • Next.js

  • React

  • TypeScript

  • Tailwind CSS

Backend

  • Node.js

  • Express.js

  • REST APIs

Database

  • PostgreSQL

  • Prisma ORM

Integrations

  • Razorpay — online payments

  • Cloudinary — image storage

  • Resend — transactional emails

Deployment

  • Linux VPS

  • Nginx

  • HTTPS

  • Custom domain

The goal was to use technologies that were reliable enough for a real production application while keeping the architecture practical for the scale of the business.


Building the Product System

The product system needed to support different types of personalized products.

For example, Polaroid products can have different sizes and quantities, while photo frames can have their own dimensions, pricing, and image requirements.

Instead of hardcoding every product directly into the frontend, product information is managed through the backend and database.

This allows the business to change product information without requiring changes to the application code.


Handling Customer Images

Personalized gifts depend heavily on customer-provided photographs.

That introduced another requirement:

How should customer images be uploaded and stored?

I integrated Cloudinary to handle image storage.

The application can receive customer uploads and associate them with the relevant order.

This is particularly useful for personalized products because the images aren't simply generic product assets — they are part of the customer's order data.


Integrating Razorpay

Payments were another important part of the system.

Razorpay was integrated to provide online payment processing.

The application associates payment information with the corresponding order so that the business can determine whether an order has completed the payment stage before moving forward with processing.

This also introduced the need to think about payment states and webhook handling rather than relying only on what happens inside the frontend.

That was an important shift from simply building UI functionality to thinking about reliable backend state management.


Email Communication

The platform also integrates Resend for transactional email delivery.

Using a dedicated email service makes it possible to send application-generated emails from the business domain rather than relying on manually sending messages for every event.

This provides a foundation for future notification workflows as the platform grows.


Admin Dashboard

The admin dashboard was designed as the operational center of the application.

Instead of requiring the business owner to manage everything through the customer-facing website, the dashboard provides a dedicated interface for business operations.

The most important part is the order management workflow.

An administrator can view orders and move them through the different stages of the production process.

This transforms the application from a simple storefront into an actual order management system.


Deployment

Getting the application working locally was only one part of the project.

The platform was deployed to a Linux VPS and configured for production.

The deployment involved:

  • Building the frontend and backend

  • Configuring environment variables

  • Running the application on the server

  • Configuring Nginx

  • Connecting the custom domain

  • Enabling HTTPS

  • Configuring production integrations

  • Testing the payment workflow

  • Verifying email delivery

Working through these deployment steps was valuable because it exposed the difference between:

"The application works on my machine."

and

"The application is actually running in production."


Challenges I Encountered

One of the biggest challenges wasn't a particular framework or library.

It was understanding the business workflow.

A generic e-commerce application usually assumes something like:

Browse → Cart → Checkout → Payment → Order

But personalized products introduce additional steps.

The customer may need to provide:

  • Product-specific customization

  • Multiple photographs

  • Quantity information

  • Additional instructions

  • Payment information

The business also needs to verify and process those details before production.

That meant the application had to be designed around the actual workflow of the business, rather than simply following a generic e-commerce template.


What I Learned

This project taught me several things that I wouldn't have learned from a tutorial project alone.

1. Real projects start with problems, not technologies

The first question shouldn't be:

"Should I use Next.js or React?"

It should be:

"What problem is the business actually trying to solve?"

Once the problem is understood, technology becomes a tool for solving it.

2. Backend state matters

Payments, orders, and production workflows all have states.

Designing those states correctly is critical when building real applications.

3. Integrations introduce real-world complexity

Razorpay, Cloudinary, and Resend each have their own configuration, authentication, failure cases, and production requirements.

Connecting APIs together is very different from simply calling an API in a tutorial.

4. Deployment is part of development

A production application isn't finished when the code compiles.

DNS, HTTPS, environment variables, reverse proxies, server configuration, monitoring, and production testing all become part of the development process.

5. Business software is different from demo projects

A portfolio project can be deleted and rebuilt tomorrow.

A production system has real users, real orders, real payments, and real consequences when something breaks.

That changes the way you think about engineering.


The Result

The final platform provides The Craft Pallet with a centralized digital system for handling products, customer orders, payments, images, and order progression.

More importantly, it transforms a workflow that previously depended heavily on manual messaging into a structured online process.

The project gave me practical experience across the entire development lifecycle:

Requirements → Architecture → Development → Integrations → Testing → Deployment → Production

And that is probably the biggest value I took away from building it.


What's Next?

This project also showed me the areas of software engineering I want to explore further.

Building the application is one thing.

Building systems that are easier to deploy, test, scale, monitor, and maintain is another.

My next focus is therefore going deeper into production engineering — particularly areas such as Docker, CI/CD, testing, backend architecture, caching, background jobs, and system design.

The goal isn't just to build more applications.

It's to become better at building reliable applications.

KP

Kiran S Pradeep

Full Stack Developer building scalable, performant web applications.

All Posts
Share
How I Integrated Razorpay Payments into The Craft Pallet: A Next.js E-commerce Case Study

Next Article

How I Integrated Razorpay Payments into The Craft Pallet: A Next.js E-commerce Case Study

Enjoyed this article?

Read more from the journal.

All Posts