Project Overview

The Dress Cleaning CMS was built to solve a real operational problem: tracking customer enquiries, jobs, appointments, and email threads across a wedding dress cleaning business was becoming unmanageable on paper and scattered through an email inbox. Quotes were being missed, follow-up timing was inconsistent, and there was no clear view of outstanding payments.

The system replaces that chaos with a single purpose-built dashboard. Enquiries arriving from the business website appear automatically in the CMS. Each customer can have multiple jobs, each job has its own timeline, conversation thread, notes, and financials. The whole thing is hosted on a Digital Ocean VPS accessible via a subdomain, with daily database backups and reliable email delivery built in from the start.

Project Highlights

  • Replaces paper tracking: Centralises all customers, jobs, notes, and appointments in one place
  • Email conversation view: Surfaces threaded email exchanges directly in the job interface via the email API
  • Reliable delivery: Exponential backoff retries on failed customer emails, with admin alerts if sending ultimately fails
  • Finance tracking: Per-job payment tracking and a monthly finance dashboard for revenue and outstanding amounts
  • Daily backups: Automated SQLite backups for business continuity

Features

Dashboard

The main landing page after login. Shows a clear overview of new and unactioned enquiries, upcoming job deadlines, and any items needing attention. Designed so the most important information is visible immediately without needing to dig into sub-pages.

Customer & Job Tracking

Each customer record holds their contact details and can have multiple jobs attached — useful for repeat customers or couples ordering cleaning for multiple dresses. Jobs track the current status, deadlines, and logistics: whether the dress will be dropped off, collected from the customer, or delivered back after cleaning, and for steaming jobs, the venue location and appointment time.

Job Manager & Email Conversation

The heart of the system. Each job has a full management interface: the conversation tile surfaces the email thread with the customer directly in the UI via the email API, so there's no switching between the CMS and an email client. From the same view, quotes can be personalised and emailed to the customer, private notes can be added, and payment amounts can be recorded and tracked against the job.

Finance Page

A dedicated finance view summarises revenue taken in a given month, surfaces unpaid jobs, and gives a running total of outstanding amounts. Replaces the previous approach of cross-referencing a paper ledger with an email inbox to work out what had been paid.

Reliable Email Delivery

Customer-facing emails — quote responses, confirmations, follow-ups — are sent via the email API with exponential backoff retry logic built in. If a send fails transiently, the system retries with increasing delays rather than silently dropping the message. If delivery ultimately fails after retries, an admin alert is triggered so the situation can be handled manually and no customer communication is lost.

Technical Implementation

The stack was chosen for simplicity and low operational overhead — a single Python process serving both the UI and API, with a file-based database that's trivial to back up.

Backend — Python Flask with Jinja

Flask handles routing, business logic, and HTML rendering via Jinja2 templates. With no separate frontend build step or API layer needed for an internal single-user tool, this keeps the deployment footprint minimal. All the email retry logic, backup scheduling, and finance calculations run within the same process.

Database — SQLite

SQLite was the right fit for a low-concurrency internal tool: no separate database process to manage, no credentials to rotate, and the database is a single file that's straightforward to back up. A daily backup job copies the database file to a safe location, providing continuity without needing a managed database service.

Hosting — Digital Ocean VPS

The application runs on a Digital Ocean Linux VPS, accessed via a dedicated subdomain pointed at the server with an A record. The VPS gives full control over the environment without the cost overhead of a managed platform for a low-traffic internal tool.

Email Reliability

Outbound emails use exponential backoff retries — if the first send attempt fails, the system waits and retries, doubling the delay each time. This handles transient deliverability issues gracefully. If all retry attempts are exhausted, an alert email goes to the admin so the failed message can be followed up manually. This pattern ensures the business never unknowingly loses a customer communication.

Project Gallery