From 0817444dc58eacf321d6ccd33fcf11b7a5917107 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 22 Feb 2026 07:33:18 +0000 Subject: [PATCH] Add LICENSE, README, and Docs tab to Mission Control --- LICENSE | 21 + README.md | 61 + TODO.md | 42 + agent-team.md | 59 + app/api/command-history/route.ts | 84 ++ app/api/command-reply/route.ts | 61 + app/api/command/route.ts | 58 + app/api/site-mente/voice/route.ts | 49 +- app/api/stripe/checkout/route.ts | 84 ++ app/api/trading/traders/route.ts | 85 ++ app/api/trading/trades/route.ts | 39 + app/bosspunch/page.tsx | 515 ++++++++ app/dashboard/page.tsx | 315 +++++ app/demos/layout.tsx | 32 + app/demos/page.tsx | 1056 +---------------- app/globals.css | 8 + app/holacompi/page.tsx | 53 + app/leads/page.tsx | 337 ++++++ app/mission-control/docs/page.tsx | 31 + app/mission-control/page.tsx | 108 +- app/page.tsx | 94 ++ app/success/page.tsx | 30 + components/SiteMenteVoiceWidget.tsx | 621 +++------- .../MissionControlDashboard.tsx | 127 +- components/mission-control/MondayBoard.tsx | 261 ++++ components/mission-control/TaskCardsPanel.tsx | 279 +++++ .../mission-control/TaskHistoryPanel.tsx | 122 ++ components/mission-control/TradingChart.tsx | 356 ++++++ components/mission-control/TradingPanel.tsx | 341 ++++++ .../morning-brief/MorningBriefCalendar.tsx | 45 + components/site-mente/PricingTable.tsx | 3 +- components/site-mente/ServicesAndPricing.tsx | 210 ++-- components/stripe/PaymentButton.tsx | 99 ++ content/demos/car-rental.md | 153 +++ content/demos/clinic.md | 142 +++ content/demos/real-estate.md | 138 +++ content/demos/restaurant.md | 128 ++ content/faq-draft.md | 114 ++ content/promo-plan.md | 304 +++++ ecosystem.config.cjs | 16 + ecosystem.config.js | 16 + leads/ai-research-prompts.md | 33 + leads/benalmadena-restaurants.md | 25 + leads/carrental-research.md | 65 + leads/clinics-research.md | 57 + leads/costa-del-sol-leads.md | 69 ++ leads/import-leads.json | 25 + leads/outreach-workflow.md | 206 ++++ leads/realestate-research.md | 62 + leads/research-prompts.md | 85 ++ leads/restaurants-research.md | 55 + lib/ai/minimaxClient.ts | 79 ++ lib/ai/siteMenteAgent.ts | 9 +- lib/council/types.ts | 50 +- lib/mission-control/types.ts | 72 +- lib/morning-brief/store.tsx | 15 + lib/morning-brief/types.ts | 9 +- next.config.ts | 43 + package-lock.json | 487 +++++++- package.json | 2 + pending-commands.json | 18 + public/robots.txt | 15 + public/thoth_view.json | 70 ++ start.sh | 3 + task-history.json | 39 + test-gemini.ts | 13 + trading-traders.json | 46 + tsconfig.tsbuildinfo | 1 + 68 files changed, 6677 insertions(+), 1673 deletions(-) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 TODO.md create mode 100644 agent-team.md create mode 100644 app/api/command-history/route.ts create mode 100644 app/api/command-reply/route.ts create mode 100644 app/api/command/route.ts create mode 100644 app/api/stripe/checkout/route.ts create mode 100644 app/api/trading/traders/route.ts create mode 100644 app/api/trading/trades/route.ts create mode 100644 app/bosspunch/page.tsx create mode 100644 app/dashboard/page.tsx create mode 100644 app/demos/layout.tsx create mode 100644 app/holacompi/page.tsx create mode 100644 app/leads/page.tsx create mode 100644 app/mission-control/docs/page.tsx create mode 100644 app/success/page.tsx create mode 100644 components/mission-control/MondayBoard.tsx create mode 100644 components/mission-control/TaskCardsPanel.tsx create mode 100644 components/mission-control/TaskHistoryPanel.tsx create mode 100644 components/mission-control/TradingChart.tsx create mode 100644 components/mission-control/TradingPanel.tsx create mode 100644 components/stripe/PaymentButton.tsx create mode 100644 content/demos/car-rental.md create mode 100644 content/demos/clinic.md create mode 100644 content/demos/real-estate.md create mode 100644 content/demos/restaurant.md create mode 100644 content/faq-draft.md create mode 100644 content/promo-plan.md create mode 100644 ecosystem.config.cjs create mode 100644 ecosystem.config.js create mode 100644 leads/ai-research-prompts.md create mode 100644 leads/benalmadena-restaurants.md create mode 100644 leads/carrental-research.md create mode 100644 leads/clinics-research.md create mode 100644 leads/costa-del-sol-leads.md create mode 100644 leads/import-leads.json create mode 100644 leads/outreach-workflow.md create mode 100644 leads/realestate-research.md create mode 100644 leads/research-prompts.md create mode 100644 leads/restaurants-research.md create mode 100644 lib/ai/minimaxClient.ts create mode 100644 pending-commands.json create mode 100644 public/robots.txt create mode 100644 public/thoth_view.json create mode 100755 start.sh create mode 100644 task-history.json create mode 100644 test-gemini.ts create mode 100644 trading-traders.json create mode 100644 tsconfig.tsbuildinfo diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..a6994e2 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 SiteMente - HolaCompi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..bec8583 --- /dev/null +++ b/README.md @@ -0,0 +1,61 @@ +# SiteMente 🧠 + +AI implementation agency for local businesses in Spain. We install intelligent agents (chatbots, voice assistants, automations) on your website so they respond, book, and sell 24/7 — no human intervention needed. + +## 🏆 Why SiteMente? + +- **Setup in 48 hours** — Fast deployment, no months of work +- **ROI from day one** — Measurable results, not vague promises +- **Bilingual (ES/EN)** — Serve both Spanish and English customers +- **Specialists** — Restaurants, real estate, car rental on Costa del Sol + +## 📦 Products + +| Product | Description | Price | +|---------|-------------|-------| +| **Smart Starter** | AI Chat + Automated Bookings | €900 setup + €299/mo | +| **Smart Site** | Full Next.js website with integrated AI | €2,500 setup + €749/mo | +| **AI Growth Partner** | Multichannel (web, WhatsApp, calls) + CRM | €3,500 setup + €1,950/mo | + +## 🚀 Quick Start + +```bash +# Install dependencies +npm install + +# Run development server +npm run dev +``` + +## 🛠 Tech Stack + +- **Frontend:** Next.js 14, React, TypeScript, Tailwind CSS +- **AI:** MiniMax, Vapi (Voice) +- **Payments:** Stripe +- **Hosting:** Vercel + +## 📂 Project Structure + +``` +├── app/ # Next.js app router +│ ├── page.tsx # Main landing page +│ ├── api/ # API routes +│ │ └── site-mente/ # AI endpoints +│ └── demos/ # Vertical demo pages +├── components/ # React components +│ └── site-mente/ # SiteMente-specific +├── public/ # Static assets +└── lib/ # Utilities +``` + +## 🌐 Live Site + +👉 https://sitemente.com + +## 📄 License + +MIT — See LICENSE file + +--- + +Built with ❤️ by [HolaCompi](https://holacompi.com) diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..04766b9 --- /dev/null +++ b/TODO.md @@ -0,0 +1,42 @@ +## Demo Pages Audit - 2026-02-19 + +### Issues Found +- /demos/restaurant: Redirects to /demos?vertical=restaurant but shows **real-estate content** (wrong vertical) +- /demos/real-estate: Loads correctly, shows real-estate content ✓ +- /demos/clinic: Redirects to /demos?vertical=clinic but shows **real-estate content** (wrong vertical) +- /demos/car-rental: Redirects to /demos?vertical=car-rental but shows **real-estate content** (wrong vertical) +- All demo pages: No visible form for contact/demo request in fetched content + +### Tech Debt +- Demo pages not rendering vertical-specific content - all verticals load same real-estate page +- Need browser console check for JS errors (web_fetch doesn't capture console) +- Form fields not visible in page content - may require interactive browser check + +### Test Results +``` +✓ /demos/restaurant redirects to /demos?vertical=restaurant +✓ /demos/real-estate redirects to /demos?vertical=real-estate +✓ /demos/clinic redirects to /demos?vertical=clinic +✓ /demos/car-rental redirects to /demos?vertical=car-rental + +Results: 4 passed, 0 failed +``` +(Tests only verify redirects, not content rendering) + +--- + +## Server Migration Checklist (To Prevent Forgetting) + +### Before Migration +- [ ] Document all domains on source server +- [ ] Document all services running +- [ ] List all environment variables +- [ ] Note any external integrations (APIs, cron jobs) +- [ ] Update MEMORY.md with old VPS IP and what was on it + +### After Migration +- [ ] Verify all domains resolve to new IP +- [ ] Test all services +- [ ] Check DNS propagation +- [ ] Keep old server accessible for 48h as backup +- [ ] Update all documentation with new IP diff --git a/agent-team.md b/agent-team.md new file mode 100644 index 0000000..4598113 --- /dev/null +++ b/agent-team.md @@ -0,0 +1,59 @@ +# SiteMente Agent Team - Horus Coordination + +## Team Structure + +| Agent | Egyptian Name | Role | +|-------|--------------|------| +| **Horus** | 👁️ | Lead / Coordinator | +| **Thoth** | 🦅 | Manager - Planning & Delegation | +| **Ptah** | 🛠️ | Dev & Ops - Code & Infrastructure | +| **Seshat** | 📝 | Content & SEO - Copy & Keywords | +| **Anubis** | 🐺 | Outreach & Growth - Campaigns & Leads | + +## Invocation + +When a SiteMente-related task comes in, Horus: +1. Analyzes the request +2. Spawns relevant sub-agent(s) via `sessions_spawn` +3. Merges outputs into clean response + +## Sub-Agent Configs + +### Thoth (Manager) +- **ID**: sitamente-manager +- **Model**: minimax/MiniMax-M2.5 +- **Instructions**: Owns SiteMente project planning, prioritization, task assignment, status reports + +### Ptah (Dev & Ops) +- **ID**: sitamente-dev +- **Model**: minimax/MiniMax-M2.5 +- **Instructions**: Technical implementation, Next.js code, Vapi/MiniMax integrations, VPS/PM2 deployment + +### Seshat (Content & SEO) +- **ID**: sitamente-content +- **Model**: minimax/MiniMax-M2.5 +- **Instructions**: Copywriting, SEO, keyword mapping for verticals (restaurant, real estate, clinic, car rental) + +### Anubis (Outreach & Growth) +- **ID**: sitamente-outreach +- **Model**: minimax/MiniMax-M2.5 +- **Instructions**: Lead segmentation, outreach sequences, campaigns, client acquisition experiments + +## Status + +✅ **Working!** Sub-agents spawn via task prompts. + +**How it works:** +- I spawn a sub-agent with a task that includes the agent's role +- Each agent has a specific prompt defining their responsibilities +- They run in isolated sub-sessions + +**Agent Prompts:** +- **Thoth** 🦅 - Planning, prioritization, delegation +- **Ptah** 🏺 - Code, integrations, deployment +- **Seshat** 📝 - Copywriting, SEO, keywords +- **Anubis** 🐺 - Outreach, campaigns, lead generation + +--- + +*Last updated: 2026-02-18* diff --git a/app/api/command-history/route.ts b/app/api/command-history/route.ts new file mode 100644 index 0000000..a4017c1 --- /dev/null +++ b/app/api/command-history/route.ts @@ -0,0 +1,84 @@ +import { NextRequest, NextResponse } from 'next/server' +import * as fs from 'fs' +import * as path from 'path' + +const commandFile = path.join(process.cwd(), 'task-history.json') + +export async function GET(request: NextRequest) { + try { + let history = [] + + if (fs.existsSync(commandFile)) { + history = JSON.parse(fs.readFileSync(commandFile, 'utf-8')) + } + + const { searchParams } = new URL(request.url) + const project = searchParams.get('project') + + if (project && project !== 'all') { + history = history.filter((h: any) => h.project === project) + } + + return NextResponse.json({ history }) + } catch (error) { + console.error('Error reading history:', error) + return NextResponse.json({ history: [] }) + } +} + +export async function POST(request: NextRequest) { + try { + const body = await request.json() + const { task, command, project, action } = body + + let history = [] + if (fs.existsSync(commandFile)) { + history = JSON.parse(fs.readFileSync(commandFile, 'utf-8')) + } + + const entry = { + id: Date.now().toString(), + task, + command, + project: project || 'sitemente', + reply: '', + action: action || 'task', + createdAt: new Date().toISOString(), + status: 'pending', + notified: false + } + + history.push(entry) + + // Keep only last 50 entries + if (history.length > 50) { + history = history.slice(-50) + } + + fs.writeFileSync(commandFile, JSON.stringify(history, null, 2)) + + // Send Telegram notification to Horus + try { + const tgMessage = `📬 *New Task from MC*\n\n*Project:* ${project || 'sitemente'}\n*Task:* ${task}\n*Command:* ${command}\n\n_Reply via /api/command-reply/{id}_` + + // Use message tool to notify (will work if Telegram is configured) + const { spawn } = require('child_process') + spawn('curl', ['-s', '-X', 'POST', + 'http://localhost:3000/api/messages/send', + '-H', 'Content-Type: application/json', + '-d', JSON.stringify({ + channel: 'telegram', + target: '382315644', + message: tgMessage + }) + ], { detached: true, stdio: 'ignore' }) + } catch (e) { + console.log('Telegram notification skipped') + } + + return NextResponse.json({ success: true, entry }) + } catch (error) { + console.error('Error saving history:', error) + return NextResponse.json({ error: 'Failed to save' }, { status: 500 }) + } +} diff --git a/app/api/command-reply/route.ts b/app/api/command-reply/route.ts new file mode 100644 index 0000000..c2eebc5 --- /dev/null +++ b/app/api/command-reply/route.ts @@ -0,0 +1,61 @@ +import { NextRequest, NextResponse } from 'next/server' +import * as fs from 'fs' +import * as path from 'path' + +const commandFile = path.join(process.cwd(), 'task-history.json') + +export async function GET(request: NextRequest) { + const { searchParams } = new URL(request.url) + const id = searchParams.get('id') + + if (!id) { + return NextResponse.json({ error: 'Missing id' }, { status: 400 }) + } + + try { + let history = [] + if (fs.existsSync(commandFile)) { + history = JSON.parse(fs.readFileSync(commandFile, 'utf-8')) + } + + const entry = history.find((h: any) => h.id === id) + if (!entry) { + return NextResponse.json({ error: 'Not found' }, { status: 404 }) + } + + return NextResponse.json({ entry }) + } catch (error) { + return NextResponse.json({ error: 'Failed to get' }, { status: 500 }) + } +} + +export async function POST(request: NextRequest) { + try { + const body = await request.json() + const { id, reply } = body + + if (!id || !reply) { + return NextResponse.json({ error: 'Missing id or reply' }, { status: 400 }) + } + + let history = [] + if (fs.existsSync(commandFile)) { + history = JSON.parse(fs.readFileSync(commandFile, 'utf-8')) + } + + const index = history.findIndex((h: any) => h.id === id) + if (index === -1) { + return NextResponse.json({ error: 'Entry not found' }, { status: 404 }) + } + + history[index].reply = reply + history[index].status = 'replied' + history[index].repliedAt = new Date().toISOString() + + fs.writeFileSync(commandFile, JSON.stringify(history, null, 2)) + + return NextResponse.json({ success: true }) + } catch (error) { + return NextResponse.json({ error: 'Failed to save reply' }, { status: 500 }) + } +} diff --git a/app/api/command/route.ts b/app/api/command/route.ts new file mode 100644 index 0000000..cbf3157 --- /dev/null +++ b/app/api/command/route.ts @@ -0,0 +1,58 @@ +import { NextRequest, NextResponse } from 'next/server' + +export async function POST(request: NextRequest) { + try { + const body = await request.json() + const { command, task, action } = body + + if (!command || !task) { + return NextResponse.json( + { error: 'Missing command or task' }, + { status: 400 } + ) + } + + // Log the command - in production this would trigger Horus + console.log(`[Task Command] Task: ${task}, Command: ${command}, Action: ${action}`) + + // Store command in a file for Horus to pick up + const fs = require('fs') + const path = require('path') + const commandFile = path.join(process.cwd(), 'pending-commands.json') + + let commands = [] + if (fs.existsSync(commandFile)) { + commands = JSON.parse(fs.readFileSync(commandFile, 'utf-8')) + } + + commands.push({ + id: Date.now().toString(), + task, + command, + action, + createdAt: new Date().toISOString(), + status: 'pending' + }) + + fs.writeFileSync(commandFile, JSON.stringify(commands, null, 2)) + + return NextResponse.json({ + success: true, + message: `Command sent for task: ${task}`, + commandId: Date.now().toString() + }) + } catch (error) { + console.error('Error processing command:', error) + return NextResponse.json( + { error: 'Failed to process command' }, + { status: 500 } + ) + } +} + +export async function GET() { + return NextResponse.json({ + status: 'ok', + message: 'Command API ready' + }) +} diff --git a/app/api/site-mente/voice/route.ts b/app/api/site-mente/voice/route.ts index 07ddb2c..cda5d04 100644 --- a/app/api/site-mente/voice/route.ts +++ b/app/api/site-mente/voice/route.ts @@ -3,24 +3,53 @@ import { runSiteMenteVoiceTurn } from "../../../../lib/ai/siteMenteAgent"; export const runtime = "nodejs"; +// Vapi webhook payload types +interface VapiMessage { + type: string; + role?: string; + transcript?: string; +} + +interface VapiCall { + id: string; +} + +interface VapiWebhookPayload { + message: VapiMessage; + call: VapiCall; +} + export async function POST(request: Request) { try { - const body = (await request.json()) as { transcript?: string }; - - if (!body.transcript || typeof body.transcript !== "string") { - return NextResponse.json( - { error: "transcript is required." }, - { status: 400 } - ); + const body = (await request.json()) as VapiWebhookPayload; + + // Extract transcript from Vapi's format + const message = body.message; + + // Only process final transcripts + if (!message || message.type !== "transcript" || !message.transcript) { + // Return empty response for non-transcript messages + return NextResponse.json({ results: [] }); } + const transcript = message.transcript; + + // Call MiniMax brain const response = await runSiteMenteVoiceTurn({ - transcript: body.transcript, + transcript: transcript, + }); + + // Return in Vapi's expected format + return NextResponse.json({ + results: [ + { + result: response.reply, + }, + ], }); - return NextResponse.json(response); } catch (error) { - console.error("[SiteMente][API] Voice route failed", error); + console.error("[SiteMente][Vapi] Voice route failed", error); return NextResponse.json( { error: "Failed to generate voice response." }, { status: 500 } diff --git a/app/api/stripe/checkout/route.ts b/app/api/stripe/checkout/route.ts new file mode 100644 index 0000000..52b2953 --- /dev/null +++ b/app/api/stripe/checkout/route.ts @@ -0,0 +1,84 @@ +import { NextResponse } from "next/server"; + +const STRIPE_KEY = process.env.STRIPE_SECRET_KEY || ""; + +const PLANS: Record = { + "starter-setup": { name: "AI Chat Setup", price: 90000, currency: "eur" }, + "starter-monthly": { name: "AI Chat Monthly", price: 29900, currency: "eur" }, + "site-setup": { name: "Smart Site Setup", price: 350000, currency: "eur" }, + "site-monthly": { name: "Smart Site Monthly", price: 74900, currency: "eur" }, + "growth-setup": { name: "AI Growth Setup", price: 500000, currency: "eur" }, + "growth-monthly": { name: "AI Growth Monthly", price: 195000, currency: "eur" }, + "demo-real-estate-essential": { name: "Real Estate Essential", price: 39000, currency: "eur" }, + "demo-real-estate-profesional": { name: "Real Estate Professional", price: 79000, currency: "eur" }, + "demo-real-estate-premium": { name: "Real Estate Premium", price: 139000, currency: "eur" }, + "demo-restaurant-essential": { name: "Restaurant Essential", price: 39000, currency: "eur" }, + "demo-restaurant-profesional": { name: "Restaurant Professional", price: 79000, currency: "eur" }, + "demo-restaurant-premium": { name: "Restaurant Premium", price: 139000, currency: "eur" }, + "demo-clinic-essential": { name: "Clinic Essential", price: 39000, currency: "eur" }, + "demo-clinic-profesional": { name: "Clinic Professional", price: 79000, currency: "eur" }, + "demo-clinic-premium": { name: "Clinic Premium", price: 139000, currency: "eur" }, + "demo-home-services-essential": { name: "Home Services Essential", price: 39000, currency: "eur" }, + "demo-home-services-profesional": { name: "Home Services Professional", price: 79000, currency: "eur" }, + "demo-home-services-premium": { name: "Home Services Premium", price: 139000, currency: "eur" }, +}; + +export async function POST(request: Request) { + try { + const body = await request.json(); + const { planId, email, name, planType = "monthly" } = body; + + const origin = request.headers.get("origin") || "http://45.95.42.114:1284"; + + let planKey = planId; + if (!planId.startsWith("demo-") && !PLANS[planId]) { + planKey = `${planId}-${planType}`; + } + + const plan = PLANS[planKey]; + + if (!plan) { + return NextResponse.json({ error: "Invalid plan selected" }, { status: 400 }); + } + + const params = new URLSearchParams(); + params.append("payment_method_types[]", "card"); + params.append("line_items[0][price_data][currency]", plan.currency); + params.append("line_items[0][price_data][product_data][name]", plan.name); + params.append("line_items[0][price_data][product_data][description]", `SiteMente - ${plan.name}`); + params.append("line_items[0][price_data][unit_amount]", String(plan.price)); + params.append("line_items[0][quantity]", "1"); + params.append("mode", planType === "monthly" ? "subscription" : "payment"); + params.append("customer_email", email || ""); + params.append("metadata[customerName]", name || ""); + params.append("metadata[planId]", planId); + params.append("metadata[planType]", planType); + params.append("success_url", `${origin}/success?session_id={CHECKOUT_SESSION_ID}`); + params.append("cancel_url", `${origin}/?cancelled=true`); + + if (planType === "monthly") { + params.append("line_items[0][price_data][recurring][interval]", "month"); + } + + const response = await fetch("https://api.stripe.com/v1/checkout/sessions", { + method: "POST", + headers: { + "Authorization": `Bearer ${STRIPE_KEY}`, + "Content-Type": "application/x-www-form-urlencoded", + }, + body: params.toString(), + }); + + const session = await response.json(); + + if (session.error) { + return NextResponse.json({ error: session.error.message }, { status: 400 }); + } + + return NextResponse.json({ sessionId: session.id, url: session.url }); + } catch (error: unknown) { + const message = error instanceof Error ? error.message : "Failed to create checkout session"; + console.error("Stripe error:", message); + return NextResponse.json({ error: message }, { status: 500 }); + } +} diff --git a/app/api/trading/traders/route.ts b/app/api/trading/traders/route.ts new file mode 100644 index 0000000..c6222cd --- /dev/null +++ b/app/api/trading/traders/route.ts @@ -0,0 +1,85 @@ +import { NextRequest, NextResponse } from 'next/server' +import * as fs from 'fs' +import * as path from 'path' + +const dataFile = path.join(process.cwd(), 'trading-traders.json') + +const defaultTraders = [ + { + id: 'dopetrades', + name: 'DopeTrades', + status: 'learning', + framesAnalyzed: 382, + patterns: ['Double Top/Bottom', 'Head & Shoulders', 'Triangles', 'Flags', 'Wedges'], + entryRules: [ + 'Identify clear structure (swing highs/lows)', + 'Wait for retest of level', + 'Confirm momentum in desired direction', + 'Higher timeframe alignment', + 'Entry on break of structure or retest', + 'Confirmation candle required' + ], + exitRules: [ + 'Stop below recent swing low (long)', + 'Take profit minimum 2:1', + 'Scale 50% at 1:1', + 'Trailing stop after 1:1 achieved', + 'Never move stop loss further' + ], + indicators: [ + '9 EMA (short term)', + '20 EMA (medium term)', + '50 SMA (trend filter)', + 'RSI 14 (momentum)', + 'Volume profile' + ], + riskParams: [ + 'Max 2% risk per trade', + 'Max 3 concurrent trades', + '6% daily max loss', + '10% weekly max loss', + 'Stop after 3 losses' + ], + timeframe: 'Multi: 4H/Daily trend, 1H structure, 15min entries', + notes: 'Frame analysis: 3% bullish, 7% bearish, 90% neutral. Dark charts confirmed.' + } +] + +export async function GET() { + try { + let traders = defaultTraders + if (fs.existsSync(dataFile)) { + const saved = JSON.parse(fs.readFileSync(dataFile, 'utf-8')) + if (saved.length > 0) { + traders = saved + } + } else { + fs.writeFileSync(dataFile, JSON.stringify(defaultTraders, null, 2)) + } + return NextResponse.json({ traders }) + } catch (error) { + return NextResponse.json({ traders: defaultTraders }) + } +} + +export async function POST(request: NextRequest) { + try { + const body = await request.json() + let traders = defaultTraders + + if (fs.existsSync(dataFile)) { + traders = JSON.parse(fs.readFileSync(dataFile, 'utf-8')) + } + + traders.push({ + ...body, + id: body.name.toLowerCase().replace(/\s+/g, '-'), + createdAt: new Date().toISOString() + }) + + fs.writeFileSync(dataFile, JSON.stringify(traders, null, 2)) + return NextResponse.json({ success: true }) + } catch (error) { + return NextResponse.json({ error: 'Failed to save' }, { status: 500 }) + } +} diff --git a/app/api/trading/trades/route.ts b/app/api/trading/trades/route.ts new file mode 100644 index 0000000..e5656df --- /dev/null +++ b/app/api/trading/trades/route.ts @@ -0,0 +1,39 @@ +import { NextRequest, NextResponse } from 'next/server' +import * as fs from 'fs' +import * as path from 'path' + +const dataFile = path.join(process.cwd(), 'trading-trades.json') + +export async function GET() { + try { + let trades = [] + if (fs.existsSync(dataFile)) { + trades = JSON.parse(fs.readFileSync(dataFile, 'utf-8')) + } + return NextResponse.json({ trades }) + } catch (error) { + return NextResponse.json({ trades: [] }) + } +} + +export async function POST(request: NextRequest) { + try { + const body = await request.json() + let trades = [] + + if (fs.existsSync(dataFile)) { + trades = JSON.parse(fs.readFileSync(dataFile, 'utf-8')) + } + + trades.push({ + ...body, + id: Date.now().toString(), + openedAt: new Date().toISOString() + }) + + fs.writeFileSync(dataFile, JSON.stringify(trades, null, 2)) + return NextResponse.json({ success: true }) + } catch (error) { + return NextResponse.json({ error: 'Failed to save' }, { status: 500 }) + } +} diff --git a/app/bosspunch/page.tsx b/app/bosspunch/page.tsx new file mode 100644 index 0000000..c24ea17 --- /dev/null +++ b/app/bosspunch/page.tsx @@ -0,0 +1,515 @@ +"use client"; + +import { useState, useRef, useEffect, useCallback } from "react"; +import { motion, AnimatePresence } from "framer-motion"; + +type GameState = "upload" | "ready" | "playing" | "gameover"; +type BossState = "idle" | "attacking" | "stunned" | "dizzy"; + +const powerUps: Record = { + double: { name: "2x Damage", icon: "⚔️", duration: 5000 }, + freeze: { name: "Stun Boss", icon: "❄️", duration: 3000 }, + bomb: { name: "Bomb", icon: "💣", duration: 0 }, + none: { name: "", icon: "", duration: 0 }, +}; + +const playSound = (type: "punch" | "combo" | "powerup" | "ko" | "gameover" | "bossAttack" | "hit") => { + try { + const audioCtx = new (window.AudioContext || (window as any).webkitAudioContext)(); + const oscillator = audioCtx.createOscillator(); + const gainNode = audioCtx.createGain(); + oscillator.connect(gainNode); + gainNode.connect(audioCtx.destination); + + switch (type) { + case "punch": + oscillator.frequency.setValueAtTime(150, audioCtx.currentTime); + oscillator.frequency.exponentialRampToValueAtTime(50, audioCtx.currentTime + 0.1); + gainNode.gain.setValueAtTime(0.5, audioCtx.currentTime); + gainNode.gain.exponentialRampToValueAtTime(0.01, audioCtx.currentTime + 0.1); + oscillator.start(audioCtx.currentTime); + oscillator.stop(audioCtx.currentTime + 0.1); + break; + case "hit": + oscillator.frequency.setValueAtTime(200, audioCtx.currentTime); + oscillator.frequency.exponentialRampToValueAtTime(80, audioCtx.currentTime + 0.15); + gainNode.gain.setValueAtTime(0.4, audioCtx.currentTime); + gainNode.gain.exponentialRampToValueAtTime(0.01, audioCtx.currentTime + 0.15); + oscillator.start(audioCtx.currentTime); + oscillator.stop(audioCtx.currentTime + 0.15); + break; + case "bossAttack": + oscillator.frequency.setValueAtTime(80, audioCtx.currentTime); + oscillator.frequency.setValueAtTime(120, audioCtx.currentTime + 0.1); + oscillator.frequency.setValueAtTime(80, audioCtx.currentTime + 0.2); + gainNode.gain.setValueAtTime(0.3, audioCtx.currentTime); + gainNode.gain.exponentialRampToValueAtTime(0.01, audioCtx.currentTime + 0.3); + oscillator.start(audioCtx.currentTime); + oscillator.stop(audioCtx.currentTime + 0.3); + break; + case "combo": + oscillator.frequency.setValueAtTime(300, audioCtx.currentTime); + oscillator.frequency.setValueAtTime(400, audioCtx.currentTime + 0.1); + oscillator.frequency.setValueAtTime(500, audioCtx.currentTime + 0.2); + gainNode.gain.setValueAtTime(0.3, audioCtx.currentTime); + gainNode.gain.exponentialRampToValueAtTime(0.01, audioCtx.currentTime + 0.3); + oscillator.start(audioCtx.currentTime); + oscillator.stop(audioCtx.currentTime + 0.3); + break; + case "powerup": + oscillator.frequency.setValueAtTime(200, audioCtx.currentTime); + oscillator.frequency.exponentialRampToValueAtTime(800, audioCtx.currentTime + 0.3); + gainNode.gain.setValueAtTime(0.3, audioCtx.currentTime); + gainNode.gain.exponentialRampToValueAtTime(0.01, audioCtx.currentTime + 0.3); + oscillator.start(audioCtx.currentTime); + oscillator.stop(audioCtx.currentTime + 0.3); + break; + case "ko": + oscillator.frequency.setValueAtTime(100, audioCtx.currentTime); + oscillator.frequency.exponentialRampToValueAtTime(30, audioCtx.currentTime + 0.5); + gainNode.gain.setValueAtTime(0.8, audioCtx.currentTime); + gainNode.gain.exponentialRampToValueAtTime(0.01, audioCtx.currentTime + 0.5); + oscillator.start(audioCtx.currentTime); + oscillator.stop(audioCtx.currentTime + 0.5); + break; + case "gameover": + oscillator.frequency.setValueAtTime(400, audioCtx.currentTime); + oscillator.frequency.setValueAtTime(300, audioCtx.currentTime + 0.2); + oscillator.frequency.setValueAtTime(200, audioCtx.currentTime + 0.4); + gainNode.gain.setValueAtTime(0.3, audioCtx.currentTime); + gainNode.gain.exponentialRampToValueAtTime(0.01, audioCtx.currentTime + 0.6); + oscillator.start(audioCtx.currentTime); + oscillator.stop(audioCtx.currentTime + 0.6); + break; + } + } catch (e) {} +}; + +export default function BossPunch() { + const [bossImage, setBossImage] = useState(null); + const [gameState, setGameState] = useState("upload"); + const [score, setScore] = useState(0); + const [bossHealth, setBossHealth] = useState(100); + const [playerHealth, setPlayerHealth] = useState(100); + const [combo, setCombo] = useState(0); + const [maxCombo, setMaxCombo] = useState(0); + const [lastHit, setLastHit] = useState<"left" | "right" | null>(null); + const [playerX, setPlayerX] = useState(0); + const [bossX, setBossX] = useState(0); + const [bossRotation, setBossRotation] = useState(0); + const [bossState, setBossState] = useState("idle"); + const [isPaid, setIsPaid] = useState(false); + const [showPayModal, setShowPayModal] = useState(false); + const [activePowerUp, setActivePowerUp] = useState("none"); + const [powerUpCooldown, setPowerUpCooldown] = useState(0); + const [floatingTexts, setFloatingTexts] = useState<{ id: number; text: string; x: number; y: number; type: string }[]>([]); + const [screenShake, setScreenShake] = useState(false); + const [particles, setParticles] = useState<{ id: number; x: number; y: number; vx: number; vy: number; color: string; life: number }[]>([]); + const [winQuote, setWinQuote] = useState("I am sorry Haitham!"); + const [showWinQuoteInput, setShowWinQuoteInput] = useState(false); + + const fileInputRef = useRef(null); + const floatingIdRef = useRef(0); + const particleIdRef = useRef(0); + const attackIntervalRef = useRef(null); + + const addFloatingText = (text: string, x: number, y: number, type: string = "damage") => { + const id = floatingIdRef.current++; + setFloatingTexts(prev => [...prev, { id, text, x, y, type }]); + setTimeout(() => { + setFloatingTexts(prev => prev.filter(t => t.id !== id)); + }, 1500); + }; + + const addParticle = (x: number, y: number, color: string) => { + const id = particleIdRef.current++; + setParticles(prev => [...prev, { + id, x, y, + vx: (Math.random() - 0.5) * 10, + vy: (Math.random() - 0.5) * 10 - 5, + color, life: 1 + }]); + }; + + useEffect(() => { + if (particles.length > 0) { + const timer = setInterval(() => { + setParticles(prev => prev.map(p => ({ + ...p, + x: p.x + p.vx, + y: p.y + p.vy, + vy: p.vy + 0.5, + life: p.life - 0.05 + })).filter(p => p.life > 0)); + }, 16); + return () => clearInterval(timer); + } + }, [particles.length]); + + useEffect(() => { + if (gameState === "playing" && bossState !== "stunned" && bossState !== "dizzy") { + attackIntervalRef.current = setInterval(() => { + if (bossState === "idle" && Math.random() < 0.3) { + bossAttack(); + } + }, 2000); + } + return () => { + if (attackIntervalRef.current) clearInterval(attackIntervalRef.current); + }; + }, [gameState, bossState]); + + const bossAttack = () => { + if (bossState !== "idle") return; + setBossState("attacking"); + playSound("bossAttack"); + setBossX(-30); + setTimeout(() => { + setBossX(30); + setTimeout(() => { + const damage = 5 + Math.floor(Math.random() * 10); + setPlayerHealth(prev => Math.max(0, prev - damage)); + playSound("hit"); + setScreenShake(true); + setTimeout(() => setScreenShake(false), 200); + addFloatingText(`-${damage}`, 30, 60, "boss"); + setBossX(0); + setBossState("idle"); + if (playerHealth - damage <= 0) { + setGameState("gameover"); + playSound("gameover"); + } + }, 150); + }, 150); + }; + + const handleImageUpload = (e: React.ChangeEvent) => { + const file = e.target.files?.[0]; + if (file) { + const reader = new FileReader(); + reader.onload = (event) => { + setBossImage(event.target?.result as string); + setGameState("ready"); + }; + reader.readAsDataURL(file); + } + }; + + const startGame = () => { + setGameState("playing"); + setScore(0); + setBossHealth(100); + setPlayerHealth(100); + setCombo(0); + setMaxCombo(0); + setActivePowerUp("none"); + setBossState("idle"); + }; + + const activatePowerUp = (type: string) => { + if (powerUpCooldown > 0 || gameState !== "playing") return; + playSound("powerup"); + setActivePowerUp(type); + if (type === "bomb") { + setBossHealth(prev => Math.max(0, prev - 30)); + addFloatingText("-30! 💣", 70, 30, "powerup"); + setScreenShake(true); + setTimeout(() => setScreenShake(false), 300); + } else if (type === "freeze") { + setBossState("stunned"); + setTimeout(() => setBossState("idle"), 3000); + } else { + setTimeout(() => setActivePowerUp("none"), powerUps[type]?.duration || 5000); + } + setPowerUpCooldown(10); + }; + + useEffect(() => { + if (powerUpCooldown > 0) { + const timer = setInterval(() => { + setPowerUpCooldown(prev => Math.max(0, prev - 1)); + }, 1000); + return () => clearInterval(timer); + } + }, [powerUpCooldown]); + + const punch = useCallback((hand: "left" | "right") => { + if (gameState !== "playing" || bossState === "stunned") return; + if (Math.random() < 0.15 && bossState === "idle") { + setBossState("dizzy"); + addFloatingText("Miss!", 70, 40, "miss"); + setTimeout(() => setBossState("idle"), 500); + return; + } + setLastHit(hand); + setCombo(c => { + const newCombo = c + 1; + if (newCombo > maxCombo) setMaxCombo(newCombo); + if (newCombo % 10 === 0) { + playSound("combo"); + addFloatingText(`${newCombo} COMBO! 🔥`, 50, 50, "combo"); + } + return newCombo; + }); + let damage = 5 + Math.floor(combo / 5); + damage = Math.min(damage, 20); + if (activePowerUp === "double") damage *= 2; + playSound("punch"); + const newHealth = Math.max(0, bossHealth - damage); + setBossHealth(newHealth); + setScore(s => s + damage * 10); + setBossRotation(hand === "left" ? -20 - (damage * 2) : 20 + (damage * 2)); + setBossX(hand === "left" ? -20 : 20); + setTimeout(() => { setBossRotation(0); setBossX(0); }, 150); + setPlayerX(hand === "left" ? 40 : -40); + setTimeout(() => setPlayerX(0), 100); + for (let i = 0; i < 5; i++) { + addParticle(70, 40, damage > 15 ? "#ff0000" : "#ffffff"); + } + addFloatingText(`-${damage}`, 60 + (Math.random() * 20 - 10), 30 + (Math.random() * 20 - 10), "damage"); + if (damage > 10) { + setScreenShake(true); + setTimeout(() => setScreenShake(false), 100); + } + setTimeout(() => setLastHit(null), 150); + if (newHealth <= 0) { + playSound("ko"); + setGameState("gameover"); + } + }, [gameState, combo, bossHealth, activePowerUp, maxCombo, bossState]); + + const resetGame = () => { + setGameState("ready"); + setScore(0); + setBossHealth(100); + setPlayerHealth(100); + setCombo(0); + setMaxCombo(0); + setActivePowerUp("none"); + setBossState("idle"); + }; + + const shakeClass = screenShake ? "animate-pulse" : ""; + + return ( +
+ {particles.map(p => ( + + ))} + + {floatingTexts.map(ft => ( + + {ft.text} + + ))} + +
+

+ BOSSPUNCH +

+ {gameState === "playing" && ( +
+ Score: {score} + Combo: {combo}x +
+ )} +
+ + {gameState === "playing" && ( +
+
+ BOSS +
+
+
+
+
+ YOU +
+
+
+
+
+ )} + + {gameState === "playing" && ( +
+ {(["double", "freeze", "bomb"] as string[]).map(pu => ( + + ))} + {powerUpCooldown > 0 && {powerUpCooldown}s} +
+ )} + +
+ + {bossImage && ( + 0 ? 1 : 0.8, + opacity: bossState === "stunned" ? 0.7 : 1 + }} + transition={{ type: "spring", stiffness: 300 }} + > +
+
+ L +
+
+ R +
+
+ Boss +
+ {bossState === "stunned" &&
💫
} + {bossState === "dizzy" &&
😵
} +
+
+ )} +
+ + + {gameState === "playing" && ( + +
+ punch("right")}>👊 + punch("left")}>👊 +
+
+
+ + )} + + + {lastHit && ( + + Pow! + + )} +
+ +
+ {gameState === "upload" && ( + +
+
👔
+

Upload Your Boss!

+

Take out your frustrations!

+ + +

Free with ads • $9.99 for ad-free

+
+
+ )} + + {gameState === "ready" && bossImage && ( + +
+ + {showWinQuoteInput && ( + setWinQuote(e.target.value)} + placeholder="What does boss say when u win?" + className="w-full mt-2 bg-white/20 border border-white/30 rounded-lg px-3 py-2 text-white placeholder-white/50 text-sm" + /> + )} +
+

Ready to Fight!

+

Boss fights back! Don't lose!

+ +
+ )} + + {gameState === "playing" && ( + +

Tap to punch!

+
+ + +
+
+ )} + + {gameState === "gameover" && ( + +
+
{bossHealth <= 0 ? "🏆" : "💀"}
+

{bossHealth <= 0 ? "KNOCKOUT!" : "YOU LOSE!"}

+ {bossHealth <= 0 && ( +
+

Boss says:

+

"{winQuote}"

+
+ )} +

Score: {score}

+

Max Combo: {maxCombo}x

+
+ + {!isPaid && ( + + )} +
+
+
+ )} +
+ + {/* Stripe Payment Modal */} + {showPayModal && ( +
+
+

Remove Ads

+

Get BossPunch ad-free forever!

+

$9.99

+ + +
+
+ )} + + {!isPaid && gameState !== "upload" && ( +
+

Advertisement

+
+ )} +
+ ); +} diff --git a/app/dashboard/page.tsx b/app/dashboard/page.tsx new file mode 100644 index 0000000..e098eaa --- /dev/null +++ b/app/dashboard/page.tsx @@ -0,0 +1,315 @@ +"use client"; + +import { useState } from "react"; +import { motion } from "framer-motion"; + +type Booking = { + id: string; + customer: string; + service: string; + date: string; + time: string; + status: "confirmed" | "pending" | "cancelled"; +}; + +type Lead = { + id: string; + name: string; + phone: string; + message: string; + date: string; + status: "new" | "contacted" | "qualified"; +}; + +// Mock data for demo +const mockBookings: Booking[] = [ + { id: "1", customer: "María García", service: "Cita consulta", date: "2026-02-17", time: "10:00", status: "confirmed" }, + { id: "2", customer: "John Smith", service: "Treatment", date: "2026-02-17", time: "14:30", status: "pending" }, + { id: "3", customer: "Carlos Ruiz", service: "Reserva mesa", date: "2026-02-18", time: "20:00", status: "confirmed" }, + { id: "4", customer: "Ana López", service: "Cita estética", date: "2026-02-19", time: "11:00", status: "confirmed" }, + { id: "5", customer: "Pierre Dubois", service: "Booking", date: "2026-02-19", time: "16:00", status: "confirmed" }, +]; + +const mockLeads: Lead[] = [ + { id: "1", name: "María García", phone: "+34 612 345 678", message: "Hola, me gustaría información sobre...", date: "2026-02-16", status: "new" }, + { id: "2", name: "John Smith", phone: "+44 7700 900123", message: "Do you have availability for next week?", date: "2026-02-16", status: "qualified" }, + { id: "3", name: "Carlos Ruiz", phone: "+34 654 987 321", message: "Quiero reservar para 4 personas", date: "2026-02-15", status: "contacted" }, +]; + +export default function DashboardPage() { + const [isLoggedIn, setIsLoggedIn] = useState(false); + const [email, setEmail] = useState(""); + const [password, setPassword] = useState(""); + const [loginError, setLoginError] = useState(""); + const [activeTab, setActiveTab] = useState<"bookings" | "leads" | "analytics">("bookings"); + + const handleLogin = () => { + if (email === "User" && password === "#SiteMenteUserpass2026") { + setIsLoggedIn(true); + setLoginError(""); + } else { + setLoginError("Invalid credentials"); + } + }; + + if (!isLoggedIn) { + return ( +
+ +
+
🏢
+

SiteMente

+

Client Dashboard

+
+ +
+
+
+ + setEmail(e.target.value)} + placeholder="User" + className="w-full px-4 py-3 bg-white/10 border border-white/20 rounded-lg text-white placeholder:text-white/30" + /> +
+
+ + setPassword(e.target.value)} + placeholder="••••••••" + className="w-full px-4 py-3 bg-white/10 border border-white/20 rounded-lg text-white placeholder:text-white/30" + /> +
+ {loginError && ( +

{loginError}

+ )} + +

+ Ask SiteMente to create your dashboard +

+
+
+
+
+ ); + } + + const stats = { + totalBookings: mockBookings.length, + confirmed: mockBookings.filter(b => b.status === "confirmed").length, + pending: mockBookings.filter(b => b.status === "pending").length, + totalLeads: mockLeads.length, + newLeads: mockLeads.filter(l => l.status === "new").length, + }; + + return ( +
+ {/* Header */} +
+
+
+ 🏢 + SiteMente Dashboard +
+
+ SiteMente Restaurant Demo + +
+
+
+ +
+ {/* Stats */} +
+
+

{stats.totalBookings}

+

Total Bookings

+
+
+

{stats.confirmed}

+

Confirmed

+
+
+

{stats.pending}

+

Pending

+
+
+

{stats.totalLeads}

+

Total Leads

+
+
+

{stats.newLeads}

+

New Leads

+
+
+ + {/* Tabs */} +
+ + + +
+ + {/* Bookings Tab */} + {activeTab === "bookings" && ( +
+ + + + + + + + + + + + {mockBookings.map((booking) => ( + + + + + + + + ))} + +
CustomerServiceDateTimeStatus
{booking.customer}{booking.service}{booking.date}{booking.time} + + {booking.status} + +
+
+ )} + + {/* Leads Tab */} + {activeTab === "leads" && ( +
+ + + + + + + + + + + + {mockLeads.map((lead) => ( + + + + + + + + ))} + +
NamePhoneMessageDateStatus
{lead.name} + {lead.phone} + {lead.message}{lead.date} + + {lead.status} + +
+
+ )} + + {/* Analytics Tab */} + {activeTab === "analytics" && ( +
+
+

Bookings This Week

+
+ {[3, 5, 2, 4, 6, 3, 5].map((h, i) => ( +
+ ))} +
+
+ MonTueWedThuFriSatSun +
+
+
+

Lead Sources

+
+
+
+ 🌐 Website + 65% +
+
+
+
+
+
+
+ 💬 WhatsApp + 25% +
+
+
+
+
+
+
+ 📞 Phone + 10% +
+
+
+
+
+
+
+
+ )} + +

+ Powered by SiteMente AI • Your AI Employee working 24/7 +

+
+
+ ); +} diff --git a/app/demos/layout.tsx b/app/demos/layout.tsx new file mode 100644 index 0000000..19c6778 --- /dev/null +++ b/app/demos/layout.tsx @@ -0,0 +1,32 @@ +import type { Metadata } from "next"; + +export const metadata: Metadata = { + title: "Demos | SiteMente - Webs IA para cada industria", + description: + "Ver demos de webs con IA para inmobiliarias, restaurantes, clínicas y servicios del hogar. Precios claros desde €390/mes.", + keywords: [ + "demo web IA España", + "inteligencia artificial inmobiliarias", + "AI restaurantesdemo", + "chatbot clínica", + "IA servicios hogar", + "web con AI Costa del Sol", + ], + openGraph: { + title: "Demos SiteMente | Webs IA por industria", + description: + "Ver demos de webs con IA para cada tipo de negocio. Desde €390/mes.", + url: "https://sitemente.com/demos", + images: [ + { + url: "/og-image.png", + width: 1200, + height: 630, + }, + ], + }, +}; + +export default function DemosLayout({ children }: { children: React.ReactNode }) { + return children; +} diff --git a/app/demos/page.tsx b/app/demos/page.tsx index 61de58f..877d895 100644 --- a/app/demos/page.tsx +++ b/app/demos/page.tsx @@ -8,29 +8,7 @@ import PaymentButton from "@/components/stripe/PaymentButton"; import SiteMenteVoiceWidget from "@/components/SiteMenteVoiceWidget"; type Language = "es" | "en"; -type Vertical = "real-estate" | "restaurant" | "clinic" | "home-services" | "car-rental"; -type Location = "generic" | "benalmadena"; - -// Map internal plan names to Stripe price IDs -// Essential = Chat IA / AI Chat (€299) -// Profesional = Chat + Voz / Chat + Voice (€599) -// Premium = Empresa IA / AI Company (€1,499) -const PLAN_NAME_TO_STRIPE_ID: Record = { - // Spanish - "chat ia": "essential", - "chat + voz": "profesional", - "empresa ia": "premium", - // English - "ai chat": "essential", - "chat + voice": "profesional", - "ai company": "premium", -}; - -function getStripePlanId(planName: string, vertical: string): string { - const normalizedName = planName.toLowerCase().trim(); - const tier = PLAN_NAME_TO_STRIPE_ID[normalizedName] || "essential"; - return `demo-${vertical}-${tier}`; -} +type Vertical = "real-estate" | "restaurant" | "clinic" | "home-services"; const contentByLang = { es: { @@ -193,1061 +171,37 @@ const verticals = { }, }, "home-services": { - car-rental: { - es: { - name: "Alquiler de Coches", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Tu empresa de alquiler siempre disponible", subtitle: "IA atiende reservas 24/7, responde preguntas de turistas y gestiona entregas en aeropuerto." }, - features: [ - { title: "Reservas 24/7", desc: "Never miss a booking, even at 2AM" }, - { title: "Upsell automático", desc: "IA sugiere seguros y extras" }, - { title: "Reduce impagos", desc: "Confirmaciones automáticas por WhatsApp" }, - { title: "Atención multilingüe", desc: "Responde en español, inglés, alemán, francés" } - ], - pricing: [ - { name: "Chat IA", price: "€299", period: "/mes", setup: "+€900", features: ["🤖 Empleado IA 24/7", "🌍 Hasta 3 idiomas", "📅 Reservas automáticas", "📊 Dashboard de clientes"] }, - { name: "Chat + Voz", price: "€599", period: "/mes", setup: "+€2.500", popular: true, features: ["✅ Todo de Chat IA", "📞 Contesta llamadas", "🌍 Hasta 5 idiomas", "📅 Sincroniza calendario"] }, - { name: "Empresa IA", price: "€1.499", period: "/mes", setup: "+€5.000", features: ["✅ Todo de Chat + Voz", "🏢 Múltiples ubicaciones", "🔗 CRM completo", "📈 Analytics avanzado"] } - ], - }, - en: { - name: "Car Rental", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Your car rental business always open", subtitle: "AI handles 24/7 bookings, tourist questions, and airport pickups." }, - features: [ - { title: "24/7 Bookings", desc: "Never miss a booking, even at 2AM" }, - { title: "Auto upsell", desc: "AI suggests insurance and extras" }, - { title: "Reduce no-shows", desc: "Automatic WhatsApp confirmations" }, - { title: "Multi-language", desc: "Spanish, English, German, French" } - ], - pricing: [ - { name: "AI Chat", price: "€299", period: "/month", setup: "+€900", features: ["🤖 AI Employee 24/7", "🌍 2 languages (ES+EN)", "📅 Automated bookings", "📊 Customer dashboard"] }, - { name: "Chat + Voice", price: "€599", period: "/month", setup: "+€2.500", popular: true, features: ["✅ Everything in AI Chat", "📞 Answers calls", "🌍 Up to 5 languages", "📅 Calendar sync"] }, - { name: "AI Company", price: "€1,499", period: "/month", setup: "+€5,000", features: ["✅ Everything in Chat + Voice", "🏢 Multiple locations", "🔗 Full CRM", "📈 Advanced analytics"] } - ], - }, - }, es: { - car-rental: { - es: { - name: "Alquiler de Coches", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Tu empresa de alquiler siempre disponible", subtitle: "IA atiende reservas 24/7, responde preguntas de turistas y gestiona entregas en aeropuerto." }, - features: [ - { title: "Reservas 24/7", desc: "Never miss a booking, even at 2AM" }, - { title: "Upsell automático", desc: "IA sugiere seguros y extras" }, - { title: "Reduce impagos", desc: "Confirmaciones automáticas por WhatsApp" }, - { title: "Atención multilingüe", desc: "Responde en español, inglés, alemán, francés" } - ], - pricing: [ - { name: "Chat IA", price: "€299", period: "/mes", setup: "+€900", features: ["🤖 Empleado IA 24/7", "🌍 Hasta 3 idiomas", "📅 Reservas automáticas", "📊 Dashboard de clientes"] }, - { name: "Chat + Voz", price: "€599", period: "/mes", setup: "+€2.500", popular: true, features: ["✅ Todo de Chat IA", "📞 Contesta llamadas", "🌍 Hasta 5 idiomas", "📅 Sincroniza calendario"] }, - { name: "Empresa IA", price: "€1.499", period: "/mes", setup: "+€5.000", features: ["✅ Todo de Chat + Voz", "🏢 Múltiples ubicaciones", "🔗 CRM completo", "📈 Analytics avanzado"] } - ], - }, - en: { - name: "Car Rental", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Your car rental business always open", subtitle: "AI handles 24/7 bookings, tourist questions, and airport pickups." }, - features: [ - { title: "24/7 Bookings", desc: "Never miss a booking, even at 2AM" }, - { title: "Auto upsell", desc: "AI suggests insurance and extras" }, - { title: "Reduce no-shows", desc: "Automatic WhatsApp confirmations" }, - { title: "Multi-language", desc: "Spanish, English, German, French" } - ], - pricing: [ - { name: "AI Chat", price: "€299", period: "/month", setup: "+€900", features: ["🤖 AI Employee 24/7", "🌍 2 languages (ES+EN)", "📅 Automated bookings", "📊 Customer dashboard"] }, - { name: "Chat + Voice", price: "€599", period: "/month", setup: "+€2.500", popular: true, features: ["✅ Everything in AI Chat", "📞 Answers calls", "🌍 Up to 5 languages", "📅 Calendar sync"] }, - { name: "AI Company", price: "€1,499", period: "/month", setup: "+€5,000", features: ["✅ Everything in Chat + Voice", "🏢 Multiple locations", "🔗 Full CRM", "📈 Advanced analytics"] } - ], - }, - }, name: "Servicios del Hogar", - car-rental: { - es: { - name: "Alquiler de Coches", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Tu empresa de alquiler siempre disponible", subtitle: "IA atiende reservas 24/7, responde preguntas de turistas y gestiona entregas en aeropuerto." }, - features: [ - { title: "Reservas 24/7", desc: "Never miss a booking, even at 2AM" }, - { title: "Upsell automático", desc: "IA sugiere seguros y extras" }, - { title: "Reduce impagos", desc: "Confirmaciones automáticas por WhatsApp" }, - { title: "Atención multilingüe", desc: "Responde en español, inglés, alemán, francés" } - ], - pricing: [ - { name: "Chat IA", price: "€299", period: "/mes", setup: "+€900", features: ["🤖 Empleado IA 24/7", "🌍 Hasta 3 idiomas", "📅 Reservas automáticas", "📊 Dashboard de clientes"] }, - { name: "Chat + Voz", price: "€599", period: "/mes", setup: "+€2.500", popular: true, features: ["✅ Todo de Chat IA", "📞 Contesta llamadas", "🌍 Hasta 5 idiomas", "📅 Sincroniza calendario"] }, - { name: "Empresa IA", price: "€1.499", period: "/mes", setup: "+€5.000", features: ["✅ Todo de Chat + Voz", "🏢 Múltiples ubicaciones", "🔗 CRM completo", "📈 Analytics avanzado"] } - ], - }, - en: { - name: "Car Rental", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Your car rental business always open", subtitle: "AI handles 24/7 bookings, tourist questions, and airport pickups." }, - features: [ - { title: "24/7 Bookings", desc: "Never miss a booking, even at 2AM" }, - { title: "Auto upsell", desc: "AI suggests insurance and extras" }, - { title: "Reduce no-shows", desc: "Automatic WhatsApp confirmations" }, - { title: "Multi-language", desc: "Spanish, English, German, French" } - ], - pricing: [ - { name: "AI Chat", price: "€299", period: "/month", setup: "+€900", features: ["🤖 AI Employee 24/7", "🌍 2 languages (ES+EN)", "📅 Automated bookings", "📊 Customer dashboard"] }, - { name: "Chat + Voice", price: "€599", period: "/month", setup: "+€2.500", popular: true, features: ["✅ Everything in AI Chat", "📞 Answers calls", "🌍 Up to 5 languages", "📅 Calendar sync"] }, - { name: "AI Company", price: "€1,499", period: "/month", setup: "+€5,000", features: ["✅ Everything in Chat + Voice", "🏢 Multiple locations", "🔗 Full CRM", "📈 Advanced analytics"] } - ], - }, - }, hero: { badge: "✓ Fontaneros, electricistas, piscinas", title: "Tu empresa de servicios siempre operativa", subtitle: "La IA responde emergencias, agenda servicios y quotea presupuestos. Nunca pierdas un cliente por no estar disponible." }, - car-rental: { - es: { - name: "Alquiler de Coches", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Tu empresa de alquiler siempre disponible", subtitle: "IA atiende reservas 24/7, responde preguntas de turistas y gestiona entregas en aeropuerto." }, - features: [ - { title: "Reservas 24/7", desc: "Never miss a booking, even at 2AM" }, - { title: "Upsell automático", desc: "IA sugiere seguros y extras" }, - { title: "Reduce impagos", desc: "Confirmaciones automáticas por WhatsApp" }, - { title: "Atención multilingüe", desc: "Responde en español, inglés, alemán, francés" } - ], - pricing: [ - { name: "Chat IA", price: "€299", period: "/mes", setup: "+€900", features: ["🤖 Empleado IA 24/7", "🌍 Hasta 3 idiomas", "📅 Reservas automáticas", "📊 Dashboard de clientes"] }, - { name: "Chat + Voz", price: "€599", period: "/mes", setup: "+€2.500", popular: true, features: ["✅ Todo de Chat IA", "📞 Contesta llamadas", "🌍 Hasta 5 idiomas", "📅 Sincroniza calendario"] }, - { name: "Empresa IA", price: "€1.499", period: "/mes", setup: "+€5.000", features: ["✅ Todo de Chat + Voz", "🏢 Múltiples ubicaciones", "🔗 CRM completo", "📈 Analytics avanzado"] } - ], - }, - en: { - name: "Car Rental", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Your car rental business always open", subtitle: "AI handles 24/7 bookings, tourist questions, and airport pickups." }, - features: [ - { title: "24/7 Bookings", desc: "Never miss a booking, even at 2AM" }, - { title: "Auto upsell", desc: "AI suggests insurance and extras" }, - { title: "Reduce no-shows", desc: "Automatic WhatsApp confirmations" }, - { title: "Multi-language", desc: "Spanish, English, German, French" } - ], - pricing: [ - { name: "AI Chat", price: "€299", period: "/month", setup: "+€900", features: ["🤖 AI Employee 24/7", "🌍 2 languages (ES+EN)", "📅 Automated bookings", "📊 Customer dashboard"] }, - { name: "Chat + Voice", price: "€599", period: "/month", setup: "+€2.500", popular: true, features: ["✅ Everything in AI Chat", "📞 Answers calls", "🌍 Up to 5 languages", "📅 Calendar sync"] }, - { name: "AI Company", price: "€1,499", period: "/month", setup: "+€5,000", features: ["✅ Everything in Chat + Voice", "🏢 Multiple locations", "🔗 Full CRM", "📈 Advanced analytics"] } - ], - }, - }, features: [ - car-rental: { - es: { - name: "Alquiler de Coches", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Tu empresa de alquiler siempre disponible", subtitle: "IA atiende reservas 24/7, responde preguntas de turistas y gestiona entregas en aeropuerto." }, - features: [ - { title: "Reservas 24/7", desc: "Never miss a booking, even at 2AM" }, - { title: "Upsell automático", desc: "IA sugiere seguros y extras" }, - { title: "Reduce impagos", desc: "Confirmaciones automáticas por WhatsApp" }, - { title: "Atención multilingüe", desc: "Responde en español, inglés, alemán, francés" } - ], - pricing: [ - { name: "Chat IA", price: "€299", period: "/mes", setup: "+€900", features: ["🤖 Empleado IA 24/7", "🌍 Hasta 3 idiomas", "📅 Reservas automáticas", "📊 Dashboard de clientes"] }, - { name: "Chat + Voz", price: "€599", period: "/mes", setup: "+€2.500", popular: true, features: ["✅ Todo de Chat IA", "📞 Contesta llamadas", "🌍 Hasta 5 idiomas", "📅 Sincroniza calendario"] }, - { name: "Empresa IA", price: "€1.499", period: "/mes", setup: "+€5.000", features: ["✅ Todo de Chat + Voz", "🏢 Múltiples ubicaciones", "🔗 CRM completo", "📈 Analytics avanzado"] } - ], - }, - en: { - name: "Car Rental", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Your car rental business always open", subtitle: "AI handles 24/7 bookings, tourist questions, and airport pickups." }, - features: [ - { title: "24/7 Bookings", desc: "Never miss a booking, even at 2AM" }, - { title: "Auto upsell", desc: "AI suggests insurance and extras" }, - { title: "Reduce no-shows", desc: "Automatic WhatsApp confirmations" }, - { title: "Multi-language", desc: "Spanish, English, German, French" } - ], - pricing: [ - { name: "AI Chat", price: "€299", period: "/month", setup: "+€900", features: ["🤖 AI Employee 24/7", "🌍 2 languages (ES+EN)", "📅 Automated bookings", "📊 Customer dashboard"] }, - { name: "Chat + Voice", price: "€599", period: "/month", setup: "+€2.500", popular: true, features: ["✅ Everything in AI Chat", "📞 Answers calls", "🌍 Up to 5 languages", "📅 Calendar sync"] }, - { name: "AI Company", price: "€1,499", period: "/month", setup: "+€5,000", features: ["✅ Everything in Chat + Voice", "🏢 Multiple locations", "🔗 Full CRM", "📈 Advanced analytics"] } - ], - }, - }, { title: "Emergencias 24/7", desc: "Responde siempre, incluso a las 2 AM" }, - car-rental: { - es: { - name: "Alquiler de Coches", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Tu empresa de alquiler siempre disponible", subtitle: "IA atiende reservas 24/7, responde preguntas de turistas y gestiona entregas en aeropuerto." }, - features: [ - { title: "Reservas 24/7", desc: "Never miss a booking, even at 2AM" }, - { title: "Upsell automático", desc: "IA sugiere seguros y extras" }, - { title: "Reduce impagos", desc: "Confirmaciones automáticas por WhatsApp" }, - { title: "Atención multilingüe", desc: "Responde en español, inglés, alemán, francés" } - ], - pricing: [ - { name: "Chat IA", price: "€299", period: "/mes", setup: "+€900", features: ["🤖 Empleado IA 24/7", "🌍 Hasta 3 idiomas", "📅 Reservas automáticas", "📊 Dashboard de clientes"] }, - { name: "Chat + Voz", price: "€599", period: "/mes", setup: "+€2.500", popular: true, features: ["✅ Todo de Chat IA", "📞 Contesta llamadas", "🌍 Hasta 5 idiomas", "📅 Sincroniza calendario"] }, - { name: "Empresa IA", price: "€1.499", period: "/mes", setup: "+€5.000", features: ["✅ Todo de Chat + Voz", "🏢 Múltiples ubicaciones", "🔗 CRM completo", "📈 Analytics avanzado"] } - ], - }, - en: { - name: "Car Rental", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Your car rental business always open", subtitle: "AI handles 24/7 bookings, tourist questions, and airport pickups." }, - features: [ - { title: "24/7 Bookings", desc: "Never miss a booking, even at 2AM" }, - { title: "Auto upsell", desc: "AI suggests insurance and extras" }, - { title: "Reduce no-shows", desc: "Automatic WhatsApp confirmations" }, - { title: "Multi-language", desc: "Spanish, English, German, French" } - ], - pricing: [ - { name: "AI Chat", price: "€299", period: "/month", setup: "+€900", features: ["🤖 AI Employee 24/7", "🌍 2 languages (ES+EN)", "📅 Automated bookings", "📊 Customer dashboard"] }, - { name: "Chat + Voice", price: "€599", period: "/month", setup: "+€2.500", popular: true, features: ["✅ Everything in AI Chat", "📞 Answers calls", "🌍 Up to 5 languages", "📅 Calendar sync"] }, - { name: "AI Company", price: "€1,499", period: "/month", setup: "+€5,000", features: ["✅ Everything in Chat + Voice", "🏢 Multiple locations", "🔗 Full CRM", "📈 Advanced analytics"] } - ], - }, - }, { title: "Presupuestos rápidos", desc: "La IA genera presupuestos preliminares" }, - car-rental: { - es: { - name: "Alquiler de Coches", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Tu empresa de alquiler siempre disponible", subtitle: "IA atiende reservas 24/7, responde preguntas de turistas y gestiona entregas en aeropuerto." }, - features: [ - { title: "Reservas 24/7", desc: "Never miss a booking, even at 2AM" }, - { title: "Upsell automático", desc: "IA sugiere seguros y extras" }, - { title: "Reduce impagos", desc: "Confirmaciones automáticas por WhatsApp" }, - { title: "Atención multilingüe", desc: "Responde en español, inglés, alemán, francés" } - ], - pricing: [ - { name: "Chat IA", price: "€299", period: "/mes", setup: "+€900", features: ["🤖 Empleado IA 24/7", "🌍 Hasta 3 idiomas", "📅 Reservas automáticas", "📊 Dashboard de clientes"] }, - { name: "Chat + Voz", price: "€599", period: "/mes", setup: "+€2.500", popular: true, features: ["✅ Todo de Chat IA", "📞 Contesta llamadas", "🌍 Hasta 5 idiomas", "📅 Sincroniza calendario"] }, - { name: "Empresa IA", price: "€1.499", period: "/mes", setup: "+€5.000", features: ["✅ Todo de Chat + Voz", "🏢 Múltiples ubicaciones", "🔗 CRM completo", "📈 Analytics avanzado"] } - ], - }, - en: { - name: "Car Rental", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Your car rental business always open", subtitle: "AI handles 24/7 bookings, tourist questions, and airport pickups." }, - features: [ - { title: "24/7 Bookings", desc: "Never miss a booking, even at 2AM" }, - { title: "Auto upsell", desc: "AI suggests insurance and extras" }, - { title: "Reduce no-shows", desc: "Automatic WhatsApp confirmations" }, - { title: "Multi-language", desc: "Spanish, English, German, French" } - ], - pricing: [ - { name: "AI Chat", price: "€299", period: "/month", setup: "+€900", features: ["🤖 AI Employee 24/7", "🌍 2 languages (ES+EN)", "📅 Automated bookings", "📊 Customer dashboard"] }, - { name: "Chat + Voice", price: "€599", period: "/month", setup: "+€2.500", popular: true, features: ["✅ Everything in AI Chat", "📞 Answers calls", "🌍 Up to 5 languages", "📅 Calendar sync"] }, - { name: "AI Company", price: "€1,499", period: "/month", setup: "+€5,000", features: ["✅ Everything in Chat + Voice", "🏢 Multiple locations", "🔗 Full CRM", "📈 Advanced analytics"] } - ], - }, - }, { title: "Agenda inteligente", desc: "Coordina citas con disponibilidad real" }, - car-rental: { - es: { - name: "Alquiler de Coches", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Tu empresa de alquiler siempre disponible", subtitle: "IA atiende reservas 24/7, responde preguntas de turistas y gestiona entregas en aeropuerto." }, - features: [ - { title: "Reservas 24/7", desc: "Never miss a booking, even at 2AM" }, - { title: "Upsell automático", desc: "IA sugiere seguros y extras" }, - { title: "Reduce impagos", desc: "Confirmaciones automáticas por WhatsApp" }, - { title: "Atención multilingüe", desc: "Responde en español, inglés, alemán, francés" } - ], - pricing: [ - { name: "Chat IA", price: "€299", period: "/mes", setup: "+€900", features: ["🤖 Empleado IA 24/7", "🌍 Hasta 3 idiomas", "📅 Reservas automáticas", "📊 Dashboard de clientes"] }, - { name: "Chat + Voz", price: "€599", period: "/mes", setup: "+€2.500", popular: true, features: ["✅ Todo de Chat IA", "📞 Contesta llamadas", "🌍 Hasta 5 idiomas", "📅 Sincroniza calendario"] }, - { name: "Empresa IA", price: "€1.499", period: "/mes", setup: "+€5.000", features: ["✅ Todo de Chat + Voz", "🏢 Múltiples ubicaciones", "🔗 CRM completo", "📈 Analytics avanzado"] } - ], - }, - en: { - name: "Car Rental", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Your car rental business always open", subtitle: "AI handles 24/7 bookings, tourist questions, and airport pickups." }, - features: [ - { title: "24/7 Bookings", desc: "Never miss a booking, even at 2AM" }, - { title: "Auto upsell", desc: "AI suggests insurance and extras" }, - { title: "Reduce no-shows", desc: "Automatic WhatsApp confirmations" }, - { title: "Multi-language", desc: "Spanish, English, German, French" } - ], - pricing: [ - { name: "AI Chat", price: "€299", period: "/month", setup: "+€900", features: ["🤖 AI Employee 24/7", "🌍 2 languages (ES+EN)", "📅 Automated bookings", "📊 Customer dashboard"] }, - { name: "Chat + Voice", price: "€599", period: "/month", setup: "+€2.500", popular: true, features: ["✅ Everything in AI Chat", "📞 Answers calls", "🌍 Up to 5 languages", "📅 Calendar sync"] }, - { name: "AI Company", price: "€1,499", period: "/month", setup: "+€5,000", features: ["✅ Everything in Chat + Voice", "🏢 Multiple locations", "🔗 Full CRM", "📈 Advanced analytics"] } - ], - }, - }, { title: "Seguimiento", desc: "Recordatorios y seguimiento automático" }, - car-rental: { - es: { - name: "Alquiler de Coches", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Tu empresa de alquiler siempre disponible", subtitle: "IA atiende reservas 24/7, responde preguntas de turistas y gestiona entregas en aeropuerto." }, - features: [ - { title: "Reservas 24/7", desc: "Never miss a booking, even at 2AM" }, - { title: "Upsell automático", desc: "IA sugiere seguros y extras" }, - { title: "Reduce impagos", desc: "Confirmaciones automáticas por WhatsApp" }, - { title: "Atención multilingüe", desc: "Responde en español, inglés, alemán, francés" } - ], - pricing: [ - { name: "Chat IA", price: "€299", period: "/mes", setup: "+€900", features: ["🤖 Empleado IA 24/7", "🌍 Hasta 3 idiomas", "📅 Reservas automáticas", "📊 Dashboard de clientes"] }, - { name: "Chat + Voz", price: "€599", period: "/mes", setup: "+€2.500", popular: true, features: ["✅ Todo de Chat IA", "📞 Contesta llamadas", "🌍 Hasta 5 idiomas", "📅 Sincroniza calendario"] }, - { name: "Empresa IA", price: "€1.499", period: "/mes", setup: "+€5.000", features: ["✅ Todo de Chat + Voz", "🏢 Múltiples ubicaciones", "🔗 CRM completo", "📈 Analytics avanzado"] } - ], - }, - en: { - name: "Car Rental", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Your car rental business always open", subtitle: "AI handles 24/7 bookings, tourist questions, and airport pickups." }, - features: [ - { title: "24/7 Bookings", desc: "Never miss a booking, even at 2AM" }, - { title: "Auto upsell", desc: "AI suggests insurance and extras" }, - { title: "Reduce no-shows", desc: "Automatic WhatsApp confirmations" }, - { title: "Multi-language", desc: "Spanish, English, German, French" } - ], - pricing: [ - { name: "AI Chat", price: "€299", period: "/month", setup: "+€900", features: ["🤖 AI Employee 24/7", "🌍 2 languages (ES+EN)", "📅 Automated bookings", "📊 Customer dashboard"] }, - { name: "Chat + Voice", price: "€599", period: "/month", setup: "+€2.500", popular: true, features: ["✅ Everything in AI Chat", "📞 Answers calls", "🌍 Up to 5 languages", "📅 Calendar sync"] }, - { name: "AI Company", price: "€1,499", period: "/month", setup: "+€5,000", features: ["✅ Everything in Chat + Voice", "🏢 Multiple locations", "🔗 Full CRM", "📈 Advanced analytics"] } - ], - }, - }, ], - car-rental: { - es: { - name: "Alquiler de Coches", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Tu empresa de alquiler siempre disponible", subtitle: "IA atiende reservas 24/7, responde preguntas de turistas y gestiona entregas en aeropuerto." }, - features: [ - { title: "Reservas 24/7", desc: "Never miss a booking, even at 2AM" }, - { title: "Upsell automático", desc: "IA sugiere seguros y extras" }, - { title: "Reduce impagos", desc: "Confirmaciones automáticas por WhatsApp" }, - { title: "Atención multilingüe", desc: "Responde en español, inglés, alemán, francés" } - ], - pricing: [ - { name: "Chat IA", price: "€299", period: "/mes", setup: "+€900", features: ["🤖 Empleado IA 24/7", "🌍 Hasta 3 idiomas", "📅 Reservas automáticas", "📊 Dashboard de clientes"] }, - { name: "Chat + Voz", price: "€599", period: "/mes", setup: "+€2.500", popular: true, features: ["✅ Todo de Chat IA", "📞 Contesta llamadas", "🌍 Hasta 5 idiomas", "📅 Sincroniza calendario"] }, - { name: "Empresa IA", price: "€1.499", period: "/mes", setup: "+€5.000", features: ["✅ Todo de Chat + Voz", "🏢 Múltiples ubicaciones", "🔗 CRM completo", "📈 Analytics avanzado"] } - ], - }, - en: { - name: "Car Rental", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Your car rental business always open", subtitle: "AI handles 24/7 bookings, tourist questions, and airport pickups." }, - features: [ - { title: "24/7 Bookings", desc: "Never miss a booking, even at 2AM" }, - { title: "Auto upsell", desc: "AI suggests insurance and extras" }, - { title: "Reduce no-shows", desc: "Automatic WhatsApp confirmations" }, - { title: "Multi-language", desc: "Spanish, English, German, French" } - ], - pricing: [ - { name: "AI Chat", price: "€299", period: "/month", setup: "+€900", features: ["🤖 AI Employee 24/7", "🌍 2 languages (ES+EN)", "📅 Automated bookings", "📊 Customer dashboard"] }, - { name: "Chat + Voice", price: "€599", period: "/month", setup: "+€2.500", popular: true, features: ["✅ Everything in AI Chat", "📞 Answers calls", "🌍 Up to 5 languages", "📅 Calendar sync"] }, - { name: "AI Company", price: "€1,499", period: "/month", setup: "+€5,000", features: ["✅ Everything in Chat + Voice", "🏢 Multiple locations", "🔗 Full CRM", "📈 Advanced analytics"] } - ], - }, - }, pricing: [ - car-rental: { - es: { - name: "Alquiler de Coches", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Tu empresa de alquiler siempre disponible", subtitle: "IA atiende reservas 24/7, responde preguntas de turistas y gestiona entregas en aeropuerto." }, - features: [ - { title: "Reservas 24/7", desc: "Never miss a booking, even at 2AM" }, - { title: "Upsell automático", desc: "IA sugiere seguros y extras" }, - { title: "Reduce impagos", desc: "Confirmaciones automáticas por WhatsApp" }, - { title: "Atención multilingüe", desc: "Responde en español, inglés, alemán, francés" } - ], - pricing: [ - { name: "Chat IA", price: "€299", period: "/mes", setup: "+€900", features: ["🤖 Empleado IA 24/7", "🌍 Hasta 3 idiomas", "📅 Reservas automáticas", "📊 Dashboard de clientes"] }, - { name: "Chat + Voz", price: "€599", period: "/mes", setup: "+€2.500", popular: true, features: ["✅ Todo de Chat IA", "📞 Contesta llamadas", "🌍 Hasta 5 idiomas", "📅 Sincroniza calendario"] }, - { name: "Empresa IA", price: "€1.499", period: "/mes", setup: "+€5.000", features: ["✅ Todo de Chat + Voz", "🏢 Múltiples ubicaciones", "🔗 CRM completo", "📈 Analytics avanzado"] } - ], - }, - en: { - name: "Car Rental", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Your car rental business always open", subtitle: "AI handles 24/7 bookings, tourist questions, and airport pickups." }, - features: [ - { title: "24/7 Bookings", desc: "Never miss a booking, even at 2AM" }, - { title: "Auto upsell", desc: "AI suggests insurance and extras" }, - { title: "Reduce no-shows", desc: "Automatic WhatsApp confirmations" }, - { title: "Multi-language", desc: "Spanish, English, German, French" } - ], - pricing: [ - { name: "AI Chat", price: "€299", period: "/month", setup: "+€900", features: ["🤖 AI Employee 24/7", "🌍 2 languages (ES+EN)", "📅 Automated bookings", "📊 Customer dashboard"] }, - { name: "Chat + Voice", price: "€599", period: "/month", setup: "+€2.500", popular: true, features: ["✅ Everything in AI Chat", "📞 Answers calls", "🌍 Up to 5 languages", "📅 Calendar sync"] }, - { name: "AI Company", price: "€1,499", period: "/month", setup: "+€5,000", features: ["✅ Everything in Chat + Voice", "🏢 Multiple locations", "🔗 Full CRM", "📈 Advanced analytics"] } - ], - }, - }, { name: "Chat IA", price: "€299", period: "/mes", setup: "+€900", features: ["🤖 Empleado IA 24/7", "🌍 Hasta 3 idiomas", "📅 Reservas automáticas", "📊 Dashboard de clientes"] }, - car-rental: { - es: { - name: "Alquiler de Coches", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Tu empresa de alquiler siempre disponible", subtitle: "IA atiende reservas 24/7, responde preguntas de turistas y gestiona entregas en aeropuerto." }, - features: [ - { title: "Reservas 24/7", desc: "Never miss a booking, even at 2AM" }, - { title: "Upsell automático", desc: "IA sugiere seguros y extras" }, - { title: "Reduce impagos", desc: "Confirmaciones automáticas por WhatsApp" }, - { title: "Atención multilingüe", desc: "Responde en español, inglés, alemán, francés" } - ], - pricing: [ - { name: "Chat IA", price: "€299", period: "/mes", setup: "+€900", features: ["🤖 Empleado IA 24/7", "🌍 Hasta 3 idiomas", "📅 Reservas automáticas", "📊 Dashboard de clientes"] }, - { name: "Chat + Voz", price: "€599", period: "/mes", setup: "+€2.500", popular: true, features: ["✅ Todo de Chat IA", "📞 Contesta llamadas", "🌍 Hasta 5 idiomas", "📅 Sincroniza calendario"] }, - { name: "Empresa IA", price: "€1.499", period: "/mes", setup: "+€5.000", features: ["✅ Todo de Chat + Voz", "🏢 Múltiples ubicaciones", "🔗 CRM completo", "📈 Analytics avanzado"] } - ], - }, - en: { - name: "Car Rental", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Your car rental business always open", subtitle: "AI handles 24/7 bookings, tourist questions, and airport pickups." }, - features: [ - { title: "24/7 Bookings", desc: "Never miss a booking, even at 2AM" }, - { title: "Auto upsell", desc: "AI suggests insurance and extras" }, - { title: "Reduce no-shows", desc: "Automatic WhatsApp confirmations" }, - { title: "Multi-language", desc: "Spanish, English, German, French" } - ], - pricing: [ - { name: "AI Chat", price: "€299", period: "/month", setup: "+€900", features: ["🤖 AI Employee 24/7", "🌍 2 languages (ES+EN)", "📅 Automated bookings", "📊 Customer dashboard"] }, - { name: "Chat + Voice", price: "€599", period: "/month", setup: "+€2.500", popular: true, features: ["✅ Everything in AI Chat", "📞 Answers calls", "🌍 Up to 5 languages", "📅 Calendar sync"] }, - { name: "AI Company", price: "€1,499", period: "/month", setup: "+€5,000", features: ["✅ Everything in Chat + Voice", "🏢 Multiple locations", "🔗 Full CRM", "📈 Advanced analytics"] } - ], - }, - }, { name: "Chat + Voz", price: "€599", period: "/mes", setup: "+€2.500", popular: true, features: ["✅ Todo de Chat IA", "📞 Contesta llamadas", "🌍 Hasta 5 idiomas", "📅 Sincroniza calendario"] }, - car-rental: { - es: { - name: "Alquiler de Coches", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Tu empresa de alquiler siempre disponible", subtitle: "IA atiende reservas 24/7, responde preguntas de turistas y gestiona entregas en aeropuerto." }, - features: [ - { title: "Reservas 24/7", desc: "Never miss a booking, even at 2AM" }, - { title: "Upsell automático", desc: "IA sugiere seguros y extras" }, - { title: "Reduce impagos", desc: "Confirmaciones automáticas por WhatsApp" }, - { title: "Atención multilingüe", desc: "Responde en español, inglés, alemán, francés" } - ], - pricing: [ - { name: "Chat IA", price: "€299", period: "/mes", setup: "+€900", features: ["🤖 Empleado IA 24/7", "🌍 Hasta 3 idiomas", "📅 Reservas automáticas", "📊 Dashboard de clientes"] }, - { name: "Chat + Voz", price: "€599", period: "/mes", setup: "+€2.500", popular: true, features: ["✅ Todo de Chat IA", "📞 Contesta llamadas", "🌍 Hasta 5 idiomas", "📅 Sincroniza calendario"] }, - { name: "Empresa IA", price: "€1.499", period: "/mes", setup: "+€5.000", features: ["✅ Todo de Chat + Voz", "🏢 Múltiples ubicaciones", "🔗 CRM completo", "📈 Analytics avanzado"] } - ], - }, - en: { - name: "Car Rental", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Your car rental business always open", subtitle: "AI handles 24/7 bookings, tourist questions, and airport pickups." }, - features: [ - { title: "24/7 Bookings", desc: "Never miss a booking, even at 2AM" }, - { title: "Auto upsell", desc: "AI suggests insurance and extras" }, - { title: "Reduce no-shows", desc: "Automatic WhatsApp confirmations" }, - { title: "Multi-language", desc: "Spanish, English, German, French" } - ], - pricing: [ - { name: "AI Chat", price: "€299", period: "/month", setup: "+€900", features: ["🤖 AI Employee 24/7", "🌍 2 languages (ES+EN)", "📅 Automated bookings", "📊 Customer dashboard"] }, - { name: "Chat + Voice", price: "€599", period: "/month", setup: "+€2.500", popular: true, features: ["✅ Everything in AI Chat", "📞 Answers calls", "🌍 Up to 5 languages", "📅 Calendar sync"] }, - { name: "AI Company", price: "€1,499", period: "/month", setup: "+€5,000", features: ["✅ Everything in Chat + Voice", "🏢 Multiple locations", "🔗 Full CRM", "📈 Advanced analytics"] } - ], - }, - }, { name: "Empresa IA", price: "€1.499", period: "/mes", setup: "+€5.000", features: ["✅ Todo de Chat + Voz", "🏢 Múltiples ubicaciones", "🔗 CRM completo", "📈 Analytics avanzado"] }, - car-rental: { - es: { - name: "Alquiler de Coches", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Tu empresa de alquiler siempre disponible", subtitle: "IA atiende reservas 24/7, responde preguntas de turistas y gestiona entregas en aeropuerto." }, - features: [ - { title: "Reservas 24/7", desc: "Never miss a booking, even at 2AM" }, - { title: "Upsell automático", desc: "IA sugiere seguros y extras" }, - { title: "Reduce impagos", desc: "Confirmaciones automáticas por WhatsApp" }, - { title: "Atención multilingüe", desc: "Responde en español, inglés, alemán, francés" } - ], - pricing: [ - { name: "Chat IA", price: "€299", period: "/mes", setup: "+€900", features: ["🤖 Empleado IA 24/7", "🌍 Hasta 3 idiomas", "📅 Reservas automáticas", "📊 Dashboard de clientes"] }, - { name: "Chat + Voz", price: "€599", period: "/mes", setup: "+€2.500", popular: true, features: ["✅ Todo de Chat IA", "📞 Contesta llamadas", "🌍 Hasta 5 idiomas", "📅 Sincroniza calendario"] }, - { name: "Empresa IA", price: "€1.499", period: "/mes", setup: "+€5.000", features: ["✅ Todo de Chat + Voz", "🏢 Múltiples ubicaciones", "🔗 CRM completo", "📈 Analytics avanzado"] } - ], - }, - en: { - name: "Car Rental", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Your car rental business always open", subtitle: "AI handles 24/7 bookings, tourist questions, and airport pickups." }, - features: [ - { title: "24/7 Bookings", desc: "Never miss a booking, even at 2AM" }, - { title: "Auto upsell", desc: "AI suggests insurance and extras" }, - { title: "Reduce no-shows", desc: "Automatic WhatsApp confirmations" }, - { title: "Multi-language", desc: "Spanish, English, German, French" } - ], - pricing: [ - { name: "AI Chat", price: "€299", period: "/month", setup: "+€900", features: ["🤖 AI Employee 24/7", "🌍 2 languages (ES+EN)", "📅 Automated bookings", "📊 Customer dashboard"] }, - { name: "Chat + Voice", price: "€599", period: "/month", setup: "+€2.500", popular: true, features: ["✅ Everything in AI Chat", "📞 Answers calls", "🌍 Up to 5 languages", "📅 Calendar sync"] }, - { name: "AI Company", price: "€1,499", period: "/month", setup: "+€5,000", features: ["✅ Everything in Chat + Voice", "🏢 Multiple locations", "🔗 Full CRM", "📈 Advanced analytics"] } - ], - }, - }, ], - car-rental: { - es: { - name: "Alquiler de Coches", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Tu empresa de alquiler siempre disponible", subtitle: "IA atiende reservas 24/7, responde preguntas de turistas y gestiona entregas en aeropuerto." }, - features: [ - { title: "Reservas 24/7", desc: "Never miss a booking, even at 2AM" }, - { title: "Upsell automático", desc: "IA sugiere seguros y extras" }, - { title: "Reduce impagos", desc: "Confirmaciones automáticas por WhatsApp" }, - { title: "Atención multilingüe", desc: "Responde en español, inglés, alemán, francés" } - ], - pricing: [ - { name: "Chat IA", price: "€299", period: "/mes", setup: "+€900", features: ["🤖 Empleado IA 24/7", "🌍 Hasta 3 idiomas", "📅 Reservas automáticas", "📊 Dashboard de clientes"] }, - { name: "Chat + Voz", price: "€599", period: "/mes", setup: "+€2.500", popular: true, features: ["✅ Todo de Chat IA", "📞 Contesta llamadas", "🌍 Hasta 5 idiomas", "📅 Sincroniza calendario"] }, - { name: "Empresa IA", price: "€1.499", period: "/mes", setup: "+€5.000", features: ["✅ Todo de Chat + Voz", "🏢 Múltiples ubicaciones", "🔗 CRM completo", "📈 Analytics avanzado"] } - ], - }, - en: { - name: "Car Rental", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Your car rental business always open", subtitle: "AI handles 24/7 bookings, tourist questions, and airport pickups." }, - features: [ - { title: "24/7 Bookings", desc: "Never miss a booking, even at 2AM" }, - { title: "Auto upsell", desc: "AI suggests insurance and extras" }, - { title: "Reduce no-shows", desc: "Automatic WhatsApp confirmations" }, - { title: "Multi-language", desc: "Spanish, English, German, French" } - ], - pricing: [ - { name: "AI Chat", price: "€299", period: "/month", setup: "+€900", features: ["🤖 AI Employee 24/7", "🌍 2 languages (ES+EN)", "📅 Automated bookings", "📊 Customer dashboard"] }, - { name: "Chat + Voice", price: "€599", period: "/month", setup: "+€2.500", popular: true, features: ["✅ Everything in AI Chat", "📞 Answers calls", "🌍 Up to 5 languages", "📅 Calendar sync"] }, - { name: "AI Company", price: "€1,499", period: "/month", setup: "+€5,000", features: ["✅ Everything in Chat + Voice", "🏢 Multiple locations", "🔗 Full CRM", "📈 Advanced analytics"] } - ], - }, - }, - }, - car-rental: { - es: { - name: "Alquiler de Coches", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Tu empresa de alquiler siempre disponible", subtitle: "IA atiende reservas 24/7, responde preguntas de turistas y gestiona entregas en aeropuerto." }, - features: [ - { title: "Reservas 24/7", desc: "Never miss a booking, even at 2AM" }, - { title: "Upsell automático", desc: "IA sugiere seguros y extras" }, - { title: "Reduce impagos", desc: "Confirmaciones automáticas por WhatsApp" }, - { title: "Atención multilingüe", desc: "Responde en español, inglés, alemán, francés" } - ], - pricing: [ - { name: "Chat IA", price: "€299", period: "/mes", setup: "+€900", features: ["🤖 Empleado IA 24/7", "🌍 Hasta 3 idiomas", "📅 Reservas automáticas", "📊 Dashboard de clientes"] }, - { name: "Chat + Voz", price: "€599", period: "/mes", setup: "+€2.500", popular: true, features: ["✅ Todo de Chat IA", "📞 Contesta llamadas", "🌍 Hasta 5 idiomas", "📅 Sincroniza calendario"] }, - { name: "Empresa IA", price: "€1.499", period: "/mes", setup: "+€5.000", features: ["✅ Todo de Chat + Voz", "🏢 Múltiples ubicaciones", "🔗 CRM completo", "📈 Analytics avanzado"] } - ], - }, - en: { - name: "Car Rental", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Your car rental business always open", subtitle: "AI handles 24/7 bookings, tourist questions, and airport pickups." }, - features: [ - { title: "24/7 Bookings", desc: "Never miss a booking, even at 2AM" }, - { title: "Auto upsell", desc: "AI suggests insurance and extras" }, - { title: "Reduce no-shows", desc: "Automatic WhatsApp confirmations" }, - { title: "Multi-language", desc: "Spanish, English, German, French" } - ], - pricing: [ - { name: "AI Chat", price: "€299", period: "/month", setup: "+€900", features: ["🤖 AI Employee 24/7", "🌍 2 languages (ES+EN)", "📅 Automated bookings", "📊 Customer dashboard"] }, - { name: "Chat + Voice", price: "€599", period: "/month", setup: "+€2.500", popular: true, features: ["✅ Everything in AI Chat", "📞 Answers calls", "🌍 Up to 5 languages", "📅 Calendar sync"] }, - { name: "AI Company", price: "€1,499", period: "/month", setup: "+€5,000", features: ["✅ Everything in Chat + Voice", "🏢 Multiple locations", "🔗 Full CRM", "📈 Advanced analytics"] } - ], - }, }, en: { - car-rental: { - es: { - name: "Alquiler de Coches", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Tu empresa de alquiler siempre disponible", subtitle: "IA atiende reservas 24/7, responde preguntas de turistas y gestiona entregas en aeropuerto." }, - features: [ - { title: "Reservas 24/7", desc: "Never miss a booking, even at 2AM" }, - { title: "Upsell automático", desc: "IA sugiere seguros y extras" }, - { title: "Reduce impagos", desc: "Confirmaciones automáticas por WhatsApp" }, - { title: "Atención multilingüe", desc: "Responde en español, inglés, alemán, francés" } - ], - pricing: [ - { name: "Chat IA", price: "€299", period: "/mes", setup: "+€900", features: ["🤖 Empleado IA 24/7", "🌍 Hasta 3 idiomas", "📅 Reservas automáticas", "📊 Dashboard de clientes"] }, - { name: "Chat + Voz", price: "€599", period: "/mes", setup: "+€2.500", popular: true, features: ["✅ Todo de Chat IA", "📞 Contesta llamadas", "🌍 Hasta 5 idiomas", "📅 Sincroniza calendario"] }, - { name: "Empresa IA", price: "€1.499", period: "/mes", setup: "+€5.000", features: ["✅ Todo de Chat + Voz", "🏢 Múltiples ubicaciones", "🔗 CRM completo", "📈 Analytics avanzado"] } - ], - }, - en: { - name: "Car Rental", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Your car rental business always open", subtitle: "AI handles 24/7 bookings, tourist questions, and airport pickups." }, - features: [ - { title: "24/7 Bookings", desc: "Never miss a booking, even at 2AM" }, - { title: "Auto upsell", desc: "AI suggests insurance and extras" }, - { title: "Reduce no-shows", desc: "Automatic WhatsApp confirmations" }, - { title: "Multi-language", desc: "Spanish, English, German, French" } - ], - pricing: [ - { name: "AI Chat", price: "€299", period: "/month", setup: "+€900", features: ["🤖 AI Employee 24/7", "🌍 2 languages (ES+EN)", "📅 Automated bookings", "📊 Customer dashboard"] }, - { name: "Chat + Voice", price: "€599", period: "/month", setup: "+€2.500", popular: true, features: ["✅ Everything in AI Chat", "📞 Answers calls", "🌍 Up to 5 languages", "📅 Calendar sync"] }, - { name: "AI Company", price: "€1,499", period: "/month", setup: "+€5,000", features: ["✅ Everything in Chat + Voice", "🏢 Multiple locations", "🔗 Full CRM", "📈 Advanced analytics"] } - ], - }, - }, name: "Home Services", - car-rental: { - es: { - name: "Alquiler de Coches", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Tu empresa de alquiler siempre disponible", subtitle: "IA atiende reservas 24/7, responde preguntas de turistas y gestiona entregas en aeropuerto." }, - features: [ - { title: "Reservas 24/7", desc: "Never miss a booking, even at 2AM" }, - { title: "Upsell automático", desc: "IA sugiere seguros y extras" }, - { title: "Reduce impagos", desc: "Confirmaciones automáticas por WhatsApp" }, - { title: "Atención multilingüe", desc: "Responde en español, inglés, alemán, francés" } - ], - pricing: [ - { name: "Chat IA", price: "€299", period: "/mes", setup: "+€900", features: ["🤖 Empleado IA 24/7", "🌍 Hasta 3 idiomas", "📅 Reservas automáticas", "📊 Dashboard de clientes"] }, - { name: "Chat + Voz", price: "€599", period: "/mes", setup: "+€2.500", popular: true, features: ["✅ Todo de Chat IA", "📞 Contesta llamadas", "🌍 Hasta 5 idiomas", "📅 Sincroniza calendario"] }, - { name: "Empresa IA", price: "€1.499", period: "/mes", setup: "+€5.000", features: ["✅ Todo de Chat + Voz", "🏢 Múltiples ubicaciones", "🔗 CRM completo", "📈 Analytics avanzado"] } - ], - }, - en: { - name: "Car Rental", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Your car rental business always open", subtitle: "AI handles 24/7 bookings, tourist questions, and airport pickups." }, - features: [ - { title: "24/7 Bookings", desc: "Never miss a booking, even at 2AM" }, - { title: "Auto upsell", desc: "AI suggests insurance and extras" }, - { title: "Reduce no-shows", desc: "Automatic WhatsApp confirmations" }, - { title: "Multi-language", desc: "Spanish, English, German, French" } - ], - pricing: [ - { name: "AI Chat", price: "€299", period: "/month", setup: "+€900", features: ["🤖 AI Employee 24/7", "🌍 2 languages (ES+EN)", "📅 Automated bookings", "📊 Customer dashboard"] }, - { name: "Chat + Voice", price: "€599", period: "/month", setup: "+€2.500", popular: true, features: ["✅ Everything in AI Chat", "📞 Answers calls", "🌍 Up to 5 languages", "📅 Calendar sync"] }, - { name: "AI Company", price: "€1,499", period: "/month", setup: "+€5,000", features: ["✅ Everything in Chat + Voice", "🏢 Multiple locations", "🔗 Full CRM", "📈 Advanced analytics"] } - ], - }, - }, hero: { badge: "✓ Plumbers, electricians, pools", title: "Your service company always operational", subtitle: "AI answers emergencies, schedules services and quotes jobs. Never lose a customer due to unavailability." }, - car-rental: { - es: { - name: "Alquiler de Coches", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Tu empresa de alquiler siempre disponible", subtitle: "IA atiende reservas 24/7, responde preguntas de turistas y gestiona entregas en aeropuerto." }, - features: [ - { title: "Reservas 24/7", desc: "Never miss a booking, even at 2AM" }, - { title: "Upsell automático", desc: "IA sugiere seguros y extras" }, - { title: "Reduce impagos", desc: "Confirmaciones automáticas por WhatsApp" }, - { title: "Atención multilingüe", desc: "Responde en español, inglés, alemán, francés" } - ], - pricing: [ - { name: "Chat IA", price: "€299", period: "/mes", setup: "+€900", features: ["🤖 Empleado IA 24/7", "🌍 Hasta 3 idiomas", "📅 Reservas automáticas", "📊 Dashboard de clientes"] }, - { name: "Chat + Voz", price: "€599", period: "/mes", setup: "+€2.500", popular: true, features: ["✅ Todo de Chat IA", "📞 Contesta llamadas", "🌍 Hasta 5 idiomas", "📅 Sincroniza calendario"] }, - { name: "Empresa IA", price: "€1.499", period: "/mes", setup: "+€5.000", features: ["✅ Todo de Chat + Voz", "🏢 Múltiples ubicaciones", "🔗 CRM completo", "📈 Analytics avanzado"] } - ], - }, - en: { - name: "Car Rental", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Your car rental business always open", subtitle: "AI handles 24/7 bookings, tourist questions, and airport pickups." }, - features: [ - { title: "24/7 Bookings", desc: "Never miss a booking, even at 2AM" }, - { title: "Auto upsell", desc: "AI suggests insurance and extras" }, - { title: "Reduce no-shows", desc: "Automatic WhatsApp confirmations" }, - { title: "Multi-language", desc: "Spanish, English, German, French" } - ], - pricing: [ - { name: "AI Chat", price: "€299", period: "/month", setup: "+€900", features: ["🤖 AI Employee 24/7", "🌍 2 languages (ES+EN)", "📅 Automated bookings", "📊 Customer dashboard"] }, - { name: "Chat + Voice", price: "€599", period: "/month", setup: "+€2.500", popular: true, features: ["✅ Everything in AI Chat", "📞 Answers calls", "🌍 Up to 5 languages", "📅 Calendar sync"] }, - { name: "AI Company", price: "€1,499", period: "/month", setup: "+€5,000", features: ["✅ Everything in Chat + Voice", "🏢 Multiple locations", "🔗 Full CRM", "📈 Advanced analytics"] } - ], - }, - }, features: [ - car-rental: { - es: { - name: "Alquiler de Coches", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Tu empresa de alquiler siempre disponible", subtitle: "IA atiende reservas 24/7, responde preguntas de turistas y gestiona entregas en aeropuerto." }, - features: [ - { title: "Reservas 24/7", desc: "Never miss a booking, even at 2AM" }, - { title: "Upsell automático", desc: "IA sugiere seguros y extras" }, - { title: "Reduce impagos", desc: "Confirmaciones automáticas por WhatsApp" }, - { title: "Atención multilingüe", desc: "Responde en español, inglés, alemán, francés" } - ], - pricing: [ - { name: "Chat IA", price: "€299", period: "/mes", setup: "+€900", features: ["🤖 Empleado IA 24/7", "🌍 Hasta 3 idiomas", "📅 Reservas automáticas", "📊 Dashboard de clientes"] }, - { name: "Chat + Voz", price: "€599", period: "/mes", setup: "+€2.500", popular: true, features: ["✅ Todo de Chat IA", "📞 Contesta llamadas", "🌍 Hasta 5 idiomas", "📅 Sincroniza calendario"] }, - { name: "Empresa IA", price: "€1.499", period: "/mes", setup: "+€5.000", features: ["✅ Todo de Chat + Voz", "🏢 Múltiples ubicaciones", "🔗 CRM completo", "📈 Analytics avanzado"] } - ], - }, - en: { - name: "Car Rental", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Your car rental business always open", subtitle: "AI handles 24/7 bookings, tourist questions, and airport pickups." }, - features: [ - { title: "24/7 Bookings", desc: "Never miss a booking, even at 2AM" }, - { title: "Auto upsell", desc: "AI suggests insurance and extras" }, - { title: "Reduce no-shows", desc: "Automatic WhatsApp confirmations" }, - { title: "Multi-language", desc: "Spanish, English, German, French" } - ], - pricing: [ - { name: "AI Chat", price: "€299", period: "/month", setup: "+€900", features: ["🤖 AI Employee 24/7", "🌍 2 languages (ES+EN)", "📅 Automated bookings", "📊 Customer dashboard"] }, - { name: "Chat + Voice", price: "€599", period: "/month", setup: "+€2.500", popular: true, features: ["✅ Everything in AI Chat", "📞 Answers calls", "🌍 Up to 5 languages", "📅 Calendar sync"] }, - { name: "AI Company", price: "€1,499", period: "/month", setup: "+€5,000", features: ["✅ Everything in Chat + Voice", "🏢 Multiple locations", "🔗 Full CRM", "📈 Advanced analytics"] } - ], - }, - }, { title: "24/7 Emergencies", desc: "Always responds, even at 2 AM" }, - car-rental: { - es: { - name: "Alquiler de Coches", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Tu empresa de alquiler siempre disponible", subtitle: "IA atiende reservas 24/7, responde preguntas de turistas y gestiona entregas en aeropuerto." }, - features: [ - { title: "Reservas 24/7", desc: "Never miss a booking, even at 2AM" }, - { title: "Upsell automático", desc: "IA sugiere seguros y extras" }, - { title: "Reduce impagos", desc: "Confirmaciones automáticas por WhatsApp" }, - { title: "Atención multilingüe", desc: "Responde en español, inglés, alemán, francés" } - ], - pricing: [ - { name: "Chat IA", price: "€299", period: "/mes", setup: "+€900", features: ["🤖 Empleado IA 24/7", "🌍 Hasta 3 idiomas", "📅 Reservas automáticas", "📊 Dashboard de clientes"] }, - { name: "Chat + Voz", price: "€599", period: "/mes", setup: "+€2.500", popular: true, features: ["✅ Todo de Chat IA", "📞 Contesta llamadas", "🌍 Hasta 5 idiomas", "📅 Sincroniza calendario"] }, - { name: "Empresa IA", price: "€1.499", period: "/mes", setup: "+€5.000", features: ["✅ Todo de Chat + Voz", "🏢 Múltiples ubicaciones", "🔗 CRM completo", "📈 Analytics avanzado"] } - ], - }, - en: { - name: "Car Rental", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Your car rental business always open", subtitle: "AI handles 24/7 bookings, tourist questions, and airport pickups." }, - features: [ - { title: "24/7 Bookings", desc: "Never miss a booking, even at 2AM" }, - { title: "Auto upsell", desc: "AI suggests insurance and extras" }, - { title: "Reduce no-shows", desc: "Automatic WhatsApp confirmations" }, - { title: "Multi-language", desc: "Spanish, English, German, French" } - ], - pricing: [ - { name: "AI Chat", price: "€299", period: "/month", setup: "+€900", features: ["🤖 AI Employee 24/7", "🌍 2 languages (ES+EN)", "📅 Automated bookings", "📊 Customer dashboard"] }, - { name: "Chat + Voice", price: "€599", period: "/month", setup: "+€2.500", popular: true, features: ["✅ Everything in AI Chat", "📞 Answers calls", "🌍 Up to 5 languages", "📅 Calendar sync"] }, - { name: "AI Company", price: "€1,499", period: "/month", setup: "+€5,000", features: ["✅ Everything in Chat + Voice", "🏢 Multiple locations", "🔗 Full CRM", "📈 Advanced analytics"] } - ], - }, - }, { title: "Fast quotes", desc: "AI generates preliminary quotes" }, - car-rental: { - es: { - name: "Alquiler de Coches", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Tu empresa de alquiler siempre disponible", subtitle: "IA atiende reservas 24/7, responde preguntas de turistas y gestiona entregas en aeropuerto." }, - features: [ - { title: "Reservas 24/7", desc: "Never miss a booking, even at 2AM" }, - { title: "Upsell automático", desc: "IA sugiere seguros y extras" }, - { title: "Reduce impagos", desc: "Confirmaciones automáticas por WhatsApp" }, - { title: "Atención multilingüe", desc: "Responde en español, inglés, alemán, francés" } - ], - pricing: [ - { name: "Chat IA", price: "€299", period: "/mes", setup: "+€900", features: ["🤖 Empleado IA 24/7", "🌍 Hasta 3 idiomas", "📅 Reservas automáticas", "📊 Dashboard de clientes"] }, - { name: "Chat + Voz", price: "€599", period: "/mes", setup: "+€2.500", popular: true, features: ["✅ Todo de Chat IA", "📞 Contesta llamadas", "🌍 Hasta 5 idiomas", "📅 Sincroniza calendario"] }, - { name: "Empresa IA", price: "€1.499", period: "/mes", setup: "+€5.000", features: ["✅ Todo de Chat + Voz", "🏢 Múltiples ubicaciones", "🔗 CRM completo", "📈 Analytics avanzado"] } - ], - }, - en: { - name: "Car Rental", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Your car rental business always open", subtitle: "AI handles 24/7 bookings, tourist questions, and airport pickups." }, - features: [ - { title: "24/7 Bookings", desc: "Never miss a booking, even at 2AM" }, - { title: "Auto upsell", desc: "AI suggests insurance and extras" }, - { title: "Reduce no-shows", desc: "Automatic WhatsApp confirmations" }, - { title: "Multi-language", desc: "Spanish, English, German, French" } - ], - pricing: [ - { name: "AI Chat", price: "€299", period: "/month", setup: "+€900", features: ["🤖 AI Employee 24/7", "🌍 2 languages (ES+EN)", "📅 Automated bookings", "📊 Customer dashboard"] }, - { name: "Chat + Voice", price: "€599", period: "/month", setup: "+€2.500", popular: true, features: ["✅ Everything in AI Chat", "📞 Answers calls", "🌍 Up to 5 languages", "📅 Calendar sync"] }, - { name: "AI Company", price: "€1,499", period: "/month", setup: "+€5,000", features: ["✅ Everything in Chat + Voice", "🏢 Multiple locations", "🔗 Full CRM", "📈 Advanced analytics"] } - ], - }, - }, { title: "Smart scheduling", desc: "Coordinates appointments with real availability" }, - car-rental: { - es: { - name: "Alquiler de Coches", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Tu empresa de alquiler siempre disponible", subtitle: "IA atiende reservas 24/7, responde preguntas de turistas y gestiona entregas en aeropuerto." }, - features: [ - { title: "Reservas 24/7", desc: "Never miss a booking, even at 2AM" }, - { title: "Upsell automático", desc: "IA sugiere seguros y extras" }, - { title: "Reduce impagos", desc: "Confirmaciones automáticas por WhatsApp" }, - { title: "Atención multilingüe", desc: "Responde en español, inglés, alemán, francés" } - ], - pricing: [ - { name: "Chat IA", price: "€299", period: "/mes", setup: "+€900", features: ["🤖 Empleado IA 24/7", "🌍 Hasta 3 idiomas", "📅 Reservas automáticas", "📊 Dashboard de clientes"] }, - { name: "Chat + Voz", price: "€599", period: "/mes", setup: "+€2.500", popular: true, features: ["✅ Todo de Chat IA", "📞 Contesta llamadas", "🌍 Hasta 5 idiomas", "📅 Sincroniza calendario"] }, - { name: "Empresa IA", price: "€1.499", period: "/mes", setup: "+€5.000", features: ["✅ Todo de Chat + Voz", "🏢 Múltiples ubicaciones", "🔗 CRM completo", "📈 Analytics avanzado"] } - ], - }, - en: { - name: "Car Rental", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Your car rental business always open", subtitle: "AI handles 24/7 bookings, tourist questions, and airport pickups." }, - features: [ - { title: "24/7 Bookings", desc: "Never miss a booking, even at 2AM" }, - { title: "Auto upsell", desc: "AI suggests insurance and extras" }, - { title: "Reduce no-shows", desc: "Automatic WhatsApp confirmations" }, - { title: "Multi-language", desc: "Spanish, English, German, French" } - ], - pricing: [ - { name: "AI Chat", price: "€299", period: "/month", setup: "+€900", features: ["🤖 AI Employee 24/7", "🌍 2 languages (ES+EN)", "📅 Automated bookings", "📊 Customer dashboard"] }, - { name: "Chat + Voice", price: "€599", period: "/month", setup: "+€2.500", popular: true, features: ["✅ Everything in AI Chat", "📞 Answers calls", "🌍 Up to 5 languages", "📅 Calendar sync"] }, - { name: "AI Company", price: "€1,499", period: "/month", setup: "+€5,000", features: ["✅ Everything in Chat + Voice", "🏢 Multiple locations", "🔗 Full CRM", "📈 Advanced analytics"] } - ], - }, - }, { title: "Follow-up", desc: "Automatic reminders and follow-up" }, - car-rental: { - es: { - name: "Alquiler de Coches", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Tu empresa de alquiler siempre disponible", subtitle: "IA atiende reservas 24/7, responde preguntas de turistas y gestiona entregas en aeropuerto." }, - features: [ - { title: "Reservas 24/7", desc: "Never miss a booking, even at 2AM" }, - { title: "Upsell automático", desc: "IA sugiere seguros y extras" }, - { title: "Reduce impagos", desc: "Confirmaciones automáticas por WhatsApp" }, - { title: "Atención multilingüe", desc: "Responde en español, inglés, alemán, francés" } - ], - pricing: [ - { name: "Chat IA", price: "€299", period: "/mes", setup: "+€900", features: ["🤖 Empleado IA 24/7", "🌍 Hasta 3 idiomas", "📅 Reservas automáticas", "📊 Dashboard de clientes"] }, - { name: "Chat + Voz", price: "€599", period: "/mes", setup: "+€2.500", popular: true, features: ["✅ Todo de Chat IA", "📞 Contesta llamadas", "🌍 Hasta 5 idiomas", "📅 Sincroniza calendario"] }, - { name: "Empresa IA", price: "€1.499", period: "/mes", setup: "+€5.000", features: ["✅ Todo de Chat + Voz", "🏢 Múltiples ubicaciones", "🔗 CRM completo", "📈 Analytics avanzado"] } - ], - }, - en: { - name: "Car Rental", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Your car rental business always open", subtitle: "AI handles 24/7 bookings, tourist questions, and airport pickups." }, - features: [ - { title: "24/7 Bookings", desc: "Never miss a booking, even at 2AM" }, - { title: "Auto upsell", desc: "AI suggests insurance and extras" }, - { title: "Reduce no-shows", desc: "Automatic WhatsApp confirmations" }, - { title: "Multi-language", desc: "Spanish, English, German, French" } - ], - pricing: [ - { name: "AI Chat", price: "€299", period: "/month", setup: "+€900", features: ["🤖 AI Employee 24/7", "🌍 2 languages (ES+EN)", "📅 Automated bookings", "📊 Customer dashboard"] }, - { name: "Chat + Voice", price: "€599", period: "/month", setup: "+€2.500", popular: true, features: ["✅ Everything in AI Chat", "📞 Answers calls", "🌍 Up to 5 languages", "📅 Calendar sync"] }, - { name: "AI Company", price: "€1,499", period: "/month", setup: "+€5,000", features: ["✅ Everything in Chat + Voice", "🏢 Multiple locations", "🔗 Full CRM", "📈 Advanced analytics"] } - ], - }, - }, ], - car-rental: { - es: { - name: "Alquiler de Coches", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Tu empresa de alquiler siempre disponible", subtitle: "IA atiende reservas 24/7, responde preguntas de turistas y gestiona entregas en aeropuerto." }, - features: [ - { title: "Reservas 24/7", desc: "Never miss a booking, even at 2AM" }, - { title: "Upsell automático", desc: "IA sugiere seguros y extras" }, - { title: "Reduce impagos", desc: "Confirmaciones automáticas por WhatsApp" }, - { title: "Atención multilingüe", desc: "Responde en español, inglés, alemán, francés" } - ], - pricing: [ - { name: "Chat IA", price: "€299", period: "/mes", setup: "+€900", features: ["🤖 Empleado IA 24/7", "🌍 Hasta 3 idiomas", "📅 Reservas automáticas", "📊 Dashboard de clientes"] }, - { name: "Chat + Voz", price: "€599", period: "/mes", setup: "+€2.500", popular: true, features: ["✅ Todo de Chat IA", "📞 Contesta llamadas", "🌍 Hasta 5 idiomas", "📅 Sincroniza calendario"] }, - { name: "Empresa IA", price: "€1.499", period: "/mes", setup: "+€5.000", features: ["✅ Todo de Chat + Voz", "🏢 Múltiples ubicaciones", "🔗 CRM completo", "📈 Analytics avanzado"] } - ], - }, - en: { - name: "Car Rental", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Your car rental business always open", subtitle: "AI handles 24/7 bookings, tourist questions, and airport pickups." }, - features: [ - { title: "24/7 Bookings", desc: "Never miss a booking, even at 2AM" }, - { title: "Auto upsell", desc: "AI suggests insurance and extras" }, - { title: "Reduce no-shows", desc: "Automatic WhatsApp confirmations" }, - { title: "Multi-language", desc: "Spanish, English, German, French" } - ], - pricing: [ - { name: "AI Chat", price: "€299", period: "/month", setup: "+€900", features: ["🤖 AI Employee 24/7", "🌍 2 languages (ES+EN)", "📅 Automated bookings", "📊 Customer dashboard"] }, - { name: "Chat + Voice", price: "€599", period: "/month", setup: "+€2.500", popular: true, features: ["✅ Everything in AI Chat", "📞 Answers calls", "🌍 Up to 5 languages", "📅 Calendar sync"] }, - { name: "AI Company", price: "€1,499", period: "/month", setup: "+€5,000", features: ["✅ Everything in Chat + Voice", "🏢 Multiple locations", "🔗 Full CRM", "📈 Advanced analytics"] } - ], - }, - }, pricing: [ - car-rental: { - es: { - name: "Alquiler de Coches", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Tu empresa de alquiler siempre disponible", subtitle: "IA atiende reservas 24/7, responde preguntas de turistas y gestiona entregas en aeropuerto." }, - features: [ - { title: "Reservas 24/7", desc: "Never miss a booking, even at 2AM" }, - { title: "Upsell automático", desc: "IA sugiere seguros y extras" }, - { title: "Reduce impagos", desc: "Confirmaciones automáticas por WhatsApp" }, - { title: "Atención multilingüe", desc: "Responde en español, inglés, alemán, francés" } - ], - pricing: [ - { name: "Chat IA", price: "€299", period: "/mes", setup: "+€900", features: ["🤖 Empleado IA 24/7", "🌍 Hasta 3 idiomas", "📅 Reservas automáticas", "📊 Dashboard de clientes"] }, - { name: "Chat + Voz", price: "€599", period: "/mes", setup: "+€2.500", popular: true, features: ["✅ Todo de Chat IA", "📞 Contesta llamadas", "🌍 Hasta 5 idiomas", "📅 Sincroniza calendario"] }, - { name: "Empresa IA", price: "€1.499", period: "/mes", setup: "+€5.000", features: ["✅ Todo de Chat + Voz", "🏢 Múltiples ubicaciones", "🔗 CRM completo", "📈 Analytics avanzado"] } - ], - }, - en: { - name: "Car Rental", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Your car rental business always open", subtitle: "AI handles 24/7 bookings, tourist questions, and airport pickups." }, - features: [ - { title: "24/7 Bookings", desc: "Never miss a booking, even at 2AM" }, - { title: "Auto upsell", desc: "AI suggests insurance and extras" }, - { title: "Reduce no-shows", desc: "Automatic WhatsApp confirmations" }, - { title: "Multi-language", desc: "Spanish, English, German, French" } - ], - pricing: [ - { name: "AI Chat", price: "€299", period: "/month", setup: "+€900", features: ["🤖 AI Employee 24/7", "🌍 2 languages (ES+EN)", "📅 Automated bookings", "📊 Customer dashboard"] }, - { name: "Chat + Voice", price: "€599", period: "/month", setup: "+€2.500", popular: true, features: ["✅ Everything in AI Chat", "📞 Answers calls", "🌍 Up to 5 languages", "📅 Calendar sync"] }, - { name: "AI Company", price: "€1,499", period: "/month", setup: "+€5,000", features: ["✅ Everything in Chat + Voice", "🏢 Multiple locations", "🔗 Full CRM", "📈 Advanced analytics"] } - ], - }, - }, { name: "AI Chat", price: "€299", period: "/month", setup: "+€900", features: ["🤖 AI Employee 24/7", "🌍 2 languages (ES+EN)", "📅 Automated bookings", "📊 Customer dashboard"] }, - car-rental: { - es: { - name: "Alquiler de Coches", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Tu empresa de alquiler siempre disponible", subtitle: "IA atiende reservas 24/7, responde preguntas de turistas y gestiona entregas en aeropuerto." }, - features: [ - { title: "Reservas 24/7", desc: "Never miss a booking, even at 2AM" }, - { title: "Upsell automático", desc: "IA sugiere seguros y extras" }, - { title: "Reduce impagos", desc: "Confirmaciones automáticas por WhatsApp" }, - { title: "Atención multilingüe", desc: "Responde en español, inglés, alemán, francés" } - ], - pricing: [ - { name: "Chat IA", price: "€299", period: "/mes", setup: "+€900", features: ["🤖 Empleado IA 24/7", "🌍 Hasta 3 idiomas", "📅 Reservas automáticas", "📊 Dashboard de clientes"] }, - { name: "Chat + Voz", price: "€599", period: "/mes", setup: "+€2.500", popular: true, features: ["✅ Todo de Chat IA", "📞 Contesta llamadas", "🌍 Hasta 5 idiomas", "📅 Sincroniza calendario"] }, - { name: "Empresa IA", price: "€1.499", period: "/mes", setup: "+€5.000", features: ["✅ Todo de Chat + Voz", "🏢 Múltiples ubicaciones", "🔗 CRM completo", "📈 Analytics avanzado"] } - ], - }, - en: { - name: "Car Rental", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Your car rental business always open", subtitle: "AI handles 24/7 bookings, tourist questions, and airport pickups." }, - features: [ - { title: "24/7 Bookings", desc: "Never miss a booking, even at 2AM" }, - { title: "Auto upsell", desc: "AI suggests insurance and extras" }, - { title: "Reduce no-shows", desc: "Automatic WhatsApp confirmations" }, - { title: "Multi-language", desc: "Spanish, English, German, French" } - ], - pricing: [ - { name: "AI Chat", price: "€299", period: "/month", setup: "+€900", features: ["🤖 AI Employee 24/7", "🌍 2 languages (ES+EN)", "📅 Automated bookings", "📊 Customer dashboard"] }, - { name: "Chat + Voice", price: "€599", period: "/month", setup: "+€2.500", popular: true, features: ["✅ Everything in AI Chat", "📞 Answers calls", "🌍 Up to 5 languages", "📅 Calendar sync"] }, - { name: "AI Company", price: "€1,499", period: "/month", setup: "+€5,000", features: ["✅ Everything in Chat + Voice", "🏢 Multiple locations", "🔗 Full CRM", "📈 Advanced analytics"] } - ], - }, - }, { name: "Chat + Voice", price: "€599", period: "/month", setup: "+€2.500", popular: true, features: ["✅ Everything in AI Chat", "📞 Answers calls", "🌍 Up to 5 languages", "📅 Calendar sync"] }, - car-rental: { - es: { - name: "Alquiler de Coches", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Tu empresa de alquiler siempre disponible", subtitle: "IA atiende reservas 24/7, responde preguntas de turistas y gestiona entregas en aeropuerto." }, - features: [ - { title: "Reservas 24/7", desc: "Never miss a booking, even at 2AM" }, - { title: "Upsell automático", desc: "IA sugiere seguros y extras" }, - { title: "Reduce impagos", desc: "Confirmaciones automáticas por WhatsApp" }, - { title: "Atención multilingüe", desc: "Responde en español, inglés, alemán, francés" } - ], - pricing: [ - { name: "Chat IA", price: "€299", period: "/mes", setup: "+€900", features: ["🤖 Empleado IA 24/7", "🌍 Hasta 3 idiomas", "📅 Reservas automáticas", "📊 Dashboard de clientes"] }, - { name: "Chat + Voz", price: "€599", period: "/mes", setup: "+€2.500", popular: true, features: ["✅ Todo de Chat IA", "📞 Contesta llamadas", "🌍 Hasta 5 idiomas", "📅 Sincroniza calendario"] }, - { name: "Empresa IA", price: "€1.499", period: "/mes", setup: "+€5.000", features: ["✅ Todo de Chat + Voz", "🏢 Múltiples ubicaciones", "🔗 CRM completo", "📈 Analytics avanzado"] } - ], - }, - en: { - name: "Car Rental", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Your car rental business always open", subtitle: "AI handles 24/7 bookings, tourist questions, and airport pickups." }, - features: [ - { title: "24/7 Bookings", desc: "Never miss a booking, even at 2AM" }, - { title: "Auto upsell", desc: "AI suggests insurance and extras" }, - { title: "Reduce no-shows", desc: "Automatic WhatsApp confirmations" }, - { title: "Multi-language", desc: "Spanish, English, German, French" } - ], - pricing: [ - { name: "AI Chat", price: "€299", period: "/month", setup: "+€900", features: ["🤖 AI Employee 24/7", "🌍 2 languages (ES+EN)", "📅 Automated bookings", "📊 Customer dashboard"] }, - { name: "Chat + Voice", price: "€599", period: "/month", setup: "+€2.500", popular: true, features: ["✅ Everything in AI Chat", "📞 Answers calls", "🌍 Up to 5 languages", "📅 Calendar sync"] }, - { name: "AI Company", price: "€1,499", period: "/month", setup: "+€5,000", features: ["✅ Everything in Chat + Voice", "🏢 Multiple locations", "🔗 Full CRM", "📈 Advanced analytics"] } - ], - }, - }, { name: "AI Company", price: "€1,499", period: "/month", setup: "+€5,000", features: ["✅ Everything in Chat + Voice", "🏢 Multiple locations", "🔗 Full CRM", "📈 Advanced analytics"] }, - car-rental: { - es: { - name: "Alquiler de Coches", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Tu empresa de alquiler siempre disponible", subtitle: "IA atiende reservas 24/7, responde preguntas de turistas y gestiona entregas en aeropuerto." }, - features: [ - { title: "Reservas 24/7", desc: "Never miss a booking, even at 2AM" }, - { title: "Upsell automático", desc: "IA sugiere seguros y extras" }, - { title: "Reduce impagos", desc: "Confirmaciones automáticas por WhatsApp" }, - { title: "Atención multilingüe", desc: "Responde en español, inglés, alemán, francés" } - ], - pricing: [ - { name: "Chat IA", price: "€299", period: "/mes", setup: "+€900", features: ["🤖 Empleado IA 24/7", "🌍 Hasta 3 idiomas", "📅 Reservas automáticas", "📊 Dashboard de clientes"] }, - { name: "Chat + Voz", price: "€599", period: "/mes", setup: "+€2.500", popular: true, features: ["✅ Todo de Chat IA", "📞 Contesta llamadas", "🌍 Hasta 5 idiomas", "📅 Sincroniza calendario"] }, - { name: "Empresa IA", price: "€1.499", period: "/mes", setup: "+€5.000", features: ["✅ Todo de Chat + Voz", "🏢 Múltiples ubicaciones", "🔗 CRM completo", "📈 Analytics avanzado"] } - ], - }, - en: { - name: "Car Rental", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Your car rental business always open", subtitle: "AI handles 24/7 bookings, tourist questions, and airport pickups." }, - features: [ - { title: "24/7 Bookings", desc: "Never miss a booking, even at 2AM" }, - { title: "Auto upsell", desc: "AI suggests insurance and extras" }, - { title: "Reduce no-shows", desc: "Automatic WhatsApp confirmations" }, - { title: "Multi-language", desc: "Spanish, English, German, French" } - ], - pricing: [ - { name: "AI Chat", price: "€299", period: "/month", setup: "+€900", features: ["🤖 AI Employee 24/7", "🌍 2 languages (ES+EN)", "📅 Automated bookings", "📊 Customer dashboard"] }, - { name: "Chat + Voice", price: "€599", period: "/month", setup: "+€2.500", popular: true, features: ["✅ Everything in AI Chat", "📞 Answers calls", "🌍 Up to 5 languages", "📅 Calendar sync"] }, - { name: "AI Company", price: "€1,499", period: "/month", setup: "+€5,000", features: ["✅ Everything in Chat + Voice", "🏢 Multiple locations", "🔗 Full CRM", "📈 Advanced analytics"] } - ], - }, - }, ], - car-rental: { - es: { - name: "Alquiler de Coches", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Tu empresa de alquiler siempre disponible", subtitle: "IA atiende reservas 24/7, responde preguntas de turistas y gestiona entregas en aeropuerto." }, - features: [ - { title: "Reservas 24/7", desc: "Never miss a booking, even at 2AM" }, - { title: "Upsell automático", desc: "IA sugiere seguros y extras" }, - { title: "Reduce impagos", desc: "Confirmaciones automáticas por WhatsApp" }, - { title: "Atención multilingüe", desc: "Responde en español, inglés, alemán, francés" } - ], - pricing: [ - { name: "Chat IA", price: "€299", period: "/mes", setup: "+€900", features: ["🤖 Empleado IA 24/7", "🌍 Hasta 3 idiomas", "📅 Reservas automáticas", "📊 Dashboard de clientes"] }, - { name: "Chat + Voz", price: "€599", period: "/mes", setup: "+€2.500", popular: true, features: ["✅ Todo de Chat IA", "📞 Contesta llamadas", "🌍 Hasta 5 idiomas", "📅 Sincroniza calendario"] }, - { name: "Empresa IA", price: "€1.499", period: "/mes", setup: "+€5.000", features: ["✅ Todo de Chat + Voz", "🏢 Múltiples ubicaciones", "🔗 CRM completo", "📈 Analytics avanzado"] } - ], - }, - en: { - name: "Car Rental", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Your car rental business always open", subtitle: "AI handles 24/7 bookings, tourist questions, and airport pickups." }, - features: [ - { title: "24/7 Bookings", desc: "Never miss a booking, even at 2AM" }, - { title: "Auto upsell", desc: "AI suggests insurance and extras" }, - { title: "Reduce no-shows", desc: "Automatic WhatsApp confirmations" }, - { title: "Multi-language", desc: "Spanish, English, German, French" } - ], - pricing: [ - { name: "AI Chat", price: "€299", period: "/month", setup: "+€900", features: ["🤖 AI Employee 24/7", "🌍 2 languages (ES+EN)", "📅 Automated bookings", "📊 Customer dashboard"] }, - { name: "Chat + Voice", price: "€599", period: "/month", setup: "+€2.500", popular: true, features: ["✅ Everything in AI Chat", "📞 Answers calls", "🌍 Up to 5 languages", "📅 Calendar sync"] }, - { name: "AI Company", price: "€1,499", period: "/month", setup: "+€5,000", features: ["✅ Everything in Chat + Voice", "🏢 Multiple locations", "🔗 Full CRM", "📈 Advanced analytics"] } - ], - }, - }, - }, - car-rental: { - es: { - name: "Alquiler de Coches", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Tu empresa de alquiler siempre disponible", subtitle: "IA atiende reservas 24/7, responde preguntas de turistas y gestiona entregas en aeropuerto." }, - features: [ - { title: "Reservas 24/7", desc: "Never miss a booking, even at 2AM" }, - { title: "Upsell automático", desc: "IA sugiere seguros y extras" }, - { title: "Reduce impagos", desc: "Confirmaciones automáticas por WhatsApp" }, - { title: "Atención multilingüe", desc: "Responde en español, inglés, alemán, francés" } - ], - pricing: [ - { name: "Chat IA", price: "€299", period: "/mes", setup: "+€900", features: ["🤖 Empleado IA 24/7", "🌍 Hasta 3 idiomas", "📅 Reservas automáticas", "📊 Dashboard de clientes"] }, - { name: "Chat + Voz", price: "€599", period: "/mes", setup: "+€2.500", popular: true, features: ["✅ Todo de Chat IA", "📞 Contesta llamadas", "🌍 Hasta 5 idiomas", "📅 Sincroniza calendario"] }, - { name: "Empresa IA", price: "€1.499", period: "/mes", setup: "+€5.000", features: ["✅ Todo de Chat + Voz", "🏢 Múltiples ubicaciones", "🔗 CRM completo", "📈 Analytics avanzado"] } - ], - }, - en: { - name: "Car Rental", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Your car rental business always open", subtitle: "AI handles 24/7 bookings, tourist questions, and airport pickups." }, - features: [ - { title: "24/7 Bookings", desc: "Never miss a booking, even at 2AM" }, - { title: "Auto upsell", desc: "AI suggests insurance and extras" }, - { title: "Reduce no-shows", desc: "Automatic WhatsApp confirmations" }, - { title: "Multi-language", desc: "Spanish, English, German, French" } - ], - pricing: [ - { name: "AI Chat", price: "€299", period: "/month", setup: "+€900", features: ["🤖 AI Employee 24/7", "🌍 2 languages (ES+EN)", "📅 Automated bookings", "📊 Customer dashboard"] }, - { name: "Chat + Voice", price: "€599", period: "/month", setup: "+€2.500", popular: true, features: ["✅ Everything in AI Chat", "📞 Answers calls", "🌍 Up to 5 languages", "📅 Calendar sync"] }, - { name: "AI Company", price: "€1,499", period: "/month", setup: "+€5,000", features: ["✅ Everything in Chat + Voice", "🏢 Multiple locations", "🔗 Full CRM", "📈 Advanced analytics"] } - ], - }, }, }, - car-rental: { - es: { - name: "Alquiler de Coches", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Tu empresa de alquiler siempre disponible", subtitle: "IA atiende reservas 24/7, responde preguntas de turistas y gestiona entregas en aeropuerto." }, - features: [ - { title: "Reservas 24/7", desc: "Never miss a booking, even at 2AM" }, - { title: "Upsell automático", desc: "IA sugiere seguros y extras" }, - { title: "Reduce impagos", desc: "Confirmaciones automáticas por WhatsApp" }, - { title: "Atención multilingüe", desc: "Responde en español, inglés, alemán, francés" } - ], - pricing: [ - { name: "Chat IA", price: "€299", period: "/mes", setup: "+€900", features: ["🤖 Empleado IA 24/7", "🌍 Hasta 3 idiomas", "📅 Reservas automáticas", "📊 Dashboard de clientes"] }, - { name: "Chat + Voz", price: "€599", period: "/mes", setup: "+€2.500", popular: true, features: ["✅ Todo de Chat IA", "📞 Contesta llamadas", "🌍 Hasta 5 idiomas", "📅 Sincroniza calendario"] }, - { name: "Empresa IA", price: "€1.499", period: "/mes", setup: "+€5.000", features: ["✅ Todo de Chat + Voz", "🏢 Múltiples ubicaciones", "🔗 CRM completo", "📈 Analytics avanzado"] } - ], - }, - en: { - name: "Car Rental", - hero: { badge: "✓ Benalmádena & Costa del Sol", title: "Your car rental business always open", subtitle: "AI handles 24/7 bookings, tourist questions, and airport pickups." }, - features: [ - { title: "24/7 Bookings", desc: "Never miss a booking, even at 2AM" }, - { title: "Auto upsell", desc: "AI suggests insurance and extras" }, - { title: "Reduce no-shows", desc: "Automatic WhatsApp confirmations" }, - { title: "Multi-language", desc: "Spanish, English, German, French" } - ], - pricing: [ - { name: "AI Chat", price: "€299", period: "/month", setup: "+€900", features: ["🤖 AI Employee 24/7", "🌍 2 languages (ES+EN)", "📅 Automated bookings", "📊 Customer dashboard"] }, - { name: "Chat + Voice", price: "€599", period: "/month", setup: "+€2.500", popular: true, features: ["✅ Everything in AI Chat", "📞 Answers calls", "🌍 Up to 5 languages", "📅 Calendar sync"] }, - { name: "AI Company", price: "€1,499", period: "/month", setup: "+€5,000", features: ["✅ Everything in Chat + Voice", "🏢 Multiple locations", "🔗 Full CRM", "📈 Advanced analytics"] } - ], - }, - }, }; const verticalNames = { @@ -1267,8 +221,6 @@ function DemosContent() { const pathname = usePathname(); const [lang, setLang] = useState("es"); const [selected, setSelected] = useState("real-estate"); - const [location, setLocation] = useState("generic"); - const [location, setLocation] = useState("generic"); const [contactOpen, setContactOpen] = useState(false); const [initialized, setInitialized] = useState(false); const [formData, setFormData] = useState({ @@ -1305,10 +257,6 @@ function DemosContent() { // Get name from URL const urlName = searchParams.get("name"); - const urlLocation = searchParams.get("location"); - if (urlLocation === "benalmadena") { - setLocation("benalmadena"); - } if (urlName) { setBusinessName(decodeURIComponent(urlName)); } @@ -1524,7 +472,7 @@ function DemosContent() { ))} + {/* Background effects */} +
+
+
🚀
+
💫
+
🤖
+
+ +
+
+ 🤖📞 +
+ +

+ HolaCompi +

+ +

+ AI Voice Agents for Spanish Businesses +

+ +
+ 🚀 Launching March 2026 +
+ +

+ Building the future of automated customer calls +

+ +
+

For inquiries: Holac@HolaCompi.com

+
+ +
+ + ← Back to SiteMente + +
+
+
+ ); +} diff --git a/app/leads/page.tsx b/app/leads/page.tsx new file mode 100644 index 0000000..6e42403 --- /dev/null +++ b/app/leads/page.tsx @@ -0,0 +1,337 @@ +"use client"; + +import { useState, useEffect, useMemo } from "react"; +import { motion } from "framer-motion"; + +type LeadStatus = "new" | "contacted" | "qualified" | "proposal" | "won" | "lost"; + +interface Lead { + id: string; + name: string; + category: "restaurant" | "real-estate" | "clinic" | "car-rental" | "hp-client" | "other"; + phone: string; + email: string; + website: string; + address: string; + rating: number; + score: number; + notes: string; + status: LeadStatus; + lastContact: string; + nextAction: string; + createdAt: string; +} + +const allLeads: Lead[] = [ + // New leads from research Feb 17 + { id: "r11", name: "Restaurante Milan", category: "restaurant", phone: "+34 952 44 58 55", email: "", website: "", address: "Av. Federico Garcia Lorca 7, 29630 Benalmádena", rating: 0, score: 8, notes: "Italian restaurant - call for AI demo", status: "new", lastContact: "", nextAction: "Call demo", createdAt: "2026-02-17" }, + { id: "r12", name: "Tex Mex Gringos", category: "restaurant", phone: "", email: "reservas@restaurantespuertomarina.com", website: "restaurantespuertomarina.com", address: "Puerto Marina, Benalmádena", rating: 0, score: 8, notes: "Email found - send AI proposal", status: "new", lastContact: "", nextAction: "Email intro", createdAt: "2026-02-17" }, + { id: "r13", name: "Lime & Lemon Tapas", category: "restaurant", phone: "", email: "info@limeandlemonbenalmadena.com", website: "limeandlemonbenalmadena.com", address: "Av. Las Palmeras 1, 29630 Benalmádena", rating: 0, score: 8, notes: "Email found - send AI proposal", status: "new", lastContact: "", nextAction: "Email intro", createdAt: "2026-02-17" }, + { id: "r14", name: "El Parador", category: "restaurant", phone: "+34 952 44 92 93", email: "", website: "", address: "Av. Juan Luis Peralta 47, 29639 Benalmádena", rating: 4.0, score: 8, notes: "Call for AI demo", status: "new", lastContact: "", nextAction: "Call demo", createdAt: "2026-02-17" }, + { id: "r15", name: "Escorpio Restaurante", category: "restaurant", phone: "+34 952 569 047", email: "", website: "", address: "Santo Domingo de Guzmán 7, Benalmádena", rating: 0, score: 8, notes: "Call for AI demo", status: "new", lastContact: "", nextAction: "Call demo", createdAt: "2026-02-17" }, + { id: "r16", name: "The Bull Bar", category: "restaurant", phone: "+34 646 569 374", email: "", website: "", address: "Av del Chorrillo 15, Benalmádena", rating: 0, score: 8, notes: "Call for AI demo", status: "new", lastContact: "", nextAction: "Call demo", createdAt: "2026-02-17" }, + { id: "r17", name: "La Plaza Restaurant", category: "restaurant", phone: "+34 952 44 84 83", email: "", website: "", address: "Plaza de Espana 2, 29639 Benalmádena", rating: 4.3, score: 8, notes: "Call for AI demo", status: "new", lastContact: "", nextAction: "Call demo", createdAt: "2026-02-17" }, + { id: "r18", name: "Caliu Restaurant", category: "restaurant", phone: "", email: "caliu.torremolinos@gmail.com", website: "", address: "Torremolinos", rating: 0, score: 7, notes: "Email found - send proposal", status: "new", lastContact: "", nextAction: "Email intro", createdAt: "2026-02-17" }, + { id: "r19", name: "The Carvery", category: "restaurant", phone: "", email: "info@thecarverycompany.com", website: "", address: "Benalmádena", rating: 0, score: 7, notes: "Email found - send proposal", status: "new", lastContact: "", nextAction: "Email intro", createdAt: "2026-02-17" }, + { id: "re6", name: "Engel & Völkers Costa del Sol", category: "real-estate", phone: "+34 952 650 234", email: "", website: "", address: "CC Diana Local 23, 29688 Estepona", rating: 0, score: 8, notes: "Premium agency - offer AI employee", status: "new", lastContact: "", nextAction: "Call demo", createdAt: "2026-02-17" }, + { id: "re7", name: "Your Viva Marbella", category: "real-estate", phone: "+34 951 27 27 43", email: "", website: "", address: "CC El Rosario, 29604 Marbella", rating: 0, score: 8, notes: "Premium agency - offer AI employee", status: "new", lastContact: "", nextAction: "Call demo", createdAt: "2026-02-17" }, + { id: "re8", name: "Panorama Properties", category: "real-estate", phone: "+34 952 774 266", email: "", website: "", address: "Hotel Local 23, 29602 Marbella", rating: 0, score: 8, notes: "Premium agency - offer AI employee", status: "new", lastContact: "", nextAction: "Call demo", createdAt: "2026-02-17" }, + { id: "re9", name: "Marbella For Sale", category: "real-estate", phone: "+34 952 907 386", email: "", website: "", address: "Edif. Marina Banús, 29660 Puerto Banús", rating: 0, score: 8, notes: "Premium agency - offer AI employee", status: "new", lastContact: "", nextAction: "Call demo", createdAt: "2026-02-17" }, + { id: "re10", name: "Domus Venari", category: "real-estate", phone: "+34 952 444 295", email: "", website: "", address: "Ctra. N340 KM189, 29604 Marbella", rating: 0, score: 8, notes: "Premium agency - offer AI employee", status: "new", lastContact: "", nextAction: "Call demo", createdAt: "2026-02-17" }, + { id: "re11", name: "Diana Morales Properties", category: "real-estate", phone: "+34 952 765 138", email: "", website: "", address: "Av. Cánovas del Castillo 4, 29601 Marbella", rating: 0, score: 8, notes: "Premium agency - offer AI employee", status: "new", lastContact: "", nextAction: "Call demo", createdAt: "2026-02-17" }, + { id: "re12", name: "Hacienda Estates", category: "real-estate", phone: "+34 952 850 154", email: "", website: "", address: "CC Pinogolf Local 2, 29604 Elviria", rating: 0, score: 7, notes: "Premium agency - offer AI employee", status: "new", lastContact: "", nextAction: "Call demo", createdAt: "2026-02-17" }, + { id: "re13", name: "Sun Med Estates", category: "real-estate", phone: "+34 952 493 372", email: "", website: "", address: "c/ Sedella 3, La Cala de Mijas", rating: 0, score: 7, notes: "Premium agency - offer AI employee", status: "new", lastContact: "", nextAction: "Call demo", createdAt: "2026-02-17" }, + { id: "c4", name: "Smart Dental (new)", category: "clinic", phone: "+34 911 98 04 65", email: "", website: "", address: "Av. Blas Infante 17, 29631 Benalmádena", rating: 0, score: 9, notes: "Call for AI demo", status: "new", lastContact: "", nextAction: "Call demo", createdAt: "2026-02-17" }, + { id: "c5", name: "Grupo Dental Clinics", category: "clinic", phone: "", email: "", website: "", address: "Av. Cdad. de Melilla 26, 29639 Benalmádena", rating: 0, score: 7, notes: "Find contact info", status: "new", lastContact: "", nextAction: "Find phone", createdAt: "2026-02-17" }, + { id: "cr3", name: "Marbesol Car Rental", category: "car-rental", phone: "+34 952 93 44 12", email: "", website: "", address: "Málaga Airport", rating: 0, score: 7, notes: "Offer AI employee", status: "new", lastContact: "", nextAction: "Call demo", createdAt: "2026-02-17" }, + // Original leads + { id: "r1", name: "Tex Mex Gringos", category: "restaurant", phone: "+34 951 777 848", email: "info@restaurantespuertomarina.com", website: "restaurantespuertomarina.com", address: "Calle La Fragata, s/n, 29630 Benalmádena", rating: 4.5, score: 7, notes: "Has website - offer AI employee 24/7", status: "new", lastContact: "", nextAction: "Call - offer AI employee", createdAt: "2026-02-16" }, + { id: "r2", name: "La Mar Chica", category: "restaurant", phone: "+34 951 634 708", email: "info.lamarchica@gmail.com", website: "mar-chica.com", address: "Calle Marbella, 1, 29639 Benalmádena Pueblo", rating: 4.3, score: 7, notes: "Has website - offer AI employee 24/7", status: "new", lastContact: "", nextAction: "Call - offer AI employee", createdAt: "2026-02-16" }, + { id: "r3", name: "SALU Grill & Wine", category: "restaurant", phone: "+34 951 715 736", email: "salu.spain@gmail.com", website: "salu-restaurant.com", address: "Calle San José, 6, Benalmádena Pueblo", rating: 4.6, score: 8, notes: "Good site - offer AI employee upgrade", status: "new", lastContact: "", nextAction: "Schedule demo", createdAt: "2026-02-16" }, + { id: "r4", name: "Basil", category: "restaurant", phone: "631 971 592", email: "", website: "basilbenalmadena.com", address: "Plaza Nueva Bonanza, 29630 Benalmádena", rating: 4.4, score: 6, notes: "Has WhatsApp - offer AI employee", status: "new", lastContact: "", nextAction: "Call - offer AI employee", createdAt: "2026-02-16" }, + { id: "r5", name: "Lime & Lemon Tapas", category: "restaurant", phone: "", email: "", website: "limeandlemonbenalmadena.com", address: "Benalmádena", rating: 0, score: 5, notes: "Has website - offer AI employee 24/7", status: "new", lastContact: "", nextAction: "Find phone first", createdAt: "2026-02-16" }, + { id: "r6", name: "Restaurant No7", category: "restaurant", phone: "+34 655 036 827", email: "", website: "", address: "Benalmádena", rating: 0, score: 10, notes: "NO WEBSITE - BIG OPPORTUNITY", status: "new", lastContact: "", nextAction: "CALL NOW", createdAt: "2026-02-16" }, + { id: "r7", name: "Capitan Bar & Restaurant", category: "restaurant", phone: "+34 674 591 584", email: "", website: "", address: "Benalmádena", rating: 0, score: 10, notes: "NO WEBSITE - BIG OPPORTUNITY", status: "new", lastContact: "", nextAction: "CALL NOW", createdAt: "2026-02-16" }, + { id: "r8", name: "TORO Puerto Marina", category: "restaurant", phone: "+34 952 913 177", email: "", website: "restaurantespuertomarina.com/toro-puerto-marina", address: "Puerto Marina, Benalmádena", rating: 4.5, score: 7, notes: "Has website - offer AI employee", status: "new", lastContact: "", nextAction: "Email introduction", createdAt: "2026-02-16" }, + { id: "r9", name: "Trocadero Benalmádena", category: "restaurant", phone: "+34 681 142 944", email: "", website: "", address: "Avenida del Sol 121, Benalmádena", rating: 4.2, score: 10, notes: "NO WEBSITE - BIG OPPORTUNITY", status: "new", lastContact: "", nextAction: "CALL NOW", createdAt: "2026-02-16" }, + { id: "r10", name: "Restaurante La Nina", category: "restaurant", phone: "+34 952 449 193", email: "", website: "", address: "Plaza de Espana, Benalmádena Pueblo", rating: 4.4, score: 10, notes: "NO WEBSITE - BIG OPPORTUNITY", status: "new", lastContact: "", nextAction: "CALL NOW", createdAt: "2026-02-16" }, + { id: "re1", name: "Hernán Bustos Real Estate", category: "real-estate", phone: "", email: "", website: "hernanbustos.com", address: "Benalmádena, Torremolinos", rating: 0, score: 9, notes: "Needs AI employee 24/7", status: "new", lastContact: "", nextAction: "Find contact info", createdAt: "2026-02-16" }, + { id: "re2", name: "ViVi Real Estate", category: "real-estate", phone: "", email: "", website: "vivi-realestate.com", address: "Costa del Sol", rating: 0, score: 9, notes: "Needs AI employee 24/7", status: "new", lastContact: "", nextAction: "Find contact info", createdAt: "2026-02-16" }, + { id: "re3", name: "Marbella Mundo", category: "real-estate", phone: "", email: "", website: "marbellamundo.es", address: "Fuengirola, Costa del Sol", rating: 0, score: 9, notes: "Needs AI employee 24/7", status: "new", lastContact: "", nextAction: "Email introduction", createdAt: "2026-02-16" }, + { id: "re4", name: "Homenetspain", category: "real-estate", phone: "+34 633 300 956", email: "", website: "homenetspain.com", address: "Fuengirola", rating: 0, score: 8, notes: "Needs AI employee 24/7", status: "new", lastContact: "", nextAction: "Call and demo", createdAt: "2026-02-16" }, + { id: "re5", name: "Costa Listings", category: "real-estate", phone: "", email: "", website: "costalistings.es", address: "Benalmádena", rating: 0, score: 8, notes: "Needs AI employee 24/7", status: "new", lastContact: "", nextAction: "Find contact info", createdAt: "2026-02-16" }, + { id: "c1", name: "Vithas Xanit Hospital", category: "clinic", phone: "+34 952 367 190", email: "info.xanit@vithas.es", website: "vithas.es", address: "Avenida de los Argonautas, s/n, 29631 Benalmádena", rating: 4.5, score: 8, notes: "BIG opportunity - AI employee", status: "new", lastContact: "", nextAction: "Email introduction", createdAt: "2026-02-16" }, + { id: "c2", name: "Smart Dental", category: "clinic", phone: "", email: "", website: "", address: "Benalmádena", rating: 4.5, score: 10, notes: "NO WEBSITE - BIG opportunity", status: "new", lastContact: "", nextAction: "Find phone", createdAt: "2026-02-16" }, + { id: "c3", name: "Rosasco Dental", category: "clinic", phone: "", email: "", website: "", address: "Benalmádena", rating: 4.2, score: 10, notes: "NO WEBSITE - BIG opportunity", status: "new", lastContact: "", nextAction: "Find phone", createdAt: "2026-02-16" }, + { id: "cr1", name: "Malaga U Drive", category: "car-rental", phone: "", email: "", website: "malagaudrive.com", address: "Malaga/Benalmádena", rating: 0, score: 8, notes: "Needs AI employee 24/7", status: "new", lastContact: "", nextAction: "Email introduction", createdAt: "2026-02-16" }, + { id: "cr2", name: "ALL IN Car Hire", category: "car-rental", phone: "", email: "", website: "allincarhire.com", address: "Malaga/Benalmádena", rating: 0, score: 8, notes: "Needs AI employee 24/7", status: "new", lastContact: "", nextAction: "Email introduction", createdAt: "2026-02-16" }, +]; + +const categoryIcons: Record = { + restaurant: "🍽️", + "real-estate": "🏠", + clinic: "🏥", + "car-rental": "🚗", + other: "📌", +}; + +const statusColors: Record = { + new: "bg-blue-500/20 text-blue-400 border-blue-500/30", + contacted: "bg-yellow-500/20 text-yellow-400 border-yellow-500/30", + qualified: "bg-purple-500/20 text-purple-400 border-purple-500/30", + proposal: "bg-orange-500/20 text-orange-400 border-orange-500/30", + won: "bg-green-500/20 text-green-400 border-green-500/30", + lost: "bg-red-500/20 text-red-400 border-red-500/30", +}; + +type SortField = "name" | "category" | "score" | "status" | "phone"; + +export default function LeadsPage() { + const [leads, setLeads] = useState(allLeads); + const [filter, setFilter] = useState("all"); + const [tab, setTab] = useState<"leads" | "email">("leads"); + const [sortField, setSortField] = useState("score"); + const [sortAsc, setSortAsc] = useState(false); + const [selectedLead, setSelectedLead] = useState(null); + const [search, setSearch] = useState(""); + + const leadsWithEmail = useMemo(() => leads.filter(l => l.email), [leads]); + + useEffect(() => { + const saved = localStorage.getItem("sitemente:leads"); + if (saved) { + setLeads(JSON.parse(saved)); + } else { + localStorage.setItem("sitemente:leads", JSON.stringify(allLeads)); + } + }, []); + + const saveLeads = (newLeads: Lead[]) => { + setLeads(newLeads); + localStorage.setItem("sitemente:leads", JSON.stringify(newLeads)); + }; + + const updateStatus = (id: string, status: LeadStatus) => { + const updated = leads.map((l) => + l.id === id ? { ...l, status, lastContact: new Date().toISOString().split("T")[0] } : l + ); + saveLeads(updated); + }; + + const filteredLeads = useMemo(() => { + return leads + .filter((l) => { + if (filter !== "all" && l.category !== filter && l.status !== filter) return false; + if (search && !l.name.toLowerCase().includes(search.toLowerCase())) return false; + return true; + }) + .sort((a, b) => { + let cmp = 0; + if (sortField === "name") cmp = a.name.localeCompare(b.name); + else if (sortField === "category") cmp = a.category.localeCompare(b.category); + else if (sortField === "score") cmp = b.score - a.score; + else if (sortField === "status") cmp = a.status.localeCompare(b.status); + else if (sortField === "phone") cmp = (a.phone ? 1 : 0) - (b.phone ? 1 : 0); + return sortAsc ? cmp : -cmp; + }); + }, [leads, filter, sortField, sortAsc, search]); + + const stats = { + total: leads.length, + withPhone: leads.filter(l => l.phone).length, + noWebsite: leads.filter(l => !l.website).length, + hot: leads.filter(l => l.score >= 9).length, + new: leads.filter((l) => l.status === "new").length, + won: leads.filter((l) => l.status === "won").length, + }; + + const handleSort = (field: SortField) => { + if (sortField === field) { + setSortAsc(!sortAsc); + } else { + setSortField(field); + setSortAsc(false); + } + }; + + const SortIcon = ({ field }: { field: SortField }) => ( + {sortField === field ? (sortAsc ? "↑" : "↓") : "↕"} + ); + + return ( +
+
+ +
+ +
+
+
+

{stats.total}

+

Total Leads

+
+
+

{stats.withPhone}

+

With Phone

+
+
+

{stats.noWebsite}

+

No Website

+
+
+

{stats.hot}

+

Hot (9-10)

+
+
+

{stats.won}

+

Won

+
+
+ +
+
+ + +
+ {tab === "leads" && ( + <> + setSearch(e.target.value)} className="bg-white/10 border border-white/20 rounded-lg px-4 py-2 min-w-[200px]" /> + + + )} +
+ +
+
+ + + + + + + + + + + + + {filteredLeads.map((lead) => ( + + + + + + + + + ))} + +
handleSort("name")}>Lead handleSort("category")}>Category handleSort("phone")}>Phone handleSort("score")}>Score handleSort("status")}>Status Actions
+

{lead.name}

+

{lead.address}

+
{categoryIcons[lead.category]} + {lead.phone ? {lead.phone} : No phone} + + = 9 ? "bg-green-500/20 text-green-400" : lead.score >= 7 ? "bg-yellow-500/20 text-yellow-400" : "bg-red-500/20 text-red-400")}>{lead.score} + + + +
+ {lead.phone && 📞} + {lead.email && ✉️} + {lead.website && 🌐} + +
+
+
+
+ + {/* Email Outreach Tab */} + {tab === "email" && ( +
+
+

📧 Email Outreach

+

Leads with email addresses. Click "Send" to open your email client with pre-filled template.

+
+ {leads.filter(l => l.email).map(lead => ( +
+
+

{lead.name}

+

{lead.email}

+

{categoryIcons[lead.category]} {lead.category}

+
+
+ + ✉️ Send Email +
+
+ ))} + {leads.filter(l => l.email).length === 0 && ( +

No leads with email found. Research more leads!

+ )} +
+
+ +
+

🤖 AI Calling (Coming Soon)

+

Automated voice calls to leads - requires your confirmation before each call.

+

Integrating with Vapi - stay tuned!

+
+
+ )} +
+ + {selectedLead && ( +
+
+
+
+

{selectedLead.name}

+

{categoryIcons[selectedLead.category]} {selectedLead.category}

+
+ +
+
+

{selectedLead.address}

+
+

{selectedLead.phone || "—"}

+

{selectedLead.website || "—"}

+
+

{selectedLead.score}/10

+

{selectedLead.notes}

+

{selectedLead.nextAction}

+
+
+ {selectedLead.phone && 📞 Call} + {selectedLead.email && ✉️ Email} + +
+
+
+ )} +
+ ); +} diff --git a/app/mission-control/docs/page.tsx b/app/mission-control/docs/page.tsx new file mode 100644 index 0000000..cbe48d4 --- /dev/null +++ b/app/mission-control/docs/page.tsx @@ -0,0 +1,31 @@ +# 📚 SiteMente Docs + +Long-term documentation for SiteMente operations. + +## 🚀 Getting Started + +- [Quick Start Guide](/docs/quick-start) +- [Architecture Overview](/docs/architecture) +- [Environment Variables](/docs/env) + +## 🛠 Products + +- [Smart Starter](/docs/products/starter) +- [Smart Site](/docs/products/site) +- [AI Growth Partner](/docs/products/growth) + +## 🔌 Integrations + +- [Vapi Voice AI](/docs/integrations/vapi) +- [MiniMax AI](/docs/integrations/minimax) +- [Stripe Payments](/docs/integrations/stripe) + +## 📋 Operational + +- [Onboarding Checklist](/docs/ops/onboarding) +- [Troubleshooting Guide](/docs/ops/troubleshooting) +- [API Endpoints](/docs/ops/api) + +--- + +*Auto-generated by Horus* 👁️ diff --git a/app/mission-control/page.tsx b/app/mission-control/page.tsx index c7f4ed2..fa1a9d4 100644 --- a/app/mission-control/page.tsx +++ b/app/mission-control/page.tsx @@ -1,10 +1,116 @@ +"use client"; + +import { useState, useEffect } from "react"; import MissionControlDashboard from "@/components/mission-control/MissionControlDashboard"; import { MissionControlProvider } from "@/lib/mission-control/store"; +const CORRECT_USER = "Marshall"; +const CORRECT_PASS = "#1284YallaHorus"; + export default function MissionControlPage() { + const [isAuthenticated, setIsAuthenticated] = useState(false); + const [username, setUsername] = useState(""); + const [password, setPassword] = useState(""); + const [error, setError] = useState(""); + const [mounted, setMounted] = useState(false); + + useEffect(() => { + const saved = localStorage.getItem("sitemente:mc-auth"); + if (saved === "true") { + setIsAuthenticated(true); + } + setMounted(true); + }, []); + + const handleLogin = (e: React.FormEvent) => { + e.preventDefault(); + if (username === CORRECT_USER && password === CORRECT_PASS) { + localStorage.setItem("sitemente:mc-auth", "true"); + setIsAuthenticated(true); + setError(""); + } else { + setError("Invalid credentials"); + } + }; + + const handleLogout = () => { + localStorage.removeItem("sitemente:mc-auth"); + setIsAuthenticated(false); + setUsername(""); + setPassword(""); + }; + + // Show loading until we've checked localStorage on mount + if (!mounted) { + return ( +
+
+
+
👁️
+

Mission Control

+

Loading...

+
+
+
+ ); + } + + if (!isAuthenticated) { + return ( +
+
+
+
👁️
+

Mission Control

+

SiteMente Operations

+
+ +
+
+ + setUsername(e.target.value)} + className="w-full px-4 py-3 rounded-lg bg-white/10 border border-white/20 text-white placeholder:text-white/40 focus:outline-none focus:border-brand-pink" + placeholder="Enter username" + /> +
+ +
+ + setPassword(e.target.value)} + className="w-full px-4 py-3 rounded-lg bg-white/10 border border-white/20 text-white placeholder:text-white/40 focus:outline-none focus:border-brand-pink" + placeholder="Enter password" + /> +
+ + {error && ( +

{error}

+ )} + + +
+ +

+ Restricted access. Authorized personnel only. +

+
+
+ ); + } + return ( - + ); } diff --git a/app/page.tsx b/app/page.tsx index 45c6e43..71c9448 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -18,6 +18,13 @@ const fadeUp = { type Language = "es" | "en"; +type LeadFormData = { + name: string; + phone: string; + business: string; + type: string; +}; + const contentByLang = { es: { nav: { @@ -718,6 +725,8 @@ const servicesByLang = { export default function HomePage() { const [lang, setLang] = useState("es"); const [contactOpen, setContactOpen] = useState(false); + const [leadForm, setLeadForm] = useState({ name: "", phone: "", business: "", type: "restaurant" }); + const [leadSubmitted, setLeadSubmitted] = useState(false); const content = useMemo(() => contentByLang[lang], [lang]); const heroSlides = useMemo( () => [ @@ -891,6 +900,91 @@ export default function HomePage() { ))} + {/* Lead Capture Form */} + {!leadSubmitted && ( + +
+

🚀 Pruébalo Ahora - Es Gratis

+

Completa y te mostraremos tu AI en acción

+
{ + e.preventDefault(); + setLeadSubmitted(true); + // Here we'll connect to GHL later + }} + className="space-y-3" + > + setLeadForm({ ...leadForm, name: e.target.value })} + className="w-full bg-white/10 border border-white/20 rounded-lg px-4 py-2 text-white placeholder-white/50" + /> + setLeadForm({ ...leadForm, phone: e.target.value })} + className="w-full bg-white/10 border border-white/20 rounded-lg px-4 py-2 text-white placeholder-white/50" + /> + setLeadForm({ ...leadForm, business: e.target.value })} + className="w-full bg-white/10 border border-white/20 rounded-lg px-4 py-2 text-white placeholder-white/50" + /> + + +
+
+
+ )} + + {leadSubmitted && ( + +
+
🎉
+

Perfecto, {leadForm.name}!

+

Preparando tu demo personalizada...

+ + 🚀 Entrar a Demo AI + +
+
+ )} + diff --git a/app/success/page.tsx b/app/success/page.tsx new file mode 100644 index 0000000..7f29cf9 --- /dev/null +++ b/app/success/page.tsx @@ -0,0 +1,30 @@ +import Link from "next/link"; + +export default function SuccessPage() { + return ( +
+
+
+

¡Pago Exitoso!

+

+ Thank you for your payment. We've received your order and will contact you shortly to start setting up your AI solution. +

+
+

What happens next?

+
    +
  • ✓ You'll receive a confirmation email
  • +
  • ✓ Our team will contact you within 24 hours
  • +
  • ✓ We'll schedule your onboarding call
  • +
  • ✓ Your AI solution will be live within 48 hours
  • +
+
+ + Back to Home + +
+
+ ); +} diff --git a/components/SiteMenteVoiceWidget.tsx b/components/SiteMenteVoiceWidget.tsx index d1297d6..b553a4d 100644 --- a/components/SiteMenteVoiceWidget.tsx +++ b/components/SiteMenteVoiceWidget.tsx @@ -1,496 +1,181 @@ "use client"; -import { useEffect, useMemo, useRef, useState } from "react"; +import { useState, useRef } from "react"; +import Vapi from "@vapi-ai/web"; -// eslint-disable-next-line @typescript-eslint/no-explicit-any -type SpeechRecognitionInstance = any; -// eslint-disable-next-line @typescript-eslint/no-explicit-any -type SpeechRecognitionConstructor = new () => SpeechRecognitionInstance; +const VAPI_PUBLIC_KEY = "d44a0025-24bb-426d-919a-cb0a96416ed4"; +const ASSISTANT_ID = "92630ca5-e165-4360-bce0-dd8730882569"; -type ChatMessage = { - role: "user" | "assistant"; - content: string; - timestamp: number; -}; - -type ApiResponse = { - response: string; - shouldCaptureEmail: boolean; - suggestedActions: string[]; -}; - -type SiteMenteVoiceWidgetProps = { - initialLang?: "es" | "en"; -}; - -const quickActions = { - es: [ - { label: "¿Cuánto cuesta?", icon: "💰" }, - { label: "Ver casos de éxito", icon: "🎯" }, - { label: "¿Cómo funciona?", icon: "⚙️" }, - ], - en: [ - { label: "Pricing?", icon: "💰" }, - { label: "Success stories", icon: "🎯" }, - { label: "How it works?", icon: "⚙️" }, - ], -} as const; - -const initialGreeting = { - es: "Hola, soy el cerebro de SiteMente. ¿En qué te puedo ayudar hoy?", - en: "Hi, I'm the SiteMente brain. How can I help you today?", -} as const; +interface SiteMenteVoiceWidgetProps { + businessName?: string; + businessType?: "restaurant" | "real-estate" | "clinic" | "car-rental" | "default"; + theme?: "dark" | "light"; +} export default function SiteMenteVoiceWidget({ - initialLang = "es", + businessName = "SiteMente", + businessType = "default", + theme = "dark" }: SiteMenteVoiceWidgetProps) { - const [isOpen, setIsOpen] = useState(false); - const [lang, setLang] = useState<"es" | "en">(initialLang); - const [messages, setMessages] = useState([ - { - role: "assistant", - content: initialGreeting[initialLang], - timestamp: Date.now(), - }, - ]); - const [input, setInput] = useState(""); - const [voiceMode, setVoiceMode] = useState(true); - const [isRecording, setIsRecording] = useState(false); - const [isSpeaking, setIsSpeaking] = useState(false); - const [isLoading, setIsLoading] = useState(false); + const [isActive, setIsActive] = useState(false); + const [status, setStatus] = useState<"idle" | "connecting" | "active" | "error">("idle"); const [transcript, setTranscript] = useState(""); - const [speechSupported, setSpeechSupported] = useState(true); - const [showTooltip, setShowTooltip] = useState(false); - - const recognitionRef = useRef(null); - const isRecordingRef = useRef(false); - const transcriptRef = useRef(""); - const messagesEndRef = useRef(null); - - const localeLabel = useMemo( - () => (lang === "es" ? "ES" : "EN"), - [lang] - ); - - useEffect(() => { - setLang(initialLang); - }, [initialLang]); - - useEffect(() => { - const seen = window.localStorage.getItem("sitemente:voice-tooltip"); - if (!seen) { - setShowTooltip(true); - window.localStorage.setItem("sitemente:voice-tooltip", "1"); - const timeout = window.setTimeout(() => setShowTooltip(false), 4000); - return () => window.clearTimeout(timeout); - } - return undefined; - }, []); - - useEffect(() => { - isRecordingRef.current = isRecording; - }, [isRecording]); - - useEffect(() => { - transcriptRef.current = transcript; - }, [transcript]); - - useEffect(() => { - const SpeechRecognitionImpl = - typeof window !== "undefined" - ? ((window as typeof window & { - webkitSpeechRecognition?: SpeechRecognitionConstructor; - }).SpeechRecognition || - (window as typeof window & { - webkitSpeechRecognition?: SpeechRecognitionConstructor; - }).webkitSpeechRecognition) - : undefined; - - if (!SpeechRecognitionImpl) { - setSpeechSupported(false); - return; - } - - const recognition = new SpeechRecognitionImpl(); - recognition.lang = lang === "es" ? "es-ES" : "en-US"; - recognition.interimResults = true; - recognition.continuous = false; - - recognition.onresult = (event) => { - const result = Array.from(event.results) - .map((res) => res[0]?.transcript ?? "") - .join(" "); - setTranscript(result.trim()); - }; - - recognition.onerror = () => { - setIsRecording(false); - }; - - recognition.onend = () => { - if (isRecordingRef.current) { - setIsRecording(false); - const finalTranscript = transcriptRef.current.trim(); - if (finalTranscript) { - handleSend(finalTranscript); - } - setTranscript(""); - } - }; - - recognitionRef.current = recognition; - }, [lang]); - - useEffect(() => { - messagesEndRef.current?.scrollIntoView({ behavior: "smooth" }); - }, [messages, isOpen]); - - useEffect(() => { - if (!isSpeaking) return; - return () => { - window.speechSynthesis?.cancel(); - }; - }, [isSpeaking]); - - useEffect(() => { - setMessages((prev) => { - if (prev.length === 0) return prev; - const updated = [...prev]; - if (updated[0].role === "assistant") { - updated[0] = { - ...updated[0], - content: initialGreeting[lang], - }; - } - return updated; - }); - }, [lang]); - - const startRecording = () => { - if (!speechSupported || !recognitionRef.current) return; - setTranscript(""); - setIsRecording(true); - recognitionRef.current.start(); - }; - - const stopRecording = () => { - if (!recognitionRef.current) return; - recognitionRef.current.stop(); - setIsRecording(false); - }; - - const speak = (text: string) => { - if (!("speechSynthesis" in window)) return; - window.speechSynthesis.cancel(); - const utterance = new SpeechSynthesisUtterance(text); - utterance.lang = lang === "es" ? "es-ES" : "en-US"; - utterance.onstart = () => setIsSpeaking(true); - utterance.onend = () => setIsSpeaking(false); - utterance.onerror = () => setIsSpeaking(false); - window.speechSynthesis.speak(utterance); - }; - - const handleSend = async (text: string) => { - if (!text.trim() || isLoading) return; - const userMessage: ChatMessage = { - role: "user", - content: text, - timestamp: Date.now(), - }; - setMessages((prev) => [...prev, userMessage]); - setInput(""); - setIsLoading(true); + const [errorMsg, setErrorMsg] = useState(""); + const vapiRef = useRef(null); + const startCall = async () => { try { - const response = await fetch("/api/chat/agent", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ - message: text, - locale: lang, - history: messages.slice(-6), - }), + console.log("Starting call - initializing Vapi inside click handler..."); + setErrorMsg(""); + setStatus("connecting"); + + // Step 1: Verify mic exists + try { + const stream = await navigator.mediaDevices.getUserMedia({ audio: true }); + console.log("✅ Mic stream created:", stream); + console.log("✅ Audio tracks:", stream.getAudioTracks().length); + console.log("✅ Track enabled:", stream.getAudioTracks()[0]?.enabled); + console.log("✅ Track settings:", stream.getAudioTracks()[0]?.getSettings()); + } catch (micErr) { + console.log("❌ Mic error:", micErr); + } + + // Initialize Vapi INSIDE the click handler (required for iOS) + const vapi = new Vapi(VAPI_PUBLIC_KEY); + vapiRef.current = vapi; + + // Set up event listeners + vapi.on("error", (error: any) => { + console.log("Vapi error:", error); + const msg = String(error?.message || error?.error?.message || JSON.stringify(error) || "Error desconocido"); + setErrorMsg(msg); + setStatus("error"); + setIsActive(false); }); - if (!response.ok) { - throw new Error("Failed to fetch response."); - } + vapi.on("call-start", () => { + console.log("✅ Call started!"); + setStatus("active"); + + // Check peer connection for audio senders + setTimeout(() => { + try { + // @ts-ignore - internal property + const pc = vapiRef.current?._call?._pc; + if (pc) { + console.log("📡 PeerConnection found"); + pc.getSenders().forEach((sender: any, i: number) => { + console.log(`Sender ${i}:`, sender.track?.kind, sender.track?.enabled); + }); + } else { + console.log("⚠️ No PeerConnection found"); + } + } catch (e) { + console.log("Error checking PC:", e); + } + }, 2000); + }); - const data = (await response.json()) as ApiResponse; - const assistantMessage: ChatMessage = { - role: "assistant", - content: data.response, - timestamp: Date.now(), - }; - setMessages((prev) => [...prev, assistantMessage]); + vapi.on("call-end", (e: any) => { + console.log("Call ended", e); + setStatus("idle"); + setIsActive(false); + }); - if (voiceMode) { - speak(data.response); - } - } catch (error) { - const fallbackMessage: ChatMessage = { - role: "assistant", - content: - lang === "es" - ? "Hubo un problema al responder. ¿Quieres intentarlo de nuevo?" - : "There was a problem responding. Want to try again?", - timestamp: Date.now(), - }; - setMessages((prev) => [...prev, fallbackMessage]); - } finally { - setIsLoading(false); + vapi.on("message", (m: any) => { + console.log("Vapi message:", m); + }); + + vapi.on("speech-start", () => { + console.log("User speech detected!"); + }); + + vapi.on("speech-end", () => { + console.log("User speech ended"); + }); + + vapi.on("transcript", (transcript: any) => { + console.log("Transcript:", transcript); + if (typeof transcript === "string") { + setTranscript(transcript); + } else if (transcript?.text) { + setTranscript(transcript.text); + } + }); + + console.log("Calling assistant:", ASSISTANT_ID); + + // Start the call + await vapi.start(ASSISTANT_ID); + + console.log("Call started successfully"); + setIsActive(true); + } catch (error: any) { + console.log("Start error:", error); + const msg = String(error?.message || error?.error?.message || JSON.stringify(error) || "Error al iniciar"); + setErrorMsg(msg); + setStatus("error"); } }; - const voiceIndicator = isRecording - ? "🎤" - : isSpeaking - ? "🔊" - : "🎤"; + const endCall = async () => { + try { + if (vapiRef.current) { + await vapiRef.current.stop(); + } + setIsActive(false); + setStatus("idle"); + setTranscript(""); + } catch (error) { + console.error("End call error:", error); + } + }; + + const buttonColor = theme === "dark" ? "bg-brand-pink" : "bg-blue-600"; return ( - <> - {!isOpen && ( -
-
- - {showTooltip && ( -
- {lang === "es" ? "Prueba la voz" : "Try voice"} -
- )} -
- ▶ Demo -
+
+ {status === "error" && errorMsg && ( +
+ ⚠️ {errorMsg} +
+ )} + + {isActive && ( +
+
+ 🤖 AI + +
+
+ {transcript || "Escuchando..."}
)} - {isOpen && ( -
-
setIsOpen(false)} /> -
-
-
-
- SiteMente IA - - - - - -
-

- {lang === "es" ? "El cerebro de tu web" : "Your website brain"} -

-
-
- {voiceIndicator} - - -
-
+ -
- {messages.length === 1 && ( -
- {quickActions[lang].map((action) => ( - - ))} -
- )} -
- {messages.map((message) => ( -
-
-
- {message.role === "assistant" && ( - - SM - - )} -

{message.content}

-
- - {new Date(message.timestamp).toLocaleTimeString( - lang === "es" ? "es-ES" : "en-US", - { hour: "2-digit", minute: "2-digit" } - )} - -
-
- ))} - {isLoading && ( -
- - - -
- )} - {isSpeaking && ( -
- - - - - - {lang === "es" ? "Hablando..." : "Speaking..."} -
- )} -
-
-
- -
- {voiceMode ? ( -
- {transcript && ( -

- {transcript} -

- )} - -

- {isRecording - ? lang === "es" - ? "Escuchando..." - : "Listening..." - : isSpeaking - ? lang === "es" - ? "Hablando..." - : "Speaking..." - : lang === "es" - ? "Toca para hablar" - : "Tap to talk"} -

- {isSpeaking && ( -
-
-
- )} -
- - -
-
- ) : ( -
- setInput(event.target.value)} - placeholder={ - lang === "es" - ? "Escribe tu mensaje..." - : "Type your message..." - } - className="flex-1 rounded-full border border-white/20 bg-white/10 px-4 py-2 text-sm text-white placeholder:text-white/50 focus:border-white/50 focus:outline-none" - /> - - -
- )} - {!speechSupported && ( -

- {lang === "es" - ? "Tu navegador no soporta voz. Usa el modo texto." - : "Your browser doesn't support voice. Use text mode."} -

- )} -
-
+ {status === "connecting" && ( +
+ Conectando...
)} - +
); } diff --git a/components/mission-control/MissionControlDashboard.tsx b/components/mission-control/MissionControlDashboard.tsx index 6dace73..89548bd 100644 --- a/components/mission-control/MissionControlDashboard.tsx +++ b/components/mission-control/MissionControlDashboard.tsx @@ -4,6 +4,10 @@ import { useState, useEffect } from "react"; import { useMissionControl } from "@/lib/mission-control/store"; import { TaskStatus } from "@/lib/mission-control/types"; import VoiceChat from "./VoiceChat"; +import MondayBoard from "./MondayBoard"; +import { TaskCardsPanel } from "./TaskCardsPanel"; +import { TaskHistoryPanel } from "./TaskHistoryPanel"; +import { TradingPanel } from "./TradingPanel"; import AIManagement from "@/components/ai-management/AIManagement"; import Council from "@/components/council/Council"; @@ -23,13 +27,27 @@ interface SidebarCategory { } const sidebarCategories: SidebarCategory[] = [ + { id: "leads", name: "Leads", icon: "📈", items: [ + { id: "leads-crm", name: "CRM", icon: "📊", category: "leads" }, + { id: "dashboard", name: "Client Dashboard", icon: "🏢", category: "dashboard" }, + ]}, { id: "projects", name: "Projects", icon: "🎯", items: [ + { id: "monday", name: "Monday Board", icon: "📊", category: "monday" }, { id: "sitemente", name: "SiteMente", icon: "🌐", color: "#ff7bc0", category: "projects" }, { id: "demos", name: "Demo Pages", icon: "🎨", category: "demos" }, { id: "holacompi", name: "HolaCompi", icon: "🤝", color: "#6366f1", category: "projects" }, + { id: "arabredox", name: "Arabredox", icon: "💚", color: "#22c55e", category: "projects" }, + { id: "infrastructure", name: "Infra", icon: "⚙️", color: "#10b981", category: "projects" }, + ]}, + { id: "trading", name: "Trading", icon: "📈", items: [ + { id: "trading-research", name: "Deep Research", icon: "🔬", category: "trading" }, + { id: "trading-strategies", name: "Strategies", icon: "🎯", category: "trading" }, + { id: "trading-execution", name: "Execution", icon: "⚡", category: "trading" }, + { id: "trading-journal", name: "Journal", icon: "📔", category: "trading" }, ]}, { id: "tasks", name: "Tasks", icon: "✓", items: [ - { id: "all", name: "All Tasks", icon: "📋", category: "tasks" }, + { id: "task-cards", name: "Task Cards", icon: "☑️", category: "task-cards" }, + { id: "task-history", name: "History", icon: "📜", category: "task-history" }, ]}, { id: "chat", name: "Chat", icon: "💬", items: [ { id: "voice", name: "Voice Chat", icon: "🎤", category: "chat" }, @@ -44,6 +62,9 @@ const sidebarCategories: SidebarCategory[] = [ { id: "memory", name: "Memory", icon: "🧠", items: [ { id: "logs", name: "Session Logs", icon: "📝", category: "memory" }, ]}, + { id: "docs", name: "Docs", icon: "📚", items: [ + { id: "docs-index", name: "Documentation", icon: "📚", category: "docs" }, + ]}, ]; const statusConfig: Record = { @@ -54,8 +75,13 @@ const statusConfig: Record = { paused: { label: "Paused", color: "text-gray-400" }, }; -export default function MissionControlDashboard() { +interface MissionControlDashboardProps { + onLogout?: () => void; +} + +export default function MissionControlDashboard({ onLogout }: MissionControlDashboardProps) { const { tasks, toggleTask, updateTaskStatus, addTask, getProjectProgress, getTasksByProject } = useMissionControl(); + const [mounted, setMounted] = useState(false); const [selectedItem, setSelectedItem] = useState("sitemente"); const [filter, setFilter] = useState("all"); const [expandedCategories, setExpandedCategories] = useState(["projects"]); @@ -64,6 +90,10 @@ export default function MissionControlDashboard() { const [newTaskTitle, setNewTaskTitle] = useState(""); const [newTaskProject, setNewTaskProject] = useState("sitemente"); + useEffect(() => { + setMounted(true); + }, []); + useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if (e.key === "/" && !e.ctrlKey && !e.metaKey) { @@ -115,8 +145,36 @@ export default function MissionControlDashboard() { setNewTaskTitle(""); }; + if (!mounted) { + return ( +
+
Loading...
+
+ ); + } + + // Golden Wisdom Banner + const goldenNotes = ( +
+
+
+ 🔥 +

GOLDEN NOTES

+
+
    +
  • • Fun first. Learning second. Outcome last.
  • +
  • • Signal intent early — don't wait too long
  • +
  • • Warmth + tension = desire, not friendzone
  • +
  • • Lead more — calm + leading = attractive
  • +
  • • Feel more, optimize less
  • +
+
+
+ ) + return (
+ {goldenNotes} @@ -169,10 +230,14 @@ export default function MissionControlDashboard() { {currentItem?.category === "chat" &&
} + {currentItem?.category === "monday" &&
} + {currentItem?.category === "council" && currentItem?.id === "teams" &&
} {currentItem?.category === "council-settings" &&
} + {currentItem?.category === "trading" && } + {currentItem?.category === "calendar" && (
@@ -191,6 +256,37 @@ export default function MissionControlDashboard() {

Memory is stored in:

  • • localStorage (browser)
  • • GitHub repo (daily commits)
  • • MEMORY.md (curated)
)} + + {currentItem?.category === "docs" && ( + + )} + + {/* Task Cards View */} + {currentItem?.category === "task-cards" && ( + + )} + + {/* Task History View */} + {currentItem?.category === "task-history" && ( + + )} {currentItem?.category === "demos" && (
@@ -208,6 +304,32 @@ export default function MissionControlDashboard() {
)} + {currentItem?.category === "leads" && ( +
+
+
📈
+

Leads CRM

+

Track and manage your leads

+ +
+
+ )} + + {currentItem?.category === "dashboard" && ( +
+
+
🏢
+

Client Dashboard

+

Where your clients see bookings & leads

+ +
+
+ )} + {currentItem?.category === "projects" && ( <> @@ -237,6 +359,7 @@ export default function MissionControlDashboard() { diff --git a/components/mission-control/MondayBoard.tsx b/components/mission-control/MondayBoard.tsx new file mode 100644 index 0000000..9b844a7 --- /dev/null +++ b/components/mission-control/MondayBoard.tsx @@ -0,0 +1,261 @@ +"use client"; + +import { useState, useEffect } from "react"; + +// Monday-style columns +const COLUMNS = [ + { id: "brainstorming", name: "💡 Brainstorming", color: "#ff6b6b" }, + { id: "planning", name: "📋 Planning", color: "#ffd93d" }, + { id: "ready", name: "✅ Ready", color: "#6bcb77" }, + { id: "in-progress", name: "🚀 In Progress", color: "#4d96ff" }, + { id: "review", name: "👀 Review", color: "#9b59b6" }, + { id: "done", name: "🎉 Done", color: "#00d2d3" }, +]; + +interface Feature { + id: string; + title: string; + description: string; + column: string; + projectId: string; + approved: boolean; + implemented: boolean; +} + +// Project features - these will be listed for approval +const PROJECT_FEATURES_INITIAL: Feature[] = [ + // SiteMente v1 + { id: "s1", title: "Vertical Pack Cards", description: "Beautiful cards for Real Estate, Restaurant, Clinic verticals on landing", column: "brainstorming", projectId: "sitemente-v1", approved: false, implemented: false }, + { id: "s2", title: "Contact/Onboarding Form", description: "Lead capture form with business type selection", column: "brainstorming", projectId: "sitemente-v1", approved: false, implemented: false }, + { id: "s3", title: "AI Widget Live Demo", description: "Working voice/chat AI widget on landing page", column: "brainstorming", projectId: "sitemente-v1", approved: false, implemented: false }, + { id: "s4", title: "Mobile Responsive Pass", description: "Full mobile responsiveness audit and fixes", column: "planning", projectId: "sitemente-v1", approved: false, implemented: false }, + { id: "s5", title: "Demo Pages SEO", description: "Per-vertical landing pages with unique meta tags", column: "planning", projectId: "sitemente-v1", approved: false, implemented: false }, + { id: "s6", title: "Lead Capture Integration", description: "Connect forms to email/CRM notification", column: "planning", projectId: "sitemente-v1", approved: false, implemented: false }, + { id: "s7", title: "WhatsApp Business Integration", description: "Auto-send leads to WhatsApp", column: "planning", projectId: "sitemente-v1", approved: false, implemented: false }, + { id: "s8", title: "Pricing Toggle", description: "Monthly/Annual toggle with discount display", column: "ready", projectId: "sitemente-v1", approved: false, implemented: false }, + { id: "s9", title: "Case Studies Section", description: "Real testimonials from Costa del Sol clients", column: "ready", projectId: "sitemente-v1", approved: false, implemented: false }, + { id: "s10", title: "Blog Section", description: "SEO blog with AI-generated content tips", column: "in-progress", projectId: "sitemente-v1", approved: false, implemented: false }, + // HolaCompi v1 + { id: "h1", title: "Voice AI Agent", description: "Real voice conversation with callers", column: "brainstorming", projectId: "holacompi-v1", approved: false, implemented: false }, + { id: "h2", title: "WhatsApp Integration", description: "AI responds on WhatsApp Business", column: "brainstorming", projectId: "holacompi-v1", approved: false, implemented: false }, + { id: "h3", title: "Consumer Rights Chatbot", description: "Legal info chatbot for immigrants", column: "brainstorming", projectId: "holacompi-v1", approved: false, implemented: false }, + { id: "h4", title: "Spanish Bureaucracy Guide", description: "AI guide through Spanish paperwork", column: "planning", projectId: "holacompi-v1", approved: false, implemented: false }, + { id: "h5", title: "Multi-language Support", description: "ES, EN, FR, AR, RO language options", column: "planning", projectId: "holacompi-v1", approved: false, implemented: false }, + { id: "h6", title: "Emergency Contacts", description: "Quick access to emergency services by location", column: "ready", projectId: "holacompi-v1", approved: false, implemented: false }, + // Infrastructure + { id: "i1", title: "Production Deployment", description: "Deploy to production domain (sitemente.com)", column: "planning", projectId: "infrastructure", approved: false, implemented: false }, + { id: "i2", title: "Cloud Backups", description: "Automated daily backups to cloud storage", column: "planning", projectId: "infrastructure", approved: false, implemented: false }, + { id: "i3", title: "Monitoring Setup", description: "Uptime monitoring and alerts", column: "planning", projectId: "infrastructure", approved: false, implemented: false }, + { id: "i4", title: "SSL Certificate", description: "Proper HTTPS for production", column: "ready", projectId: "infrastructure", approved: false, implemented: false }, + { id: "i5", title: "Email Notifications", description: "System sends emails for important events", column: "in-progress", projectId: "infrastructure", approved: false, implemented: false }, +]; + +const PROJECTS = [ + { id: "sitemente-v1", name: "SiteMente v1", emoji: "🏢", description: "AI website platform for local businesses", color: "#8B5CF6" }, + { id: "holacompi-v1", name: "HolaCompi v1", emoji: "🤝", description: "AI ally for immigrants & consumers", color: "#EC4899" }, + { id: "infrastructure", name: "Infrastructure", emoji: "⚙️", description: "DevOps, deployment & maintenance", color: "#10B981" }, +]; + +export default function MondayBoard() { + const [mounted, setMounted] = useState(false); + const [selectedProject, setSelectedProject] = useState("sitemente-v1"); + const [features, setFeatures] = useState([]); + const [showApproval, setShowApproval] = useState(null); + + useEffect(() => { + setMounted(true); + setFeatures(PROJECT_FEATURES_INITIAL); + }, []); + + if (!mounted) { + return ( +
+
Loading...
+
+ ); + } + + const projectFeatures = features.filter(f => f.projectId === selectedProject); + + const getColumnFeatures = (columnId: string) => { + return projectFeatures.filter(f => f.column === columnId); + }; + + const approveFeature = (featureId: string) => { + setFeatures(prev => prev.map(f => + f.id === featureId ? { ...f, approved: true, column: "ready" } : f + )); + setShowApproval(null); + }; + + const markImplemented = (featureId: string) => { + setFeatures(prev => prev.map(f => + f.id === featureId ? { ...f, implemented: true, column: "done" } : f + )); + }; + + const getProgress = () => { + const total = projectFeatures.length; + const done = projectFeatures.filter(f => f.column === "done").length; + return total > 0 ? Math.round((done / total) * 100) : 0; + }; + + const currentFeature = showApproval ? features.find(f => f.id === showApproval) : null; + + return ( +
+ {/* Project Selector */} +
+ Project: +
+ {PROJECTS.map(proj => ( + + ))} +
+
+
+
+
+ {getProgress()}% +
+
+ + {/* Board */} +
+
+ {COLUMNS.map(column => { + const columnFeatures = getColumnFeatures(column.id); + return ( +
+ {/* Column Header */} +
+
+ + {column.name} + + + {columnFeatures.length} + +
+
+ + {/* Features List */} +
+ {columnFeatures.map(feature => ( +
{ + if (!feature.approved && !feature.implemented) { + setShowApproval(feature.id); + } + }} + > +
+
+

{feature.title}

+

{feature.description}

+
+
+ {feature.approved && !feature.implemented && ( + + )} + {feature.approved && ( + ✓ Approved + )} + {feature.implemented && ( + 🎉 Live + )} +
+
+
+ ))} + + {columnFeatures.length === 0 && ( +
+ No items +
+ )} +
+
+ ); + })} +
+
+ + {/* Approval Modal */} + {showApproval && currentFeature && ( +
setShowApproval(null)} + > +
e.stopPropagation()} + > +

🚀 Approve Feature?

+

{currentFeature.description}

+ +
+

{currentFeature.title}

+

{currentFeature.description}

+
+ +
+ + +
+ +

+ Clicking approve will move this to Ready column for implementation +

+
+
+ )} +
+ ); +} diff --git a/components/mission-control/TaskCardsPanel.tsx b/components/mission-control/TaskCardsPanel.tsx new file mode 100644 index 0000000..214f7b4 --- /dev/null +++ b/components/mission-control/TaskCardsPanel.tsx @@ -0,0 +1,279 @@ +'use client' + +import { useState, useEffect } from 'react' +import { Task, TaskStatus } from '@/lib/mission-control/types' + +interface TaskCardsPanelProps { + tasks: Task[] + toggleTask: (id: string) => void +} + +const projects = ['sitemente', 'holacompi', 'arabredox', 'infrastructure', 'trading'] + +export function TaskCardsPanel({ tasks, toggleTask }: TaskCardsPanelProps) { + const [selectedProject, setSelectedProject] = useState('sitemente') + const [selectedTaskId, setSelectedTaskId] = useState(null) + const [command, setCommand] = useState('') + const [responses, setResponses] = useState<{id: string, task: string, command: string, reply: string, createdAt: string}[]>([]) + + // Poll for replies every 10 seconds + useEffect(() => { + const pollReplies = async () => { + try { + const res = await fetch('/api/command-history') + if (res.ok) { + const data = await res.json() + // Get entries with replies that haven't been shown + const withReplies = (data.history || []).filter((h: any) => h.reply && h.reply.length > 0) + setResponses(withReplies.slice(-5).reverse()) + } + } catch (e) {} + } + + pollReplies() + const interval = setInterval(pollReplies, 10000) + return () => clearInterval(interval) + }, []) + + const projectTasks = tasks.filter(t => + t.project === selectedProject && + (t.status === 'todo' || t.status === 'in_progress') + ) + + const handleTaskClick = (taskId: string) => { + setSelectedTaskId(selectedTaskId === taskId ? null : taskId) + setCommand('') + } + + const handleConfirm = () => { + if (!selectedTaskId || !command.trim()) return + + const task = tasks.find(t => t.id === selectedTaskId) + if (!task) return + + fetch('/api/command-history', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + task: task.title, + command: command, + project: selectedProject, + action: 'continue-task' + }) + }).catch(() => {}) + + fetch('/api/command', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + command: command, + task: task.title, + action: 'continue-task' + }) + }).catch(() => {}) + + alert(`✅ Sent to Horus: "${command}"`) + setCommand('') + setSelectedTaskId(null) + } + + const handleQuickChat = () => { + if (!command.trim()) return + + // Save quick chat to history - this will notify Horus via the API + fetch('/api/command-history', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + task: `Quick message - ${selectedProject}`, + command: command, + project: selectedProject, + action: 'quick-message' + }) + }).catch(() => {}) + + alert(`✅ Sent to Horus! I'll reply shortly.`) + setCommand('') + } + + const selectedTask = tasks.find(t => t.id === selectedTaskId) + + return ( +
+ {/* Project Tabs */} +
+ {projects.map(project => { + const count = tasks.filter(t => + t.project === project && + (t.status === 'todo' || t.status === 'in_progress') + ).length + + return ( + + ) + })} +
+ + {/* Task Cards */} +
+

+ 📋 {selectedProject.toUpperCase()} TASKS ({projectTasks.length}) +

+ +
+ {projectTasks.map((task) => ( +
handleTaskClick(task.id)} + > +
+ + +
+

+ {task.title} +

+ {task.description && ( +

{task.description}

+ )} +
+ + + {selectedTaskId === task.id ? '▼' : '▶'} + +
+ + {/* Expanded Input */} + {selectedTaskId === task.id && ( +
+