⚙️

Admin Panel

Accesso riservato — inserisci la password amministratore

Password errata. Riprova.
● Live
← Sito
0
Acquisti totali
€0
Ricavi stimati
0
Bundle venduti
0
Acquisti oggi
Registro Acquisti
DataEmailProdottoImporto Codice LicenzaAzioni

I dati sono salvati in localStorage di questo browser. Con Stripe Webhook integrato (vedi Setup) si popoleranno automaticamente e in modo permanente.

Come funziona il flusso di pagamento

Attualmente il sito genera la licenza lato client (nel browser del cliente). Funziona per un test rapido, ma in produzione non è sicuro: chiunque potrebbe teoricamente generarsi una licenza senza pagare. Di seguito i due percorsi per mettere tutto in produzione correttamente.

⚠️ Problema attuale: La chiave privata ECDSA è nel codice HTML visibile a tutti. Prima del deploy in produzione devi spostare la firma licenze sul server (opzione A o B qui sotto).

Opzione A — Netlify Functions (consigliata, gratuita)

Netlify ospita il tuo sito HTML gratis e permette di creare funzioni serverless che vengono eseguite sul server (non visibili al client). Flusso:

1
Crea account su Stripe e Netlify
Stripe: dashboard.stripe.com → crea i 4 prodotti (Dashboard Pro, Guida Fin, Guida Inv, Bundle) come pagamenti una tantum. Copia i price_ID e inseriscili nei PRODUCT.priceId in ogni pagina HTML. Netlify: netlify.com → crea account free.
2
Struttura cartelle del tuo progetto
Crea questa struttura locale, poi carica su Netlify (drag & drop della cartella):
mellow-money/
├── index.html
├── prodotto-dashboard.html
├── prodotto-bundle.html
├── prodotto-guida-finanziamenti.html
├── prodotto-guida-investimenti.html
├── admin.html
└── netlify/
    └── functions/
        ├── create-payment-intent.js   ← crea il PaymentIntent
        └── stripe-webhook.js          ← riceve conferma pagamento
3
Crea netlify/functions/create-payment-intent.js
Questa funzione viene chiamata dal browser quando il cliente clicca "Paga". Crea il PaymentIntent su Stripe e restituisce il clientSecret al browser.
// netlify/functions/create-payment-intent.js
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);

exports.handler = async (event) => {
  const { priceId, email } = JSON.parse(event.body);

  // Mappa priceId → importo in centesimi
  const amounts = {
    'price_DASHBOARD_PRO_ID': 2950,   // €29,50
    'price_GFIN_ID_QUI':      1350,   // €13,50
    'price_GINV_ID_QUI':      1350,   // €13,50
    'price_BUNDLE_ID_QUI':    4999,   // €49,99
  };

  const paymentIntent = await stripe.paymentIntents.create({
    amount:   amounts[priceId] || 4999,
    currency: 'eur',
    metadata: { email, priceId },
    receipt_email: email,
  });

  return {
    statusCode: 200,
    body: JSON.stringify({ clientSecret: paymentIntent.client_secret }),
  };
};
4
Sblocca il codice Stripe nelle pagine prodotto
In ogni pagina prodotto, nella funzione processPayment(), decommentare il blocco segnato con "PRODUZIONE" e sostituire l'URL con la tua funzione Netlify:
// Sostituisci il blocco "demo flow" con questo:
const res = await fetch('/.netlify/functions/create-payment-intent', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ priceId: PRODUCT.priceId, email })
});
const { clientSecret } = await res.json();

const result = await stripe.confirmCardPayment(clientSecret, {
  payment_method: { card: cardElement, billing_details: { email } }
});

if (result.error) throw new Error(result.error.message);
// Se arrivato qui: pagamento OK → genera licenza
const license = await generateLicense(email, PRODUCT.key);
5
Crea il Webhook per email automatica (opzionale ma consigliato)
Il webhook viene chiamato da Stripe ogni volta che un pagamento va a buon fine. Puoi usarlo per inviare l'email con la licenza via Resend, Mailgun o simili. Alternativa più semplice: usa Make.com o Zapier con trigger "Stripe payment succeeded".
// netlify/functions/stripe-webhook.js
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);
const { Resend } = require('resend'); // npm install resend

const resend = new Resend(process.env.RESEND_API_KEY);

exports.handler = async (event) => {
  const sig = event.headers['stripe-signature'];
  let stripeEvent;
  
  try {
    stripeEvent = stripe.webhooks.constructEvent(
      event.body, sig, process.env.STRIPE_WEBHOOK_SECRET
    );
  } catch (err) {
    return { statusCode: 400, body: `Webhook Error: ${err.message}` };
  }

  if (stripeEvent.type === 'payment_intent.succeeded') {
    const pi = stripeEvent.data.object;
    const { email, priceId } = pi.metadata;
    
    // Genera licenza lato server (qui è sicuro — chiave privata in env var)
    const license = await generateLicenseServer(email, priceId);
    
    // Invia email con Resend
    await resend.emails.send({
      from: 'noreply@getmellow.com',
      to: email,
      subject: 'Il tuo accesso Mellow Money',
      html: `
        <h2>Benvenuto su Mellow Money!</h2>
        <p>Il tuo codice di attivazione:</p>
        <code style="background:#000;padding:16px;display:block">${license}</code>
        <p>Download dashboard: https://getmellow.com/dashboard.html</p>
      `
    });
  }

  return { statusCode: 200, body: 'OK' };
};
6
Variabili d'ambiente su Netlify
Su netlify.com → Site Settings → Environment Variables, aggiungi:
STRIPE_SECRET_KEY=sk_live_xxx...        ← da Stripe Dashboard (usa sk_test_ per test)
STRIPE_WEBHOOK_SECRET=whsec_xxx...      ← da Stripe → Webhooks → endpoint secret
RESEND_API_KEY=re_xxx...                ← da resend.com (piano free: 3000 email/mese)
ECDSA_PRIVATE_KEY_D=EiH4GBm2pCuaet...  ← il campo "d" della tua JWK privata
✓ Alternativa più rapida — Stripe Checkout hosted: Invece di gestire il form carta tu, usa stripe.redirectToCheckout({ lineItems: [{ price: priceId, quantity: 1 }], mode: 'payment', successUrl, cancelUrl, customerEmail: email }). Stripe gestisce tutto il form di pagamento. Meno controllo estetico, ma zero complessità PCI. Ottimo per iniziare.

Opzione B — Make.com o Zapier (zero codice)

Se non vuoi scrivere codice, puoi usare Stripe Checkout hosted + Make.com per l'automazione:

1
Crea i Payment Links su Stripe
Dashboard Stripe → Payment Links → crea un link per ogni prodotto. Personalizza con logo e colori. Il cliente viene reindirizzato a una pagina Stripe, paga, poi torna sul tuo sito (URL di successo che imposti tu).
2
Crea Scenario su Make.com
Trigger: Stripe → Watch Events → payment_intent.succeeded → Action: Email → Send Email con il codice generato dal Generatore Licenze (vedi tab "Genera Licenza Manuale"). Funziona, ma richiede un passaggio semi-manuale per la generazione del codice se non usi un webhook con crypto.
3
Per piena automazione Make: usa HTTP module
Nel tuo scenario Make, dopo il trigger Stripe aggiungi un modulo HTTP → Make a Request che chiama la funzione Netlify create-license passando email e prodotto, e riceve il codice da includere nell'email.

Riepilogo raccomandato per il tuo caso

✓ Setup consigliato — 3 ore di lavoro, zero costi fissi:

1. Netlify (free) → ospita tutti gli HTML
2. Stripe Checkout hosted (commission-only) → nessun form carta da gestire
3. Resend (free fino 3.000 email/mese) → email transazionali con licenza
4. Netlify Function: stripe-webhook.js → genera e invia licenza automaticamente

Costo fisso: €0/mese. Paghi solo la commissione Stripe (1.4% + €0.25 per carte EU).

Analytics / Visite pagina

Per analizzare le visite alla landing senza cookie invasivi, aggiungi uno di questi script nell'<head> di ogni pagina:

<!-- Plausible Analytics — privacy-first, GDPR ok, €9/mese -->
<script defer data-domain="getmellow.com" 
  src="https://plausible.io/js/script.js"></script>

<!-- Umami — self-hostable su Netlify, gratuito -->
<script async defer 
  src="https://analytics.umami.is/script.js"
  data-website-id="IL-TUO-ID"></script>

Entrambi non usano cookie, compatibili GDPR, mostrano: visite, pagine viste, tassi di uscita, referral, dispositivi. Plausible è la scelta più semplice.

Generatore Licenza Manuale

Usa questo strumento per generare manualmente un codice di attivazione — utile per rimborsi, sostituzioni o test. Il codice è firmato con la stessa chiave privata usata dal sistema automatico.