Back to Projects
Picktable (Woorim) - D2C F&B Commerce Platform

Picktable (Woorim) - D2C F&B Commerce Platform
Professional Work

Picktable is a direct-to-consumer food and beverage commerce platform built for Woorim F&B Inc., delivering premium HMR and meal-kit products direct from the client's own factories.

I served as a full-stack developer across the product lifecycle — the consumer mobile WebView app, the operations admin dashboard, and the NestJS and PostgreSQL API behind both. The platform supports Kakao and Apple social login, Toss Payments and PortOne, bilingual Korean/English localisation, 3PL logistics export, real-time notifications, and a complete order lifecycle from browse to delivery.

My Role

Full Stack Developer

My Contributions

Authentication & Security

  • Implemented JWT authentication with refresh-token rotation and reuse detection.

  • Built SMS OTP signup and password reset flows.

  • Integrated Kakao Sync and Apple Sign In.

  • Implemented role-based access control across consumer and admin applications.

E-commerce

  • Implemented cart, checkout, order and payment flows.

  • Integrated Toss Payments including payment retry and bank-transfer flows.

  • Built exchange, refund and cancellation workflows.

  • Implemented 3PL export functionality.

Admin Dashboard

  • Built 12+ admin screens covering products, members, orders, promotions and events.

  • Implemented bulk product actions, Excel exports and role-based admin access.

Consumer Application

  • Built 15+ mobile WebView screens.

  • Implemented product listing, infinite scrolling, search, MyPage, orders, coupons, points and address management.

  • Implemented banner carousel and touch interactions.

Internationalization & Infrastructure

  • Added Korean/English localization across consumer and admin interfaces.

  • Added SEO assets and performance optimizations.

  • Implemented TypeORM migrations and operational logging.

Challenges & Solutions

1. JWT Auth Race Conditions

Problem: The WebView application could show authenticated UI while the authentication cookie had already expired, resulting in 401 responses and refresh retry loops.

Solution: Centralised authentication state using Redux, implemented a typed auth interceptor, and added atomic token handling to prevent OTP race conditions.


2. Checkout Performance

Problem: Sequential SKU and order-item queries created unnecessary database operations during checkout.

Solution: Implemented batch SKU lookups and batch order-item inserts, reducing N+1 query patterns in the checkout flow.


3. Payment Webhook Race Conditions

Problem: Payment webhooks could arrive before the frontend payment redirect completed, creating potential duplicate or inconsistent payment states.

Solution: Implemented idempotent webhook handling, validation around payment identifiers, and Slack notifications for payment failures.


4. 3PL Integration

Problem: The fulfilment partner's export format changed during development, including a carrier change from Hanjin to Lotte.

Solution: Built a configurable export pipeline and updated the format to match the fulfilment partner's requirements while migrating existing carrier data.

Result: Duplicate webhooks, retried OTP submissions and a mid-flight carrier change stopped being incidents and became handled cases. Because the export pipeline takes the format as input rather than hard-coding it, the carrier switch was a configuration edit and a data migration rather than a rewrite.

NestJS
TypeScript
TypeORM
PostgreSQL
Redis
BullMQ
React
React Router 7
Redux Toolkit
Tailwind CSS
shadcn/ui
WebSocket
AWS S3
Docker
This project was developed as part of my work at Potential Inc. The source code is proprietary and belongs to the client/company.