Accesso riservato — inserisci la password amministratore
| Data | Prodotto | Importo | Codice Licenza | Azioni |
|---|
I dati sono salvati in localStorage di questo browser. Con Stripe Webhook integrato (vedi Setup) si popoleranno automaticamente e in modo permanente.
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.
Netlify ospita il tuo sito HTML gratis e permette di creare funzioni serverless che vengono eseguite sul server (non visibili al client). Flusso:
price_ID e inseriscili nei PRODUCT.priceId in ogni pagina HTML. Netlify: netlify.com → crea account free.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
netlify/functions/create-payment-intent.js// 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 }),
};
};
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);
// 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' };
};
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
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.Se non vuoi scrivere codice, puoi usare Stripe Checkout hosted + Make.com per l'automazione:
create-license passando email e prodotto, e riceve il codice da includere nell'email.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.
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.