Plataforma ecommerce con dashboard administrativo para la venta de yerba mate agroecológica, yuyos, mates y accesorios.
- Node.js 20+
- pnpm
- Cuenta de Supabase
- Cuenta de Google (para OAuth)
# Instalar dependencias
pnpm install
# Configurar variables de entorno
cp env.example .env.local
# Edita .env.local con tus credenciales
# Crear tablas en Supabase
pnpm run db:generate
pnpm run db:migrate
# Poblar con datos de ejemplo
pnpm run db:seed
# Iniciar servidor de desarrollo
pnpm run devAbre http://localhost:3000 en tu navegador.
- Variables de entorno requeridas (en
.env.local):
# NextAuth (Sistema Unificado)
NEXTAUTH_SECRET=your_nextauth_secret_key
NEXTAUTH_URL=http://localhost:3000
# Google OAuth
GOOGLE_CLIENT_ID=your_google_client_id
GOOGLE_CLIENT_SECRET=your_google_client_secret
# Database
DATABASE_URL=your_supabase_database_url- Crear usuario admin inicial:
# Ejecutar script para crear admin
pnpm exec tsx scripts/create-admin.ts- Visitantes: Pueden navegar libremente por la tienda
- Login con credenciales:
- Admin → redirige a
/dashboard - Cliente → redirige a
/(tienda)
- Admin → redirige a
- Login con Google: Siempre crea/permita acceso como cliente
- Registro: Siempre crea usuarios como 'customer' (no admin)
- Base de datos Supabase con 14 tablas
- Dashboard admin con métricas en tiempo real
- Gestión de productos y variantes
- Sistema de inventario con alertas
- Sistema de puntos/fidelidad (base de datos)
- Sistema de autenticación unificado (NextAuth)
- Migración de Clerk a NextAuth para admin y clientes
- Sistema de roles (admin/customer) en tabla customers
- OAuth con Google para clientes
- Login unificado con redirección automática por role
- Middleware simplificado y unificado
- Script para crear usuario admin inicial
- Tienda pública completa (catálogo, filtros, búsqueda)
- Carrito de compras con persistencia
- Checkout para invitados y registrados
- Sistema de autenticación de clientes (NextAuth)
- Páginas de detalle de producto
- Gestión de imágenes con Cloudinary
- API routes completas para checkout
- SEO y metadata dinámica
- Responsive design
- Sistema de pagos (MercadoPago)
- Sistema de puntos/fidelidad completo
- Notificaciones por email
- Admin: Dashboard completo para gestión
- Cliente Invitado: Compra sin registro (no acumula puntos)
- Cliente Registrado: Compra con cuenta (acumula puntos y beneficios)
- Framework: Next.js 15.3.5 con App Router
- Lenguaje: TypeScript 5
- UI: Shadcn/ui + Tailwind CSS 4
- Base de Datos: Supabase (PostgreSQL)
- ORM: Drizzle ORM
- Autenticación: Clerk
- Deploy: Vercel
yerbashop/
├── src/
│ ├── app/
│ │ ├── dashboard/ # Dashboard admin
│ │ ├── (tienda)/ # Ecommerce público ✅
│ │ │ ├── page.tsx # Home/Landing
│ │ │ ├── tienda/ # Catálogo
│ │ │ ├── producto/[slug]/ # Detalle producto
│ │ │ ├── carrito/ # Carrito
│ │ │ ├── checkout/ # Checkout
│ │ │ ├── orden/[id]/ # Confirmación
│ │ │ ├── login/ # Login clientes
│ │ │ ├── registro/ # Registro clientes
│ │ │ └── perfil/ # Perfil cliente
│ │ ├── api/ # API routes
│ │ │ ├── auth/ # NextAuth
│ │ │ ├── products/ # Productos
│ │ │ ├── orders/ # Pedidos
│ │ │ └── checkout/ # Checkout
│ │ ├── sitemap.ts # SEO
│ │ └── robots.ts # SEO
│ ├── components/
│ │ ├── ui/ # Componentes base
│ │ ├── layouts/ # Layouts
│ │ ├── product/ # Componentes productos
│ │ ├── cart/ # Componentes carrito
│ │ ├── admin/ # Componentes admin
│ │ └── providers/ # Providers (NextAuth)
│ ├── lib/
│ │ ├── database/ # Funciones de BD
│ │ ├── auth.ts # NextAuth config
│ │ ├── cloudinary.ts # Cloudinary config
│ │ ├── metadata.ts # SEO metadata
│ │ └── supabase.ts # Cliente Supabase
│ ├── store/
│ │ └── cart-store.ts # Zustand store
│ ├── hooks/
│ │ └── use-cart.ts # Hook carrito
│ ├── db/
│ │ ├── schema.ts # Esquemas de BD
│ │ └── index.ts # Cliente Drizzle
│ └── config/ # Configuración
├── scripts/
│ ├── seed-simple.ts # Poblar BD
│ ├── test-connection.ts # Test de conexión
│ └── check-data.ts # Verificar datos
└── drizzle/ # Migraciones
categories- Categorías de productosproducts- Productos baseproduct_variants- Variantes (0.5kg, 1kg, 2kg, 3kg)inventory- Control de stockstock_movements- Historial de movimientoscustomers- Clientes (invitados + registrados)orders- Pedidosorder_items- Items de pedidosloyalty_transactions- Movimientos de puntosloyalty_rewards- Recompensasloyalty_redemptions- Canjes
# Desarrollo
pnpm run dev # Servidor de desarrollo
# Base de datos
pnpm run db:generate # Generar migraciones
pnpm run db:migrate # Ejecutar migraciones
pnpm run db:seed # Poblar con datos de ejemplo
pnpm run db:test # Probar conexión
pnpm run db:check # Verificar datos
pnpm run db:studio # Abrir Drizzle Studio
# Producción
pnpm run build # Build para producción
pnpm run start # Servidor de producción
pnpm run lint # LinterVer documentos detallados:
ARQUITECTURA-YERBASHOP.md- Arquitectura completa del sistemaROADMAP-PRIORIDADES.md- Plan de implementación por fases
Crea un archivo .env.local con:
# Supabase
NEXT_PUBLIC_SUPABASE_URL=tu_url_de_supabase
NEXT_PUBLIC_SUPABASE_ANON_KEY=tu_anon_key
SUPABASE_SERVICE_ROLE_KEY=tu_service_role_key
DATABASE_URL=postgresql://postgres.ref:password@aws-region.pooler.supabase.com:6543/postgres
# Clerk
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=tu_clerk_publishable_key
CLERK_SECRET_KEY=tu_clerk_secret_keyEste es un proyecto privado desarrollado para un cliente específico.
Privado - Todos los derechos reservados