WWooshPayment docs
Risoluzione problemi

Bug storici risolti

Catalogo dei bug significativi WooshPayment risolti in passato. Trasparenza tecnica per merchant che valutano stabilità.

5 min di lettura

TLDR: trasparenza tecnica. Sotto la lista dei bug significativi risolti dal lancio (Q2 2026). Per il merchant: nessuno di questi è oggi attivo. Per chi valuta WooshPayment: ecco come trattiamo le incident.

2026-05 — Security hardening sprint + UX consistency fixes

Ondata di fix tecnici e UX:

Sicurezza (14-fix sprint OWASP)

  • Mass-assignment: tutti i body Zod marcati .strict() per rifiutare campi non whitelisted
  • Encryption at rest: AES-256-GCM su whopApiKey, accessToken Shopify, wooConsumerSecret
  • Timing-equalize login: bcrypt compare contro dummy hash quando l'email non esiste → no email enumeration
  • Rate limit: 10 login / 5 register per IP ogni 15 min
  • Body limit: 1MB con error handler 413/400/403 in un unico middleware
  • CORS apex-of-subdomain: regola che riconosce l'apex del subdomain custom verificato (es. tuostore.com se checkout.tuostore.com è verified)
  • JWT signing: claim ridotto a { merchantId, shopDomain }, niente PII extra

Connessione Whop

  • Switch da /api/v2/me a /v5/company: il vecchio endpoint era per user-token; con Company API key ritornava 401. Ora usiamo /v5/company che funziona con qualsiasi Company key con ruolo Proprietario. Documentato in Setup Whop.

UX consistency

  • Sidebar/Settings sync dopo OAuth: dopo OAuth Shopify, la dashboard mostrava ancora "Non connesso" perché il merchant in localStorage era stale. Risolto con refreshMerchant() chiamato al mount del segment /dashboard/* che rifetcha /api/merchant/me e aggiorna lo store Zustand.
  • Apex domain → auto-prepend checkout.: il campo dominio custom ora ha prefisso checkout. fisso visivo; se incolli un apex il backend lo trasforma in subdomain checkout.X. Vedi Dominio custom.
  • Bonifico rimosso dall'onboarding: feature dismessa per semplificare il setup. Solo Whop + COD ora come metodi al checkout.

Vecchio sprint Audit (riferimento storico — Q2 2026)

Audit interno post-lancio. Categorie:

Sicurezza (CRITICAL — fix immediato)

  • BUG-C1: API keys marketing ritornate in plaintext da endpoint pubblici → fix: allowlist sanitization, crittografia at-rest
  • BUG-C2: XSS via custom_scripts checkout → fix: Zod strict allowlist + 10k char cap
  • BUG-C3: footer GDPR link rotti (href="#") → fix: link a /privacy, /terms, /refund
  • BUG-C4: signup → onboarding skippava verify email → fix: /verify-email-pending polling gate
  • BUG-C5: ExpressCheckoutBlock localizable strings hardcoded → fix: i18n props threading

HIGH (UX / data integrity)

  • BUG-H1: admin JWT in localStorage (XSS-stealable) → fix: httpOnly cookie su .wooshpayment.com
  • BUG-H2: accessToken aveva fallback plaintext → fix: nullable + warn log su decryption failure
  • BUG-H3: CORS regex Vercel preview ngrok wildcards in prod → fix: gated NODE_ENV !== production
  • BUG-H4: impersonation token in URL (CSRF/log leak) → fix: model ImpersonationToken + single-use updateMany + JSON body
  • BUG-H5: reset/verify token usando cuid (low-entropy) → fix: randomBytes(24).toString('base64url')
  • BUG-H6: Pay button ignorava brandColor → fix: classe CSS .sp-pay-cta la onora
  • BUG-H7: blank white loading checkout → fix: skeleton animate-pulse
  • BUG-H8: onboarding step "Procedi al lancio" cliccabile senza preview → fix: gate su state
  • BUG-H10: log API emettevano email full → fix: helper redactEmail() ovunque
  • BUG-H12 / PERF-1: API region iad1 (us-east) → fix: pinned cdg1 (Paris). p95 1500ms → 180ms

MEDIUM (qualità / a11y)

  • 18 fix vari: empty catch silenziosi, dialog confirm() nativo non a11y, Permissions-Policy mancante per Apple Pay iframe Whop, next/image migration (LCP), empty states con CTA, stepper a11y.

LOW (polish)

  • Touch target 44px, contrast WCAG AA, sanitization CSS custom, schema drift root vs apps.

Vedi work/context/bugs-known.md per la lista completa con line:column reference.

2026-04 — Webhook duplicati Whop

Incident: tra 5 e 8 aprile 2026, alcuni ordini venivano marcati PAID due volte → email conferma cliente partita twice, evento pixel Purchase doppio.

Causa: Whop in casi rari (~0.1%) reinvia webhook senza change in idempotencyKey. La nostra logica di deduplica usava whopPaymentId + status invece di webhookDeliveryId.

Fix (deploy dpl_K2x...): introduzione WebhookDelivery model con unique index su provider + deliveryId. Idempotenza vera. Backfill manuale dei 12 ordini doppio-sparati.

Impatto: 12 merchant interessati, notificati via mail + credit €5 piano successivo.

2026-04 — Apple Pay non si apriva iOS 17.4+

Incident: utenti iPhone con iOS 17.4 vedevano bottone Apple Pay grigio.

Causa: iOS 17.4 ha cambiato la default Permissions-Policy → richiede header esplicito Permissions-Policy: payment=(self "https://whop.com") sulla pagina embed.

Fix (BUG-M5): aggiunto header in apps/web/next.config.js:33. Deploy 24h dopo report.

Impatto: ~40% degli utenti iOS in quei 3 giorni vedevano Apple Pay broken → fallback su carta digitata. Conversion mobile iOS scesa 15% temporaneamente. Recuperata post-fix.

2026-03 — RESEND_API_KEY mancante in prod

Incident: per 6 ore email transazionali non partivano. Cliente non riceveva conferma ordine.

Causa: durante setup iniziale env variables, RESEND_API_KEY non era stata aggiunta su Vercel API project.

Fix: configurato via Resend Auto-Configure API direttamente, bypassando UI GoDaddy che bloccava per wildcard CNAME conflict. Vedi work/context/bugs-known.md per dettaglio.

Impatto: ~30 ordini senza email conferma in quel finestra. Riinvio manuale eseguito a tutti.

2026-02 — Volume fee Whop sbagliato ($10 vs $15.99)

Incident: alcuni clienti pagavano $10 invece di $15.99 al checkout per un access pass test.

Causa: Whop sandbox vs prod product ID mismatch. Test product Whop aveva quote prezzo $10.

Fix: validation pre-checkout che incrocia merchant.whopProductId con il catalogo Whop reale. Refuse checkout se mismatch. Vedi changelog 2026-02.

Impatto: ~5 ordini mispriced. Risolti con charge supplementare consensuale (5/5 cliente OK).

2026-02 — Whop webhook ritardi/missing

Issue ongoing: Whop webhook delivery è best-effort. Vediamo ritardi minuti / missing 0.5-1% volume.

Mitigation (sempre attiva):

  • /refresh-status endpoint polla Whop API direttamente quando return page detecta stale PROCESSING
  • Admin panel "Verifica pagamento" forza backfill manuale
  • Return page polla ogni 3s per 45s post-redirect

Real fix proposto: monitoring delivery + auto-replay via Whop "resend webhook" API. Roadmap Q3.

Storia trasparenza

Post-mortem completi: scrivi a noreply@wooshpayment.com con subject [POSTMORTEM] + data incident. Inviamo PDF dettagliato.

Come trattiamo i bug

  1. Severity SLA:

    • CRITICAL (data loss, security) → fix entro 4h
    • HIGH (broken core feature) → fix entro 24h
    • MEDIUM (bug parziale o workaround) → fix entro 7gg
    • LOW (polish) → next sprint
  2. Comunicazione:

    • CRITICAL → mail tutti i merchant + banner dashboard
    • HIGH → mail merchant impattati
    • MEDIUM/LOW → changelog mensile
  3. Compensation:

    • Bug ha causato perdita ordini? → credit piano successivo proporzionale
    • Bug ha causato leak dati? → notifica GDPR + supporto compliance