2025
UK 3PL and ecommerce fulfilment marketing site — service landing pages, pricing, lead capture, and a Django-powered blog CMS. Next.js 15 frontend paired with Django Ninja + PostgreSQL API on carrier.tdwlogistics.co.uk.
Overview
TDW Logistics is a production marketing site for a UK third-party logistics and ecommerce fulfilment provider based in the Forest of Dean, Gloucestershire. The site positions TDW as an HMRC-approved fulfilment house serving startups through international brands — store, pick, pack, and ship.
The work spans two codebases: tdwlogistics-nextjs (Next.js 15, React 19, TypeScript) and tdwlogistics-django — Django 5 + Django Ninja on PostgreSQL, deployed at carrier.tdwlogistics.co.uk. Lead forms use Zeptomail server actions; blog media is stored on Cloudinary.
Public experience
The homepage combines a hero with HMRC approval badge, fulfilment SVG illustration, warehouse showcase, starter packages, UK coverage map, and partner logos.
Service pages — 15 dedicated routes under /services (3PL, warehousing, fulfilment, Shopify fulfilment, pick and pack, returns, shipping, reporting, sales-channel integration, and more) with FAQs, integration logos, and conversion CTAs to /enquire.
Pricing, company (1M+ parcels, founded 2021), locations, contact-us, and enquire round out the marketing funnel. Legal pages cover privacy, terms, and claims.
Lead capture
Contact and enquire forms share a Zeptomail server action (submitContactForm) that emails the business inbox and sends an auto-reply confirmation to the customer.
Fields capture name, company, order volume, website, email, phone, and message. Client-side validation uses Zod patterns; successful submits fire Google Tag Manager conversion events (AW-792382412). nextjs-toploader provides route progress feedback.
Blog CMS
Editorial content is managed in Django admin (Blog, Author, Category models) with draft/published status, slugged URLs, excerpts, and Cloudinary image uploads.
The Ninja API exposes:
GET /api/blogs— paginated list with optional status filterGET /api/blogs/{slug}— single post with author and category
The Next.js /blog index fetches from the API with client-side pagination; /blog/[slug] renders sanitized HTML via DOMPurify. Admin includes duplicate-blog actions and image preview widgets.
Technical notes
Frontend: Tailwind CSS 3, Headless UI, Heroicons, Motion + AOS scroll animations, Lenis smooth scroll dep, Geist fonts, static sitemap. Backend: Gunicorn + Docker, WhiteNoise static files, django-cors-headers for tdwlogistics.co.uk.
No customer portal or order dashboard in this repo — the site is marketing and lead-gen focused. Blog write endpoints exist in commented code; publishing is admin-only today.