This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
ShopCall.ai is an AI-powered calling system integrated with e-commerce platforms. The project consists of:
/data/shopcall/
├── shopcall.ai-main/ # Frontend application
│ ├── src/
│ │ ├── components/ # React components
│ │ │ ├── context/ # React context providers (AuthContext)
│ │ │ └── ui/ # shadcn-ui component library
│ │ ├── pages/ # Route pages (Dashboard, Login, CallLogs, etc.)
│ │ ├── hooks/ # Custom React hooks
│ │ ├── lib/ # Utility functions
│ │ └── App.tsx # Main application with routing
│ └── package.json
└── supabase/ # Supabase Edge Functions
└── functions/ # Backend API functions
cd shopcall.ai-main
npm install # Install dependencies
npm run dev # Start dev server on port 8080
npm run build # Production build
npm run build:dev # Development build
npm run lint # Run ESLint
npm run preview # Preview production build
# Deploy Edge Functions
supabase functions deploy <function-name>
# Test locally
supabase functions serve
Authentication Flow:
src/components/context/AuthContext.tsx) manages global auth statesession_dataRouting Structure:
/ (Index) → Landing page
/signup → User registration
/login → User login
/otp → OTP verification
/dashboard (protected) → Main dashboard
/call-logs (protected) → Call history
/analytics (protected) → Analytics dashboard
/webshops (protected) → E-commerce integrations
/phone-numbers (protected) → Phone number management
/ai-config (protected) → AI configuration
/onboarding (protected) → User onboarding flow
/about, /privacy, /terms → Public pages
Component Organization:
src/pages/ handle routingDashboardContent.tsx) contain page logicsrc/components/ui/ are reusable shadcn componentsApp.tsxSupabase Edge Functions: Backend logic implemented as serverless Edge Functions
Authentication:
E-commerce Integrations:
oauth-woocommerce (OAuth 1.0a authentication)_shared/woocommerce-client.tsoauth-shoprenter-init, oauth-shoprenter-callbackwebhook-shoprenter-uninstallshoprenter-products, shoprenter-orders, shoprenter-customersshoprenter-syncshoprenter-scheduled-sync (automated via pg_cron)_shared/shoprenter-client.tsstores tablestores table:
- user_id: UUID (FK to auth.users)
- platform_name: text (e.g., 'shopify', 'woocommerce', 'shoprenter')
- store_name: text
- store_url: text
- api_key: text (access token for ShopRenter)
- api_secret: text (refresh token for ShopRenter)
- scopes: text[]
- alt_data: jsonb (platform-specific data, e.g., expires_at, last_sync_at)
- phone_number: text
- package: text
oauth_states table (for OAuth flow state management):
- state: text (UUID for CSRF protection)
- user_id: UUID (FK to auth.users)
- platform: text (e.g., 'shoprenter')
- shopname: text
- expires_at: timestamp
pending_shoprenter_installs table (temporary storage during OAuth):
- installation_id: text (UUID)
- shopname: text
- access_token: text
- refresh_token: text
- token_type: text
- expires_in: integer
- scopes: text[]
- expires_at: timestamp
shoprenter_products_cache table (cached product data):
- store_id: UUID (FK to stores)
- shoprenter_product_id: text
- name: text
- sku: text
- price: decimal
- currency: text
- description: text
- stock: integer
- active: boolean
- raw_data: jsonb
- last_synced_at: timestamp
shoprenter_webhooks table (webhook registrations):
- store_id: UUID (FK to stores)
- shoprenter_webhook_id: text
- event: text (e.g., 'order/create')
- callback_url: text
- is_active: boolean
- last_received_at: timestamp
- total_received: integer
sync_logs table (scheduled sync execution logs):
- id: UUID (primary key)
- sync_type: text ('manual', 'scheduled', 'webhook')
- platform: text ('shopify', 'woocommerce', 'shoprenter')
- stores_processed: integer
- results: jsonb (detailed results per store)
- started_at: timestamptz
- completed_at: timestamptz
- created_at: timestamptz
store_sync_config table (per-store sync configuration):
- id: UUID (primary key)
- store_id: UUID (FK to stores, unique)
- enabled: boolean (default: true)
- sync_frequency: text ('15min', '30min', 'hourly', '6hours', 'daily')
- last_sync_at: timestamptz
- next_sync_at: timestamptz (auto-calculated)
- sync_products: boolean (default: true)
- sync_orders: boolean (default: true)
- sync_customers: boolean (default: true)
- created_at: timestamptz
- updated_at: timestamptz
.env (shopcall.ai-main)# Supabase Configuration
VITE_SUPABASE_URL=https://ztklqodcdjeqpsvhlpud.supabase.co
VITE_SUPABASE_ANON_KEY=<anon_key>
# Backend API Base URL (Supabase Edge Functions)
VITE_API_URL=https://ztklqodcdjeqpsvhlpud.supabase.co/functions/v1
# Frontend URL (for OAuth callbacks)
VITE_FRONTEND_URL=https://shopcall.ai
.env# OAuth Configuration
SHOPIFY_API_KEY=<shopify_api_key>
SHOPIFY_API_SECRET=<shopify_api_secret>
SHOPRENTER_CLIENT_ID=<shoprenter_client_id>
SHOPRENTER_CLIENT_SECRET=<shoprenter_client_secret>
# Scheduled Sync Security
INTERNAL_SYNC_SECRET=<random_secure_secret_for_scheduled_sync>
# Email Configuration
RESEND_API_KEY=<resend_api_key>
# Frontend URL
FRONTEND_URL=https://shopcall.ai
# Supabase Configuration
SUPABASE_URL=<supabase_project_url>
SUPABASE_ANON_KEY=<supabase_anon_key>
SUPABASE_SERVICE_ROLE_KEY=<supabase_service_role_key>
Configure in Supabase Dashboard → Project Settings → Database → Custom Postgres Configuration:
app.internal_sync_secret = '<same_as_INTERNAL_SYNC_SECRET_above>'
app.supabase_url = 'https://ztklqodcdjeqpsvhlpud.supabase.co'
npm run build generates static files in dist/supabase functions deploy commandWhen making changes:
shopcall.ai-main/src/supabase/functions/<PrivateRoute> wrappersupabase/functions/stores tableFrontend uses TypeScript path alias:
@/ → ./src/Example: import { Button } from "@/components/ui/button"
The ShopRenter integration includes automated background sync capabilities using PostgreSQL's pg_cron extension.
How it works:
sync_logs tableSync Frequencies:
15min - Every 15 minutes (high-frequency updates)30min - Every 30 minuteshourly - Every hour (default, recommended)6hours - Every 6 hoursdaily - Once per dayConfiguration:
store_sync_config tableMonitoring:
sync_logs table tracks all sync executionssync_statistics view provides aggregated metricsSetup Requirements:
supabase/migrations/20250129_shoprenter_scheduled_sync.sqlsupabase functions deploy shoprenter-scheduled-syncINTERNAL_SYNC_SECRET in Edge Functions environmentsync_logs table for execution resultsManual Control:
-- Enable/disable sync for a store
SELECT set_store_sync_enabled('store-uuid', true);
-- Change sync frequency
SELECT set_store_sync_frequency('store-uuid', 'hourly');
-- View recent sync logs
SELECT * FROM sync_logs ORDER BY created_at DESC LIMIT 10;
-- View sync statistics
SELECT * FROM sync_statistics;
Security:
INTERNAL_SYNC_SECRET prevents unauthorized sync triggers