<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: rokimiftah</title>
    <description>The latest articles on DEV Community by rokimiftah (@rokimiftah).</description>
    <link>https://dev.to/rokimiftah</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F521598%2Fb4354d56-7dd5-44a7-abe5-161bc88794ba.png</url>
      <title>DEV Community: rokimiftah</title>
      <link>https://dev.to/rokimiftah</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rokimiftah"/>
    <language>en</language>
    <item>
      <title>What The Pack - AI Mission Control for D2C Logistics</title>
      <dc:creator>rokimiftah</dc:creator>
      <pubDate>Mon, 27 Oct 2025 06:57:22 +0000</pubDate>
      <link>https://dev.to/rokimiftah/what-the-pack-ai-mission-control-for-d2c-logistics-13a6</link>
      <guid>https://dev.to/rokimiftah/what-the-pack-ai-mission-control-for-d2c-logistics-13a6</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/auth0-2025-10-08"&gt;Auth0 for AI Agents Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What I Built&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I built &lt;strong&gt;&lt;code&gt;WhatThePack.today&lt;/code&gt;&lt;/strong&gt;, an AI-powered, multi-tenant "Mission Control" OS for Direct-to-Customer (D2C) businesses. It's designed to solve the "delegation nightmare" by allowing business owners (&lt;code&gt;owner&lt;/code&gt;) to safely grant granular permissions to their staff (&lt;code&gt;admin&lt;/code&gt; and &lt;code&gt;packer&lt;/code&gt;) for critical logistics operations, all powered and secured by Auth0, and enhanced with integrated AI tools.&lt;/p&gt;

&lt;p&gt;Each business receives an isolated dashboard (&lt;code&gt;store-name.whatthepack.today&lt;/code&gt;). The platform provides the core AI intelligence and notifications, while the owner brings their own courier (BYOC) account. &lt;code&gt;WhatThePack&lt;/code&gt; transforms manual operational chaos into an automated, intelligent, and secure logistics workflow. For the warehouse &lt;code&gt;packer&lt;/code&gt;, it answers their core question hands-free: &lt;strong&gt;"What Should Be Packed Today?"&lt;/strong&gt;, while ensuring every action is secured.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Problem&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Successful D2C sellers (on Instagram, WA, etc.) drown in manual work. To scale, they must hire staff, which creates a massive security risk. I identified four core problems:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Operational Chaos:&lt;/strong&gt; Successful D2C sellers are drowning in manual work: verifying bank transfers, copy-pasting addresses, checking shipping rates, and typing tracking numbers back to customers. &lt;strong&gt;Data entry is slow and error-prone.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;The Delegation Nightmare (Core Problem):&lt;/strong&gt; To hire staff (an &lt;code&gt;admin&lt;/code&gt; and a &lt;code&gt;packer&lt;/code&gt;), the owner is &lt;em&gt;forced&lt;/em&gt; to share highly sensitive access:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Online Banking Login&lt;/strong&gt; (to verify transfers).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Courier/Aggregator API Keys&lt;/strong&gt; (to purchase shipping labels).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Financial Data&lt;/strong&gt; (Cost of Goods Sold, profit margins, etc.). Crucially, &lt;strong&gt;staff passwords&lt;/strong&gt; should also remain private.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Location Disparity &amp;amp; Communication Gaps:&lt;/strong&gt; The &lt;code&gt;admin&lt;/code&gt; (at the office/home) and the &lt;code&gt;packer&lt;/code&gt; (in the warehouse) lack a real-time, single source of truth for orders, and critical updates (like stockouts) are often delayed.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Warehouse Inefficiency:&lt;/strong&gt; The &lt;code&gt;packer&lt;/code&gt; must constantly look at a screen, switch between tasks, and manually confirm steps, slowing down fulfillment and increasing the chance of errors.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Solution&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;WhatThePack.today&lt;/code&gt; solves this multi-layered crisis by integrating Auth0's security with targeted AI tools, creating a &lt;strong&gt;secure, agentic workflow&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Securely Onboards &amp;amp; Authenticates Staff:&lt;/strong&gt; Uses &lt;strong&gt;Auth0 Universal Login&lt;/strong&gt;, employs &lt;strong&gt;Auth0 Roles&lt;/strong&gt;, and leverages &lt;strong&gt;Auth0's email enrollment flow&lt;/strong&gt; triggered via the Management API for secure staff onboarding. &lt;code&gt;Owner&lt;/code&gt; invites staff via email, and staff set their own private passwords.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Ensures Business Isolation:&lt;/strong&gt; Leverages &lt;strong&gt;Auth0 Organizations&lt;/strong&gt; for true multi-tenancy, guaranteeing data separation between businesses.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Protects Sensitive Credentials:&lt;/strong&gt; Secures the &lt;code&gt;owner&lt;/code&gt;'s critical API key (e.g., ShipEngine) in the &lt;strong&gt;Auth0 Organization Metadata&lt;/strong&gt;, preventing exposure to staff or the AI itself.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Enables Secure Agentic Action &amp;amp; Warehouse Efficiency:&lt;/strong&gt; Empowers an &lt;strong&gt;AI Agent&lt;/strong&gt; (running on Convex) - triggered via &lt;strong&gt;VAPI.ai voice commands&lt;/strong&gt; from the &lt;code&gt;packer&lt;/code&gt; - to securely access the &lt;strong&gt;Organization Metadata&lt;/strong&gt; and execute actions (like buying labels) on the &lt;code&gt;owner&lt;/code&gt;'s behalf. &lt;em&gt;This solves the core delegation nightmare &lt;strong&gt;and&lt;/strong&gt; allows the packer to work hands-free, eliminating screen-switching inefficiency.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Delivers Role-Aware Intelligence:&lt;/strong&gt; Implements &lt;strong&gt;Auth0's &lt;code&gt;Limit knowledge&lt;/code&gt; (RAG)&lt;/strong&gt; principle, using the user's role (from the Auth0 JWT) to filter data &lt;em&gt;before&lt;/em&gt; it reaches the &lt;strong&gt;LLM (OpenAI)&lt;/strong&gt;. &lt;em&gt;This ensures the AI provides relevant information (SOPs for packers, profit for owners) without leaking sensitive data.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Provides Proactive Communication:&lt;/strong&gt; Uses &lt;strong&gt;Resend&lt;/strong&gt; (triggered by the AI Agent) to send automated email notifications (e.g., stock alerts reported via VAPI) to the relevant roles (&lt;code&gt;owner&lt;/code&gt;/&lt;code&gt;admin&lt;/code&gt;). &lt;em&gt;This instantly bridges the communication gap caused by location disparity.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Reduces Operational Burden:&lt;/strong&gt; Utilizes the &lt;strong&gt;LLM&lt;/strong&gt; for practical AI assistance, such as extracting order details from pasted chat logs (&lt;code&gt;admin&lt;/code&gt;) and generating business summaries/analysis (&lt;code&gt;owner&lt;/code&gt;). &lt;em&gt;This directly combats operational chaos and slow data entry.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Product Philosophy: The Justification for Manual Workflows&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;WhatThePack&lt;/code&gt; intentionally does not automate customer chat or payment verification. This is a deliberate design philosophy essential for the D2C/Social Commerce target market.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Preserving the "Human Touch" (High-Touch):&lt;/strong&gt; Social commerce brands are built on personal conversations. Customers &lt;em&gt;want&lt;/em&gt; to ask, "Is this material comfortable?" A rigid bot would destroy this personal experience. In this model, the &lt;code&gt;admin&lt;/code&gt; is a &lt;em&gt;Human Customer Service&lt;/em&gt; representative, not a data operator.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Market Reality (Trust in Payments):&lt;/strong&gt; In many markets, "Manual Transfer + Send Proof" is the most common and trusted payment method for SMEs. It maximizes profit (zero payment gateway fees) and aligns with existing customer behavior.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Focusing on the Real Problem:&lt;/strong&gt; The biggest problem for sellers is NOT replying to chats. It's &lt;strong&gt;what happens &lt;em&gt;after&lt;/em&gt; the chat is closed&lt;/strong&gt;: the logistics chaos and the &lt;strong&gt;security nightmare&lt;/strong&gt; of delegating that chaos. &lt;code&gt;WhatThePack&lt;/code&gt; is laser-focused on solving that core problem.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Target Audience&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Business Type:&lt;/strong&gt; D2C sellers who &lt;em&gt;avoid&lt;/em&gt; marketplaces to maximize their profit. (e.g., independent fashion brands, jewelry, hobbies, or thrift stores on IG/WA/TikTok).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business Scale:&lt;/strong&gt; Growing Small-to-Medium Businesses (SMEs). Perfect for the "Overwhelmed Solopreneur" hiring their first staff, or small teams (2-5 people) needing a clear separation of duties.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Comparison &amp;amp; Advantages vs. Marketplaces&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This platform is designed for sellers who &lt;em&gt;avoid&lt;/em&gt; marketplaces. Here's why it's a superior model for them:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Marketplace (Amazon, Shopee)&lt;/th&gt;
&lt;th&gt;&lt;code&gt;WhatThePack.today&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Profit Margin&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Low.&lt;/strong&gt; Slashed by marketplace commissions (5-10%).&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;100% Profit.&lt;/strong&gt; No sales commissions.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Customer Data&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Owned by Marketplace.&lt;/strong&gt; You cannot re-market.&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Owned by You.&lt;/strong&gt; You build your own customer data asset.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Staff Security&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Basic.&lt;/strong&gt; Generic admin roles.&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Granular &amp;amp; Secure (Auth0).&lt;/strong&gt; (&lt;code&gt;owner&lt;/code&gt;, &lt;code&gt;admin&lt;/code&gt;, &lt;code&gt;packer&lt;/code&gt;) roles with totally separate UIs &amp;amp; data.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;API Control&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Locked-in.&lt;/strong&gt; You must use their payment &amp;amp; shipping.&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Open &amp;amp; Secure (Auth0 Organization Metadata).&lt;/strong&gt; "Bring Your Own Courier" (via ShipEngine) &amp;amp; secure your API key.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Warehouse Ops&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Manual.&lt;/strong&gt; &lt;code&gt;Packer&lt;/code&gt; must view a screen.&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Agentic (VAPI.ai).&lt;/strong&gt; &lt;code&gt;Packer&lt;/code&gt; can work &lt;em&gt;hands-free&lt;/em&gt; via voice commands.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Business Intel&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Generic.&lt;/strong&gt; Basic sales analytics.&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Specific &amp;amp; Secure (Auth0 RAG).&lt;/strong&gt; &lt;code&gt;Owner&lt;/code&gt; sees profit, &lt;code&gt;Packer&lt;/code&gt; sees SOPs. Same data, different views.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Demo&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://whatthepack.today" rel="noopener noreferrer"&gt;https://whatthepack.today&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/rokimiftah/whatthepack.today" rel="noopener noreferrer"&gt;https://github.com/rokimiftah/whatthepack.today&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Owner Dashboard:&lt;/strong&gt; Financial KPIs, Staff Management (Invite form), Integrations page showing ShipEngine connected via Organization Metadata.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Admin Dashboard:&lt;/strong&gt; Order entry form with "Paste Chat to Auto-fill" button and order list.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Packer Dashboard:&lt;/strong&gt; Packing Queue view on a tablet/mobile, highlighting the VAPI.ai voice interface prompt.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Auth0 Configuration:&lt;/strong&gt; Screenshots showing: Auth0 Roles (&lt;code&gt;owner&lt;/code&gt;, &lt;code&gt;admin&lt;/code&gt;, &lt;code&gt;packer&lt;/code&gt;), Auth0 Organizations list, Organization Metadata configuration for ShipEngine API.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Example Email Notification:&lt;/strong&gt; Screenshot of the "CRITICAL STOCK ALERT" email sent via Resend.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Auth0 Enrollment Email:&lt;/strong&gt; Screenshot of the invitation email received by a new staff member.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  🎮 Try It Yourself
&lt;/h3&gt;

&lt;p&gt;Test users are pre-configured. &lt;strong&gt;Password:&lt;/strong&gt; &lt;code&gt;A!1aaaaa&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;*Note:&lt;/strong&gt; For demo purposes, test users have pre-set passwords. The actual secure onboarding flow involves the owner inviting staff via email, and the staff member setting their own private password via an Auth0 enrollment link.*&lt;/p&gt;

&lt;p&gt;&lt;a href="https://thrift-store.whatthepack.today" rel="noopener noreferrer"&gt;https://thrift-store.whatthepack.today&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Email&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Organization&lt;/th&gt;
&lt;th&gt;Key Permissions&lt;/th&gt;
&lt;th&gt;Username (Example)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;owner-thrift-store@whatthepack.today&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;owner&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Store A&lt;/td&gt;
&lt;td&gt;Connects APIs, Sees Profit, Manages Staff, VAPI (Insight)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;owner&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;admin-thrift-store@whatthepack.today&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;admin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Store A&lt;/td&gt;
&lt;td&gt;Creates Orders, Sees Order Status&lt;/td&gt;
&lt;td&gt;&lt;code&gt;lisa_admin&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;packer-thrift-store@whatthepack.today&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;packer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Store A&lt;/td&gt;
&lt;td&gt;Sees Packing Queue, VAPI (Action Mode)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;john_packer&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Try These Scenarios:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Secure Staff Onboarding (Simulated):&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Login as &lt;code&gt;owner-thrift-store@whatthepack.today&lt;/code&gt; → Go to "Manage Staff" → Click "Invite Staff".&lt;/li&gt;
&lt;li&gt;Enter a staff email (use a real email you can access to see the Auth0 invite), assign role &lt;code&gt;packer&lt;/code&gt;, username base &lt;code&gt;test&lt;/code&gt;. Confirm username &lt;code&gt;test_packer&lt;/code&gt;. Click "Send Invite".&lt;/li&gt;
&lt;li&gt;Check your email for the Auth0 enrollment link and follow it to set a password.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Secure API Delegation (The Core Loop):&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Login as &lt;code&gt;owner-thrift-store@whatthepack.today&lt;/code&gt; → Go to "Integrations" → Connect your ShipEngine TEST API key.&lt;/li&gt;
&lt;li&gt;Login as &lt;code&gt;admin-thrift-store@whatthepack.today&lt;/code&gt; (using username &lt;code&gt;lisa_admin&lt;/code&gt;) → Create a new order.&lt;/li&gt;
&lt;li&gt;Login as &lt;code&gt;packer-thrift-store@whatthepack.today&lt;/code&gt; (using username &lt;code&gt;john_packer&lt;/code&gt;) → Use VAPI: "Vapi, next order."&lt;/li&gt;
&lt;li&gt;VAPI will read the order. Say: "Finished packing, weight 300 grams."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Result:&lt;/strong&gt; The AI Agent buys the label &lt;em&gt;using the owner's key&lt;/em&gt;. The &lt;code&gt;packer&lt;/code&gt; never sees it. The &lt;code&gt;admin&lt;/code&gt; will see the tracking number appear.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;RAG - Role-Based Knowledge:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Login as &lt;code&gt;packer-thrift-store@whatthepack.today&lt;/code&gt; → Ask VAPI: "How do I pack SKU123?" → &lt;strong&gt;AI Response:&lt;/strong&gt; "Fold 3 times, use polymailer M."&lt;/li&gt;
&lt;li&gt;Now ask: "How much profit did we make on SKU123?" → &lt;strong&gt;AI Response:&lt;/strong&gt; "Sorry, you are not authorized to access financial information."&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;RAG - Owner Insight:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Login as &lt;code&gt;owner-thrift-store@whatthepack.today&lt;/code&gt; → Ask VAPI: "Vapi, read my daily briefing." → &lt;strong&gt;AI Response:&lt;/strong&gt; "Good morning. You had 15 orders, with an estimated profit of $145. Stock for 'Black T-Shirt' is low."&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Multi-Tenancy Isolation:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Login as &lt;code&gt;owner@store-b.com&lt;/code&gt; → You will see &lt;strong&gt;zero&lt;/strong&gt; orders or data from &lt;code&gt;Store A&lt;/code&gt;. Your dashboard is completely isolated.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Detailed Feature Matrix per Role&lt;/strong&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;owner&lt;/code&gt; (The Strategist)&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;admin&lt;/code&gt; (The Operator)&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;packer&lt;/code&gt; (The Executor)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Login &amp;amp; Dashboard&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Login via &lt;code&gt;store-name...&lt;/code&gt;.&lt;/strong&gt;&lt;br&gt;Full Dashboard: Financial KPIs, AI Analytics, Staff Logs.&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Login via Username&lt;/strong&gt; (&lt;code&gt;name_role&lt;/code&gt;)&lt;br&gt;Limited Dashboard: "Order Management" only.&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Login via Username&lt;/strong&gt; (&lt;code&gt;name_role&lt;/code&gt;)&lt;br&gt;Hyper-Limited Dashboard: "Packing Queue" only.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Staff Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;Yes&lt;/strong&gt; (&lt;strong&gt;Invite&lt;/strong&gt; &amp;amp; Remove &lt;code&gt;admin&lt;/code&gt; / &lt;code&gt;packer&lt;/code&gt; via email enrollment).&lt;/td&gt;
&lt;td&gt;❌ &lt;strong&gt;No&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;❌ &lt;strong&gt;No&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;API Integration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;Yes&lt;/strong&gt; (Connects &lt;strong&gt;ShipEngine&lt;/strong&gt; API key via &lt;strong&gt;Auth0 Organization Metadata&lt;/strong&gt;).&lt;/td&gt;
&lt;td&gt;❌ &lt;strong&gt;No&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;❌ &lt;strong&gt;No&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Product Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;Yes&lt;/strong&gt; (Upload/Edit Catalog &amp;amp; SOPs. Enters COGS, Sell Price, Bin Location).&lt;/td&gt;
&lt;td&gt;❌ &lt;strong&gt;No&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;❌ &lt;strong&gt;No&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Order Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;Yes&lt;/strong&gt; (View &amp;amp; Edit all orders).&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;Yes&lt;/strong&gt; (Create new orders, view status).&lt;br&gt;&lt;strong&gt;LLM Feature:&lt;/strong&gt; "Paste Chat" to auto-fill form.&lt;/td&gt;
&lt;td&gt;❌ &lt;strong&gt;No&lt;/strong&gt; (Only sees &lt;code&gt;status: "paid"&lt;/code&gt; queue).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Email Notifications&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;Receives&lt;/strong&gt;&lt;br&gt;("Stock Alert," "Daily Briefing," etc. from &lt;code&gt;notifications@whatthepack.today&lt;/code&gt;).&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;Receives&lt;/strong&gt;&lt;br&gt;("Stock Alert," "Order Failed," etc.).&lt;/td&gt;
&lt;td&gt;❌ &lt;strong&gt;No&lt;/strong&gt; (Works via UI/VAPI only).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RAG (LLM) Access&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;Full Access.&lt;/strong&gt;&lt;br&gt;"What's my profit?"&lt;br&gt;"Analyze SKU123 trends."&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;Limited Access.&lt;/strong&gt;&lt;br&gt;"What's order #125 status?"&lt;br&gt;"How much stock is left for SKU123?"&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;Scoped Access.&lt;/strong&gt;&lt;br&gt;"How do I pack SKU123?"&lt;br&gt;"Where is SKU123 located?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VAPI.ai Access&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;Insight Mode (Read-Only).&lt;/strong&gt;&lt;br&gt;"Vapi, read my AI Daily Briefing."&lt;br&gt;"How is &lt;code&gt;packer&lt;/code&gt; John performing?"&lt;/td&gt;
&lt;td&gt;❌ &lt;strong&gt;No&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;Action Mode (Read-Write).&lt;/strong&gt;&lt;br&gt;"Vapi, next order."&lt;br&gt;"Finished, weight 300g."&lt;br&gt;"Stock for SKU123 is out."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Staff Analytics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;Yes.&lt;/strong&gt;&lt;br&gt;Views performance dashboard (e.g., "Avg. pack time per &lt;code&gt;packer&lt;/code&gt;").&lt;/td&gt;
&lt;td&gt;❌ &lt;strong&gt;No&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;❌ &lt;strong&gt;No&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;How I Used Auth0 for AI Agents (And Integrated AI Tools)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;My project's entire security and operational model is built on solving the "multi-layered crisis of trust" using the complete Auth0 for AI Agents framework, intelligently integrated with other key AI technologies.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Solving Organizational &amp;amp; Role-Based Trust (&lt;code&gt;Authenticate the user&lt;/code&gt;)
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Problem:&lt;/strong&gt; How to manage multiple businesses securely and enforce strict permissions between &lt;code&gt;owner&lt;/code&gt;, &lt;code&gt;admin&lt;/code&gt;, and &lt;code&gt;packer&lt;/code&gt;, especially during onboarding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;My Auth0 Solution:&lt;/strong&gt; I use &lt;strong&gt;Auth0 Organizations&lt;/strong&gt; for multi-tenancy and &lt;strong&gt;Auth0 Roles + Actions&lt;/strong&gt; to inject JWT claims. &lt;strong&gt;Crucially, staff onboarding uses Auth0's secure email enrollment triggered via the Management API.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementation:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;  &lt;span class="c1"&gt;// convex/auth.config.ts (Simplified)&lt;/span&gt;
  &lt;span class="c1"&gt;// This config tells Convex to trust Auth0 and read the custom claims.&lt;/span&gt;
  &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;providers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AUTH0_DOMAIN&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;applicationID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AUTH0_CLIENT_ID&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;jwksUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`https://&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AUTH0_DOMAIN&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/.well-known/jwks.json`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="c1"&gt;// We map the custom claims from the Auth0 Action&lt;/span&gt;
        &lt;span class="na"&gt;roleClaim&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://whatthepack.today/roles&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;organizationClaim&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://whatthepack.today/orgId&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Staff Onboarding (Auth0 Management API):&lt;/strong&gt; When the &lt;code&gt;owner&lt;/code&gt; invites a staff member via the UI, a Convex &lt;code&gt;action&lt;/code&gt; calls the Auth0 Management API. This call creates the user within the correct &lt;code&gt;Organization&lt;/code&gt;, assigns the appropriate &lt;code&gt;Role&lt;/code&gt;, and triggers Auth0 to send a secure &lt;strong&gt;enrollment/invitation email&lt;/strong&gt; to the staff member. The staff member clicks the link and sets their &lt;em&gt;own private password&lt;/em&gt;. The &lt;code&gt;owner&lt;/code&gt; never knows it.
&amp;lt;!-- end list --&amp;gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;  &lt;span class="c1"&gt;// convex/users.ts (Simplified pseudocode for invitation action)&lt;/span&gt;
  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ManagementClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;auth0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Auth0 Node SDK&lt;/span&gt;

  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./_generated/server&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;inviteStaff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;action&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="na"&gt;orgId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;identity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getUserIdentity&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="c1"&gt;// Check if inviter is owner of the org...&lt;/span&gt;

      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;management&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ManagementClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AUTH0_MGMT_DOMAIN&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;clientId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AUTH0_MGMT_CLIENT_ID&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;clientSecret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AUTH0_MGMT_CLIENT_SECRET&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;

      &lt;span class="c1"&gt;// Create user in Auth0 (password set by user via link)&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;management&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Username-Password-Authentication&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Or your DB connection&lt;/span&gt;
        &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// e.g., lisa_admin&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;

      &lt;span class="c1"&gt;// Add user to the correct organization&lt;/span&gt;
      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;management&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;organizations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addMembers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;orgId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;members&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;newUser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

      &lt;span class="c1"&gt;// Assign the role (admin or packer)&lt;/span&gt;
      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;management&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;roles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assignUsers&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;getRoleId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;users&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;newUser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

      &lt;span class="c1"&gt;// Trigger the enrollment email (change password ticket)&lt;/span&gt;
      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;management&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tickets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createPasswordChangeTicket&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;result_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`https://&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;getStoreSubdomain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;orgId&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;.whatthepack.today/login`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Redirect after password set&lt;/span&gt;
        &lt;span class="na"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;newUser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;

      &lt;span class="c1"&gt;// Store user reference in Convex DB...&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Why This Matters:&lt;/strong&gt; Provides the foundational security layer, enables granular control, and ensures staff passwords remain private via a standard, secure onboarding flow.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2. Solving Delegated Trust (&lt;code&gt;Control the tools&lt;/code&gt;)
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Problem:&lt;/strong&gt; How to let a low-privilege &lt;code&gt;packer&lt;/code&gt; perform a high-trust action (buy a shipping label) without the &lt;code&gt;owner&lt;/code&gt;'s master API key?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;My Auth0 Solution:&lt;/strong&gt; This is the star feature. The &lt;code&gt;owner&lt;/code&gt; saves their &lt;strong&gt;ShipEngine API Key&lt;/strong&gt; directly into the &lt;strong&gt;Auth0 Organization Metadata&lt;/strong&gt;. When the &lt;code&gt;packer&lt;/code&gt; gives the voice command, my AI Agent (a Convex Action) is authorized to request and &lt;em&gt;use&lt;/em&gt; that token on the organization's behalf, but the &lt;code&gt;packer&lt;/code&gt; &lt;em&gt;never&lt;/em&gt; sees it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementation:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;  &lt;span class="c1"&gt;// convex/agents/shippingAgent.ts (Simplified pseudocode)&lt;/span&gt;
  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;internalAction&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../_generated/server&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ManagementClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;auth0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;buyLabel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;internalAction&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;orderId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;orders&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="na"&gt;orgId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// 1. Get the owner's secured API key from Organization Metadata&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mgmt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ManagementClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AUTH0_DOMAIN&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;clientId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AUTH0_MGMT_CLIENT_ID&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;clientSecret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AUTH0_MGMT_CLIENT_SECRET&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;

      &lt;span class="c1"&gt;// Retrieve from Organization Metadata (encrypted at rest)&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;org&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;mgmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;organizations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByID&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;orgId&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;shipEngineApiKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;org&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;shipengine_api_key&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;shipEngineApiKey&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;API key not configured&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="c1"&gt;// 2. Use the API key to call the external API&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;shipEngine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ShipEngineClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;shipEngineApiKey&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// ShipEngine client library&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;shipEngine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;purchaseLabel&lt;/span&gt;&lt;span class="p"&gt;(...);&lt;/span&gt; &lt;span class="c1"&gt;// Add necessary order details&lt;/span&gt;

      &lt;span class="c1"&gt;// 3. Update our database&lt;/span&gt;
      &lt;span class="c1"&gt;// ... (update order with tracking number using Convex mutations)&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Why This Matters:&lt;/strong&gt; I built a true &lt;strong&gt;zero-trust, delegated-action workflow&lt;/strong&gt;. The AI agent acts as a secure proxy, enabling a low-trust user to perform a high-trust action without ever exposing the credential.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  3. Solving AI Trust &amp;amp; Providing Role-Aware Info (&lt;code&gt;Limit knowledge&lt;/code&gt;)
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Problem:&lt;/strong&gt; How to ensure the AI gives correct, role-specific answers (SOPs vs. Profit) without leaking data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;My Auth0 + LLM Solution:&lt;/strong&gt; I use Auth0's &lt;code&gt;Limit knowledge&lt;/code&gt; (RAG) principle. The AI Agent checks the user's &lt;code&gt;role&lt;/code&gt; from the Auth0 JWT &lt;em&gt;before&lt;/em&gt; querying the database for context. The LLM &lt;em&gt;only&lt;/em&gt; receives data that the specific role is authorized to see.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementation:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;  &lt;span class="c1"&gt;// convex/agents/ragAgent.ts (Simplified)&lt;/span&gt;
  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;OpenAI&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;openai&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../_generated/api&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Import API for type safety&lt;/span&gt;
  &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;query&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../_generated/server&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;openai&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;answerQuery&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;identity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getUserIdentity&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;identity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Not authenticated&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="na"&gt;contextData&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt; &lt;span class="c1"&gt;// Initialize context data&lt;/span&gt;

      &lt;span class="c1"&gt;// 2. Role-Based Data Access (Limit Knowledge)&lt;/span&gt;
      &lt;span class="c1"&gt;// Ensure Org ID filtering for multi-tenancy!&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;identity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;owner&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Owner can access financial data for analysis within their org&lt;/span&gt;
        &lt;span class="nx"&gt;contextData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;db&lt;/span&gt;
          &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;products&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withIndex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;by_orgId&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;orgId&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;identity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;orgId&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;// Use index for filtering&lt;/span&gt;
          &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;collect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Fetch relevant fields like costOfGoods, sellPrice, etc.&lt;/span&gt;
        &lt;span class="c1"&gt;// Add relevant order data for profit calculation&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;identity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;packer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Packer can ONLY access SOPs and location within their org&lt;/span&gt;
        &lt;span class="nx"&gt;contextData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;db&lt;/span&gt;
          &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;products&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withIndex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;by_orgId&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;orgId&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;identity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;orgId&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;// Use index for filtering&lt;/span&gt;
          &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;collect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Fetch relevant fields like sop_packing, warehouseLocation&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="c1"&gt;// Add case for 'admin' if they have specific RAG needs&lt;/span&gt;

      &lt;span class="c1"&gt;// Simplistic context preparation (improve with actual RAG logic - embeddings, vector search)&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;relevantContext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;contextData&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;`SKU: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, Name: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, SOP: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sop_packing&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;N/A&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="c1"&gt;// 3. The LLM only receives the pre-filtered, safe context for that Org&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;system&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`You are a helpful assistant for the WhatThePack platform. Answer based ONLY on the provided context. Context: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;relevantContext&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Why This Matters:&lt;/strong&gt; The AI's "brain" is dynamically and securely scoped based on &lt;em&gt;who&lt;/em&gt; is asking and &lt;em&gt;which organization&lt;/em&gt; they belong to. The RAG pipeline is permission-aware at the data-access layer, ensuring zero data leakage to the LLM or between tenants.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  4. Solving Warehouse Inefficiency &amp;amp; Enabling Agentic Action
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Problem:&lt;/strong&gt; Packers are slowed down by screen-switching and manual confirmations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;My VAPI.ai + AI Agent Solution:&lt;/strong&gt; I integrated &lt;strong&gt;VAPI.ai&lt;/strong&gt; as the primary interface for the &lt;code&gt;packer&lt;/code&gt;. Voice commands trigger my &lt;strong&gt;AI Agent&lt;/strong&gt; (Convex Action), which then orchestrates the entire packing and shipping workflow (including RAG lookups and calling the Auth0 Organization Metadata).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why This Matters:&lt;/strong&gt; Creates a truly hands-free, efficient, and AI-driven warehouse operation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  5. Solving Communication Gaps
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Problem:&lt;/strong&gt; Delayed critical updates (like stockouts) between warehouse and management.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;My Resend + AI Agent Solution:&lt;/strong&gt; When the AI Agent detects a critical event (e.g., &lt;code&gt;packer&lt;/code&gt; reports "stock out" via VAPI), it triggers a Convex Action that uses the &lt;strong&gt;platform's Resend key&lt;/strong&gt; to send an instant email notification to the &lt;code&gt;owner&lt;/code&gt; and &lt;code&gt;admin&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why This Matters:&lt;/strong&gt; Ensures timely communication and proactive management.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  6. Solving Operational Chaos &amp;amp; Data Entry Burden
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Problem:&lt;/strong&gt; Admins waste time copy-pasting chat logs into order forms; Owners struggle to get quick business insights.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;My LLM Solution:&lt;/strong&gt; I leverage the &lt;strong&gt;LLM (OpenAI)&lt;/strong&gt; for:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data Extraction:&lt;/strong&gt; The "Paste Chat to Auto-fill" feature on the &lt;code&gt;admin&lt;/code&gt;'s order form.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Summarization &amp;amp; Analysis:&lt;/strong&gt; The "AI Daily Briefing" and "Business Analyst" features for the &lt;code&gt;owner&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Why This Matters:&lt;/strong&gt; Directly reduces manual labor and provides actionable intelligence.&lt;/li&gt;

&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Technical Architecture Summary&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Framework:&lt;/strong&gt; React 19 (Frontend), Convex (Backend, DB, Serverless Functions)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication:&lt;/strong&gt; Auth0 (Universal Login, Organizations, Roles, Actions, Organization Metadata)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Voice AI:&lt;/strong&gt; VAPI.ai (Agentic voice interface for &lt;code&gt;packer&lt;/code&gt; and &lt;code&gt;owner&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logistics API:&lt;/strong&gt; ShipEngine (Purchasing labels with &lt;code&gt;owner&lt;/code&gt;'s key)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build Tool:&lt;/strong&gt; Rsbuild&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Model:&lt;/strong&gt; OpenAI (Powered by platform key, used for RAG, Summarization, Analysis)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notifications:&lt;/strong&gt; Resend (Powered by platform key, for stock alerts)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Styling:&lt;/strong&gt; Mantine UI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code Quality&lt;/strong&gt;: Biome (Linting), Prettier (Formatting), TypeScript strict mode&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Complete Workflows&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Flow 1: Setup &amp;amp; Data Upload (By &lt;code&gt;Owner&lt;/code&gt;, One-Time)&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;code&gt;Owner&lt;/code&gt; signs up. Auth0 creates a new &lt;code&gt;Organization&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt; &lt;code&gt;Owner&lt;/code&gt; is directed to their unique subdomain: &lt;code&gt;store-name.whatthepack.today&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Integration:&lt;/strong&gt; &lt;code&gt;Owner&lt;/code&gt; goes to "Integrations" and sees only one button: &lt;strong&gt;"Connect ShipEngine"&lt;/strong&gt;. They enter their ShipEngine API Key, which is stored securely in the &lt;strong&gt;Auth0 Organization Metadata&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Data:&lt;/strong&gt; &lt;code&gt;Owner&lt;/code&gt; uploads their Product Catalog CSV (SKU, Name, COGS, Sell Price, Stock, Bin Location, Packing SOP).&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Background (LLM):&lt;/strong&gt; A Convex &lt;code&gt;action&lt;/code&gt; triggers, using the &lt;em&gt;platform's&lt;/em&gt; OpenAI key to create RAG &lt;em&gt;embeddings&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Staff Onboarding:&lt;/strong&gt; &lt;code&gt;Owner&lt;/code&gt; goes to "Manage Staff" -&amp;gt; "Invite New Staff".&lt;/li&gt;
&lt;li&gt; &lt;code&gt;Owner&lt;/code&gt; enters the staff member's &lt;strong&gt;Email&lt;/strong&gt; (&lt;code&gt;lisa.admin@email.com&lt;/code&gt;), assigns a &lt;strong&gt;Role&lt;/strong&gt; (&lt;code&gt;admin&lt;/code&gt;), and optionally a &lt;strong&gt;Username Base&lt;/strong&gt; (&lt;code&gt;lisa&lt;/code&gt;). System confirms &lt;code&gt;lisa_admin&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt; &lt;code&gt;Owner&lt;/code&gt; clicks "Send Invite".&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Backend (Auth0 Management API):&lt;/strong&gt; Convex calls Auth0 to create the user (&lt;code&gt;lisa_admin&lt;/code&gt;) in the &lt;code&gt;Organization&lt;/code&gt; and trigger Auth0's &lt;strong&gt;email enrollment flow&lt;/strong&gt; to &lt;code&gt;lisa.employee@email.com&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Staff Experience:&lt;/strong&gt; Lisa receives an Auth0 email, clicks the link, and &lt;strong&gt;sets her own private password&lt;/strong&gt;. &lt;code&gt;Owner&lt;/code&gt; invites &lt;code&gt;john.packer@email.com&lt;/code&gt; similarly for the &lt;code&gt;packer&lt;/code&gt; role (username &lt;code&gt;john_packer&lt;/code&gt;).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Flow 2: Daily Order Processing (Manual Admin -&amp;gt; AI Logistics)&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;code&gt;Admin&lt;/code&gt; Lisa logs in using username &lt;code&gt;lisa_admin&lt;/code&gt; and her private password. She sees the "Order Management" dashboard.&lt;/li&gt;
&lt;li&gt; (Outside the app) Lisa handles customer chat and manually verifies payment.&lt;/li&gt;
&lt;li&gt; In &lt;code&gt;WhatThePack&lt;/code&gt;, Lisa clicks "Create New Order".&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;LLM Feature:&lt;/strong&gt; She pastes the final chat confirmation. The &lt;em&gt;platform's&lt;/em&gt; LLM extracts details to &lt;strong&gt;auto-fill&lt;/strong&gt; the draft form.&lt;/li&gt;
&lt;li&gt; Lisa verifies, selects SKU123, and clicks &lt;strong&gt;"Send to Warehouse"&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; Order #125 (&lt;code&gt;status: "paid"&lt;/code&gt;) appears &lt;strong&gt;in real-time&lt;/strong&gt; on &lt;code&gt;Packer&lt;/code&gt; John's screen.&lt;/li&gt;
&lt;li&gt; John starts the &lt;strong&gt;VAPI Voice Workflow&lt;/strong&gt; (see Feature Matrix).&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;VAPI:&lt;/strong&gt; "Finished packing. Weight 300 grams."&lt;/li&gt;
&lt;li&gt; The &lt;strong&gt;AI Logistics Agent (Convex)&lt;/strong&gt; is triggered:

&lt;ul&gt;
&lt;li&gt;Calls &lt;strong&gt;Auth0 Organization Metadata&lt;/strong&gt; -&amp;gt; gets &lt;code&gt;owner&lt;/code&gt;'s ShipEngine token for this &lt;code&gt;orgId&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Calls &lt;strong&gt;ShipEngine&lt;/strong&gt; -&amp;gt; buys the cheapest label (billing the &lt;code&gt;owner&lt;/code&gt;'s account).&lt;/li&gt;
&lt;li&gt;Updates &lt;code&gt;order&lt;/code&gt; in Convex with tracking number.&lt;/li&gt;
&lt;li&gt;Updates &lt;code&gt;product&lt;/code&gt; stock in Convex.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VAPI&lt;/strong&gt; confirms to John: "Label printed. Stock is now 14."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time (Admin):&lt;/strong&gt; Lisa's screen updates: Order #125 -&amp;gt; "Shipped", tracking number appears.&lt;/li&gt;
&lt;li&gt;Lisa (manually) sends the tracking number to the customer.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Flow 3: Proactive Notification Workflow (AI -&amp;gt; Human)&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;code&gt;Packer&lt;/code&gt; John (via VAPI): "Vapi, stock for SKU123 is out."&lt;/li&gt;
&lt;li&gt; AI Agent updates &lt;code&gt;product&lt;/code&gt; stock to 0.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;AI Agent (Automatic):&lt;/strong&gt; Triggers a Notification &lt;em&gt;action&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt; &lt;em&gt;Action&lt;/em&gt; uses the &lt;strong&gt;platform's Resend key&lt;/strong&gt; to send an email from &lt;code&gt;notifications@whatthepack.today&lt;/code&gt; to &lt;code&gt;owner-thrift-store@whatthepack.today&lt;/code&gt; and &lt;code&gt;lisa-thrift-store@whatthepack.today&lt;/code&gt;:
&amp;gt; &lt;strong&gt;Subject: CRITICAL STOCK ALERT - SKU123 (Red Shirt)&lt;/strong&gt;
&amp;gt; Hello,
&amp;gt; Stock for SKU123 (Red Shirt) was just reported as 0 by &lt;code&gt;packer&lt;/code&gt; John on October 19, 11:15.
&amp;gt; Please contact your vendor immediately to reorder.&lt;/li&gt;
&lt;li&gt; &lt;code&gt;Owner&lt;/code&gt; and &lt;code&gt;admin&lt;/code&gt; are instantly notified.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Flow 4: &lt;code&gt;Owner&lt;/code&gt; Monitoring Workflow (Mobile)&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;code&gt;Owner&lt;/code&gt; opens VAPI on their phone (logged in as &lt;code&gt;owner&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;&lt;code&gt;Owner&lt;/code&gt; (via VAPI):&lt;/strong&gt; "Vapi, read me my AI Daily Briefing."&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;AI (VAPI + RAG + Platform LLM):&lt;/strong&gt; Provides the summary.&lt;/li&gt;
&lt;li&gt; &lt;code&gt;Owner&lt;/code&gt; is informed and ends the call.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Lessons Learned and Takeaways&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Agentic AI is about &lt;em&gt;Secure Delegation&lt;/em&gt;:&lt;/strong&gt; The synergy between Auth0 Organization Metadata and AI Agents (triggered by VAPI) is key to enabling low-trust users to perform high-trust actions securely.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Security Must Be Proactive (RAG + Roles):&lt;/strong&gt; Auth0's &lt;code&gt;Limit knowledge&lt;/code&gt; principle, combined with Role-Based Access and Organization filtering, is crucial for preventing data leaks &lt;em&gt;before&lt;/em&gt; they reach the LLM, especially in a multi-tenant environment.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Auth0's Stack is the Key:&lt;/strong&gt; This project would be impossible to secure properly without the combination of &lt;strong&gt;Organizations&lt;/strong&gt; (for tenancy), &lt;strong&gt;Roles&lt;/strong&gt; (for permissions), &lt;strong&gt;Actions&lt;/strong&gt; (for claims), and the &lt;strong&gt;Organization Metadata&lt;/strong&gt; (for delegated credentials). This stack is the perfect solution for building secure, multi-tenant AI applications.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;WhatThePack.today&lt;/code&gt; demonstrates a real-world, scalable solution to a critical problem for D2C businesses. By leveraging the full power of the Auth0 for AI Agents suite, I built a platform that enables secure delegation, provides role-aware intelligence, enforces multi-tenant data isolation, and creates a truly "agentic," efficient workflow for logistics.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>auth0challenge</category>
      <category>ai</category>
      <category>authentication</category>
    </item>
  </channel>
</rss>
