Generated: 2025-10-22 Project: ShopCall.ai (AI-powered calling system for e-commerce) Repositories:
shopcall.ai-main (React/Vite/TypeScript)shopcall.ai-backend-main (Express.js/Node.js)Location: shopcall.ai-main/src/components/OnboardingContent.tsx
Status: UI complete, backend integration missing
Issues:
handleFinish() function only redirects to homepage (line 100-108)Missing Backend Endpoints:
POST /api/onboarding/complete
Body: {
shopifyUrl: string,
selectedPhone: string,
selectedPackage: string
}
Impact: Users can complete onboarding but nothing is saved. On next login, they'll need to onboard again.
Effort: Medium (2-3 days)
Location: shopcall.ai-backend-main/api/index.js:532-597
Status: OAuth flow works, but tokens not persisted
Issues:
stores table after successful OAuthhttps://shopcall.ai/) instead of dashboardCurrent Code:
// Line 586
// TODO: Save tokenJson.access_token securely
console.log(`Successfully authenticated shop: ${normalizedShop}`);
res.redirect(`https://shopcall.ai/`);
Required Fix:
// Save to database
const { data: storeData, error: storeError } = await supabase
.from('stores')
.insert({
user_id: nonceData.userId, // from nonce
platform_name: 'shopify',
store_name: normalizedShop.split('.')[0],
store_url: `https://${normalizedShop}`,
access_token: tokenJson.access_token,
scopes: tokenJson.scope.split(','),
connected_at: new Date().toISOString()
});
res.redirect(`https://shopcall.ai/dashboard?connected=true`);
Impact: Shopify stores cannot be properly connected. OAuth succeeds but connection is lost immediately.
Effort: Small (1 day)
Location: shopcall.ai-main/src/components/PhoneNumbersContent.tsx
Status: Complete UI mockup with static data
Issues:
connectedShops, availableCountries, carriers arraysMissing Backend Endpoints:
GET /api/phone-numbers # List phone numbers for user
POST /api/phone-numbers # Purchase new phone number
PUT /api/phone-numbers/:id/assign # Assign number to store
DELETE /api/phone-numbers/:id # Release phone number
POST /api/carriers/connect # Connect external carrier (Twilio, etc.)
GET /api/carriers # List connected carriers
Missing Database Tables:
CREATE TABLE phone_numbers (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES profiles(id),
store_id UUID REFERENCES stores(id),
number VARCHAR(20) NOT NULL,
country VARCHAR(2) NOT NULL,
type VARCHAR(20), -- 'local', 'toll-free'
carrier VARCHAR(50), -- 'internal', 'twilio', 'telnyx', etc.
status VARCHAR(20), -- 'active', 'pending_kyc', 'inactive'
monthly_cost DECIMAL(10,2),
carrier_config JSONB, -- carrier-specific data
created_at TIMESTAMP DEFAULT NOW(),
assigned_at TIMESTAMP
);
CREATE TABLE carrier_integrations (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES profiles(id),
carrier_name VARCHAR(50), -- 'twilio', 'telnyx', 'vonage', 'zadarma'
credentials JSONB, -- encrypted API keys
is_active BOOLEAN DEFAULT true,
created_at TIMESTAMP DEFAULT NOW()
);
Impact: Core feature completely non-functional. Users cannot set up phone numbers which are essential for the service to work.
Effort: Large (5-7 days including carrier API integrations)
Location: shopcall.ai-main/src/components/AIConfigContent.tsx
Status: Complete UI for AI settings, no backend persistence
Issues:
Missing Backend Endpoints:
GET /api/ai-config/:storeId # Get AI config for store
POST /api/ai-config/:storeId # Create/update AI config
POST /api/ai-config/:storeId/test # Test AI configuration
POST /api/ai-config/:storeId/sync # Sync store data (products, policies)
POST /api/ai-config/:storeId/copy # Copy config from another store
Missing Database Table:
CREATE TABLE ai_configurations (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
store_id UUID REFERENCES stores(id) UNIQUE,
-- Voice settings
voice_type VARCHAR(50) DEFAULT 'sarah',
speaking_speed VARCHAR(20) DEFAULT 'normal',
accent VARCHAR(50) DEFAULT 'us-english',
-- Conversation behavior
greeting_message TEXT,
business_hours_mode BOOLEAN DEFAULT true,
local_currency_support BOOLEAN DEFAULT true,
escalation_policy VARCHAR(20) DEFAULT 'medium',
-- Knowledge base
product_catalog_synced BOOLEAN DEFAULT false,
product_catalog_last_sync TIMESTAMP,
store_policies TEXT,
faq_database JSONB,
custom_knowledge JSONB,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
Impact: AI cannot be customized per webshop. All stores would use default settings, making the service less valuable.
Effort: Medium-Large (4-5 days)
Location: shopcall.ai-main/src/components/AnalyticsContent.tsx
Status: Complete UI with charts, all using static data
Issues:
weeklyData, resolutionData, callDurationData, topIntentsData, etc. - all hardcoded (lines 6-58)Missing Backend Endpoints:
GET /api/analytics/overview?timeRange=week # KPIs and overview charts
GET /api/analytics/trends?timeRange=month # Trend analysis
GET /api/analytics/performance?timeRange=week # Performance metrics
GET /api/analytics/call-volume?groupBy=day # Call volume data
GET /api/analytics/intents?limit=10 # Top call intents
Required Aggregation Logic:
Impact: Dashboard shows misleading fake data. Users cannot make data-driven decisions.
Effort: Medium (3-4 days for proper aggregation queries)
Location:
shopcall.ai-main/src/components/KPICards.tsxshopcall.ai-main/src/components/ChartsSection.tsxshopcall.ai-main/src/components/RecentCallsTable.tsxStatus: Complete UI, static mock data
Issues:
Missing Backend Endpoint:
GET /api/dashboard/summary?timeRange=24h
Response: {
totalCalls: number,
resolvedCalls: number,
activeConversations: number,
avgResponseTime: number,
resolutionRate: number,
avgCallDuration: number,
totalCost: number,
chartData: {
callVolume: [...],
resolutionRate: [...]
},
recentCalls: [...]
}
Impact: Dashboard is just a demo, not showing real data.
Effort: Small-Medium (2-3 days, reuses analytics logic)
Location: shopcall.ai-main/src/components/IntegrationsContent.tsx
Status: Backend APIs exist, frontend not connected
Issues:
GET /api/stores (line 800)PUT /api/stores/:id (line 855)DELETE /api/stores/:id (line 893)connectedShops array (lines 10-86)/api/storesRequired Frontend Changes:
const [stores, setStores] = useState([]);
useEffect(() => {
const fetchStores = async () => {
const response = await fetch('https://shopcall-ai-backend.vercel.app/api/stores', {
headers: { 'Authorization': `Bearer ${token}` }
});
const data = await response.json();
setStores(data.stores);
};
fetchStores();
}, []);
Impact: Users see fake store list instead of their actual connected stores.
Effort: Small (1 day to connect frontend to existing backend)
Location: shopcall.ai-main/src/components/CallDetailsModal.tsx
Status: UI exists, no audio implementation
Issues:
recording_url field in call_logs table not usedRequired Implementation:
const [audio] = useState(new Audio());
const [isPlaying, setIsPlaying] = useState(false);
const [currentTime, setCurrentTime] = useState(0);
const [duration, setDuration] = useState(0);
useEffect(() => {
if (call.recording_url) {
audio.src = call.recording_url;
audio.addEventListener('loadedmetadata', () => {
setDuration(audio.duration);
});
audio.addEventListener('timeupdate', () => {
setCurrentTime(audio.currentTime);
});
}
}, [call.recording_url]);
const handlePlayPause = () => {
if (isPlaying) {
audio.pause();
} else {
audio.play();
}
setIsPlaying(!isPlaying);
};
Impact: Cannot review call recordings, limiting quality assurance capabilities.
Effort: Small (1-2 days)
Location: shopcall.ai-backend-main/api/index.js:463-529
Status: OAuth callback implemented, token storage works
Issues:
Missing Features:
Impact: WooCommerce support advertised but not fully functional.
Effort: Medium (3-4 days for full WooCommerce integration)
Location: Multiple components
Issues:
CallLogsContent.tsx:118-124)CallLogsContent.tsx:126-129)CallLogsContent.tsx:107-111)Required Backend Changes:
GET /api/call-logs?search=xxx&status=completed&outcome=resolved&dateFrom=...&dateTo=...
Required Frontend Changes:
Impact: Users must manually scroll through all calls, poor UX for high-volume users.
Effort: Small-Medium (2-3 days)
Location: shopcall.ai-main/src/components/CallLogsContent.tsx:102-105
Status: Button exists, no implementation
Issues:
Missing Backend Endpoint:
GET /api/call-logs/export?format=csv&dateFrom=...&dateTo=...
Response: CSV/PDF file download
Required Features:
Impact: Users cannot extract data for external analysis or reporting.
Effort: Small (1-2 days)
Status: Not implemented
Issues:
Required Implementation:
Missing Infrastructure:
// Backend
const io = require('socket.io')(server);
io.on('connection', (socket) => {
socket.on('authenticate', async (token) => {
// Validate token and join user room
socket.join(`user_${userId}`);
});
});
// Emit on new call
io.to(`user_${userId}`).emit('new_call', callData);
Impact: Users miss real-time updates, dashboard feels outdated.
Effort: Medium (3-4 days for WebSocket implementation)
Status: Not implemented
Issues:
profiles table exists but no edit endpointMissing Endpoints:
GET /api/profile # Get current user profile
PUT /api/profile # Update profile
POST /api/profile/change-password # Change password
DELETE /api/profile # Delete account
Missing Frontend Pages:
/settings/profile - Profile edit page/settings/security - Password change/settings/account - Account managementImpact: Users stuck with initial registration data. Cannot fix typos or update information.
Effort: Small-Medium (2-3 days)
Location: OnboardingContent.tsx:31-80 - Package selection UI
Status: Package selection UI only
Issues:
Missing Implementation:
Missing Endpoints:
POST /api/subscriptions/create # Create subscription
GET /api/subscriptions/current # Get current subscription
POST /api/subscriptions/cancel # Cancel subscription
POST /api/subscriptions/upgrade # Upgrade plan
GET /api/invoices # List invoices
Missing Database Table:
CREATE TABLE subscriptions (
id UUID PRIMARY KEY,
user_id UUID REFERENCES profiles(id),
plan_id VARCHAR(50), -- 'free-trial', 'starter', 'professional'
status VARCHAR(20), -- 'active', 'cancelled', 'past_due'
stripe_subscription_id VARCHAR(100),
current_period_start TIMESTAMP,
current_period_end TIMESTAMP,
cancel_at_period_end BOOLEAN,
created_at TIMESTAMP DEFAULT NOW()
);
Impact: Cannot monetize the service. All users have unlimited access.
Effort: Large (5-7 days for full payment integration)
Status: Only OTP emails implemented
Issues:
sendOTPEmail function exists)Missing Email Templates:
Required Implementation:
Impact: Users not notified of important events. Must check dashboard constantly.
Effort: Medium (3-4 days)
Missing Features:
Impact: Basic AI calling only. Limited flexibility.
Effort: Large (ongoing feature development)
Status: Not implemented (single-user only)
Missing Features:
Required Database Tables:
CREATE TABLE team_members (
id UUID PRIMARY KEY,
organization_id UUID,
user_id UUID REFERENCES profiles(id),
role VARCHAR(20), -- 'owner', 'admin', 'agent', 'viewer'
permissions JSONB,
invited_by UUID,
invited_at TIMESTAMP,
joined_at TIMESTAMP
);
CREATE TABLE organizations (
id UUID PRIMARY KEY,
name VARCHAR(255),
owner_id UUID REFERENCES profiles(id),
created_at TIMESTAMP
);
Impact: Only suitable for solo users. Cannot scale to businesses with teams.
Effort: Large (7-10 days)
Status: Not implemented
Missing:
Required:
Impact: Cannot integrate with external tools. Limited extensibility.
Effort: Medium (3-5 days for basic API docs + key management)
Status: No tests exist
Missing:
Required:
Impact: High risk of bugs, difficult to refactor safely.
Effort: Ongoing (20-30% of development time)
Status: Shopify & WooCommerce partially implemented
Missing Platforms:
Required:
Impact: Limited market reach. Many e-commerce users excluded.
Effort: Large per platform (4-5 days each)
shopcall.ai-backend-main/api/index.js)Line 586: // TODO: Save tokenJson.access_token securely
Line 604: // TODO: Retrieve access token from database
Line 677: // TODO: Implement your business logic here
| Priority | Category | Count | Estimated Effort |
|---|---|---|---|
| 🔴 Critical | Core functionality blockers | 4 | 12-15 days |
| 🟡 High | Major features incomplete | 5 | 15-20 days |
| 🟢 Medium | UX and data issues | 6 | 15-20 days |
| 🔵 Low | Enhancement features | 5 | 40-50 days |
| TOTAL | 20 | 82-105 days |
/api/stores endpointsIn-memory state stores (pendingSignups, nonceStore Maps in api/index.js)
Hardcoded URLs in frontend
https://shopcall-ai-backend.vercel.app (should be env variable)https://shopcall.ai (should be env variable)No database migrations system
No error tracking
No API versioning
/api/v1/...No rate limiting
| Feature Category | UI Complete | Backend Complete | Integration Complete | Overall |
|---|---|---|---|---|
| Authentication | ✅ 100% | ✅ 100% | ✅ 100% | ✅ 100% |
| Onboarding | ✅ 100% | ❌ 0% | ❌ 0% | ⚠️ 33% |
| Dashboard | ✅ 100% | ⚠️ 50% | ❌ 30% | ⚠️ 60% |
| Call Logs | ✅ 100% | ✅ 90% | ✅ 90% | ✅ 93% |
| Analytics | ✅ 100% | ❌ 0% | ❌ 0% | ⚠️ 33% |
| Integrations | ✅ 100% | ✅ 80% | ❌ 20% | ⚠️ 67% |
| Phone Numbers | ✅ 100% | ❌ 0% | ❌ 0% | ⚠️ 33% |
| AI Config | ✅ 100% | ❌ 0% | ❌ 0% | ⚠️ 33% |
| User Profile | ❌ 0% | ⚠️ 50% | ❌ 0% | ❌ 17% |
| Payments | ⚠️ 50% | ❌ 0% | ❌ 0% | ❌ 17% |
| OVERALL | ⚠️ 48% |
GDPR Webhooks Not Implemented (line 677)
No API Key Encryption
No Session Management
No CORS Configuration Per Environment
app.use(cors())Email Credentials in Code
Report End - For questions or clarifications, refer to source code locations provided in each section.