Multi-vendor Marketplace · Edorax
← Catalog Instructor · Dev Weekends
Multi-vendor Marketplace Build and deploy a multi-vendor marketplace through a product-specific track. Your assigned or selected track determines the data model, build steps, assessments, and capstone you see.
Difficulty Medium
Duration ~240 hours
Price Free What you're going to build
Three connected product experiences Customer experience
A marketplace people want to browse Build local-store discovery, catalogue search, category filters, rich product cards, and a storefront backed by real inventory.
Week 1 - Lay the foundations 5 modules · 413 lessons · about 60 hours Set up the client and API, connect MongoDB, and design the marketplace data model.
Module 01: Introduction 22 lessons View lessons Hide lessons 1.01 What you're building20 min 1.01 What you're building20 min 1.02 How to use this course20 min 1.02 How to use this course20 min Finish and present · Provider dashboard and weekly hours Document, demo, and defend your project. View project Hide project Module 99: Provider dashboard and weekly hours 20 lessons View lessons Hide lessons 99.01 13.1 Run the practice in local time30 min 99.01 13.1 Run the practice in local time30 min 99.02 13.2 Turn schedule errors into useful actions30 min 99.02 13.2 Turn schedule errors into useful actions30 min 99.03 13.3 Manage services without changing old bookings120 min Additional modules 114 modules Module 26: Closing 6 lessons View lessons Hide lessons 26.01 Ship it20 min 26.01 Ship it20 min 26.02 Document it20 min 26.02 Document it20 min 26.03 Bar-raiser and evaluation20 min 26.03 Bar-raiser and evaluation20 min What you'll build
Ship a live marketplace with multiple independent sellers or providers, a customer journey, a safe checkout, and product-specific reliability checks. The chosen variant determines its inventory, booking, fulfilment, or access rules and the evidence required at the final gate.
1.03 The product and its people
20 min
1.03 The product and its people20 min
1.04 Scope20 min
1.04 Scope20 min
1.05 Before you start20 min
1.05 Before you start20 min
1.06 Course outline20 min
1.06 Course outline20 min
1.07 Your working rhythm20 min
1.07 Your working rhythm20 min
1.08 Visual roadmap and demo frames25 min
1.08 Visual roadmap and demo frames25 min
1.09 Beginner questions and reading roadmap30 min
1.09 Beginner questions and reading roadmap30 min
1.10 Engineering thinking playbook25 min
1.10 Engineering thinking playbook25 min
1.11 Checklist and learning log20 min
1.11 Checklist and learning log20 min Module 03: Why MongoDB 23 lessons View lessons Hide lessons 3.01 Set the scene15 min 3.01 Set the scene15 min 3.02 Why grocery data is different15 min 3.02 Why grocery data is different15 min 3.03 What you'll decide15 min 3.03 What you'll decide15 min 3.04 Relational vs document models20 min 3.04 Relational vs document models20 min 3.05 The decision for FreshMarket20 min 3.05 The decision for FreshMarket20 min 3.06 Embedding vs referencing20 min 3.06 Embedding vs referencing20 min 3.07 Prime your thinking15 min 3.07 Prime your thinking15 min 3.08 Design your data blueprint25 min 3.08 Design your data blueprint25 min 3.09 Map actors to collections20 min 3.09 Map actors to collections20 min 3.10 Data-model decisions15 min 3.10 Data-model decisions15 min 3.11 Checklist and learning log15 min 3.11 Checklist and learning log15 min 3.11 Checklist and learning log15 min Module 04: Config and database 174 lessons View lessons Hide lessons 4.01 Set the scene20 min 4.01 Set the scene20 min 4.01 Set the scene20 min 4.01 Set the scene20 min 4.01 Set the scene20 min 4.01 Set the scene20 min 4.01 Set the scene20 min 4.01 Set the scene20 min 4.01 Set the scene20 min 4.01 Set the scene20 min 4.01 Set the scene20 min 4.01 Set the scene20 min 4.02 Why secrets matter20 min 4.02 Why secrets matter20 min 4.02 Why secrets matter20 min 4.02 Why secrets matter20 min 4.02 Why secrets matter20 min 4.02 Why secrets matter20 min 4.02 Why secrets matter20 min 4.02 Why secrets matter20 min 4.02 Why secrets matter20 min 4.02 Why secrets matter20 min 4.02 Why secrets matter20 min 4.02 Why secrets matter20 min 4.03 What you'll build in this chapter15 min 4.03 What you'll build in this chapter15 min 4.03 What you'll build in this chapter15 min 4.03 What you'll build in this chapter15 min 4.03 What you'll build in this chapter15 min 4.03 What you'll build in this chapter15 min 4.03 What you'll build in this chapter15 min 4.03 What you'll build in this chapter15 min 4.03 What you'll build in this chapter15 min 4.03 What you'll build in this chapter15 min 4.03 What you'll build in this chapter15 min 4.03 What you'll build in this chapter15 min 4.04 Environment variables vs hardcoded config15 min 4.04 Environment variables vs hardcoded config15 min 4.04 Environment variables vs hardcoded config15 min 4.04 Environment variables vs hardcoded config15 min 4.04 Environment variables vs hardcoded config15 min 4.04 Environment variables vs hardcoded config15 min 4.04 Environment variables vs hardcoded config15 min 4.04 Environment variables vs hardcoded config15 min 4.04 Environment variables vs hardcoded config15 min 4.04 Environment variables vs hardcoded config15 min 4.04 Environment variables vs hardcoded config15 min 4.04 Environment variables vs hardcoded config15 min 4.05 Local MongoDB vs Atlas20 min 4.05 Local MongoDB vs Atlas20 min 4.05 Local MongoDB vs Atlas20 min 4.05 Local MongoDB vs Atlas20 min 4.05 Local MongoDB vs Atlas20 min 4.05 Local MongoDB vs Atlas20 min 4.05 Local MongoDB vs Atlas20 min 4.05 Local MongoDB vs Atlas20 min 4.05 Local MongoDB vs Atlas20 min 4.05 Local MongoDB vs Atlas20 min 4.05 Local MongoDB vs Atlas20 min 4.05 Local MongoDB vs Atlas20 min 4.06 4.6 , Prime your thinking20 min 4.06 Prime your thinking20 min 4.06 4.6 , Prime your thinking20 min 4.06 4.6 , Prime your thinking20 min 4.06 4.6 , Prime your thinking20 min 4.06 4.6 , Prime your thinking20 min 4.06 4.6 , Prime your thinking20 min 4.06 4.6 , Prime your thinking20 min 4.06 Prime your thinking20 min 4.06 4.6 , Prime your thinking20 min 4.06 4.6 , Prime your thinking20 min 4.06 4.6 , Prime your thinking20 min 4.07 Config, secrets and startup10 min 4.07 Config, secrets and startup10 min 4.07 Config, secrets and startup10 min 4.07 Config, secrets and startup10 min 4.07 Config, secrets and startup10 min 4.07 Config, secrets and startup10 min 4.07 Config, secrets and startup10 min 4.07 Config, secrets and startup10 min 4.07 Config, secrets and startup10 min 4.07 Config, secrets and startup10 min 4.07 Config, secrets and startup10 min 4.07 Config, secrets and startup10 min 4.08 Where the project is now20 min 4.08 Where the project is now20 min 4.09 Create env files20 min 4.09 Create env files20 min 4.09 Create env files20 min 4.09 Create env files20 min 4.09 Create env files20 min 4.09 Create env files20 min 4.09 Create env files20 min 4.09 Create env files20 min 4.09 Create env files20 min 4.09 Create env files20 min 4.09 Create env files20 min 4.09 Create env files20 min 4.10 Config module20 min 4.10 Config module20 min 4.10 Config module20 min 4.10 Config module20 min 4.10 Config module20 min 4.10 Config module20 min 4.10 Config module20 min 4.10 Config module20 min 4.10 Config module20 min 4.10 Config module20 min 4.10 Config module20 min 4.10 Config module20 min 4.11 DB module20 min 4.11 DB module20 min 4.11 DB module20 min 4.11 DB module20 min 4.11 DB module20 min 4.11 DB module20 min 4.11 DB module20 min 4.11 DB module20 min 4.11 DB module20 min 4.11 DB module20 min 4.11 DB module20 min 4.11 DB module20 min 4.12 Wire DB on boot20 min 4.12 Wire DB on boot20 min 4.12 Wire DB on boot20 min 4.12 Wire DB on boot20 min 4.12 Wire DB on boot20 min 4.12 Wire DB on boot20 min 4.12 Wire DB on boot20 min 4.12 Wire DB on boot20 min 4.12 Wire DB on boot20 min 4.12 Wire DB on boot20 min 4.12 Wire DB on boot20 min 4.12 Wire DB on boot20 min 4.13 Health check DB status20 min 4.13 Health check DB status20 min 4.13 Health check DB status20 min 4.13 Health check DB status20 min 4.13 Health check DB status20 min 4.13 Health check DB status20 min 4.13 Health check DB status20 min 4.13 Health check DB status20 min 4.13 Health check DB status20 min 4.13 Health check DB status20 min 4.13 Health check DB status20 min 4.13 Health check DB status20 min 4.14 Client env20 min 4.14 Client env20 min 4.14 Client env20 min 4.14 Client env20 min 4.14 Client env20 min 4.14 Client env20 min 4.14 Client env20 min 4.14 Client env20 min 4.14 Client env20 min 4.14 Client env20 min 4.14 Client env20 min 4.14 Client env20 min 4.15 Verify connection20 min 4.15 Verify connection20 min 4.16 Recap and what's next20 min 4.16 Recap and what's next20 min 4.16 Recap and what's next20 min 4.16 Recap and what's next20 min 4.16 Recap and what's next20 min 4.16 Recap and what's next20 min 4.16 Recap and what's next20 min 4.16 Recap and what's next20 min 4.16 Recap and what's next20 min 4.16 Recap and what's next20 min 4.16 Recap and what's next20 min 4.16 Recap and what's next20 min 4.17 Checklist and learning log20 min 4.17 Checklist and learning log20 min Module 05: Data model and seed 36 lessons View lessons Hide lessons 5.01 Set the scene20 min 5.01 Set the scene20 min 5.02 The denormalisation trap20 min 5.02 The denormalisation trap20 min 5.03 What you'll build20 min 5.03 What you'll build20 min 5.04 Ownership chain20 min 5.04 Ownership chain20 min 5.05 Grocery domain fields20 min 5.05 Grocery domain fields20 min 5.06 Prime your thinking20 min 5.06 Prime your thinking20 min 5.07 Ownership and snapshots10 min 5.07 Ownership and snapshots10 min 5.08 Where the project is now20 min 5.08 Where the project is now20 min 5.09 Scaffold models folder20 min 5.09 Scaffold models folder20 min 5.10 User and Profile models20 min 5.10 User and Profile models20 min 5.11 Store model20 min 5.11 Store model20 min 5.12 Product model20 min 5.12 Product model20 min 5.13 Cart and Order models20 min 5.13 Cart and Order models20 min 5.14 Seed script scaffold20 min 5.14 Seed script scaffold20 min 5.15 Run seed and inspect20 min 5.15 Run seed and inspect20 min 5.16 Draw final ERD20 min 5.16 Draw final ERD20 min 5.17 Recap and what's next20 min 5.17 Recap and what's next20 min 5.18 Checklist and learning log20 min 5.18 Checklist and learning log20 min End-of-week demo
Both apps run. The API reports healthy, and MongoDB contains the seeded shops and products.
Week 2 - Build the vendor experience 8 modules · 556 lessons · about 60 hours Add authentication, ownership rules, shop setup, product management, and photo uploads.
Module 06: Authentication API 200 lessons View lessons Hide lessons 6.01 Set the scene20 min 6.01 Set the scene20 min 6.01 Set the scene20 min 6.01 Set the scene20 min 6.01 Set the scene20 min 6.01 Set the scene20 min 6.01 Set the scene20 min 6.01 Set the scene20 min 6.01 Set the scene20 min 6.01 Set the scene20 min 6.01 Set the scene20 min 6.01 Set the scene20 min 6.02 Why auth matters20 min 6.02 Why auth matters20 min 6.02 Why auth matters20 min 6.02 Why auth matters20 min 6.02 Why auth matters20 min 6.02 Why auth matters20 min 6.02 Why auth matters20 min 6.02 Why auth matters20 min 6.02 Why auth matters20 min 6.02 Why auth matters20 min 6.02 Why auth matters20 min 6.02 Why auth matters20 min 6.03 What you'll build20 min 6.03 What you'll build20 min 6.03 What you'll build20 min 6.03 What you'll build20 min 6.03 What you'll build20 min 6.03 What you'll build20 min 6.03 What you'll build20 min 6.03 What you'll build20 min 6.03 What you'll build20 min 6.03 What you'll build20 min 6.03 What you'll build20 min 6.03 What you'll build20 min 6.04 6.4 , Sessions vs JWT20 min 6.04 6.4 , Sessions vs JWT20 min 6.04 6.4 , Sessions vs JWT20 min 6.04 6.4 , Sessions vs JWT20 min 6.04 6.4 , Sessions vs JWT20 min 6.04 Sessions vs JWT20 min 6.04 6.4 , Sessions vs JWT20 min 6.04 6.4 , Sessions vs JWT20 min 6.04 6.4 , Sessions vs JWT20 min 6.04 6.4 , Sessions vs JWT20 min 6.04 Sessions vs JWT20 min 6.04 6.4 , Sessions vs JWT20 min 6.05 Password hashing20 min 6.05 Password hashing20 min 6.06 What a JWT is20 min 6.06 What a JWT is20 min 6.06 What a JWT is20 min 6.06 What a JWT is20 min 6.06 What a JWT is20 min 6.06 What a JWT is20 min 6.06 What a JWT is20 min 6.06 What a JWT is20 min 6.06 What a JWT is20 min 6.06 What a JWT is20 min 6.06 What a JWT is20 min 6.06 What a JWT is20 min 6.07 Prime your thinking20 min 6.07 6.7 , Prime your thinking20 min 6.07 Prime your thinking20 min 6.07 6.7 , Prime your thinking20 min 6.07 6.7 , Prime your thinking20 min 6.07 6.7 , Prime your thinking20 min 6.07 6.7 , Prime your thinking20 min 6.07 6.7 , Prime your thinking20 min 6.07 6.7 , Prime your thinking20 min 6.07 6.7 , Prime your thinking20 min 6.07 6.7 , Prime your thinking20 min 6.07 6.7 , Prime your thinking20 min 6.08 Passwords and tokens10 min 6.08 Passwords and tokens10 min 6.08 Passwords and tokens10 min 6.08 Passwords and tokens10 min 6.08 Passwords and tokens10 min 6.08 Passwords and tokens10 min 6.08 Passwords and tokens10 min 6.08 Passwords and tokens10 min 6.08 Passwords and tokens10 min 6.08 Passwords and tokens10 min 6.08 Passwords and tokens10 min 6.08 Passwords and tokens10 min 6.09 Where the project is now20 min 6.09 Where the project is now20 min 6.10 Scaffold auth module20 min 6.10 Scaffold auth module20 min 6.10 Scaffold auth module20 min 6.10 Scaffold auth module20 min 6.10 Scaffold auth module20 min 6.10 Scaffold auth module20 min 6.10 Scaffold auth module20 min 6.10 Scaffold auth module20 min 6.10 Scaffold auth module20 min 6.10 Scaffold auth module20 min 6.10 Scaffold auth module20 min 6.10 Scaffold auth module20 min 6.11 Wire auth routes20 min 6.11 Wire auth routes20 min 6.11 Wire auth routes20 min 6.11 Wire auth routes20 min 6.11 Wire auth routes20 min 6.11 Wire auth routes20 min 6.11 Wire auth routes20 min 6.11 Wire auth routes20 min 6.11 Wire auth routes20 min 6.11 Wire auth routes20 min 6.11 Wire auth routes20 min 6.11 Wire auth routes20 min 6.12 Register handler20 min 6.12 Register handler20 min 6.12 Register handler20 min 6.12 Register handler20 min 6.12 Register handler20 min 6.12 Register handler20 min 6.12 Register handler20 min 6.12 Register handler20 min 6.12 Register handler20 min 6.12 Register handler20 min 6.12 Register handler20 min 6.12 Register handler20 min 6.13 Login handler20 min 6.13 Login handler20 min 6.13 Login handler20 min 6.13 Login handler20 min 6.13 Login handler20 min 6.13 Login handler20 min 6.13 Login handler20 min 6.13 Login handler20 min 6.13 Login handler20 min 6.13 Login handler20 min 6.13 Login handler20 min 6.13 Login handler20 min 6.14 Access token20 min 6.14 Access token20 min 6.14 Access token20 min 6.14 Access token20 min 6.14 Access token20 min 6.14 Access token20 min 6.14 Access token20 min 6.14 Access token20 min 6.14 Access token20 min 6.14 Access token20 min 6.14 Access token20 min 6.14 Access token20 min 6.15 Refresh token20 min 6.15 Refresh token20 min 6.15 Refresh token20 min 6.15 Refresh token20 min 6.15 Refresh token20 min 6.15 Refresh token20 min 6.15 Refresh token20 min 6.15 Refresh token20 min 6.15 Refresh token20 min 6.15 Refresh token20 min 6.15 Refresh token20 min 6.15 Refresh token20 min 6.16 6.16 , OTP verification20 min 6.16 OTP verification20 min 6.16 OTP verification20 min 6.16 OTP verification20 min 6.16 OTP verification20 min 6.16 OTP verification20 min 6.16 OTP verification20 min 6.16 OTP verification20 min 6.16 OTP verification20 min 6.16 6.16 , OTP verification20 min 6.16 OTP verification20 min 6.16 OTP verification20 min 6.17 Auth middleware20 min 6.17 Auth middleware20 min 6.17 Auth middleware20 min 6.17 Auth middleware20 min 6.17 Auth middleware20 min 6.17 Auth middleware20 min 6.17 Auth middleware20 min 6.17 Auth middleware20 min 6.17 Auth middleware20 min 6.17 Auth middleware20 min 6.17 Auth middleware20 min 6.17 Auth middleware20 min 6.18 Test with curl20 min 6.18 Test with curl20 min 6.19 Recap and what's next20 min 6.19 Recap and what's next20 min 6.20 6.20: Checklist and learning log20 min 6.20 Checklist and learning log20 min 6.20 6.20: Checklist and learning log20 min 6.20 6.20 Checklist and learning log20 min 6.20 6.20: Checklist and learning log20 min 6.20 6.20 Checklist and learning log20 min 6.20 Checklist and learning log20 min 6.20 6.20 , Checklist and learning log20 min 6.20 6.20 Checklist and learning log45 min 6.20 6.20 , Checklist and learning log20 min 6.20 6.20: Checklist and learning log20 min 6.20 6.20 Checklist and learning log45 min Module 07: Login and registration 186 lessons View lessons Hide lessons 7.01 Set the scene20 min 7.01 Set the scene20 min 7.02 Why token storage matters20 min 7.02 Why token storage matters20 min 7.02 Why token storage matters20 min 7.02 Why token storage matters20 min 7.02 Why token storage matters20 min Why token storage mattersModule 08: Authorization and isolation 30 lessons View lessons Hide lessons 8.01 Set the scene20 min 8.01 Set the scene20 min 8.02 IDOR and marketplaces20 min 8.02 IDOR and marketplaces20 min 8.03 What you'll build20 min 8.03 What you'll build20 min 8.04 Authentication vs authorization20 min 8.04 Authentication vs authorizationModule 09: Vendor store API 28 lessons View lessons Hide lessons 9.01 Set the scene20 min 9.01 Set the scene20 min 9.02 One store per vendor20 min 9.02 One store per vendor20 min 9.03 What you'll build20 min 9.03 What you'll build20 min 9.04 Store fields20 min 9.04 Store fieldsModule 10: Open your shop 26 lessons View lessons Hide lessons 10.01 Set the scene20 min 10.01 Set the scene20 min 10.02 Onboarding as a gate20 min 10.02 Onboarding as a gate20 min 10.03 What you'll build20 min 10.03 What you'll build20 min 10.04 Prime your thinking20 min 10.04 Prime your thinkingModule 11: Manage products API 30 lessons View lessons Hide lessons 11.01 Set the scene20 min 11.01 Set the scene20 min 11.02 Two views of products20 min 11.02 Two views of products20 min 11.03 What you'll build20 min 11.03 What you'll build20 min 11.04 Public vs vendor routes20 min 11.04 Public vs vendor routesModule 12: Vendor dashboard 26 lessons View lessons Hide lessons 12.01 Set the scene20 min 12.01 Set the scene20 min 12.02 Table plus forms20 min 12.02 Table plus forms20 min 12.03 What you'll build20 min 12.03 What you'll build20 min 12.04 Error mapping20 min 12.04 Error mappingModule 13: Product photos 30 lessons View lessons Hide lessons 13.01 Set the scene20 min 13.01 Set the scene20 min 13.02 The base64 trap20 min 13.02 The base64 trap20 min 13.03 What you'll build20 min 13.03 What you'll build20 min 13.04 Object storage pattern20 min 13.04 Object storage patternWeek 3 - Build the buyer experience 7 modules · 210 lessons · about 60 hours Create the catalogue, cart, split checkout, Stripe test payment, and order tracking.
Module 14: Browse catalogue API 32 lessons View lessons Hide lessons 14.01 Set the scene20 min 14.01 Set the scene20 min 14.02 The N+1 trap20 min 14.02 The N+1 trap20 min 14.03 What you'll build20 min 14.03 What you'll build20 min 14.04 Populate vs aggregate20 min 14.04 Populate vs aggregate20 min 14.05 Pagination20 min 14.05 Pagination20 min 14.06 Prime your thinking20 min 14.06 Prime your thinking20 min 14.07 Catalogue queries10 min 14.07 Catalogue queries10 min 14.08 Where the project is now20 min 14.08 Where the project is now20 min 14.09 Public products route20 min 14.09 Public products route20 min 14.10 Filter query params20 min 14.10 Filter query params20 min 14.11 Pagination params20 min 14.11 Pagination params20 min 14.12 Populate store name20 min 14.12 Populate store name20 min 14.13 Single product route20 min 14.13 Single product route20 min 14.14 Test catalogue API20 min 14.14 Test catalogue API20 min 14.15 Recap and what's next20 min 14.15 Recap and what's next20 min 14.16 Checklist and learning log20 min 14.16 Checklist and learning log20 min Module 15: Shop the marketplace 26 lessons View lessons Hide lessons 15.01 Set the scene20 min 15.01 Set the scene20 min 15.02 Editorial grid20 min 15.02 Editorial grid20 min 15.03 What you'll build20 min 15.03 What you'll build20 min 15.04 Where the project is now20 min 15.04 Where the project is nowModule 16: Cart API 30 lessons View lessons Hide lessons 16.01 Set the scene20 min 16.01 Set the scene20 min 16.02 Why storeId on cart item20 min 16.02 Why storeId on cart item20 min 16.03 What you'll build20 min 16.03 What you'll build20 min 16.04 Prime your thinking20 min 16.04 Prime your thinkingModule 17: Your cart 26 lessons View lessons Hide lessons 17.01 Set the scene20 min 17.01 Set the scene20 min 17.02 Grouped by store20 min 17.02 Grouped by store20 min 17.03 What you'll build20 min 17.03 What you'll build20 min 17.04 Where the project is now20 min 17.04 Where the project is nowModule 18: Checkout and orders 36 lessons View lessons Hide lessons 18.01 Set the scene20 min 18.01 Set the scene20 min 18.02 Price snapshot trap20 min 18.02 Price snapshot trap20 min 18.03 What you'll build20 min 18.03 What you'll build20 min 18.04 Normalization payoff20 min 18.04 Normalization payoffModule 19: Payment processing 32 lessons View lessons Hide lessons 19.01 Set the scene20 min 19.01 Set the scene20 min 19.02 Fake checkout trap20 min 19.02 Fake checkout trap20 min 19.03 What you'll build20 min 19.03 What you'll build20 min 19.04 One payment, many orders20 min 19.04 One payment, many ordersModule 20: Track orders 28 lessons View lessons Hide lessons 20.01 Set the scene20 min 20.01 Set the scene20 min 20.02 Snapshots make UI easy20 min 20.02 Snapshots make UI easy20 min 20.03 What you'll build20 min 20.03 What you'll build20 min 20.04 Where the project is now20 min 20.04 Where the project is nowWeek 4 - Polish, harden, and ship 5 modules · 189 lessons · about 60 hours Add Redis caching and search, ship background jobs, deploy the marketplace, prevent overselling with inventory reservations, and validate promotions on the server.
Module 21: Cache and search 32 lessons View lessons Hide lessons 21.01 Set the scene20 min 21.01 Set the scene20 min 21.02 Stale cache trap20 min 21.02 Stale cache trap20 min 21.03 What you'll build20 min 21.03 What you'll build20 min 21.04 TTL vs event invalidation20 min 21.04 TTL vs event invalidation20 min 21.05 Prime your thinking20 min 21.05 Prime your thinking20 min 21.06 Cache safety10 min 21.06 Cache safety10 min 21.07 Where the project is now20 min 21.07 Where the project is now20 min 21.08 Redis connection20 min 21.08 Redis connection20 min 21.09 Cache catalogue middleware20 min 21.09 Cache catalogue middleware20 min 21.10 Measure before/after20 min 21.10 Measure before/after20 min 21.11 Cache bust on product save20 min 21.11 Cache bust on product save20 min 21.12 Text index20 min 21.12 Text index20 min 21.13 Explain query20 min 21.13 Explain query20 min 21.14 Fallback if Redis down20 min 21.14 Fallback if Redis down20 min 21.15 Recap and what's next20 min 21.15 Recap and what's next20 min 21.16 Checklist and learning log20 min 21.16 Checklist and learning log20 min Module 22: Async jobs and queues 36 lessons View lessons Hide lessons 22.01 Set the scene20 min 22.01 Set the scene20 min 22.02 The sync trap20 min 22.02 The sync trap20 min 22.03 What you'll build20 min 22.03 What you'll build20 min 22.04 When to queue20 min 22.04 When to queueModule 23: Deploy 64 lessons View lessons Hide lessons 23.01 Set the scene20 min 23.01 Set the scene20 min 23.01 Set the scene20 min 23.01 Set the scene20 min 23.01 Set the scene20 min 23.01 Set the scene20 min 23.01 Set the scene20 min 23.01 Set the sceneModule 24: Inventory reservations 29 lessons View lessons Hide lessons 24.01 Set the scene15 min 24.01 Set the scene15 min 24.02 Why overselling hurts trust18 min 24.02 Why overselling hurts trust18 min 24.03 What you'll build20 min 24.03 What you'll build20 min 24.04 Reserve vs decrement18 min 24.04 Reserve vs decrementModule 25: Promotions & pricing 28 lessons View lessons Hide lessons 25.01 Set the scene18 min 25.01 Set the scene18 min 25.02 Why never trust client totals22 min 25.02 Why never trust client totals22 min 25.03 What you'll build28 min 25.03 What you'll build28 min 25.04 Coupon types and rules25 min 25.04 Coupon types and rulesEnd-of-week demo
The live marketplace survives a restart, concurrent checkouts cannot oversell the last unit, and server-calculated promotions match the Stripe test payment.
99.03 13.3 Manage services without changing old bookings120 min
99.04 13.4 Publish nonoverlapping weekly rules90 min
99.04 13.4 Publish nonoverlapping weekly rules90 min
99.05 13.5 Block a dated interval and show conflicts60 min
99.05 13.5 Block a dated interval and show conflicts60 min
99.06 13.6 Edit weekly hours in the provider zone120 min
99.06 13.6 Edit weekly hours in the provider zone120 min
99.07 13.7 Block the rest of today safely60 min
99.07 13.7 Block the rest of today safely60 min
99.08 13.8 List a provider only when clients can book30 min
99.08 13.8 List a provider only when clients can book30 min
99.09 13.9 Provider schedule check15 min
99.09 13.9 Provider schedule check15 min
99.10 13.10 Provider schedule gate45 min
99.10 13.10 Provider schedule gate45 min Module 27: Introduction to Ghurza 14 lessons
View lessons
Hide lessons
27.01 1.1: Build Ghurza, a marketplace for handmade work35 min 27.01 1.1: Build Ghurza, a marketplace for handmade work35 min 27.02 1.2: How to use this course30 min 27.02 1.2: How to use this course30 min 27.03 1.3: The crafts and the people who make them60 min 27.03 1.3: The crafts and the people who make them60 min 27.04 1.4: Writing about craft with respect and accuracy30 min 27.04 1.4: Writing about craft with respect and accuracy30 min 27.05 1.5: Scope30 min 27.05 1.5: Scope30 min 27.06 1.6: Prerequisites and course outline30 min 27.06 1.6: Prerequisites and course outline30 min 27.07 1.7: Working rhythm, recap and checklist30 min 27.07 1.7: Working rhythm, recap and checklist30 min Module 28: Handmade data model and seed 26 lessons View lessons Hide lessons 28.01 5.1: Set the scene30 min 28.01 5.1: Set the scene30 min 28.02 5.2: The quantity trap30 min 28.02 5.2: The quantity trap30 min 28.03 5.3: What you will build30 min 28.03 5.3: What you will build30 min 28.04 5.4: Ownership versus credit60 min 28.04 5.4: Ownership versus credit60 min 28.05 5.5: Craft fields without a schema per craft45 min 28.05 5.5: Craft fields without a schema per craft45 min 28.06 5.6: Two things for sale45 min 28.06 5.6: Two things for sale45 min 28.07 5.7: Ownership and one-off model check30 min 28.07 5.7: Ownership and one-off model check30 min 28.08 5.8: User, Workshop and Artisan models90 min 28.08 5.8: User, Workshop and Artisan models90 min 28.09 5.9: Piece model60 min 28.09 5.9: Piece model60 min 28.10 5.10: Cart and Order models60 min 28.10 5.10: Cart and Order models60 min 28.11 5.11: ShippingProfile, CustomRequest, Quote and Commission60 min 28.11 5.11: ShippingProfile, CustomRequest, Quote and Commission60 min 28.12 5.12: Seed script60 min 28.12 5.12: Seed script60 min 28.13 5.13: Final ERD, recap and checklist30 min 28.13 5.13: Final ERD, recap and checklist30 min Module 29: Custom requests 4 lessons View lessons Hide lessons 29.01 22.1: Build a private custom-request path360 min 29.01 22.1: Build a private custom-request path360 min 29.02 22.2: Custom-request gate and learning log60 min 29.02 22.2: Custom-request gate and learning log60 min Module 30: Quotes and deposits 4 lessons View lessons Hide lessons 30.01 23.1: Send a versioned quote and take one deposit390 min 30.01 23.1: Send a versioned quote and take one deposit390 min 30.02 23.2: Quote and deposit gate60 min 30.02 23.2: Quote and deposit gate60 min Module 31: Production and balance 4 lessons View lessons Hide lessons 31.01 24.1: Move a commission through production and balance390 min 31.01 24.1: Move a commission through production and balance390 min 31.02 24.2: Commission timeline and balance gate60 min 31.02 24.2: Commission timeline and balance gate60 min Module 32: Checkout: sold exactly once 30 lessons View lessons Hide lessons 32.01 19.1: Set the scene15 min 32.01 19.1: Set the scene15 min 32.02 19.2: The last-piece trap30 min 32.02 19.2: The last-piece trap30 min 32.03 19.3: What you will build15 min 32.03 19.3: What you will build15 min 32.04 19.4: One document, one atomic update60 min 32.04 19.4: One document, one atomic update60 min 32.05 19.5: Holds with an expiry45 min 32.05 19.5: Holds with an expiry45 min 32.06 19.6: Predict the race45 min 32.06 19.6: Predict the race45 min 32.07 19.7: All or nothing across workshops30 min 32.07 19.7: All or nothing across workshops30 min 32.08 19.8: Checkout consistency check30 min 32.08 19.8: Checkout consistency check30 min 32.09 19.9: Checkout route90 min 32.09 19.9: Checkout route90 min 32.10 19.10: Hold every Piece or none120 min 32.10 19.10: Hold every Piece or none120 min 32.11 19.11: Snapshot OrderLines90 min 32.11 19.11: Snapshot OrderLines90 min 32.12 19.12: Buyer and maker order routes75 min 32.12 19.12: Buyer and maker order routes75 min 32.13 19.13: Verify the race90 min 32.13 19.13: Verify the race90 min 32.14 19.14: Test snapshot immutability60 min 32.14 19.14: Test snapshot immutability60 min 32.15 19.15: Recap and checklist30 min 32.15 19.15: Recap and checklist30 min Module 33: Payment processing 10 lessons View lessons Hide lessons 33.01 20.1: Paid but not sold, sold but not paid60 min 33.01 20.1: Paid but not sold, sold but not paid60 min 33.02 20.2: One payment across workshop orders60 min 33.02 20.2: One payment across workshop orders60 min 33.03 20.3: Verify the webhook and sell the held pieces60 min 33.03 20.3: Verify the webhook and sell the held pieces60 min 33.04 20.4: Expired holds and a late success60 min 33.04 20.4: Expired holds and a late success60 min 33.05 20.5: Payment gate and race evidence60 min 33.05 20.5: Payment gate and race evidence60 min Module 34: Why MongoDB for commissions 8 lessons View lessons Hide lessons 34.01 3.1 A piece, a copy and a commission30 min 34.01 3.1 A piece, a copy and a commission30 min 34.02 3.2 Tables and documents for one-off work60 min 34.02 3.2 Tables and documents for one-off work60 min 34.03 3.3 The decision for Ghurza and the first ERD90 min 34.03 3.3 The decision for Ghurza and the first ERD90 min 34.04 3.4 Data model decision gate30 min 34.04 3.4 Data model decision gate30 min Module 35: Authorization and isolation 8 lessons View lessons Hide lessons 35.01 8.1 Whose workshop, whose commission?45 min 35.01 8.1 Whose workshop, whose commission?45 min 35.02 8.2 Object checks on workshops, pieces and commissions75 min 35.02 8.2 Object checks on workshops, pieces and commissions75 min 35.03 8.3 Authorization matrix and cross-workshop tests150 min 35.03 8.3 Authorization matrix and cross-workshop tests150 min 35.04 8.4 Isolation gate60 min 35.04 8.4 Isolation gate60 min Module 36: Workshop API 6 lessons View lessons Hide lessons 36.01 9.1 A workshop needs a public identity30 min 36.01 9.1 A workshop needs a public identity30 min 36.02 9.2 Workshop fields, slugs and ownership180 min 36.02 9.2 Workshop fields, slugs and ownership180 min 36.03 9.3 Workshop API gate60 min 36.03 9.3 Workshop API gate60 min Module 37: Open your workshop 6 lessons View lessons Hide lessons 37.01 10.1 The maker who has no workshop page30 min 37.01 10.1 The maker who has no workshop page30 min 37.02 10.2 Onboarding, settings and the routing gate180 min 37.02 10.2 Onboarding, settings and the routing gate180 min 37.03 10.3 Open-your-workshop gate60 min 37.03 10.3 Open-your-workshop gate60 min Module 38: Pieces API 6 lessons View lessons Hide lessons 38.01 11.1 A piece is one exact object30 min 38.01 11.1 A piece is one exact object30 min 38.02 11.2 Piece fields, status and ownership150 min 38.02 11.2 Piece fields, status and ownership150 min 38.03 11.3 Pieces API gate75 min 38.03 11.3 Pieces API gate75 min Module 39: Maker dashboard 6 lessons View lessons Hide lessons 39.01 12.1: The maker's back office30 min 39.01 12.1: The maker's back office30 min 39.02 12.2: Pieces, commissions and the maker dashboard240 min 39.02 12.2: Pieces, commissions and the maker dashboard240 min 39.03 12.3: Maker dashboard gate60 min 39.03 12.3: Maker dashboard gate60 min Module 40: Piece photos 6 lessons View lessons Hide lessons 40.01 13.1: A buyer cannot touch the stitch30 min 40.01 13.1: A buyer cannot touch the stitch30 min 40.02 13.2: Upload real piece photos and craft evidence270 min 40.02 13.2: Upload real piece photos and craft evidence270 min 40.03 13.3: Piece photo gate60 min 40.03 13.3: Piece photo gate60 min Module 41: Shipping profiles and lead times 6 lessons View lessons Hide lessons 41.01 14.1: Honest lead times and shipping30 min 41.01 14.1: Honest lead times and shipping30 min 41.02 14.2: Shipping profiles, lead times and packaging360 min 41.02 14.2: Shipping profiles, lead times and packaging360 min 41.03 14.3: Shipping profile gate60 min 41.03 14.3: Shipping profile gate60 min Module 42: Browse the collection API 6 lessons View lessons Hide lessons 42.01 15.1 Browsing a collection of one-off pieces45 min 42.01 15.1 Browsing a collection of one-off pieces45 min 42.02 15.2 Collection query, filters and the N+1 trap150 min 42.02 15.2 Collection query, filters and the N+1 trap150 min 42.03 15.3 Browse collection gate60 min 42.03 15.3 Browse collection gate60 min Module 43: Shop the collection 6 lessons View lessons Hide lessons 43.01 16.1 A storefront for work that may be one of one45 min 43.01 16.1 A storefront for work that may be one of one45 min 43.02 16.2 Piece page, maker credit and the request path160 min 43.02 16.2 Piece page, maker credit and the request path160 min 43.03 16.3 Shop the collection gate60 min 43.03 16.3 Shop the collection gate60 min Module 44: Cart API 6 lessons View lessons Hide lessons 44.01 17.1 A cart of exact pieces40 min 44.01 17.1 A cart of exact pieces40 min 44.02 17.2 Add, remove and reject sold or held pieces150 min 44.02 17.2 Add, remove and reject sold or held pieces150 min 44.03 17.3 Cart API gate60 min 44.03 17.3 Cart API gate60 min Module 45: Your cart 6 lessons View lessons Hide lessons 45.01 18.1 One cart, several workshops, exact pieces45 min 45.01 18.1 One cart, several workshops, exact pieces45 min 45.02 18.2 Cart rows, workshop groups and removal140 min 45.02 18.2 Cart rows, workshop groups and removal140 min 45.03 18.3 Cart page gate50 min 45.03 18.3 Cart page gate50 min Module 46: Track orders 6 lessons View lessons Hide lessons 46.01 21.1 Following a one-off order to the door45 min 46.01 21.1 Following a one-off order to the door45 min 46.02 21.2 Buyer and maker order pages, packed and shipped210 min 46.02 21.2 Buyer and maker order pages, packed and shipped210 min 46.03 21.3 Track orders gate90 min 46.03 21.3 Track orders gate90 min Module 47: Async jobs and queues 6 lessons View lessons Hide lessons 47.01 25.1 What should not happen inside a request50 min 47.01 25.1 What should not happen inside a request50 min 47.02 25.2 Worker, quote reminders and production notifications270 min 47.02 25.2 Worker, quote reminders and production notifications270 min 47.03 25.3 Async jobs gate75 min 47.03 25.3 Async jobs gate75 min Module 48: Cache and search 6 lessons View lessons Hide lessons 48.01 26.1 What may be cached in a one-off catalogue45 min 48.01 26.1 What may be cached in a one-off catalogue45 min 48.02 26.2 Cache collections, invalidate on sale, search craft and maker180 min 48.02 26.2 Cache collections, invalidate on sale, search craft and maker180 min 48.03 26.3 Cache and search gate60 min 48.03 26.3 Cache and search gate60 min Module 49: Closing and capstone 4 lessons View lessons Hide lessons 49.01 99.1 Ship and document Ghurza120 min 49.01 99.1 Ship and document Ghurza120 min 49.02 99.2 Five-minute demo and capstone defense90 min 49.02 99.2 Five-minute demo and capstone defense90 min Module 50: Introduction to Midad 14 lessons View lessons Hide lessons 50.01 1.1: Build Midad, a marketplace for licensed digital work35 min 50.01 1.1: Build Midad, a marketplace for licensed digital work35 min 50.02 1.2: How to use this course30 min 50.02 1.2: How to use this course30 min 50.03 1.3: The product and its people60 min 50.03 1.3: The product and its people60 min 50.04 1.4: Scope and the one-line flow30 min 50.04 1.4: Scope and the one-line flow30 min 50.05 1.5: Prerequisites and entry diagnostic30 min 50.05 1.5: Prerequisites and entry diagnostic30 min 50.06 1.6: Working rhythm on unreliable power30 min 50.06 1.6: Working rhythm on unreliable power30 min 50.07 1.7: Recap and checklist30 min 50.07 1.7: Recap and checklist30 min Module 51: Digital product data model and seed 14 lessons View lessons Hide lessons 51.01 5.1: Two chains90 min 51.01 5.1: Two chains90 min 51.02 5.2: The purchase-is-a-link trap60 min 51.02 5.2: The purchase-is-a-link trap60 min 51.03 5.3: Users, studios and products120 min 51.03 5.3: Users, studios and products120 min 51.04 5.4: ProductFile versions90 min 51.04 5.4: ProductFile versions90 min 51.05 5.5: Cart, Checkout and Order90 min 51.05 5.5: Cart, Checkout and Order90 min 51.06 5.6: License and DownloadGrant60 min 51.06 5.6: License and DownloadGrant60 min 51.07 5.7: Seed, inspect and final ERD90 min 51.07 5.7: Seed, inspect and final ERD90 min Module 52: Checkout and creator orders 10 lessons View lessons Hide lessons 52.01 18.1: Orders before payment90 min 52.01 18.1: Orders before payment90 min 52.02 18.2: The snapshot trap60 min 52.02 18.2: The snapshot trap60 min 52.03 18.3: Checkout route150 min 52.03 18.3: Checkout route150 min 52.04 18.4: Snapshot lines and the immutability test90 min 52.04 18.4: Snapshot lines and the immutability test90 min 52.05 18.5: Order routes and checklist90 min 52.05 18.5: Order routes and checklist90 min Module 53: Instant fulfilment and license keys 4 lessons View lessons Hide lessons 53.01 20.1: Fulfil a paid checkout exactly once360 min 53.01 20.1: Fulfil a paid checkout exactly once360 min 53.02 20.2: Fulfilment gate and replay evidence60 min 53.02 20.2: Fulfilment gate and replay evidence60 min Module 54: Your library and signed downloads 4 lessons View lessons Hide lessons 54.01 21.1: Build the library and private download route360 min 54.01 21.1: Build the library and private download route360 min 54.02 21.2: Library and download gate60 min 54.02 21.2: Library and download gate60 min Module 55: Previews and private files 4 lessons View lessons Hide lessons 55.01 13.1: Separate public previews from private deliverables390 min 55.01 13.1: Separate public previews from private deliverables390 min 55.02 13.2: Public-preview and private-file gate60 min 55.02 13.2: Public-preview and private-file gate60 min Module 56: Payment processing 10 lessons View lessons Hide lessons 56.01 19.1: Test mode and Payment Intents90 min 56.01 19.1: Test mode and Payment Intents90 min 56.02 19.2: Webhooks and verified events60 min 56.02 19.2: Webhooks and verified events60 min 56.03 19.3: Price and create the PaymentIntent60 min 56.03 19.3: Price and create the PaymentIntent60 min 56.04 19.4: Verify and record the event60 min 56.04 19.4: Verify and record the event60 min 56.05 19.5: Payment gate and test-mode evidence60 min 56.05 19.5: Payment gate and test-mode evidence60 min Module 57: Why MongoDB for entitlements 8 lessons View lessons Hide lessons 57.01 3.1 A listing, a private file and a licence60 min 57.01 3.1 A listing, a private file and a licence60 min 57.02 3.2 Tables and documents for entitlements90 min 57.02 3.2 Tables and documents for entitlements90 min 57.03 3.3 The decision for Midad and the first ERD90 min 57.03 3.3 The decision for Midad and the first ERD90 min 57.04 3.4 Data model decision gate60 min 57.04 3.4 Data model decision gate60 min Module 58: Authorization and isolation 8 lessons View lessons Hide lessons 58.01 8.1 Whose studio, whose licence?90 min 58.01 8.1 Whose studio, whose licence?90 min 58.02 8.2 Object checks on studios, products and licences120 min 58.02 8.2 Object checks on studios, products and licences120 min 58.03 8.3 Authorization matrix and two-buyer tests120 min 58.03 8.3 Authorization matrix and two-buyer tests120 min 58.04 8.4 Isolation gate90 min 58.04 8.4 Isolation gate90 min Module 59: Creator studio API 6 lessons View lessons Hide lessons 59.01 9.1 A creator needs a studio60 min 59.01 9.1 A creator needs a studio60 min 59.02 9.2 Studio fields, slugs and ownership180 min 59.02 9.2 Studio fields, slugs and ownership180 min 59.03 9.3 Studio API gate120 min 59.03 9.3 Studio API gate120 min Module 60: Open your studio 6 lessons View lessons Hide lessons 60.01 10.1 The creator who has no studio page60 min 60.01 10.1 The creator who has no studio page60 min 60.02 10.2 Onboarding, settings and the routing gate150 min 60.02 10.2 Onboarding, settings and the routing gate150 min 60.03 10.3 Open-your-studio gate90 min 60.03 10.3 Open-your-studio gate90 min Module 61: Products and license options API 6 lessons View lessons Hide lessons 61.01 11.1 A product is sold under a licence, not a quantity120 min 61.01 11.1 A product is sold under a licence, not a quantity120 min 61.02 11.2 Product routes, license options and terms versions270 min 61.02 11.2 Product routes, license options and terms versions270 min 61.03 11.3 Products and licence gate90 min 61.03 11.3 Products and licence gate90 min Module 62: Creator dashboard 6 lessons View lessons Hide lessons 62.01 12.1 The creator's back office60 min 62.01 12.1 The creator's back office60 min 62.02 12.2 Product table and the license editor150 min 62.02 12.2 Product table and the license editor150 min 62.03 12.3 Creator dashboard gate60 min 62.03 12.3 Creator dashboard gate60 min Module 63: Browse catalogue API 6 lessons View lessons Hide lessons 63.01 14.1 A public catalogue with private files45 min 63.01 14.1 A public catalogue with private files45 min 63.02 14.2 Filters, pagination and the N+1 trap120 min 63.02 14.2 Filters, pagination and the N+1 trap120 min 63.03 14.3 Browse catalogue gate60 min 63.03 14.3 Browse catalogue gate60 min Module 64: Shop the marketplace 6 lessons View lessons Hide lessons 64.01 15.1 Comparing licences before buying45 min 64.01 15.1 Comparing licences before buying45 min 64.02 15.2 Product page, previews and license comparison150 min 64.02 15.2 Product page, previews and license comparison150 min 64.03 15.3 Shop the marketplace gate60 min 64.03 15.3 Shop the marketplace gate60 min Module 65: Cart API 6 lessons View lessons Hide lessons 65.01 16.1 A digital cart line is a licence60 min 65.01 16.1 A digital cart line is a licence60 min 65.02 16.2 One line per product, licence switches and owned items150 min 65.02 16.2 One line per product, licence switches and owned items150 min 65.03 16.3 Cart API gate60 min 65.03 16.3 Cart API gate60 min Module 66: Your cart 6 lessons View lessons Hide lessons 66.01 17.1 A cart grouped by creator150 min 66.01 17.1 A cart grouped by creator150 min 66.02 17.2 Cart rows, licence badges and switches90 min 66.02 17.2 Cart rows, licence badges and switches90 min 66.03 17.3 Cart UI gate60 min 66.03 17.3 Cart UI gate60 min Module 67: Cache and search 6 lessons View lessons Hide lessons 67.01 22.1 What may be cached, and what never is90 min 67.01 22.1 What may be cached, and what never is90 min 67.02 22.2 Cache the catalogue, never the library150 min 67.02 22.2 Cache the catalogue, never the library150 min 67.03 22.3 Cache and search gate60 min 67.03 22.3 Cache and search gate60 min Module 68: Async jobs and queues 6 lessons View lessons Hide lessons 68.01 23.1 What leaves the webhook60 min 68.01 23.1 What leaves the webhook60 min 68.02 23.2 Worker, receipts and payment reconciliation300 min 68.02 23.2 Worker, receipts and payment reconciliation300 min 68.03 23.3 Async jobs gate120 min 68.03 23.3 Async jobs gate120 min Module 69: Download limits and seats 6 lessons View lessons Hide lessons 69.01 25.1 The stock moved to the licence60 min 69.01 25.1 The stock moved to the licence60 min 69.02 25.2 Atomic download limits and seat assignment300 min 69.02 25.2 Atomic download limits and seat assignment300 min 69.03 25.3 Limits and seats gate150 min 69.03 25.3 Limits and seats gate150 min Module 70: Refunds and revocation 6 lessons View lessons Hide lessons 70.01 26.1 Refunding one creator in a split payment60 min 70.01 26.1 Refunding one creator in a split payment60 min 70.02 26.2 Refund webhook, revocation and licence verify300 min 70.02 26.2 Refund webhook, revocation and licence verify300 min 70.03 26.3 Refund and revocation gate150 min 70.03 26.3 Refund and revocation gate150 min Module 71: Closing and capstone 4 lessons View lessons Hide lessons 71.01 99.1 Ship and document Midad180 min 71.01 99.1 Ship and document Midad180 min 71.02 99.2 Five-minute demo and capstone defense180 min 71.02 99.2 Five-minute demo and capstone defense180 min Module 72: Introduction to Hamesh 18 lessons View lessons Hide lessons 72.01 1.1: Build Hamesh, a marketplace for exact editions and used copies35 min 72.01 1.1: Build Hamesh, a marketplace for exact editions and used copies35 min 72.02 1.2: How to use this course30 min 72.02 1.2: How to use this course30 min 72.03 1.3: The product and its people30 min 72.03 1.3: The product and its people30 min 72.04 1.4: Scope and condition grades30 min 72.04 1.4: Scope and condition grades30 min 72.05 1.5: Entry diagnostic60 min 72.05 1.5: Entry diagnostic60 min 72.06 1.6: Course outline30 min 72.06 1.6: Course outline30 min 72.07 1.7: Book trade vocabulary30 min 72.07 1.7: Book trade vocabulary30 min 72.08 1.8: Your working rhythm60 min 72.08 1.8: Your working rhythm60 min 72.09 1.9: Recap and checklist30 min 72.09 1.9: Recap and checklist30 min Module 73: Book catalogue data model and seed 26 lessons View lessons Hide lessons 73.01 5.1: The product that is not one product30 min 73.01 5.1: The product that is not one product30 min 73.02 5.2: The duplicate edition trap30 min 73.02 5.2: The duplicate edition trap30 min 73.03 5.3: Ownership with a shared catalogue60 min 73.03 5.3: Ownership with a shared catalogue60 min 73.04 5.4: Condition grades as ranks30 min 73.04 5.4: Condition grades as ranks30 min 73.05 5.5: ISBN-10, ISBN-13 and check digits60 min 73.05 5.5: ISBN-10, ISBN-13 and check digits60 min 73.06 5.6: Shared catalogue model check30 min 73.06 5.6: Shared catalogue model check30 min 73.07 5.7: User, Profile and Shop models60 min 73.07 5.7: User, Profile and Shop models60 min 73.08 5.8: Work and Edition models60 min 73.08 5.8: Work and Edition models60 min 73.09 5.9: Listing model60 min 73.09 5.9: Listing model60 min 73.10 5.10: ReadingList and WantListEntry models60 min 73.10 5.10: ReadingList and WantListEntry models60 min 73.11 5.11: Cart and Order models30 min 73.11 5.11: Cart and Order models30 min 73.12 5.12: Seed script60 min 73.12 5.12: Seed script60 min 73.13 5.13: Final ERD and checklist30 min 73.13 5.13: Final ERD and checklist30 min Module 74: Editions and ISBN API 4 lessons View lessons Hide lessons 74.01 11.1: Make one edition from two shop-counter requests360 min 74.01 11.1: Make one edition from two shop-counter requests360 min 74.02 11.2: Edition identity gate and learning log60 min 74.02 11.2: Edition identity gate and learning log60 min Module 75: Want-list alerts 4 lessons View lessons Hide lessons 75.01 24.1: Alert a student when an eligible copy appears360 min 75.01 24.1: Alert a student when an eligible copy appears360 min 75.02 24.2: Want-list alert gate60 min 75.02 24.2: Want-list alert gate60 min Module 76: Reading lists and the matcher 4 lessons View lessons Hide lessons 76.01 18.1: Match a whole reading list to real copies390 min 76.01 18.1: Match a whole reading list to real copies390 min 76.02 18.2: Reading-list matcher gate60 min 76.02 18.2: Reading-list matcher gate60 min Module 77: Checkout and orders 20 lessons View lessons Hide lessons 77.01 19.1: One list, three shops30 min 77.01 19.1: One list, three shops30 min 77.02 19.2: The condition snapshot trap30 min 77.02 19.2: The condition snapshot trap30 min 77.03 19.3: What to snapshot60 min 77.03 19.3: What to snapshot60 min 77.04 19.4: Claiming a single copy atomically60 min 77.04 19.4: Claiming a single copy atomically60 min 77.05 19.5: Checkout and condition check30 min 77.05 19.5: Checkout and condition check30 min 77.06 19.6: Checkout route split by Shop90 min 77.06 19.6: Checkout route split by Shop90 min 77.07 19.7: Snapshot OrderLines75 min 77.07 19.7: Snapshot OrderLines75 min 77.08 19.8: Hold copies, all or nothing90 min 77.08 19.8: Hold copies, all or nothing90 min 77.09 19.9: Shop and student order routes75 min 77.09 19.9: Shop and student order routes75 min 77.10 19.10: Snapshot test and checklist30 min 77.10 19.10: Snapshot test and checklist30 min Module 78: Payment processing 8 lessons View lessons Hide lessons 78.01 20.1: One payment, several bookshop orders60 min 78.01 20.1: One payment, several bookshop orders60 min 78.02 20.2: Price the intent on the server60 min 78.02 20.2: Price the intent on the server60 min 78.03 20.3: Verify the webhook and mark orders paid60 min 78.03 20.3: Verify the webhook and mark orders paid60 min 78.04 20.4: Payment gate, double submit and test cards60 min 78.04 20.4: Payment gate, double submit and test cards60 min Module 79: Why MongoDB for editions 8 lessons View lessons Hide lessons 79.01 3.1 One book, many copies30 min 79.01 3.1 One book, many copies30 min 79.02 3.2 Tables and documents for a shared catalogue75 min 79.02 3.2 Tables and documents for a shared catalogue75 min 79.03 3.3 The decision for Hamesh and the first ERD90 min 79.03 3.3 The decision for Hamesh and the first ERD90 min 79.04 3.4 Catalogue model decision gate45 min 79.04 3.4 Catalogue model decision gate45 min Module 80: Authorization and isolation 8 lessons View lessons Hide lessons 80.01 8.1 Whose shop, whose copy?30 min 80.01 8.1 Whose shop, whose copy?30 min 80.02 8.2 Object checks on shops, copies and editions90 min 80.02 8.2 Object checks on shops, copies and editions90 min 80.03 8.3 The authorization matrix and cross-shop tests90 min 80.03 8.3 The authorization matrix and cross-shop tests90 min 80.04 8.4 Isolation gate60 min 80.04 8.4 Isolation gate60 min Module 81: List a copy 6 lessons View lessons Hide lessons 81.01 12.1 The counter with a pile of returns30 min 81.01 12.1 The counter with a pile of returns30 min 81.02 12.2 ISBN-first listing, grade and price guidance120 min 81.02 12.2 ISBN-first listing, grade and price guidance120 min 81.03 12.3 Listing gate75 min 81.03 12.3 Listing gate75 min Module 82: Condition photos 6 lessons View lessons Hide lessons 82.01 13.1 A buyer cannot hold the book30 min 82.01 13.1 A buyer cannot hold the book30 min 82.02 13.2 Upload the real copy, require evidence below Very Good150 min 82.02 13.2 Upload the real copy, require evidence below Very Good150 min 82.03 13.3 Condition photo gate75 min 82.03 13.3 Condition photo gate75 min Module 83: Browse editions API 6 lessons View lessons Hide lessons 83.01 14.1 Students search for a book, not a shop30 min 83.01 14.1 Students search for a book, not a shop30 min 83.02 14.2 Offer summaries, grades and the N+1 trap150 min 83.02 14.2 Offer summaries, grades and the N+1 trap150 min 83.03 14.3 Browse editions gate75 min 83.03 14.3 Browse editions gate75 min Module 84: Find a book 6 lessons View lessons Hide lessons 84.01 15.1 A student with a phone and a course code30 min 84.01 15.1 A student with a phone and a course code30 min 84.02 15.2 Edition page, grade badges and copies across shops90 min 84.02 15.2 Edition page, grade badges and copies across shops90 min 84.03 15.3 Find-a-book gate45 min 84.03 15.3 Find-a-book gate45 min Module 85: Cart API 6 lessons View lessons Hide lessons 85.01 16.1 A cart of copies, not quantities30 min 85.01 16.1 A cart of copies, not quantities30 min 85.02 16.2 Add, remove and reject sold, withdrawn or duplicate copies120 min 85.02 16.2 Add, remove and reject sold, withdrawn or duplicate copies120 min 85.03 16.3 Cart API gate60 min 85.03 16.3 Cart API gate60 min Module 86: Track orders and collection 6 lessons View lessons Hide lessons 86.01 21.1 Collecting a book from a shop30 min 86.01 21.1 Collecting a book from a shop30 min 86.02 21.2 Order pages, collection code and ready-for-collection150 min 86.02 21.2 Order pages, collection code and ready-for-collection150 min 86.03 21.3 Collection gate90 min 86.03 21.3 Collection gate90 min Module 87: Cache and search 6 lessons View lessons Hide lessons 87.01 22.1 A sold copy in a stale offer summary30 min 87.01 22.1 A sold copy in a stale offer summary30 min 87.02 22.2 Cache offers, invalidate on change, search ISBN and text120 min 87.02 22.2 Cache offers, invalidate on change, search ISBN and text120 min 87.03 22.3 Cache and search gate60 min 87.03 22.3 Cache and search gate60 min Module 88: Async jobs and queues 6 lessons View lessons Hide lessons 88.01 23.1 What should not happen inside a request30 min 88.01 23.1 What should not happen inside a request30 min 88.02 23.2 Worker, order jobs and the listing.published event150 min 88.02 23.2 Worker, order jobs and the listing.published event150 min 88.03 23.3 Async jobs gate60 min 88.03 23.3 Async jobs gate60 min Module 89: Copy holds 6 lessons View lessons Hide lessons 89.01 26.1 Two students, one last copy30 min 89.01 26.1 Two students, one last copy30 min 89.02 26.2 Hold on checkout, confirm on payment, release on expiry120 min 89.02 26.2 Hold on checkout, confirm on payment, release on expiry120 min 89.03 26.3 Two-tab race and hold gate60 min 89.03 26.3 Two-tab race and hold gate60 min Module 90: Condition pricing and markdowns 6 lessons View lessons Hide lessons 90.01 27.1 The server owns every price35 min 90.01 27.1 The server owns every price35 min 90.02 27.2 Grade pricing, markdown schedules and a price floor150 min 90.02 27.2 Grade pricing, markdown schedules and a price floor150 min 90.03 27.3 Pricing gate and audit trail70 min 90.03 27.3 Pricing gate and audit trail70 min Module 91: Closing and capstone 4 lessons View lessons Hide lessons 91.01 99.1 Ship and document Hamesh270 min 91.01 99.1 Ship and document Hamesh270 min 91.02 99.2 Five-minute demo and capstone defense270 min 91.02 99.2 Five-minute demo and capstone defense270 min Module 92: Bookshop API 6 lessons View lessons Hide lessons 92.01 9.1 A bookshop needs a page before it needs stock30 min 92.01 9.1 A bookshop needs a page before it needs stock30 min 92.02 9.2 Shop fields, slugs and ownership180 min 92.02 9.2 Shop fields, slugs and ownership180 min 92.03 9.3 Bookshop API gate60 min 92.03 9.3 Bookshop API gate60 min Module 93: Open your bookshop 6 lessons View lessons Hide lessons 93.01 10.1 The owner who has no shop yet30 min 93.01 10.1 The owner who has no shop yet30 min 93.02 10.2 Onboarding, settings and the routing gate180 min 93.02 10.2 Onboarding, settings and the routing gate180 min 93.03 10.3 Open-your-bookshop gate60 min 93.03 10.3 Open-your-bookshop gate60 min Module 94: Your cart 6 lessons View lessons Hide lessons 94.01 17.1 A cart of copies, grouped by shop30 min 94.01 17.1 A cart of copies, grouped by shop30 min 94.02 17.2 Copy rows, shop subtotals and removal150 min 94.02 17.2 Copy rows, shop subtotals and removal150 min 94.03 17.3 Cart page gate60 min 94.03 17.3 Cart page gate60 min Module 95: SkillSlot introduction 16 lessons View lessons Hide lessons 95.01 1.1 What you are building: SkillSlot30 min 95.01 1.1 What you are building: SkillSlot30 min 95.02 1.2 How to use this course30 min 95.02 1.2 How to use this course30 min 95.03 1.3 The product and its people30 min 95.03 1.3 The product and its people30 min 95.04 1.4 Keep the booking product in scope30 min 95.04 1.4 Keep the booking product in scope30 min 95.05 1.5 Check the entry skills and repair date basics30 min 95.05 1.5 Check the entry skills and repair date basics30 min 95.06 1.6 Course outline and demo targets30 min 95.06 1.6 Course outline and demo targets30 min 95.07 1.7 Why time is the hard part30 min 95.07 1.7 Why time is the hard part30 min 95.08 1.8 Working rhythm and introduction gate30 min 95.08 1.8 Working rhythm and introduction gate30 min Module 96: Time and time zones 20 lessons View lessons Hide lessons 96.01 5.1 A booking has two clocks30 min 96.01 5.1 A booking has two clocks30 min 96.02 5.2 An instant is not a wall-clock rule60 min 96.02 5.2 An instant is not a wall-clock rule60 min 96.03 5.3 A zone is a rule set, not one offset60 min 96.03 5.3 A zone is a rule set, not one offset60 min 96.04 5.4 When 02:30 happens zero or two times35 min 96.04 5.4 When 02:30 happens zero or two times35 min 96.05 5.5 Your time, their time30 min 96.05 5.5 Your time, their time30 min 96.06 5.6 Time-zone decisions30 min 96.06 5.6 Time-zone decisions30 min 96.07 5.7 Put time conversion behind one module60 min 96.07 5.7 Put time conversion behind one module60 min 96.08 5.8 Give the server one testable clock30 min 96.08 5.8 Give the server one testable clock30 min 96.09 5.9 Prove the clock and zone boundaries120 min 96.09 5.9 Prove the clock and zone boundaries120 min 96.10 5.10 Time module gate30 min 96.10 5.10 Time module gate30 min Module 97: Why MongoDB for a calendar 14 lessons View lessons Hide lessons 97.01 3.1 Rules, slots and bookings30 min 97.01 3.1 Rules, slots and bookings30 min 97.02 3.2 Relational and document schedules60 min 97.02 3.2 Relational and document schedules60 min 97.03 3.3 The SkillSlot database decision30 min 97.03 3.3 The SkillSlot database decision30 min 97.04 3.4 Why a booking is its own document30 min 97.04 3.4 Why a booking is its own document30 min 97.05 3.5 Calendar data-model check30 min 97.05 3.5 Calendar data-model check30 min 97.06 3.6 Map the calendar actors to collections30 min 97.06 3.6 Map the calendar actors to collections30 min 97.07 3.7 Calendar data-model gate30 min 97.07 3.7 Calendar data-model gate30 min Module 98: Calendar data model and seed 28 lessons View lessons Hide lessons 98.01 6.1 The overlap trap30 min 98.01 6.1 The overlap trap30 min 98.02 6.2 Follow the ownership chain30 min 98.02 6.2 Follow the ownership chain30 min 98.03 6.3 Rules are local; appointments are instants30 min 98.03 6.3 Rules are local; appointments are instants30 min 98.04 6.4 Calendar model check30 min 98.04 6.4 Calendar model check30 min 98.05 6.5 Put identity and display zone in the right models30 min 98.05 6.5 Put identity and display zone in the right models30 min 98.06 6.6 Give each provider one working identity30 min 98.06 6.6 Give each provider one working identity30 min 98.07 6.7 Make a Service a priced time promise60 min 98.07 6.7 Make a Service a priced time promise60 min 98.08 6.8 Store weekly rules and dated time off60 min 98.08 6.8 Store weekly rules and dated time off60 min 98.09 6.9 Make a block claim unique in MongoDB60 min 98.09 6.9 Make a block claim unique in MongoDB60 min 98.10 6.10 Give Booking an independent lifecycle60 min 98.10 6.10 Give Booking an independent lifecycle60 min 98.11 6.11 Separate a requested slot from a provider order30 min 98.11 6.11 Separate a requested slot from a provider order30 min 98.12 6.12 Seed people, rules and a dated appointment90 min 98.12 6.12 Seed people, rules and a dated appointment90 min 98.13 6.13 Inspect the seed as a calendar model30 min 98.13 6.13 Inspect the seed as a calendar model30 min 98.14 6.14 Calendar model and seed gate30 min 98.14 6.14 Calendar model and seed gate30 min Module 100: Availability engine API 24 lessons View lessons Hide lessons 100.01 15.1 From provider rules to bookable starts30 min 100.01 15.1 From provider rules to bookable starts30 min 100.02 15.2 The availability algorithm60 min 100.02 15.2 The availability algorithm60 min 100.03 15.3 See the blocks behind a slot30 min 100.03 15.3 See the blocks behind a slot30 min 100.04 15.4 Availability engine check30 min 100.04 15.4 Availability engine check30 min 100.05 15.5 Expand rules into dated windows90 min 100.05 15.5 Expand rules into dated windows90 min 100.06 15.6 Step through windows in UTC60 min 100.06 15.6 Step through windows in UTC60 min 100.07 15.7 Load time off and claims once90 min 100.07 15.7 Load time off and claims once90 min 100.08 15.8 Fit the full service and buffer60 min 100.08 15.8 Fit the full service and buffer60 min 100.09 15.9 Apply notice and booking horizon60 min 100.09 15.9 Apply notice and booking horizon60 min 100.10 15.10 Return the next seven days of starts60 min 100.10 15.10 Return the next seven days of starts60 min 100.11 15.11 Prove the engine on hard dates120 min 100.11 15.11 Prove the engine on hard dates120 min 100.12 15.12 Availability engine gate30 min 100.12 15.12 Availability engine gate30 min Module 101: Holds and checkout 24 lessons View lessons Hide lessons 101.01 19.1 Two phones, one 15:00 slot30 min 101.01 19.1 Two phones, one 15:00 slot30 min 101.02 19.2 Check-then-insert is a race60 min 101.02 19.2 Check-then-insert is a race60 min 101.03 19.3 Claims as database locks60 min 101.03 19.3 Claims as database locks60 min 101.04 19.4 Holds that expire30 min 101.04 19.4 Holds that expire30 min 101.05 19.5 Claim and hold check30 min 101.05 19.5 Claim and hold check30 min 101.06 19.6 Checkout all lines or none120 min 101.06 19.6 Checkout all lines or none120 min 101.07 19.7 Split the cart by provider90 min 101.07 19.7 Split the cart by provider90 min 101.08 19.8 Make checkout retries idempotent60 min 101.08 19.8 Make checkout retries idempotent60 min 101.09 19.9 Limit calendar holds60 min 101.09 19.9 Limit calendar holds60 min 101.10 19.10 Hide held blocks from new offers30 min 101.10 19.10 Hide held blocks from new offers30 min 101.11 19.11 Prove one winner under parallel checkout60 min 101.11 19.11 Prove one winner under parallel checkout60 min 101.12 19.12 Checkout and hold gate30 min 101.12 19.12 Checkout and hold gate30 min Module 102: Payment and confirmation 22 lessons View lessons Hide lessons 102.01 20.1 Pay before the hold ends30 min 102.01 20.1 Pay before the hold ends30 min 102.02 20.2 One payment, many provider orders30 min 102.02 20.2 One payment, many provider orders30 min 102.03 20.3 Set up Stripe test mode30 min 102.03 20.3 Set up Stripe test mode30 min 102.04 20.4 Payment boundary check30 min 102.04 20.4 Payment boundary check30 min 102.05 20.5 Create payment from held snapshots60 min 102.05 20.5 Create payment from held snapshots60 min 102.06 20.6 Confirm holds from a signed webhook90 min 102.06 20.6 Confirm holds from a signed webhook90 min 102.07 20.7 Expire and release safely60 min 102.07 20.7 Expire and release safely60 min 102.08 20.8 Reconcile a late successful charge90 min 102.08 20.8 Reconcile a late successful charge90 min 102.09 20.9 Keep the hold after a card decline30 min 102.09 20.9 Keep the hold after a card decline30 min 102.10 20.10 Verify payment test paths60 min 102.10 20.10 Verify payment test paths60 min 102.11 20.11 Payment and confirmation gate30 min 102.11 20.11 Payment and confirmation gate30 min Module 103: Booking authorization and isolation 18 lessons View lessons Hide lessons 103.01 9.1 Whose booking is this?30 min 103.01 9.1 Whose booking is this?30 min 103.02 9.2 Object checks on every booking route30 min 103.02 9.2 Object checks on every booking route30 min 103.03 9.3 Authentication, roles and ownership60 min 103.03 9.3 Authentication, roles and ownership60 min 103.04 9.4 Booking authorization check30 min 103.04 9.4 Booking authorization check30 min 103.05 9.5 Write the authorization matrix60 min 103.05 9.5 Write the authorization matrix60 min 103.06 9.6 Build role and ownership helpers90 min 103.06 9.6 Build role and ownership helpers90 min 103.07 9.7 Share only needed Booking fields60 min 103.07 9.7 Share only needed Booking fields60 min 103.08 9.8 Test two clients and two providers30 min 103.08 9.8 Test two clients and two providers30 min 103.09 9.9 Booking authorization gate30 min 103.09 9.9 Booking authorization gate30 min Module 104: Provider profile API 6 lessons View lessons Hide lessons 104.01 10.1 A provider needs a public profile30 min 104.01 10.1 A provider needs a public profile30 min 104.02 10.2 Profile fields, time zone and ownership60 min 104.02 10.2 Profile fields, time zone and ownership60 min 104.03 10.3 Provider profile gate30 min 104.03 10.3 Provider profile gate30 min Module 105: Practice setup 6 lessons View lessons Hide lessons 105.01 11.1 The provider who has no practice page30 min 105.01 11.1 The provider who has no practice page30 min 105.02 11.2 Onboarding, settings and the routing gate90 min 105.02 11.2 Onboarding, settings and the routing gate90 min 105.03 11.3 Practice setup gate30 min 105.03 11.3 Practice setup gate30 min Module 106: Services API 6 lessons View lessons Hide lessons 106.01 12.1 A service is a priced block of time30 min 106.01 12.1 A service is a priced block of time30 min 106.02 12.2 Service fields, duration, buffer and cancellation policy90 min 106.02 12.2 Service fields, duration, buffer and cancellation policy90 min 106.03 12.3 Services API gate30 min 106.03 12.3 Services API gate30 min Module 107: Portfolio 6 lessons View lessons Hide lessons 107.01 14.1 A client hires evidence, not a list45 min 107.01 14.1 A client hires evidence, not a list45 min 107.02 14.2 Portfolio photos, avatar and ownership150 min 107.02 14.2 Portfolio photos, avatar and ownership150 min 107.03 14.3 Portfolio gate45 min 107.03 14.3 Portfolio gate45 min Module 108: Browse catalogue API 6 lessons View lessons Hide lessons 108.01 16.1 Clients search for a person and a time60 min 108.01 16.1 Clients search for a person and a time60 min 108.02 16.2 Browse providers, next free slot and the N+1 trap270 min 108.02 16.2 Browse providers, next free slot and the N+1 trap270 min 108.03 16.3 Browse catalogue gate90 min 108.03 16.3 Browse catalogue gate90 min Module 109: Slot picker 6 lessons View lessons Hide lessons 109.01 17.1 Two clocks in one picker60 min 109.01 17.1 Two clocks in one picker60 min 109.02 17.2 Slots in the client zone and the provider zone330 min 109.02 17.2 Slots in the client zone and the provider zone330 min 109.03 17.3 Slot picker gate90 min 109.03 17.3 Slot picker gate90 min Module 110: Slot cart 6 lessons View lessons Hide lessons 110.01 18.1 A cart of requested slots45 min 110.01 18.1 A cart of requested slots45 min 110.02 18.2 Add slots, group by provider and price the cart150 min 110.02 18.2 Add slots, group by provider and price the cart150 min 110.03 18.3 Slot cart gate90 min 110.03 18.3 Slot cart gate90 min Module 111: Bookings agenda 6 lessons View lessons Hide lessons 111.01 21.1 A booking is not an order45 min 111.01 21.1 A booking is not an order45 min 111.02 21.2 My bookings, provider agenda and the calendar file150 min 111.02 21.2 My bookings, provider agenda and the calendar file150 min 111.03 21.3 Bookings agenda gate90 min 111.03 21.3 Bookings agenda gate90 min Module 112: Cancellation and rescheduling 6 lessons View lessons Hide lessons 112.01 22.1 A booking that has to move45 min 112.01 22.1 A booking that has to move45 min 112.02 22.2 Cancel, reschedule and refund by policy150 min 112.02 22.2 Cancel, reschedule and refund by policy150 min 112.03 22.3 Cancellation and rescheduling gate120 min 112.03 22.3 Cancellation and rescheduling gate120 min Module 113: Cache and search 6 lessons View lessons Hide lessons 113.01 23.1 Availability is a display, not a promise30 min 113.01 23.1 Availability is a display, not a promise30 min 113.02 23.2 Cache display data and search providers210 min 113.02 23.2 Cache display data and search providers210 min 113.03 23.3 Cache and search gate30 min 113.03 23.3 Cache and search gate30 min Module 114: Async jobs and queues 6 lessons View lessons Hide lessons 114.01 24.1 What should not happen inside a request30 min 114.01 24.1 What should not happen inside a request30 min 114.02 24.2 Reminders, hold expiry and cache invalidation300 min 114.02 24.2 Reminders, hold expiry and cache invalidation300 min 114.03 24.3 Async jobs gate30 min 114.03 24.3 Async jobs gate30 min Module 115: Concurrency and clock evidence 6 lessons View lessons Hide lessons 115.01 26.1 Twenty clients, one slot30 min 115.01 26.1 Twenty clients, one slot30 min 115.02 26.2 Parallel booking and clock-change evidence210 min 115.02 26.2 Parallel booking and clock-change evidence210 min 115.03 26.3 Concurrency and clock gate60 min 115.03 26.3 Concurrency and clock gate60 min Module 116: Coupons and pricing 6 lessons View lessons Hide lessons 116.01 27.1 A coupon is a server-owned price change30 min 116.01 27.1 A coupon is a server-owned price change30 min 116.02 27.2 Provider-funded coupons, caps and refunds180 min 116.02 27.2 Provider-funded coupons, caps and refunds180 min 116.03 27.3 Coupon gate30 min 116.03 27.3 Coupon gate30 min Module 117: Closing and capstone 4 lessons View lessons Hide lessons 117.01 28.1 Ship and document SkillSlot180 min 117.01 28.1 Ship and document SkillSlot180 min 117.02 28.2 Five-minute demo and capstone defense180 min 117.02 28.2 Five-minute demo and capstone defense180 min Module 118: Introduction to Sufra 14 lessons View lessons Hide lessons 118.01 1.1 What you are building: Sufra30 min 118.01 1.1 What you are building: Sufra30 min 118.02 1.2 How to use this course30 min 118.02 1.2 How to use this course30 min 118.03 1.3 The product and its people30 min 118.03 1.3 The product and its people30 min 118.04 1.4 Scope: what is in and what is out30 min 118.04 1.4 Scope: what is in and what is out30 min 118.05 1.5 Prerequisites and the date diagnostic60 min 118.05 1.5 Prerequisites and the date diagnostic60 min 118.06 1.6 Course outline30 min 118.06 1.6 Course outline30 min 118.07 1.7 Working rhythm and checklist30 min 118.07 1.7 Working rhythm and checklist30 min Module 119: Data model and seed 18 lessons View lessons Hide lessons 119.01 5.1 Time is the inventory30 min 119.01 5.1 Time is the inventory30 min 119.02 5.2 The stock trap30 min 119.02 5.2 The stock trap30 min 119.03 5.3 The ownership chain60 min 119.03 5.3 The ownership chain60 min 119.04 5.4 Kitchen and Dish models90 min 119.04 5.4 Kitchen and Dish models90 min 119.05 5.5 DeliveryWindow and CapacityClaim models90 min 119.05 5.5 DeliveryWindow and CapacityClaim models90 min 119.06 5.6 Cart and Order models90 min 119.06 5.6 Cart and Order models90 min 119.07 5.7 Seed three kitchens and seven days90 min 119.07 5.7 Seed three kitchens and seven days90 min 119.08 5.8 Data model decisions15 min 119.08 5.8 Data model decisions15 min 119.09 5.9 Final ERD and gate45 min 119.09 5.9 Final ERD and gate45 min Module 120: Kitchen API 12 lessons View lessons Hide lessons 120.01 9.1 A kitchen is a schedule30 min 120.01 9.1 A kitchen is a schedule30 min 120.02 9.2 Kitchen profile and service area90 min 120.02 9.2 Kitchen profile and service area90 min 120.03 9.3 The weekly schedule template120 min 120.03 9.3 The weekly schedule template120 min 120.04 9.4 Time zone on the kitchen60 min 120.04 9.4 Time zone on the kitchen60 min 120.05 9.5 Pause the kitchen for today60 min 120.05 9.5 Pause the kitchen for today60 min 120.06 9.6 Ownership tests and gate60 min 120.06 9.6 Ownership tests and gate60 min Module 121: Delivery windows and cutoffs 18 lessons View lessons Hide lessons 121.01 14.1 The 11:31 lunch order30 min 121.01 14.1 The 11:31 lunch order30 min 121.02 14.2 Windows, cutoffs, and the server clock90 min 121.02 14.2 Windows, cutoffs, and the server clock90 min 121.03 14.3 A dated window has a time zone90 min 121.03 14.3 A dated window has a time zone90 min 121.04 14.4 Generate the next seven days once120 min 121.04 14.4 Generate the next seven days once120 min 121.05 14.5 A slow dish closes first90 min 121.05 14.5 A slow dish closes first90 min 121.06 14.6 Close or change one day safely90 min 121.06 14.6 Close or change one day safely90 min 121.07 14.7 Make the cutoff boundary fail on purpose90 min 121.07 14.7 Make the cutoff boundary fail on purpose90 min 121.08 14.8 Window and cutoff decisions15 min 121.08 14.8 Window and cutoff decisions15 min 121.09 14.9 Delivery-window gate45 min 121.09 14.9 Delivery-window gate45 min Module 122: Browse by window API 12 lessons View lessons Hide lessons 122.01 15.1 Window first30 min 122.01 15.1 Window first30 min 122.02 15.2 The availability query120 min 122.02 15.2 The availability query120 min 122.03 15.3 Kitchens and dishes without N+1120 min 122.03 15.3 Kitchens and dishes without N+1120 min 122.04 15.4 Hide dishes past their own cutoff60 min 122.04 15.4 Hide dishes past their own cutoff60 min 122.05 15.5 Filters and pagination90 min 122.05 15.5 Filters and pagination90 min 122.06 15.6 Query plan and gate60 min 122.06 15.6 Query plan and gate60 min Module 123: Cart API 12 lessons View lessons Hide lessons 123.01 17.1 One window per cart30 min 123.01 17.1 One window per cart30 min 123.02 17.2 Add to cart with time checks120 min 123.02 17.2 Add to cart with time checks120 min 123.03 17.3 Change the window90 min 123.03 17.3 Change the window90 min 123.04 17.4 Load per kitchen60 min 123.04 17.4 Load per kitchen60 min 123.05 17.5 User scoping test60 min 123.05 17.5 User scoping test60 min 123.06 17.6 Cart API gate60 min 123.06 17.6 Cart API gate60 min Module 124: Checkout, capacity claims and orders 18 lessons View lessons Hide lessons 124.01 19.1 Two diners, one last spot30 min 124.01 19.1 Two diners, one last spot30 min 124.02 19.2 Claim capacity in one window update90 min 124.02 19.2 Claim capacity in one window update90 min 124.03 19.3 All or nothing across kitchens90 min 124.03 19.3 All or nothing across kitchens90 min 124.04 19.4 Capacity claims as holds120 min 124.04 19.4 Capacity claims as holds120 min 124.05 19.5 Split and snapshot orders120 min 124.05 19.5 Split and snapshot orders120 min 124.06 19.6 Recheck the cutoff at claim time60 min 124.06 19.6 Recheck the cutoff at claim time60 min 124.07 19.7 Twenty parallel checkouts90 min 124.07 19.7 Twenty parallel checkouts90 min 124.08 19.8 Checkout decisions15 min 124.08 19.8 Checkout decisions15 min 124.09 19.9 Capacity checkout gate45 min 124.09 19.9 Capacity checkout gate45 min Module 125: Payment processing 18 lessons View lessons Hide lessons 125.01 20.1 One payment, two kitchens30 min 125.01 20.1 One payment, two kitchens30 min 125.02 20.2 One PaymentIntent for a prepared attempt120 min 125.02 20.2 One PaymentIntent for a prepared attempt120 min 125.03 20.3 Verify and record webhooks90 min 125.03 20.3 Verify and record webhooks90 min 125.04 20.4 Payment decision check20 min 125.04 20.4 Payment decision check20 min 125.05 20.5 Confirm both kitchens after payment120 min 125.05 20.5 Confirm both kitchens after payment120 min 125.06 20.6 Reconcile a late payment success90 min 125.06 20.6 Reconcile a late payment success90 min 125.07 20.7 Refund one kitchen share90 min 125.07 20.7 Refund one kitchen share90 min 125.08 20.8 Replay and race tests90 min 125.08 20.8 Replay and race tests90 min 125.09 20.9 Payment processing gate60 min 125.09 20.9 Payment processing gate60 min Module 126: Async jobs and queues 16 lessons View lessons Hide lessons 126.01 21.1 The checkout request that waited too long30 min 126.01 21.1 The checkout request that waited too long30 min 126.02 21.2 When to queue60 min 126.02 21.2 When to queue60 min 126.03 21.3 Run a separate BullMQ worker90 min 126.03 21.3 Run a separate BullMQ worker90 min 126.04 21.4 Queue decisions check20 min 126.04 21.4 Queue decisions check20 min 126.05 21.5 Generate the rolling window horizon90 min 126.05 21.5 Generate the rolling window horizon90 min 126.06 21.6 Expire unpaid holds90 min 126.06 21.6 Expire unpaid holds90 min 126.07 21.7 Notify the cook after placement60 min 126.07 21.7 Notify the cook after placement60 min 126.08 21.8 Async jobs gate60 min 126.08 21.8 Async jobs gate60 min Module 127: Kitchen acceptance and order lifecycle 14 lessons View lessons Hide lessons 127.01 22.1 The cook who never answered30 min 127.01 22.1 The cook who never answered30 min 127.02 22.2 The kitchen order state machine90 min 127.02 22.2 The kitchen order state machine90 min 127.03 22.3: Transitions with preconditions90 min 127.03 22.3: Transitions with preconditions90 min 127.04 22.4: The acceptance deadline90 min 127.04 22.4: The acceptance deadline90 min 127.05 22.5: Reject, release and refund90 min 127.05 22.5: Reject, release and refund90 min 127.06 22.6: The kitchen board90 min 127.06 22.6: The kitchen board90 min 127.07 22.7: Lifecycle gate and timeline evidence90 min 127.07 22.7: Lifecycle gate and timeline evidence90 min Module 128: Why MongoDB for a kitchen 8 lessons View lessons Hide lessons 128.01 3.1 Rules, windows and claims are three kinds of time data30 min 128.01 3.1 Rules, windows and claims are three kinds of time data30 min 128.02 3.2 Relational and document shapes for a kitchen schedule75 min 128.02 3.2 Relational and document shapes for a kitchen schedule75 min 128.03 3.3 The decision for Sufra and the first ERD90 min 128.03 3.3 The decision for Sufra and the first ERD90 min 128.04 3.4 Data model decision gate45 min 128.04 3.4 Data model decision gate45 min Module 129: Authorization and isolation 8 lessons View lessons Hide lessons 129.01 8.1 Whose kitchen, whose order?30 min 129.01 8.1 Whose kitchen, whose order?30 min 129.02 8.2 Object checks on kitchens, dishes and orders90 min 129.02 8.2 Object checks on kitchens, dishes and orders90 min 129.03 8.3 The authorization matrix and cross-kitchen tests90 min 129.03 8.3 The authorization matrix and cross-kitchen tests90 min 129.04 8.4 Isolation gate60 min 129.04 8.4 Isolation gate60 min Module 130: Open your kitchen 6 lessons View lessons Hide lessons 130.01 10.1 The cook who has no kitchen page30 min 130.01 10.1 The cook who has no kitchen page30 min 130.02 10.2 Kitchen form and the phone-width schedule grid90 min 130.02 10.2 Kitchen form and the phone-width schedule grid90 min 130.03 10.3 Onboarding gate on a phone60 min 130.03 10.3 Onboarding gate on a phone60 min Module 131: Manage dishes API 8 lessons View lessons Hide lessons 131.01 11.1 A dish is a promise of time30 min 131.01 11.1 A dish is a promise of time30 min 131.02 11.2 Dish fields, validation and ownership90 min 131.02 11.2 Dish fields, validation and ownership90 min 131.03 11.3 A dish that cannot fit, and a price that can change90 min 131.03 11.3 A dish that cannot fit, and a price that can change90 min 131.04 11.4 Dish API gate60 min 131.04 11.4 Dish API gate60 min Module 132: Kitchen dashboard 4 lessons View lessons Hide lessons 132.01 12.1 The kitchen dashboard120 min 132.01 12.1 The kitchen dashboard120 min 132.02 12.2 Kitchen dashboard gate45 min 132.02 12.2 Kitchen dashboard gate45 min Module 133: Find a meal 6 lessons View lessons Hide lessons 133.01 16.1 Lunch on a phone, in a window30 min 133.01 16.1 Lunch on a phone, in a window30 min 133.02 16.2 Window picker, kitchen cards and dish lists60 min 133.02 16.2 Window picker, kitchen cards and dish lists60 min 133.03 16.3 Find-a-meal gate45 min 133.03 16.3 Find-a-meal gate45 min Module 134: Your cart 6 lessons View lessons Hide lessons 134.01 18.1 One cart, one window, several kitchens30 min 134.01 18.1 One cart, one window, several kitchens30 min 134.02 18.2 Cart rows, load totals and window changes75 min 134.02 18.2 Cart rows, load totals and window changes75 min 134.03 18.3 Cart UI gate45 min 134.03 18.3 Cart UI gate45 min Module 135: Live order tracking 10 lessons View lessons Hide lessons 135.01 23.1 Lunch on a weak connection30 min 135.01 23.1 Lunch on a weak connection30 min 135.02 23.2 Polling, long polling, SSE and WebSockets120 min 135.02 23.2 Polling, long polling, SSE and WebSockets120 min 135.03 23.3 One stream per user, snapshot then deltas330 min 135.03 23.3 One stream per user, snapshot then deltas330 min 135.04 23.4 Polling fallback and the tracking screen180 min 135.04 23.4 Polling fallback and the tracking screen180 min 135.05 23.5 Offline test and tracking gate120 min 135.05 23.5 Offline test and tracking gate120 min Module 136: Cache and search 6 lessons View lessons Hide lessons 136.01 24.1 What may be cached, and what never is35 min 136.01 24.1 What may be cached, and what never is35 min 136.02 24.2 Cache menus, bust on save, search dishes75 min 136.02 24.2 Cache menus, bust on save, search dishes75 min 136.03 24.3 Cache and search gate50 min 136.03 24.3 Cache and search gate50 min Module 137: Deploy 6 lessons View lessons Hide lessons 137.01 25.1 Deploy the API, worker and client45 min 137.01 25.1 Deploy the API, worker and client45 min 137.02 25.2 HTTPS, secrets, and streams in production300 min 137.02 25.2 HTTPS, secrets, and streams in production300 min 137.03 25.3 Deploy gate and restart survival180 min 137.03 25.3 Deploy gate and restart survival180 min Module 138: Capacity under load 8 lessons View lessons Hide lessons 138.01 26.1 The Friday lunch rush30 min 138.01 26.1 The Friday lunch rush30 min 138.02 26.2 Payment time, cutoff time and hold expiry90 min 138.02 26.2 Payment time, cutoff time and hold expiry90 min 138.03 26.3 Reconcile claims and prove the race240 min 138.03 26.3 Reconcile claims and prove the race240 min 138.04 26.4 Capacity evidence gate120 min 138.04 26.4 Capacity evidence gate120 min Module 139: Closing and capstone 4 lessons View lessons Hide lessons 139.01 99.1 Ship and document Sufra300 min 139.01 99.1 Ship and document Sufra300 min 139.02 99.2 Five-minute demo and capstone defense240 min 139.02 99.2 Five-minute demo and capstone defense240 min Module 140: Dish photos 6 lessons View lessons Hide lessons 140.01 13.1 A diner cannot smell the maqluba40 min 140.01 13.1 A diner cannot smell the maqluba40 min 140.02 13.2 Upload dish photos and serve small ones120 min 140.02 13.2 Upload dish photos and serve small ones120 min 140.03 13.3 Dish photo gate60 min 140.03 13.3 Dish photo gate60 min 7.02
20 min
7.02 Why token storage matters20 min
7.02 Why token storage matters20 min
7.02 Why token storage matters20 min
7.02 Why token storage matters20 min
7.02 Why token storage matters20 min
7.02 Why token storage matters20 min
7.03 What you'll build20 min
7.03 What you'll build20 min
7.03 What you'll build20 min
7.03 What you'll build20 min
7.03 What you'll build20 min
7.03 What you'll build20 min
7.03 What you'll build20 min
7.03 What you'll build20 min
7.03 What you'll build20 min
7.03 What you'll build20 min
7.03 What you'll build20 min
7.03 What you'll build20 min
7.04 7.4 , Where tokens live20 min
7.04 7.4 , Where tokens live20 min
7.04 7.4 , Where tokens live20 min
7.04 7.4 , Where tokens live20 min
7.04 7.4 , Where tokens live20 min
7.04 7.4 , Where tokens live20 min
7.04 7.4 , Where tokens live20 min
7.04 Where tokens live20 min
7.04 7.4 , Where tokens live20 min
7.04 Where tokens live20 min
7.04 7.4 , Where tokens live20 min
7.04 7.4 , Where tokens live20 min
7.05 The 401 retry loop20 min
7.05 The 401 retry loop20 min
7.05 The 401 retry loop20 min
7.05 The 401 retry loop20 min
7.05 The 401 retry loop20 min
7.05 The 401 retry loop20 min
7.05 The 401 retry loop20 min
7.05 The 401 retry loop20 min
7.05 The 401 retry loop20 min
7.05 The 401 retry loop20 min
7.05 The 401 retry loop20 min
7.05 The 401 retry loop20 min
7.06 Prime your thinking20 min
7.06 Prime your thinking20 min
7.06 Prime your thinking20 min
7.06 Prime your thinking20 min
7.06 Prime your thinking20 min
7.06 Prime your thinking20 min
7.06 Prime your thinking20 min
7.06 Prime your thinking20 min
7.06 Prime your thinking20 min
7.06 Prime your thinking20 min
7.06 Prime your thinking20 min
7.06 Prime your thinking20 min
7.07 Browser sign-in flow10 min
7.07 Browser sign-in flow10 min
7.07 Browser sign-in flow10 min
7.07 Browser sign-in flow10 min
7.07 Browser sign-in flow10 min
7.07 Browser sign-in flow10 min
7.07 Browser sign-in flow10 min
7.07 Browser sign-in flow10 min
7.07 Browser sign-in flow10 min
7.07 Browser sign-in flow10 min
7.07 Browser sign-in flow10 min
7.07 Browser sign-in flow10 min
7.08 Where the project is now20 min
7.08 Where the project is now20 min
7.09 Scaffold auth pages20 min
7.09 Scaffold auth pages20 min
7.09 Scaffold auth pages20 min
7.09 Scaffold auth pages20 min
7.09 Scaffold auth pages20 min
7.09 Scaffold auth pages20 min
7.09 Scaffold auth pages20 min
7.09 Scaffold auth pages20 min
7.09 Scaffold auth pages20 min
7.09 Scaffold auth pages20 min
7.09 Scaffold auth pages20 min
7.09 Scaffold auth pages20 min
7.10 Auth context or hook20 min
7.10 Auth context or hook20 min
7.10 Auth context or hook20 min
7.10 Auth context or hook20 min
7.10 Auth context or hook20 min
7.10 Auth context or hook20 min
7.10 Auth context or hook20 min
7.10 Auth context or hook20 min
7.10 Auth context or hook20 min
7.10 Auth context or hook20 min
7.10 Auth context or hook20 min
7.10 Auth context or hook20 min
7.11 Register page25 min
7.11 Register page25 min
7.11 Register page25 min
7.11 Register page25 min
7.11 Register page25 min
7.11 Register page25 min
7.11 Register page25 min
7.11 Register page25 min
7.11 Register page25 min
7.11 Register page25 min
7.11 Register page25 min
7.11 Register page25 min
7.12 Verify OTP page20 min
7.12 Verify OTP page20 min
7.12 Verify OTP page20 min
7.12 Verify OTP page20 min
7.12 Verify OTP page20 min
7.12 Verify OTP page20 min
7.12 Verify OTP page20 min
7.12 Verify OTP page20 min
7.12 Verify OTP page20 min
7.12 Verify OTP page20 min
7.12 Verify OTP page20 min
7.12 Verify OTP page20 min
7.13 Login page25 min
7.13 Login page25 min
7.13 Login page25 min
7.13 Login page25 min
7.13 Login page25 min
7.13 Login page25 min
7.13 Login page25 min
7.13 Login page25 min
7.13 Login page25 min
7.13 Login page25 min
7.13 Login page25 min
7.13 Login page25 min
7.14 API interceptor20 min
7.14 API interceptor20 min
7.14 API interceptor20 min
7.14 API interceptor20 min
7.14 API interceptor20 min
7.14 API interceptor20 min
7.14 API interceptor20 min
7.14 API interceptor20 min
7.14 API interceptor20 min
7.14 API interceptor20 min
7.14 API interceptor20 min
7.14 API interceptor20 min
7.15 Protected route wrapper20 min
7.15 Protected route wrapper20 min
7.15 Protected route wrapper20 min
7.15 Protected route wrapper20 min
7.15 Protected route wrapper20 min
7.15 Protected route wrapper20 min
7.15 Protected route wrapper20 min
7.15 Protected route wrapper20 min
7.15 Protected route wrapper20 min
7.15 Protected route wrapper20 min
7.15 Protected route wrapper20 min
7.15 Protected route wrapper20 min
7.16 Verify in browser20 min
7.16 Verify in browser20 min
7.16 Verify in browser20 min
7.16 Verify in browser20 min
7.16 Verify in browser20 min
7.16 Verify in browser20 min
7.16 Verify in browser20 min
7.16 Verify in browser20 min
7.16 Verify in browser20 min
7.16 Verify in browser20 min
7.16 Verify in browser20 min
7.16 Verify in browser20 min
7.17 Recap and what's next20 min
7.17 Recap and what's next20 min
7.18 7.18 , Checklist and learning log20 min
7.18 7.18 Checklist and learning log20 min
7.18 Checklist and learning log20 min
7.18 7.18 Checklist and learning log20 min
7.18 7.18: Checklist and learning log20 min
7.18 7.18: Checklist and learning log20 min
7.18 7.18: Checklist and learning log20 min
7.18 7.18 , Checklist and learning log20 min
7.18 7.18 Checklist and learning log45 min
7.18 Checklist and learning log20 min
7.18 7.18: Checklist and learning log20 min
7.18 7.18 Checklist and learning log45 min 20 min
8.05 RBAC and ownership20 min
8.05 RBAC and ownership20 min
8.06 Prime your thinking20 min
8.06 Prime your thinking20 min
8.07 Roles and ownership10 min
8.07 Roles and ownership10 min
8.08 Authorization matrix20 min
8.08 Authorization matrix20 min
8.09 Where the project is now20 min
8.09 Where the project is now20 min
8.10 Require role middleware20 min
8.10 Require role middleware20 min
8.11 Ownership helper20 min
8.11 Ownership helper20 min
8.12 Apply to store routes20 min
8.12 Apply to store routes20 min
8.13 Test IDOR with two vendors20 min
8.13 Test IDOR with two vendors20 min
8.14 Recap and what's next20 min
8.14 Recap and what's next20 min
8.15 Checklist and learning log20 min
8.15 Checklist and learning log20 min 20 min
9.05 Prime your thinking20 min
9.05 Prime your thinking20 min
9.06 Store API contracts10 min
9.06 Store API contracts10 min
9.07 Where the project is now20 min
9.07 Where the project is now20 min
9.08 Scaffold stores module20 min
9.08 Scaffold stores module20 min
9.09 Create store route20 min
9.09 Create store route20 min
9.10 Get my store route20 min
9.10 Get my store route20 min
9.11 Update store route20 min
9.11 Update store route20 min
9.12 Test with curl20 min
9.12 Test with curl20 min
9.13 Recap and what's next20 min
9.13 Recap and what's next20 min
9.14 Checklist and learning log20 min
9.14 Checklist and learning log20 min 20 min
10.05 Where the project is now20 min
10.05 Where the project is now20 min
10.06 Scaffold vendor layout25 min
10.06 Scaffold vendor layout25 min
10.07 Store setup page30 min
10.07 Store setup page30 min
10.08 Store settings page25 min
10.08 Store settings page25 min
10.09 Onboarding redirect25 min
10.09 Onboarding redirect25 min
10.10 Verify onboarding flow20 min
10.10 Verify onboarding flow20 min
10.11 Recap and what's next20 min
10.11 Recap and what's next20 min
10.12 The store gate15 min
10.12 The store gate15 min
10.13 Checklist and learning log20 min
10.13 Checklist and learning log20 min 20 min
11.05 Prime your thinking20 min
11.05 Prime your thinking20 min
11.06 Product ownership10 min
11.06 Product ownership10 min
11.07 Where the project is now20 min
11.07 Where the project is now20 min
11.08 Scaffold products module20 min
11.08 Scaffold products module20 min
11.09 Create product route30 min
11.09 Create product route30 min
11.10 List vendor products25 min
11.10 List vendor products25 min
11.11 Update product route20 min
11.11 Update product route20 min
11.12 Delete product route20 min
11.12 Delete product route20 min
11.13 Test cross-vendor 40320 min
11.13 Test cross-vendor 40320 min
11.14 Recap and what's next20 min
11.14 Recap and what's next20 min
11.15 Checklist and learning log20 min
11.15 Checklist and learning log20 min 20 min
12.05 Where the project is now20 min
12.05 Where the project is now20 min
12.06 Product list page30 min
12.06 Product list page30 min
12.07 Create product page30 min
12.07 Create product page30 min
12.08 Edit product page30 min
12.08 Edit product page30 min
12.09 Publish toggle25 min
12.09 Publish toggle25 min
12.10 Verify vendor flow20 min
12.10 Verify vendor flow20 min
12.11 Recap and what's next20 min
12.11 Recap and what's next20 min
12.12 Dashboard failure states15 min
12.12 Dashboard failure states15 min
12.13 Checklist and learning log20 min
12.13 Checklist and learning log20 min 20 min
13.05 Prime your thinking20 min
13.05 Prime your thinking20 min
13.06 Upload boundaries10 min
13.06 Upload boundaries10 min
13.07 Where the project is now20 min
13.07 Where the project is now20 min
13.08 Cloudinary config20 min
13.08 Cloudinary config20 min
13.09 Upload route35 min
13.09 Upload route35 min
13.10 Delete old image20 min
13.10 Delete old image20 min
13.11 Upload UI component30 min
13.11 Upload UI component30 min
13.12 Verify image flow20 min
13.12 Verify image flow20 min
13.13 Recap and what's next20 min
13.13 Recap and what's next20 min
13.14 Bridge to Week 3 (customer experience)20 min
13.14 Bridge to Week 3 (customer experience)20 min
13.15 Checklist and learning log20 min
13.15 Checklist and learning log20 min 20 min
15.05 Scaffold customer pages25 min
15.05 Scaffold customer pages25 min
15.06 Product card component25 min
15.06 Product card component25 min
15.07 Filter bar25 min
15.07 Filter bar25 min
15.08 Shop page with pagination30 min
15.08 Shop page with pagination30 min
15.09 Product detail page25 min
15.09 Product detail page25 min
15.10 Verify browse UI25 min
15.10 Verify browse UI25 min
15.11 Recap and what's next20 min
15.11 Recap and what's next20 min
15.12 Browse decisions15 min
15.12 Browse decisions15 min
15.13 Checklist and learning log20 min
15.13 Checklist and learning log20 min 20 min
16.05 Cart boundaries10 min
16.05 Cart boundaries10 min
16.06 Where the project is now20 min
16.06 Where the project is now20 min
16.07 Scaffold cart module20 min
16.07 Scaffold cart module20 min
16.08 Add to cart route30 min
16.08 Add to cart route30 min
16.09 Get cart route20 min
16.09 Get cart route20 min
16.10 Update cart item20 min
16.10 Update cart item20 min
16.11 Remove cart item20 min
16.11 Remove cart item20 min
16.12 Stock check on add20 min
16.12 Stock check on add20 min
16.13 User scoping test20 min
16.13 User scoping test20 min
16.14 Recap and what's next20 min
16.14 Recap and what's next20 min
16.15 Checklist and learning log20 min
16.15 Checklist and learning log20 min 20 min
17.05 Cart page30 min
17.05 Cart page30 min
17.06 Quantity controls25 min
17.06 Quantity controls25 min
17.07 Remove item20 min
17.07 Remove item20 min
17.08 Wire add-to-cart25 min
17.08 Wire add-to-cart25 min
17.09 Cart icon and header badge20 min
17.09 Cart icon and header badge20 min
17.10 Verify cart persists20 min
17.10 Verify cart persists20 min
17.11 Recap and what's next20 min
17.11 Recap and what's next20 min
17.12 Honest cart state15 min
17.12 Honest cart state15 min
17.13 Checklist and learning log20 min
17.13 Checklist and learning log20 min 20 min
18.05 Atomic stock decrement20 min
18.05 Atomic stock decrement20 min
18.06 Prime your thinking20 min
18.06 Prime your thinking20 min
18.07 Split orders and stock10 min
18.07 Split orders and stock10 min
18.08 Where the project is now20 min
18.08 Where the project is now20 min
18.09 Scaffold orders module25 min
18.09 Scaffold orders module25 min
18.10 Checkout route35 min
18.10 Checkout route35 min
18.11 Snapshot order lines25 min
18.11 Snapshot order lines25 min
18.12 Stock decrement30 min
18.12 Stock decrement30 min
18.13 Clear cart on success20 min
18.13 Clear cart on success20 min
18.14 Vendor orders route20 min
18.14 Vendor orders route20 min
18.15 Customer orders route20 min
18.15 Customer orders route20 min
18.16 Test snapshot immutability20 min
18.16 Test snapshot immutability20 min
18.17 Recap and what's next20 min
18.17 Recap and what's next20 min
18.18 Checklist and learning log20 min
18.18 Checklist and learning log20 min 20 min
19.05 Stripe test mode20 min
19.05 Stripe test mode20 min
19.06 Prime your thinking20 min
19.06 Prime your thinking20 min
19.07 Payment trust boundary10 min
19.07 Payment trust boundary10 min
19.08 Where the project is now20 min
19.08 Where the project is now20 min
19.09 Stripe config20 min
19.09 Stripe config20 min
19.10 Payment Intent route35 min
19.10 Payment Intent route35 min
19.11 Payment-gated checkout40 min
19.11 Payment-gated checkout40 min
19.12 Webhook handler20 min
19.12 Webhook handler20 min
19.13 Idempotency and double-submit20 min
19.13 Idempotency and double-submit20 min
19.14 Verify with test cards20 min
19.14 Verify with test cards20 min
19.15 Recap and what's next20 min
19.15 Recap and what's next20 min
19.16 Checklist and learning log20 min
19.16 Checklist and learning log20 min 20 min
20.05 Checkout page20 min
20.05 Checkout page20 min
20.06 Order confirmation page25 min
20.06 Order confirmation page25 min
20.07 Customer orders page20 min
20.07 Customer orders page20 min
20.08 Vendor orders page20 min
20.08 Vendor orders page20 min
20.09 Order status badge20 min
20.09 Order status badge20 min
20.10 Vendor update status20 min
20.10 Vendor update status20 min
20.11 Full commerce demo20 min
20.11 Full commerce demo20 min
20.12 Recap and what's next20 min
20.12 Recap and what's next20 min
20.13 Receipts and status15 min
20.13 Receipts and status15 min
20.14 Checklist and learning log20 min
20.14 Checklist and learning log20 min 20 min
22.05 BullMQ and Redis20 min
22.05 BullMQ and Redis20 min
22.06 Prime your thinking20 min
22.06 Prime your thinking20 min
22.07 Queue boundaries10 min
22.07 Queue boundaries10 min
22.08 Where the project is now20 min
22.08 Where the project is now20 min
22.09 Queue module20 min
22.09 Queue module20 min
22.10 Worker process20 min
22.10 Worker process20 min
22.11 Order created job20 min
22.11 Order created job20 min
22.12 Order created processor20 min
22.12 Order created processor20 min
22.13 Order status job20 min
22.13 Order status job20 min
22.14 Retries and idempotency20 min
22.14 Retries and idempotency20 min
22.15 Verify async flow20 min
22.15 Verify async flow20 min
22.16 Cache invalidation job20 min
22.16 Cache invalidation job20 min
22.17 Recap and what's next20 min
22.17 Recap and what's next20 min
22.18 Checklist and learning log20 min
22.18 Checklist and learning log20 min 20 min
23.01 Set the scene20 min
23.01 Set the scene20 min
23.02 Secrets in Git forever20 min
23.02 Secrets in Git forever20 min
23.03 What you'll build20 min
23.03 What you'll build20 min
23.04 VPS vs PaaS20 min
23.04 VPS vs PaaS20 min
23.04 VPS vs PaaS20 min
23.04 VPS vs PaaS20 min
23.04 VPS vs PaaS20 min
23.04 VPS vs PaaS20 min
23.04 VPS vs PaaS20 min
23.04 VPS vs PaaS20 min
23.04 VPS vs PaaS20 min
23.04 VPS vs PaaS20 min
23.05 Prime your thinking20 min
23.05 Prime your thinking20 min
23.05 Prime your thinking20 min
23.05 Prime your thinking20 min
23.05 Prime your thinking20 min
23.05 Prime your thinking20 min
23.05 Prime your thinking20 min
23.05 Prime your thinking20 min
23.05 Prime your thinking20 min
23.05 Prime your thinking20 min
23.06 Production config10 min
23.06 Production config10 min
23.07 Where the project is now20 min
23.07 Where the project is now20 min
23.08 Production env checklist30 min
23.08 Production env checklist30 min
23.09 Build client for production20 min
23.09 Build client for production20 min
23.10 Deploy API and worker35 min
23.10 Deploy API and worker35 min
23.11 Domain and HTTPS20 min
23.11 Domain and HTTPS20 min
23.12 Deploy client30 min
23.12 Deploy client30 min
23.13 Smoke test production40 min
23.13 Smoke test production40 min
23.14 Restart survival test30 min
23.14 Restart survival test30 min
23.15 23.15 , Recap and what's next20 min
23.15 23.15 , Recap and what's next20 min
23.15 23.15 , Recap and what's next20 min
23.15 23.15 , Recap and what's next30 min
23.15 23.15 , Recap and what's next20 min
23.15 23.15 , Recap and what's next20 min
23.15 Recap and what's next20 min
23.15 23.15 , Recap and what's next30 min
23.15 Recap and what's next20 min
23.15 23.15 , Recap and what's next20 min
23.16 Checklist and learning log20 min
23.16 Checklist and learning log20 min 18 min
24.05 Prime your thinking15 min
24.05 Prime your thinking15 min
24.06 Stock reservations15 min
24.06 Stock reservations15 min
24.07 Where the project is now12 min
24.07 Where the project is now12 min
24.08 Reservation schema and indexes35 min
24.08 Reservation schema and indexes35 min
24.09 Reserve stock at checkout45 min
24.09 Reserve stock at checkout45 min
24.10 Confirm and release on payment45 min
24.10 Confirm and release on payment45 min
24.11 Expiry worker for holds35 min
24.11 Expiry worker for holds35 min
24.12 Verify concurrent checkout30 min
24.12 Verify concurrent checkout30 min
24.13 Recap and what's next18 min
24.13 Recap and what's next18 min
24.14 Checklist and learning log20 min
24.14 Checklist and learning log20 min
24.14 Checklist and learning log20 min 25 min
25.05 Prime your thinking15 min
25.05 Prime your thinking15 min
25.06 Pricing trust boundary15 min
25.06 Pricing trust boundary15 min
25.07 Where the project is now18 min
25.07 Where the project is now18 min
25.08 Coupon and redemption models45 min
25.08 Coupon and redemption models45 min
25.09 Validate coupon API50 min
25.09 Validate coupon API50 min
25.10 Recalculate cart totals55 min
25.10 Recalculate cart totals55 min
25.11 Snapshot discounts on order55 min
25.11 Snapshot discounts on order55 min
25.12 Rate limits and abuse38 min
25.12 Rate limits and abuse38 min
25.13 Recap and what's next20 min
25.13 Recap and what's next20 min
25.14 Checklist and learning log30 min
25.14 Checklist and learning log30 min