Jeffrey Bernadas
Software Engineer
I build enterprise-grade, responsive digital solutions for the web and mobile โ systems that hold up when they're carrying real weight.
Back to Projects
Balloon Artist PH
Description
A production e-commerce platform I built for a Philippine balloon-decoration and event-styling business. It handles three purchase flows: direct product sales, customizable design packages, and a custom-quote pipeline where customers request a setup, admins price it, and the accepted quote becomes a payable order. The frontend is a React and TypeScript SPA with Redux Toolkit Query; the backend is a dual-process NestJS app pairing an API server with a worker that runs background jobs and scheduled tasks. It integrates Stripe payments, Lalamove delivery, Keycloak OIDC auth, real-time chat, and a full admin dashboard.
Features
Product Catalogue
- -Product CRUD with variants (size/color) carrying independent price and stock
- -Product images stored in MinIO with a primary thumbnail
- -Filter by category, price range, availability, and popularity
- -Sort by newest, price, name, or popularity
- -Stock decremented on payment confirmation and restored on cancellation
- -Featured products widget
Design Catalogue
- -Ready-made balloon arrangements with unlimited made-to-order availability
- -Occasion-based filtering (birthday, wedding, corporate, and more) plus tags
- -Three flows: add as-is, personalize, or use as quote inspiration
- -Per-character surcharge pricing with a live price breakdown
- -Configurable dimensions, lead time, and delivery service type
Categories
- -Flat category structure with auto-generated slugs
- -Soft delete so existing products stay visible
- -Redis-cached with configurable TTL and display ordering
Cart
- -Guest cart in localStorage and authenticated cart in PostgreSQL
- -Guest cart merges into the account on login at latest prices
- -De-duplication of identical product and design items
- -Stock re-validation at checkout with inactive-item warnings
- -Daily guest-cart cleanup job
Wishlist
- -Save favorite products and designs
- -Out-of-stock items retained with add-to-cart disabled
Custom Quote Workflow
- -Customer requests with event details, budget, and optional design inspiration
- -Admin replies with pricing, design mockups, and production notes
- -Status pipeline: pending, quoted, accepted, declined, expired
- -Accepted quotes convert into payable orders
- -30-day expiry with 3-day warning emails and re-quote support
- -On-site installation option that skips delivery booking
Checkout
- -Stripe hosted checkout in PHP
- -Address selection with Google geocoding to lat/lng
- -Delivery date and time-slot scheduling (morning, afternoon, evening, PH time)
- -Lead-time enforcement and a daily design-capacity check
- -Frozen price and item snapshots at purchase
Payments & Refunds
- -Stripe payments with signature-verified webhooks
- -Manual-payment fallback for direct social-media transactions
- -Admin-approved refund workflow (pending, approved, processed)
- -Configurable refund percentages by order status
- -Stock restored on paid cancellation
Delivery & Shipping
- -Full Lalamove integration (PH v3 API) across 10 vehicle types
- -Vehicle-type routing based on order contents
- -Live shipping quotes with configurable per-vehicle surcharges
- -API or manual delivery booking
- -Webhook-driven delivery status tracking
- -PSGC region, province, city, and barangay address cascade
Orders & Fulfillment
- -Order numbers in BA-YYYYMMDD-XXXXXX format
- -Full lifecycle: pending, confirmed, preparing, out for delivery, delivered
- -Customer order tracking with driver info and status badges
- -Auto-cancellation of abandoned unpaid orders (7 to 14 days)
Reviews & Ratings
- -Star ratings with up to 2 photos per review
- -30-day review window after delivery, one review per product per order
- -Denormalized average rating and review count on designs
Real-time Chat
- -Customer and admin messaging over Socket.IO with a Redis adapter
- -Presence tracking, read receipts, and message editing
- -System messages for quote and order updates
- -Emoji support and a floating chat widget
Authentication & Accounts
- -Keycloak OIDC with DPoP tokens
- -Sync-on-demand profiles with 24-hour staleness refresh
- -Role-based admin access
- -User blocking via a global guard with a suspended-account page
- -Profile, addresses, and email-notification settings
Admin Dashboard
- -Metrics and analytics with Recharts (revenue, orders, customers, quote conversion)
- -Product, inventory, category, order, and quote management
- -Refund approvals and failed-email retry
- -Runtime system configuration (40+ keys)
- -Audit logging of admin actions with before/after diffs
Background Jobs & Scheduling
- -Dual-process worker running RabbitMQ consumers and cron jobs (Asia/Manila)
- -Abandoned-cart reminders and low-stock alerts
- -Quote expiry warnings and updates
- -Abandoned-order cleanup
Notifications & Email
- -Transactional emails via React Email and Resend
- -Templates for orders, quotes, reminders, and alerts
- -Failed-email admin dashboard with retry and discard
Platform & Security
- -Optional runtime-toggleable hybrid encryption (AES-256-GCM + RSA-2048)
- -Replay protection with timestamp and Redis nonce dedup
- -Redis caching and Redis-backed rate limiting
- -Elasticsearch full-text search and structured logging
- -Sentry and Elastic APM monitoring with Swagger/OpenAPI docs
Tech Stack
Frontend
- React 19
- TypeScript
- Vite
- Tailwind CSS v4
- Shadcn/ui
- Redux Toolkit Query
- React Hook Form
- Zod
- Socket.IO Client
- Recharts
- Motion
Backend
- NestJS
- TypeScript
- Prisma
- PostgreSQL
- Redis
- RabbitMQ
- Socket.IO
Infrastructure
- Keycloak
- MinIO
- Elasticsearch
- Kibana
External Services
- Stripe
- Lalamove
- Google Maps
- Resend
- React Email
Monitoring & Logging
- Sentry
- Elastic APM
- Winston