muneeb.
Case study · 2026

Pacific Trips Admin

Internal admin panel for a Pakistani travel agency. Built to let the owner and team manage every piece of content on pacific-trips.com — from trip packages to blog posts to customer enquiries.

Year
2026
Type
Client work
Timeline
30 days . Secure . Custom RBAC
Status
Live
https://pacific-admin-panel.vercel.app/dashboard/trips
All trips
9-step trip wizard
Blog post editor
Blog posts
User management
Role-based permissions
Organisation settings
Account settings

The problem

Pacific Trips had no way to update their public website without going through a developer. The owner and staff were emailing edits, which slowed down publishing and caused version drift. They needed a self-serve tool that let multiple team members manage content with different levels of access.

What I built

I built a full-stack admin dashboard on Next.js 16 and Supabase. It covers every content type on the public site and ships with a role-based permission system so the owner can control exactly what each team member can see or edit.

  • Security layer

    Supabase RLS at the database level, JWT sessions, Cloudflare Turnstile CAPTCHA on login, and CSP headers throughout.

  • 9-step trip wizard

    Multi-step form for creating trip packages — card info, images, itinerary, gallery, FAQs, SEO metadata, and publish status, all validated per-step with Zod.

  • Blog editor with inline images

    Tiptap rich-text editor with markdown support, inline image uploads to Supabase Storage, and automatic orphaned-image cleanup on delete.

  • Granular role based access system

    Three roles (super admin, admin, viewer) with per-module permissions across 8 sections. Permissions are cached for 5 minutes to avoid redundant DB hits.

  • Bulk operations

    Batch delete and status updates across trips, blogs, enquiries, contact queries, and more — all powered by TanStack Table with pagination and search.

  • Contact form with spam protection

    Public-facing contact form validates each submission against Cloudflare Turnstile before touching the database. Clean submissions are inserted into Supabase; spam is dropped before insert.

  • Email notifications via Resend

    A Supabase Edge Function triggers on every new contact_messages row insertion and fires a transactional email through Resend — so the team gets notified the moment a lead comes in, without polling the dashboard

The result

The owner and team can now publish trip packages, blog posts, and respond to enquiries without any developer involvement. Role-based access means support staff only see what they need. Image uploads that used to require manual FTP now take seconds from the dashboard.

12
modules
42
API routes
2
Multi step forms
3
User roles
All projects← back to work