From 78d5134f01a763712c29d77615b9031b53592f04 Mon Sep 17 00:00:00 2001 From: AEG-Desktop <52181546+adrianegraphene@users.noreply.github.com> Date: Fri, 3 Oct 2025 18:22:48 -0700 Subject: [PATCH 1/5] ok version from claude --- src/components/blocked-email.css | 373 +++++++++++++++++++++++++++++++ src/pages/make-a-deposit.js | 268 +++++++++++++++++----- 2 files changed, 585 insertions(+), 56 deletions(-) diff --git a/src/components/blocked-email.css b/src/components/blocked-email.css index 37fa48a..3ec28c0 100644 --- a/src/components/blocked-email.css +++ b/src/components/blocked-email.css @@ -94,3 +94,376 @@ transform: scale(1.02); transition: transform 0.3s; } + +/* Hero Section */ +.deposit-page .hero-section { + text-align: center; + margin-bottom: 1.5rem; + padding: 1.5rem 1rem; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + color: white; + border-radius: 12px; +} + +.deposit-page .hero-subtitle { + font-size: 1.25rem; + margin-top: 1rem; +} + +/* Status Card */ +.status-card { + background: #f8f9fa; + padding: 1rem; + border-radius: 8px; + margin-bottom: 1rem; + border-left: 4px solid #1188E6; + color: #333; +} + +/* Steps */ +.how-it-works { + margin: 1rem 0; +} + +.steps { + display: flex; + flex-direction: column; + gap: 1rem; + margin-top: 1rem; +} + +.step { + display: flex; + gap: 1rem; + align-items: flex-start; +} + +.step-number { + background: #1188E6; + color: white; + width: 36px; + height: 36px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-weight: bold; + flex-shrink: 0; +} + +.step-content strong { + display: block; + margin-bottom: 0.5rem; + color: #2c3e50; +} + +.step-content p { + margin: 0; + color: #666; +} + +/* Guarantee Box */ +.guarantee-box { + background: #d4edda; + border: 2px solid #28a745; + padding: 1rem; + border-radius: 8px; + margin: 1rem 0; +} + +.guarantee-box h4 { + margin-top: 0; + color: #155724; +} + +/* Why This Works */ +.why-this-works { + background: #e7f3ff; + padding: 1rem; + border-radius: 8px; + margin: 1rem 0; +} + +/* CTA Section */ +.cta-section { + background: #f8f9fa; + padding: 1.5rem; + border-radius: 12px; + text-align: center; + margin: 1.5rem 0; +} + +.cta-buttons { + display: flex; + gap: 1rem; + justify-content: center; + margin: 1rem 0; + flex-direction: row; +} + +.learn-more-btn.primary { + background: #1188E6; + color: white; + font-size: 1.1rem; + padding: 1rem 2rem; + min-width: 200px; + flex: 1; + max-width: 250px; +} + +.learn-more-btn.secondary { + background: #6c757d; + color: white; + font-size: 1.1rem; + padding: 1rem 2rem; + min-width: 200px; + flex: 1; + max-width: 250px; +} + +.refund-reminder { + color: #28a745; + font-size: 0.95rem; + margin-top: 1rem; +} + +/* Trust Section */ +.trust-section { + margin: 1.5rem 0; + padding: 1.5rem; + background: white; + border-radius: 8px; +} + +.trust-points { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 1.5rem; + margin-top: 1rem; +} + +.trust-point { + text-align: center; +} + +.trust-point .icon { + font-size: 2.5rem; + display: block; + margin-bottom: 0.5rem; +} + +.trust-point strong { + display: block; + margin-bottom: 0.5rem; + color: #2c3e50; +} + +.trust-point p { + color: #666; + font-size: 0.9rem; + margin: 0; +} + +/* Inspiration Section */ +.inspiration-section { + background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%); + color: white; + padding: 1.5rem; + border-radius: 12px; + margin: 1.5rem 0; +} + +.inspiration-section a { + color: white; + text-decoration: underline; + font-weight: bold; +} + +/* Success Message */ +.success-message { + background: #d4edda; + border: 2px solid #28a745; + padding: 1.5rem; + border-radius: 12px; + text-align: center; + margin: 1.5rem 0; +} + +.success-message h3 { + color: #155724; + margin-top: 0; +} + +@media (max-width: 768px) { + .cta-buttons { + flex-direction: column; + align-items: center; + } + + .learn-more-btn.primary, + .learn-more-btn.secondary { + min-width: 280px; + max-width: 100%; + flex: none; + } + + .trust-points { + grid-template-columns: 1fr; + } +} + +/* Dark Mode Support */ +@media (prefers-color-scheme: dark) { + .status-card { + background: var(--color-background); + color: var(--color-text); + border-left-color: var(--fyncom-blue); + } + + .how-it-works h3, + .status-card h3 { + color: var(--color-text); + } + + .step-content strong { + color: var(--color-text); + } + + .step-content p { + color: var(--color-text); + opacity: 0.8; + } + + .guarantee-box { + background: var(--fyncom-darkest-cyan); + border-color: var(--karmacall-green); + color: var(--color-text); + } + + .guarantee-box h4 { + color: var(--karmacall-green); + } + + .why-this-works { + background: var(--fyncom-darkest-cyan); + color: var(--color-text); + } + + .why-this-works h4 { + color: var(--color-text); + } + + .cta-section { + background: var(--color-background); + color: var(--color-text); + } + + .cta-section h3 { + color: var(--color-text); + } + + .trust-section { + background: var(--color-background); + color: var(--color-text); + } + + .trust-section h3 { + color: var(--color-text); + } + + .trust-point strong { + color: var(--color-text); + } + + .trust-point p { + color: var(--color-text); + opacity: 0.8; + } + + .success-message { + background: var(--fyncom-darkest-cyan); + border-color: var(--karmacall-green); + color: var(--color-text); + } + + .success-message h3 { + color: var(--karmacall-green); + } +} + +/* Manual Dark Mode Support */ +:root[data-theme="dark"] .status-card { + background: var(--color-background); + color: var(--color-text); + border-left-color: var(--fyncom-blue); +} + +:root[data-theme="dark"] .how-it-works h3, +:root[data-theme="dark"] .status-card h3 { + color: var(--color-text); +} + +:root[data-theme="dark"] .step-content strong { + color: var(--color-text); +} + +:root[data-theme="dark"] .step-content p { + color: var(--color-text); + opacity: 0.8; +} + +:root[data-theme="dark"] .guarantee-box { + background: var(--fyncom-darkest-cyan); + border-color: var(--karmacall-green); + color: var(--color-text); +} + +:root[data-theme="dark"] .guarantee-box h4 { + color: var(--karmacall-green); +} + +:root[data-theme="dark"] .why-this-works { + background: var(--fyncom-darkest-cyan); + color: var(--color-text); +} + +:root[data-theme="dark"] .why-this-works h4 { + color: var(--color-text); +} + +:root[data-theme="dark"] .cta-section { + background: var(--color-background); + color: var(--color-text); +} + +:root[data-theme="dark"] .cta-section h3 { + color: var(--color-text); +} + +:root[data-theme="dark"] .trust-section { + background: var(--color-background); + color: var(--color-text); +} + +:root[data-theme="dark"] .trust-section h3 { + color: var(--color-text); +} + +:root[data-theme="dark"] .trust-point strong { + color: var(--color-text); +} + +:root[data-theme="dark"] .trust-point p { + color: var(--color-text); + opacity: 0.8; +} + +:root[data-theme="dark"] .success-message { + background: var(--fyncom-darkest-cyan); + border-color: var(--karmacall-green); + color: var(--color-text); +} + +:root[data-theme="dark"] .success-message h3 { + color: var(--karmacall-green); +} \ No newline at end of file diff --git a/src/pages/make-a-deposit.js b/src/pages/make-a-deposit.js index 2d72350..5dcad56 100644 --- a/src/pages/make-a-deposit.js +++ b/src/pages/make-a-deposit.js @@ -14,7 +14,7 @@ import { logEvent } from "../utils/analytics" const MakeADeposit = () => { const [blockedEmailDetails, setBlockedEmailDetails] = useState(null) const location = useLocation() - const [dynamicMessage, setDynamicMessage] = useState("You're seeing this because you've gotten a \"PayCation\" email.") + const [dynamicMessage, setDynamicMessage] = useState("") const [isModalOpen, setIsModalOpen] = useState(false) const [urlToExecute, setUrlToExecute] = useState(null) const [stripeUrl, setStripeUrl] = useState("") @@ -54,24 +54,66 @@ const MakeADeposit = () => { const data = await response.json() const depositPaid = data.depositPaid console.log("deposit paid status: " + depositPaid) - const secondaryLabel = data.emailLabel ? data.emailLabel : "FynFiltered" - const fynMail = "FynMail" + if (depositPaid) { // provide extra info - we'll handle this later as it's an edge case for now } - setBlockedEmailDetails(data) // Update the state, which will re-render the component + setBlockedEmailDetails(data) + + // Format the deposit amount properly (avoiding scientific notation) + const formattedAmount = formatDepositAmount(data.recipientMin) + const newMessage = data.depositPaid - ? `Thank you for your $${data.recipientMin} deposit... [rest of the message]` - : `

Your email (${data.senderEmail}) to ${data.recipientEmail} landed in their - ${data.labelName}, but was moved to a secondary inbox, ${secondaryLabel}, - because they don't know you. -

-

${data.recipientEmail} requires a $${data.recipientMin} - refundable deposit for your email to move to their main inbox and be marked as ${fynMail}. If you pay - this deposit, ${data.recipientEmail} will be notified and they will immediately see your email. If - ${data.recipientEmail} responds to your FynMail within ${data.daysDeadline} days, - you will get your deposit back. Then you may manage your deposit refund by accessing app.fyncom.com. -

` + ? `
+

✓ Deposit Received!

+

Thank you for your ${formattedAmount} deposit. ${data.recipientEmail} has been notified and will see your email in their main +inbox.

+
` + : `
+
+

📧 Your Email Status

+

Your email from ${data.senderEmail} to ${data.recipientEmail} was automatically filtered.

+
+ +
+

How This Works (It's Simple!)

+
+
+ 1 +
+ Make a tiny deposit of ${formattedAmount} +

This moves your email to their main inbox instantly

+
+
+
+ 2 +
+ ${data.recipientEmail} gets notified immediately +

Your message goes to the top of their inbox

+
+
+
+ 3 +
+ Get your full refund when they reply +

If they respond within ${data.daysDeadline} days, you pay nothing

+
+
+
+
+ +
+

💯 100% Money-Back Guarantee

+

You only pay if ${data.recipientEmail} doesn't respond within ${data.daysDeadline} days. + Most people respond within 24-48 hours, so you'll likely get your full deposit back.

+
+ +
+

Why does this work?

+

This micro-deposit proves you're a real person with a genuine message, not spam. It helps ${data.recipientEmail} + prioritize legitimate emails while earning a small reward for managing their inbox effectively.

+
+
` setDynamicMessage(newMessage) } else { throw new Error("Failed to fetch email details") @@ -81,65 +123,179 @@ const MakeADeposit = () => { } } + // Format deposit amount to avoid scientific notation and add context + const formatDepositAmount = amount => { + const numAmount = parseFloat(amount) + + // Format with appropriate decimals + let formatted = numAmount.toFixed(8).replace(/\.?0+$/, "") + + // Add context for very small amounts + if (numAmount <= 0.0001) { + const emailsPer1Cent = 0.01 / numAmount + if (emailsPer1Cent >= 1000) { + const thousands = Math.round(emailsPer1Cent / 1000) + return `$${formatted} (just 1¢ per ${thousands}k emails!)` + } else { + return `$${formatted} (just 1¢ per ${Math.round(emailsPer1Cent)} emails!)` + } + } + + return `$${formatted}` + } + // Function to render the payment button or any other elements based on the blocked email details function renderPaymentButton() { if (blockedEmailDetails) { console.log("data is here from {}", blockedEmailDetails) - // Render your button and use the details from blockedEmailDetails const stripeUrl = `https://buy.stripe.com/fZe5obgilbJa5lm001?prefilled_email=${blockedEmailDetails.senderEmailRaw}&client_reference_id=${blockedEmailDetails.blockedEmailLogId}` - // todo - only use this if you plan to show a button to everyone that visits this page. - const stripeUrlDefault = `https://buy.stripe.com/fZe5obgilbJa5lm001` + return ( - <> - logEvent("Deposit", "Click", "Stripe Deposit")} - > - Deposit cash - - +
+

Choose Your Deposit Method

+
+ logEvent("Deposit", "Click", "Stripe Deposit")} + > + 💳 Deposit with Card + + +
+

+ Remember: Full refund if they respond within {blockedEmailDetails.daysDeadline} days +

{isModalOpen && } - +
) } else { - console.log("no data present") + return ( +
+

Loading email details...

+
+ ) } } return (
-
-

Get Your Email Noticed. Make a Deposit.

- - Pay a small, refundable deposit to get your email to my main inbox & get my immediate attention. If I respond, you get your deposit back. Simple! - -
+
+
+

🎯 Get Your Email to the Top of Their Inbox

+

+ Make a tiny deposit. Get immediate attention. Pay nothing if they respond. +

+
+ + {dynamicMessage ? ( +
+ ) : ( +
+
+

📧 Your Email Was Filtered

+

+ You're here because someone is using FynCom's email filtering system. Your message was automatically moved to a secondary folder, but you can + get it prioritized! +

+
+ +
+

How This Works (It's Simple!)

+
+
+ 1 +
+ Make a tiny refundable deposit +

This moves your email to their main inbox instantly

+
+
+
+ 2 +
+ Recipient gets notified immediately +

Your message goes to the top of their inbox

+
+
+
+ 3 +
+ Get your full refund when they reply +

If they respond within their deadline, you pay nothing

+
+
+
+
+ +
+

💯 100% Money-Back Guarantee

+

+ You only pay if the recipient doesn't respond within their specified timeframe. Most people respond within 24-48 hours, so you'll likely get + your full deposit back. +

+
+ +
+

Why does this work?

+

+ This micro-deposit proves you're a real person with a genuine message, not spam. It helps email recipients prioritize legitimate messages while + earning a small reward for managing their inbox effectively. +

+
+
+ )} + {renderPaymentButton()} -

- Still here? Why not read something interesting? Ever get annoying calls? Emails? DMs? Read below to find out how we're helping fix that problem by - getting people paid to block scam / spam and respond to good messages. -

-

Why Do Spam Calls Still Exist?

-

...and how can I stop scams, but get useful outreach?

-

- That's the thought that started FynCom on a journey of exploring an emerging market based in "communications + currency" to create trust between - strangers with shared interests. Here's our paper we wrote to record our thought process - it later became{" "} - our 1st patent, app, and is the basis for how we - came to be. Thanks for reading!
- - Team FynCom -

- + +
+

Why Trust This System?

+
+
+ 🔒 + Secure Payments +

Processed through Stripe & Nano crypto

+
+
+ + Instant Results +

Your email moves to their inbox immediately

+
+
+ 💰 + Fair Pricing +

Tiny amounts that prove you're real

+
+
+
+ +
+

💡 Like This Idea?

+

+ Tired of spam in your own inbox? You can use this same system! Sign up at app.fyncom.com to + filter your emails and earn rewards when genuine senders reach out to you. +

+
+ +
+

Why Do Spam Calls & Emails Still Exist?

+

We asked ourselves this question and built a solution. Here's how we're fixing communication for everyone.

+

+ Our approach creates trust between strangers with shared interests using tiny "proof-of-intent" deposits. Read our original white paper that became{" "} + our first patent, powers our KarmaCall app, and + forms the foundation of FynCom. +

+ +
From d57e68df855604ec03b3089f0fc3b3306574a854 Mon Sep 17 00:00:00 2001 From: AEG-Desktop <52181546+adrianegraphene@users.noreply.github.com> Date: Fri, 3 Oct 2025 19:54:51 -0700 Subject: [PATCH 2/5] has a crappy v2 ersioln whatever --- src/components/blocked-email.css | 13 ++ src/pages/make-a-deposit-v2.js | 312 +++++++++++++++++++++++++++++++ src/pages/make-a-deposit-v3.js | 312 +++++++++++++++++++++++++++++++ 3 files changed, 637 insertions(+) create mode 100644 src/pages/make-a-deposit-v2.js create mode 100644 src/pages/make-a-deposit-v3.js diff --git a/src/components/blocked-email.css b/src/components/blocked-email.css index 3ec28c0..9462c7d 100644 --- a/src/components/blocked-email.css +++ b/src/components/blocked-email.css @@ -466,4 +466,17 @@ :root[data-theme="dark"] .success-message h3 { color: var(--karmacall-green); +} + +/* Badge styling for v2 */ +.badge { + display: inline-flex; + align-items: center; + padding: 0.5rem 1rem; + background: var(--color-background); + color: var(--color-text); + border: 1px solid var(--color-bar); + border-radius: 20px; + font-size: 0.875rem; + font-weight: 500; } \ No newline at end of file diff --git a/src/pages/make-a-deposit-v2.js b/src/pages/make-a-deposit-v2.js new file mode 100644 index 0000000..e2c31f1 --- /dev/null +++ b/src/pages/make-a-deposit-v2.js @@ -0,0 +1,312 @@ +import React, { useEffect, useMemo, useState } from "react" +import Header from "../components/header" +import Footer from "../components/footer" +import Seo from "../components/seo" +import "../components/blocked-email.css" +import { MakeADepositModal } from "../components/Modal" +import { logEvent } from "../utils/analytics" + +/** + * MakeADepositV2 – a UX-focused redesign for your refundable deposit page. + * + * Highlights + * - Clear hero + promise + * - Smart empty-state (no backend data) with explainer + self-serve input + * - Data-present state with rich summary, trust copy, and strong CTAs + * - Inline FAQ and "How it works" with visual steps + * - Subtle motion + modern card layout + * - Handles loading, error, and edge cases + */ + +const API_URL = process.env.GATSBY_API_URL + +export default function MakeADepositV2() { + const [details, setDetails] = useState(null) + const [loading, setLoading] = useState(true) + const [error, setError] = useState(null) + const [isModalOpen, setIsModalOpen] = useState(false) + const [manualId, setManualId] = useState("") + + // Parse depositId from URL on first load + useEffect(() => { + const search = new URLSearchParams(window.location.search) + const id = search.get("depositId") + if (id) fetchDetails(id) + else setLoading(false) + }, []) + + async function fetchDetails(id) { + try { + setLoading(true) + const res = await fetch(`${API_URL}email/blocked/${id}`) + if (!res.ok) throw new Error("Failed to fetch deposit details") + const data = await res.json() + setDetails(data) + setError(null) + } catch (e) { + setError(e?.message ?? "Something went wrong") + setDetails(null) + } finally { + setLoading(false) + } + } + + const stripeUrl = useMemo(() => { + if (!details) return "https://buy.stripe.com/fZe5obgilbJa5lm001" // default checkout + const email = encodeURIComponent(details.senderEmailRaw || details.senderEmail || "") + const ref = encodeURIComponent(details.blockedEmailLogId || "") + return `https://buy.stripe.com/fZe5obgilbJa5lm001?prefilled_email=${email}&client_reference_id=${ref}` + }, [details]) + + const minDeposit = details?.recipientMin ? Number(details.recipientMin).toFixed(2) : "0.00" + const deadlineDays = details?.daysDeadline ?? 30 + const labelName = details?.labelName || "INBOX" + const secondaryLabel = details?.emailLabel || "FynFiltered" + + function handleNano() { + setIsModalOpen(true) + } + + return ( +
+ +
+
+
+

+ 🎯 Get your email noticed with a refundable deposit +

+

+ Unknown senders stake a tiny deposit to reach the main inbox. If the recipient engages, the sender gets it back. If not, the user keeps it. Simple. +

+
+ 🛡️ Patent-backed + ⏱️ Time-based escrow + 💰 User‑rewarded +
+
+ + {/* Loading state */} + {loading && ( +
+

📧 Loading Email Details...

+

Fetching your deposit details…

+
+ )} + + {/* Error state */} + {!loading && error && ( +
+

⚠️ We couldn't load that link

+

{error}

+
+ )} + + {/* DATA PRESENT */} + {!loading && !error && details && ( +
+
+
+
+

+ This message is waiting in {secondaryLabel} +

+

+ From {details.senderEmail} to {details.recipientEmail} +

+
+
+
Minimum deposit
+
${minDeposit}
+
+
+
+ +
+

How This Works

+
+
+ 1 +
+ 📧 Move to main inbox +

Pay the deposit to move this email to the recipient's {labelName} immediately.

+
+
+
+ 2 +
+ ⏱️ Refund window +

+ If they respond within {deadlineDays} days, your deposit is automatically refunded. +

+
+
+
+ 3 +
+ 💰 User gets paid if ignored +

If there's no response, the recipient keeps a portion as a reward for their time.

+
+
+
+
+ +
+

Choose Your Deposit Method

+ +

+ Remember: Full refund if they respond within {deadlineDays} days +

+ {isModalOpen && setIsModalOpen(false)} />} +
+ +
+

🔒 Why a deposit?

+

It's an economic good‑faith signal that discourages spam. If the recipient engages, you're refunded automatically.

+
+
🛡️ Patent‑backed, time‑based escrow
+
⏱️ Response‑based, automatic refunds
+
💰 Rewards recipients for attention
+
+
+
+ )} + + {/* EMPTY STATE (NO DATA) */} + {!loading && !error && !details && ( +
+
+

Got a FynCom PayCation email?

+

+ Paste your depositId from the link to see your sender/recipient details and complete a deposit. No worries—if they reply, + you're refunded. +

+ +
+ setManualId(e.target.value)} + style={{ flex: 1, minWidth: "200px", padding: "0.75rem", borderRadius: "8px", border: "1px solid #ccc" }} + /> + +
+
+ +
+

How This Works (It's Simple!)

+
+
+ 1 +
+ 💰 Make a tiny deposit +

Stake a small, refundable amount to signal good faith.

+
+
+
+ 2 +
+ 📧 Jump the queue +

Your email moves to the main inbox instantly.

+
+
+
+ 3 +
+ ⏱️ Auto‑refund on reply +

If they respond within the window, you get it back.

+
+
+
+
+ +
+

Why this works

+

+ Spam is cheap to send. A refundable deposit flips the economics—only serious senders stake it. If it's not useful, the user keeps a portion. +

+ +

Prefer crypto? Use Nano (XNO) via the app wallet.

+
+
+ )} + +
+

Why Trust This System?

+
+
+ 🔒 + Secure Payments +

Processed through Stripe & Nano crypto

+
+
+ + Instant Results +

Your email moves to their inbox immediately

+
+
+ 💰 + Fair Pricing +

Tiny amounts that prove you're real

+
+
+
+ +
+

💡 Like This Idea?

+

+ Tired of spam in your own inbox? You can use this same system! Sign up at app.fyncom.com to + filter your emails and earn rewards when genuine senders reach out to you. +

+
+ +
+

FAQ

+
+
+ Do I lose money if they never read it? +

+ If there's no response in the refund window, the recipient keeps a portion of the deposit as a reward for their time. +

+
+
+ What if I'm an approved contact? +

Known contacts are automatically whitelisted—no deposit needed.

+
+
+ Is this secure? +

+ Deposits are processed through trusted providers, and refunds are automatic based on recipient engagement. +

+
+
+
+
+
+
+ ) +} diff --git a/src/pages/make-a-deposit-v3.js b/src/pages/make-a-deposit-v3.js new file mode 100644 index 0000000..c44993c --- /dev/null +++ b/src/pages/make-a-deposit-v3.js @@ -0,0 +1,312 @@ +import React, { useEffect, useMemo, useState } from "react" +import Header from "../components/header" +import Footer from "../components/footer" +import Seo from "../components/seo" +import "../components/blocked-email.css" +import { MakeADepositModal } from "../components/Modal" +import { logEvent } from "../utils/analytics" + +/** + * MakeADepositV3 – a UX-focused redesign for your refundable deposit page. + * + * Highlights + * - Clear hero + promise + * - Smart empty-state (no backend data) with explainer + self-serve input + * - Data-present state with rich summary, trust copy, and strong CTAs + * - Inline FAQ and "How it works" with visual steps + * - Subtle motion + modern card layout + * - Handles loading, error, and edge cases + */ + +const API_URL = process.env.GATSBY_API_URL + +export default function MakeADepositV2() { + const [details, setDetails] = useState(null) + const [loading, setLoading] = useState(true) + const [error, setError] = useState(null) + const [isModalOpen, setIsModalOpen] = useState(false) + const [manualId, setManualId] = useState("") + + // Parse depositId from URL on first load + useEffect(() => { + const search = new URLSearchParams(window.location.search) + const id = search.get("depositId") + if (id) fetchDetails(id) + else setLoading(false) + }, []) + + async function fetchDetails(id) { + try { + setLoading(true) + const res = await fetch(`${API_URL}email/blocked/${id}`) + if (!res.ok) throw new Error("Failed to fetch deposit details") + const data = await res.json() + setDetails(data) + setError(null) + } catch (e) { + setError(e?.message ?? "Something went wrong") + setDetails(null) + } finally { + setLoading(false) + } + } + + const stripeUrl = useMemo(() => { + if (!details) return "https://buy.stripe.com/fZe5obgilbJa5lm001" // default checkout + const email = encodeURIComponent(details.senderEmailRaw || details.senderEmail || "") + const ref = encodeURIComponent(details.blockedEmailLogId || "") + return `https://buy.stripe.com/fZe5obgilbJa5lm001?prefilled_email=${email}&client_reference_id=${ref}` + }, [details]) + + const minDeposit = details?.recipientMin ? Number(details.recipientMin).toFixed(2) : "0.00" + const deadlineDays = details?.daysDeadline ?? 30 + const labelName = details?.labelName || "INBOX" + const secondaryLabel = details?.emailLabel || "FynFiltered" + + function handleNano() { + setIsModalOpen(true) + } + + return ( +
+ +
+
+
+

+ 🎯 Get your email noticed with a refundable deposit +

+

+ Unknown senders stake a tiny deposit to reach the main inbox. If the recipient engages, the sender gets it back. If not, the user keeps it. Simple. +

+
+ 🛡️ Patent-backed + ⏱️ Time-based escrow + 💰 User‑rewarded +
+
+ + {/* Loading state */} + {loading && ( +
+

📧 Loading Email Details...

+

Fetching your deposit details…

+
+ )} + + {/* Error state */} + {!loading && error && ( +
+

⚠️ We couldn't load that link

+

{error}

+
+ )} + + {/* DATA PRESENT */} + {!loading && !error && details && ( +
+
+
+
+

+ This message is waiting in {secondaryLabel} +

+

+ From {details.senderEmail} to {details.recipientEmail} +

+
+
+
Minimum deposit
+
${minDeposit}
+
+
+
+ +
+

How This Works

+
+
+ 1 +
+ 📧 Move to main inbox +

Pay the deposit to move this email to the recipient's {labelName} immediately.

+
+
+
+ 2 +
+ ⏱️ Refund window +

+ If they respond within {deadlineDays} days, your deposit is automatically refunded. +

+
+
+
+ 3 +
+ 💰 User gets paid if ignored +

If there's no response, the recipient keeps a portion as a reward for their time.

+
+
+
+
+ +
+

Choose Your Deposit Method

+ +

+ Remember: Full refund if they respond within {deadlineDays} days +

+ {isModalOpen && setIsModalOpen(false)} />} +
+ +
+

🔒 Why a deposit?

+

It's an economic good‑faith signal that discourages spam. If the recipient engages, you're refunded automatically.

+
+
🛡️ Patent‑backed, time‑based escrow
+
⏱️ Response‑based, automatic refunds
+
💰 Rewards recipients for attention
+
+
+
+ )} + + {/* EMPTY STATE (NO DATA) */} + {!loading && !error && !details && ( +
+
+

Got a FynCom PayCation email?

+

+ Paste your depositId from the link to see your sender/recipient details and complete a deposit. No worries—if they reply, + you're refunded. +

+ +
+ setManualId(e.target.value)} + style={{ flex: 1, minWidth: "200px", padding: "0.75rem", borderRadius: "8px", border: "1px solid #ccc" }} + /> + +
+
+ +
+

How This Works (It's Simple!)

+
+
+ 1 +
+ 💰 Make a tiny deposit +

Stake a small, refundable amount to signal good faith.

+
+
+
+ 2 +
+ 📧 Jump the queue +

Your email moves to the main inbox instantly.

+
+
+
+ 3 +
+ ⏱️ Auto‑refund on reply +

If they respond within the window, you get it back.

+
+
+
+
+ +
+

Why this works

+

+ Spam is cheap to send. A refundable deposit flips the economics—only serious senders stake it. If it's not useful, the user keeps a portion. +

+ +

Prefer crypto? Use Nano (XNO) via the app wallet.

+
+
+ )} + +
+

Why Trust This System?

+
+
+ 🔒 + Secure Payments +

Processed through Stripe & Nano crypto

+
+
+ + Instant Results +

Your email moves to their inbox immediately

+
+
+ 💰 + Fair Pricing +

Tiny amounts that prove you're real

+
+
+
+ +
+

💡 Like This Idea?

+

+ Tired of spam in your own inbox? You can use this same system! Sign up at app.fyncom.com to + filter your emails and earn rewards when genuine senders reach out to you. +

+
+ +
+

FAQ

+
+
+ Do I lose money if they never read it? +

+ If there's no response in the refund window, the recipient keeps a portion of the deposit as a reward for their time. +

+
+
+ What if I'm an approved contact? +

Known contacts are automatically whitelisted—no deposit needed.

+
+
+ Is this secure? +

+ Deposits are processed through trusted providers, and refunds are automatic based on recipient engagement. +

+
+
+
+
+
+
+ ) +} From babc1acbd903bb0527acfa9297f4982a7a3ce04f Mon Sep 17 00:00:00 2001 From: "Adrian E. Garcia" <52181546+adrianegraphene@users.noreply.github.com> Date: Sun, 5 Oct 2025 06:17:39 -0700 Subject: [PATCH 3/5] fixing v2 and v1 --- src/components/blocked-email.css | 51 ++++++++++++++++++++++++++++++++ src/pages/make-a-deposit-v2.js | 30 ++++++++++--------- 2 files changed, 67 insertions(+), 14 deletions(-) diff --git a/src/components/blocked-email.css b/src/components/blocked-email.css index 9462c7d..735fce5 100644 --- a/src/components/blocked-email.css +++ b/src/components/blocked-email.css @@ -479,4 +479,55 @@ border-radius: 20px; font-size: 0.875rem; font-weight: 500; +} +/* FAQ Section */ +.faq-section { + margin-top: 2rem; + padding: 1.5rem; + background: #f8f9fa; + border-radius: 8px; +} +.faq-content { + margin-top: 1rem; +} +.faq-item { + margin-bottom: 1rem; +} +.faq-question { + font-weight: bold; + cursor: pointer; +} +.faq-answer { + margin-top: 0.5rem; + padding-left: 1rem; +} +@media (prefers-color-scheme: dark) { + .faq-section { + background: var(--color-background); + color: var(--color-text); + } + .faq-section h3 { + color: var(--color-text); + } + .faq-question { + color: var(--color-text); + } + .faq-answer { + color: var(--color-text); + opacity: 0.85; + } +} +:root[data-theme="dark"] .faq-section { + background: var(--color-background); + color: var(--color-text); +} +:root[data-theme="dark"] .faq-section h3 { + color: var(--color-text); +} +:root[data-theme="dark"] .faq-question { + color: var(--color-text); +} +:root[data-theme="dark"] .faq-answer { + color: var(--color-text); + opacity: 0.85; } \ No newline at end of file diff --git a/src/pages/make-a-deposit-v2.js b/src/pages/make-a-deposit-v2.js index e2c31f1..8e2b485 100644 --- a/src/pages/make-a-deposit-v2.js +++ b/src/pages/make-a-deposit-v2.js @@ -58,7 +58,11 @@ export default function MakeADepositV2() { return `https://buy.stripe.com/fZe5obgilbJa5lm001?prefilled_email=${email}&client_reference_id=${ref}` }, [details]) - const minDeposit = details?.recipientMin ? Number(details.recipientMin).toFixed(2) : "0.00" + const minDeposit = details?.recipientMin + ? Number(details.recipientMin) >= 0.01 + ? Number(details.recipientMin).toFixed(2) + : Number(details.recipientMin).toFixed(5) + : "0.00" const deadlineDays = details?.daysDeadline ?? 30 const labelName = details?.labelName || "INBOX" const secondaryLabel = details?.emailLabel || "FynFiltered" @@ -284,24 +288,22 @@ export default function MakeADepositV2() {

-
+

FAQ

-
-
- Do I lose money if they never read it? -

+

+
+ Do I lose money if they never read it? +

If there's no response in the refund window, the recipient keeps a portion of the deposit as a reward for their time.

-
- What if I'm an approved contact? -

Known contacts are automatically whitelisted—no deposit needed.

+
+ What if I'm an approved contact? +

Known contacts are automatically whitelisted—no deposit needed.

-
- Is this secure? -

- Deposits are processed through trusted providers, and refunds are automatic based on recipient engagement. -

+
+ Is this secure? +

Deposits are processed through trusted providers, and refunds are automatic based on recipient engagement.

From f9535c59f30e8fd08bc0763a02a586374488007c Mon Sep 17 00:00:00 2001 From: "Adrian E. Garcia" <52181546+adrianegraphene@users.noreply.github.com> Date: Sun, 5 Oct 2025 06:43:27 -0700 Subject: [PATCH 4/5] slight changes to add boxes / align --- src/pages/make-a-deposit.js | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/pages/make-a-deposit.js b/src/pages/make-a-deposit.js index 5dcad56..5132376 100644 --- a/src/pages/make-a-deposit.js +++ b/src/pages/make-a-deposit.js @@ -191,11 +191,20 @@ inbox.

/>
-
-

🎯 Get Your Email to the Top of Their Inbox

-

- Make a tiny deposit. Get immediate attention. Pay nothing if they respond. -

+
+
+

🎯 Get Your Email to the Top of Their Inbox

+
+
+

+ Make a tiny deposit. Get immediate attention. Pay nothing if they respond. +

+
+ 🛡️ Patent-backed + ⏱️ Time-based escrow + 💰 User‑rewarded +
+
{dynamicMessage ? ( From 566d5c7428e9ac81344a2652ebaa018ab414083c Mon Sep 17 00:00:00 2001 From: "Adrian E. Garcia" <52181546+adrianegraphene@users.noreply.github.com> Date: Sun, 5 Oct 2025 14:08:26 -0700 Subject: [PATCH 5/5] variants working , but lost icon rowand css overkill --- src/components/make-a-deposit-v3.css | 566 +++++++++++++++++++++++++++ src/pages/make-a-deposit-v1.js | 305 +++++++++++++++ src/pages/make-a-deposit-v2.js | 2 +- src/pages/make-a-deposit-v3.js | 520 ++++++++++++------------ src/pages/make-a-deposit.js | 343 +++------------- 5 files changed, 1175 insertions(+), 561 deletions(-) create mode 100644 src/components/make-a-deposit-v3.css create mode 100644 src/pages/make-a-deposit-v1.js diff --git a/src/components/make-a-deposit-v3.css b/src/components/make-a-deposit-v3.css new file mode 100644 index 0000000..c218463 --- /dev/null +++ b/src/components/make-a-deposit-v3.css @@ -0,0 +1,566 @@ +.deposit-page { + background: linear-gradient(180deg, rgba(var(--fyncom-blue-rgb), 0.08) 0%, rgba(255, 255, 255, 0.95) 40%, var(--color-background) 100%); + min-height: 100vh; +} + +.deposit-main { + max-width: 1100px; + margin: 0 auto; + padding: 4rem 1.5rem 5rem; + display: flex; + flex-direction: column; + gap: 4rem; +} + +.deposit-hero { + background: linear-gradient(135deg, var(--fyncom-darkest-cyan) 0%, rgba(var(--fyncom-blue-rgb), 0.92) 55%, rgba(19, 220, 236, 0.85) 100%); + color: #fff; + padding: 3rem; + border-radius: 28px; + display: grid; + grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); + gap: 2.5rem; + position: relative; + overflow: hidden; + box-shadow: 0 30px 60px rgba(0, 0, 0, 0.2); +} + +.deposit-hero::after { + content: ""; + position: absolute; + inset: 0; + background: radial-gradient(circle at top right, rgba(255, 255, 255, 0.35), transparent 55%), + radial-gradient(circle at bottom left, rgba(0, 0, 0, 0.22), transparent 60%); + mix-blend-mode: screen; + pointer-events: none; +} + +.hero-copy, +.hero-card { + position: relative; + z-index: 1; +} + +.hero-copy { + display: flex; + flex-direction: column; + gap: 1.25rem; +} + +.hero-eyebrow { + font-size: 0.95rem; + letter-spacing: 0.32rem; + text-transform: uppercase; + opacity: 0.85; + margin: 0; +} + +.hero-title { + font-size: clamp(2.4rem, 4vw, 3.2rem); + line-height: 1.05; + margin: 0; +} + +.hero-subtitle { + font-size: 1.1rem; + line-height: 1.65; + margin: 0; + max-width: 36ch; +} + +.hero-personalization { + display: flex; + flex-wrap: wrap; + gap: 0.75rem; + margin: 0.6rem 0 1.2rem; +} + +.hero-pill { + display: inline-flex; + align-items: center; + padding: 0.45rem 0.9rem; + border-radius: 999px; + background: rgba(255, 255, 255, 0.2); + border: 1px solid rgba(255, 255, 255, 0.25); + font-size: 0.85rem; + font-weight: 600; + letter-spacing: 0.01em; + color: #fff; +} + +.deposit-actions { + display: flex; + flex-wrap: wrap; + gap: 0.85rem; + align-items: center; +} + +.deposit-actions .learn-more-btn { + border-radius: 999px; + padding: 0.85rem 1.9rem; + font-size: 1rem; + font-weight: 600; + letter-spacing: 0.01em; + text-transform: none; + box-shadow: 0 12px 28px rgba(0, 0, 0, 0.25); + transition: transform 0.2s ease, box-shadow 0.2s ease; +} + +/* ensure deposit action buttons have enough room for text */ +.deposit-actions .learn-more-btn { + min-width: 180px; + display: inline-flex; + justify-content: center; + align-items: center; + overflow: visible; +} + +.deposit-actions .learn-more-btn:hover { + transform: translateY(-2px); + box-shadow: 0 18px 30px rgba(0, 0, 0, 0.3); +} + +.deposit-assurance { + font-size: 0.95rem; + line-height: 1.6; + opacity: 0.9; + margin: 0; + max-width: 40ch; +} +.deposit-assurance a { + color: #fff !important; + text-decoration-color: rgba(255, 255, 255, 0.8); +} + +.deposit-trust-bar { + display: flex; + flex-wrap: wrap; + gap: 0.9rem; + margin-top: 0.75rem; + font-size: 0.85rem; + opacity: 0.85; +} + +.deposit-trust-badge { + padding: 0.35rem 0.85rem; + border-radius: 999px; + background: rgba(255, 255, 255, 0.18); + border: 1px solid rgba(255, 255, 255, 0.22); + backdrop-filter: blur(6px); +} + +.hero-card { + background: rgba(255, 255, 255, 0.15); + border-radius: 22px; + padding: 2.25rem; + display: flex; + flex-direction: column; + gap: 1.5rem; + backdrop-filter: blur(12px); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.35); +} + +.hero-card h3 { + margin: 0; + font-size: 1.3rem; + text-transform: uppercase; + letter-spacing: 0.12rem; + opacity: 0.95; +} + +.hero-card-body { + display: flex; + flex-direction: column; + gap: 1.25rem; +} + +.hero-card .html-dynamic { + text-align: left; + font-size: 1rem; + line-height: 1.7; +} + +.hero-card .html-dynamic p { + margin-bottom: 0.85rem; +} + +.hero-card .html-dynamic .emphasis { + color: #fff; + text-shadow: 0 0 18px rgba(255, 255, 255, 0.3); +} + +.hero-card-stats { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); + gap: 0.9rem; +} + +.hero-card-stat { + background: rgba(0, 0, 0, 0.25); + border-radius: 16px; + padding: 0.85rem 1rem; + display: flex; + flex-direction: column; + gap: 0.35rem; + font-size: 0.95rem; +} + +.hero-card-stat-label { + text-transform: uppercase; + letter-spacing: 0.08rem; + font-size: 0.75rem; + opacity: 0.7; +} + +.hero-card-stat-value { + font-size: 1.15rem; + font-weight: 700; +} + +.hero-checklist { + list-style: none; + padding: 0; + margin: 0; + display: grid; + gap: 0.65rem; +} + +.hero-checklist li { + display: flex; + gap: 0.7rem; + align-items: flex-start; + font-size: 0.98rem; + line-height: 1.6; +} + +.hero-checklist li::before { + content: "\2713"; + color: var(--fyncom-yellow); + font-weight: 700; + margin-top: 0.05rem; +} + +.deposit-section { + display: flex; + flex-direction: column; + gap: 1.75rem; +} + +.deposit-section header { + display: flex; + flex-direction: column; + gap: 0.75rem; + max-width: 680px; +} + +.deposit-section header h2 { + font-size: clamp(2rem, 3vw, 2.45rem); + margin: 0; + color: var(--fyncom-darkest-cyan); +} + +.deposit-section header p { + margin: 0; + font-size: 1.05rem; + line-height: 1.75; + color: rgba(0, 0, 0, 0.72); +} + +.deposit-info-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); + gap: 1.5rem; +} + +.deposit-info-card { + background: linear-gradient(160deg, rgba(var(--fyncom-blue-rgb), 0.09) 0%, rgba(255, 255, 255, 0.95) 100%); + border: 1px solid rgba(var(--fyncom-blue-rgb), 0.2); + border-radius: 20px; + padding: 1.75rem; + display: flex; + flex-direction: column; + gap: 0.75rem; + box-shadow: 0 18px 35px rgba(0, 0, 0, 0.08); +} + +.deposit-info-card h3 { + margin: 0; + font-size: 1.2rem; + color: var(--fyncom-darkest-cyan); +} + +.deposit-info-card p { + margin: 0; + font-size: 1rem; + line-height: 1.7; +} + +.deposit-steps-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); + gap: 1.5rem; +} + +.deposit-step-card { + background: #fff; + border-radius: 22px; + padding: 1.9rem 1.75rem; + border: 1px solid rgba(0, 0, 0, 0.07); + box-shadow: 0 15px 35px rgba(0, 0, 0, 0.07); + display: flex; + flex-direction: column; + gap: 1rem; +} + +.deposit-step-number { + width: 46px; + height: 46px; + border-radius: 50%; + display: grid; + place-items: center; + background: rgba(var(--fyncom-red-rgb), 0.12); + color: var(--fyncom-red); + font-weight: 700; + font-size: 1.2rem; +} + +.deposit-step-card h3 { + margin: 0; + font-size: 1.15rem; + color: var(--fyncom-darkest-cyan); +} + +.deposit-step-card p { + margin: 0; + font-size: 0.98rem; + line-height: 1.7; +} + +/* links inside step copy should be white on gradient background */ +.deposit-step-card p a { + color: #fff !important; + text-decoration-color: rgba(255, 255, 255, 0.8); +} + +.deposit-testimonial { + background: linear-gradient(140deg, rgba(var(--fyncom-blue-rgb), 0.15) 0%, rgba(255, 255, 255, 0.95) 100%); + border-radius: 24px; + padding: 2.5rem; + border: 1px solid rgba(var(--fyncom-blue-rgb), 0.15); + box-shadow: 0 20px 40px rgba(0, 0, 0, 0.12); + position: relative; + overflow: hidden; +} + +.deposit-testimonial::before { + content: "\201C"; + position: absolute; + top: -35px; + left: -5px; + font-size: 9rem; + color: rgba(var(--fyncom-blue-rgb), 0.15); + font-family: Georgia, serif; +} + +.deposit-testimonial blockquote { + margin: 0; + font-size: 1.15rem; + line-height: 1.8; + color: rgba(0, 0, 0, 0.75); + position: relative; + z-index: 1; +} + +.deposit-testimonial cite { + display: block; + margin-top: 1.5rem; + font-style: normal; + font-weight: 600; + color: var(--fyncom-darkest-cyan); +} + +.deposit-cta-card { + background: linear-gradient(120deg, rgba(var(--fyncom-red-rgb), 0.85) 0%, rgba(var(--fyncom-blue-rgb), 0.85) 100%); + border-radius: 26px; + padding: 2.75rem; + color: #fff; + display: grid; + gap: 1.35rem; + box-shadow: 0 25px 60px rgba(0, 0, 0, 0.25); +} + +.deposit-cta-card h2 { + margin: 0; + font-size: clamp(2rem, 3vw, 2.5rem); +} + +.deposit-cta-card p { + margin: 0; + font-size: 1.05rem; + line-height: 1.7; + max-width: 52ch; +} + +.deposit-cta-actions { + display: flex; + flex-wrap: wrap; + gap: 0.85rem; +} + +.deposit-cta-actions .cta-link-secondary { + display: inline-flex; + align-items: center; + gap: 0.4rem; + padding: 0.85rem 1.4rem; + border-radius: 999px; + border: 1px solid rgba(255, 255, 255, 0.5); + color: #fff; + text-decoration: none; + font-weight: 600; + transition: background 0.2s ease; +} + +.deposit-cta-actions .cta-link-secondary:hover { + background: rgba(255, 255, 255, 0.18); +} + +.deposit-whitepaper { + display: grid; + gap: 1.5rem; +} + +.deposit-whitepaper p { + margin: 0; + font-size: 1.02rem; + line-height: 1.75; +} + +@media (max-width: 960px) { + .deposit-main { + padding: 3.5rem 1.25rem 4rem; + } + + .deposit-hero { + padding: 2.4rem; + } +} + +@media (max-width: 640px) { + .deposit-main { + padding: 3rem 1rem; + } + + .deposit-hero { + padding: 2rem; + border-radius: 22px; + display: flex; + flex-direction: column; + gap: 1.75rem; + overflow: visible; + } + + .hero-title { + font-size: clamp(2rem, 8vw, 2.8rem); + } + + .deposit-actions .learn-more-btn { + width: 100%; + justify-content: center; + } + + .hero-card { + padding: 1.9rem; + } + + .deposit-trust-bar { + flex-direction: column; + align-items: flex-start; + } + + .hero-personalization { + flex-direction: column; + align-items: stretch; + gap: 0.6rem; + } + + .hero-pill { + width: 100%; + justify-content: center; + } +} + +@media (prefers-color-scheme: dark) { + .deposit-page { + background: linear-gradient(180deg, rgba(0, 53, 84, 0.65) 0%, rgba(0, 0, 0, 0.85) 100%); + } + + .hero-title, + .deposit-section header h2, + .hero-card h3, + .deposit-info-card h3, + .deposit-step-card h3 { + color: rgba(var(--fyncom-red-rgb), 0.9); + } + + .hero-personalization { + gap: 0.65rem; + } + + .hero-pill { + background: rgba(var(--fyncom-red-rgb), 0.18); + border-color: rgba(var(--fyncom-red-rgb), 0.32); + color: rgba(255, 255, 255, 0.92); + } + + .hero-subtitle, + .deposit-assurance, + .deposit-info-card, + .deposit-info-card p, + .deposit-step-card, + .deposit-step-card p, + .hero-checklist li { + color: rgba(255, 255, 255, 0.78); + } + + .deposit-section header p, + .deposit-whitepaper p { + color: rgba(255, 255, 255, 0.75); + } + + .hero-card .html-dynamic, + .hero-card .html-dynamic p { + color: rgba(255, 255, 255, 0.85); + } + + .deposit-trust-badge { + background: rgba(255, 255, 255, 0.12); + border-color: rgba(255, 255, 255, 0.18); + } + + .deposit-info-card { + background: linear-gradient(155deg, rgba(255, 255, 255, 0.08) 0%, rgba(19, 220, 236, 0.05) 100%); + border-color: rgba(255, 255, 255, 0.1); + box-shadow: 0 18px 35px rgba(0, 0, 0, 0.5); + } + + .deposit-step-card { + background: rgba(0, 0, 0, 0.55); + border-color: rgba(255, 255, 255, 0.1); + box-shadow: 0 18px 35px rgba(0, 0, 0, 0.55); + } + + .deposit-testimonial { + background: linear-gradient(140deg, rgba(255, 255, 255, 0.05) 0%, rgba(0, 0, 0, 0.65) 100%); + border-color: rgba(255, 255, 255, 0.12); + box-shadow: 0 18px 35px rgba(0, 0, 0, 0.65); + } + + .deposit-testimonial blockquote, + .deposit-testimonial cite { + color: rgba(255, 255, 255, 0.82); + } + + .deposit-cta-card p { + color: rgba(255, 255, 255, 0.88); + } +} diff --git a/src/pages/make-a-deposit-v1.js b/src/pages/make-a-deposit-v1.js new file mode 100644 index 0000000..c7b1e68 --- /dev/null +++ b/src/pages/make-a-deposit-v1.js @@ -0,0 +1,305 @@ +import React, { useState, useEffect } from "react" +import Header from "../components/header" +import Footer from "../components/footer" +import "../components/white-paper.css" +import "../components/blocked-email.css" +import "../components/contact.css" +import { useLocation } from "@reach/router" +import whitePaper from "../../static/pdfs/fyncom-Original-White-Paper-For-KarmaCall-Update.pdf" +import Seo from "../components/seo" +import PdfContent from "../components/PdfContent" +import { MakeADepositModal } from "../components/Modal" +import { logEvent } from "../utils/analytics" + +const MakeADepositV1 = () => { + const [blockedEmailDetails, setBlockedEmailDetails] = useState(null) + const location = useLocation() + const [dynamicMessage, setDynamicMessage] = useState("") + const [isModalOpen, setIsModalOpen] = useState(false) + const [urlToExecute, setUrlToExecute] = useState(null) + const [stripeUrl, setStripeUrl] = useState("") + + const toggleModal = () => { + setIsModalOpen(!isModalOpen) + logEvent("Deposit", "Toggle Nano Deposit Modal", isModalOpen ? "Close" : "Open") + } + + useEffect(() => { + const searchParams = new URLSearchParams(location.search) + const blockedEmailId = searchParams.get("depositId") + console.log("deposit ID is %s", blockedEmailId) + if (blockedEmailId) { + getBlockedEmailDetails(blockedEmailId) + } + }, [location]) + + useEffect(() => { + if (urlToExecute) { + window.location.href = urlToExecute + } + }, [urlToExecute]) + + const getBlockedEmailDetails = async blockedEmailId => { + let newUrl = `${process.env.GATSBY_API_URL}email/blocked/${blockedEmailId}` + try { + const response = await fetch(newUrl, { + method: "GET", + headers: { + "Content-Type": "application/json", + Accept: "application/json", + }, + }) + + if (response.ok) { + const data = await response.json() + const depositPaid = data.depositPaid + console.log("deposit paid status: " + depositPaid) + + if (depositPaid) { + // provide extra info - we'll handle this later as it's an edge case for now + } + setBlockedEmailDetails(data) + + // Format the deposit amount properly (avoiding scientific notation) + const formattedAmount = formatDepositAmount(data.recipientMin) + + const newMessage = data.depositPaid + ? `
+

✓ Deposit Received!

+

Thank you for your ${formattedAmount} deposit. ${data.recipientEmail} has been notified and will see your email in their main +inbox.

+
` + : `
+
+

📧 Your Email Status

+

Your email from ${data.senderEmail} to ${data.recipientEmail} was automatically filtered.

+
+ +
+

How This Works (It's Simple!)

+
+
+ 1 +
+ Make a tiny deposit of ${formattedAmount} +

This moves your email to their main inbox instantly

+
+
+
+ 2 +
+ ${data.recipientEmail} gets notified immediately +

Your message goes to the top of their inbox

+
+
+
+ 3 +
+ Get your full refund when they reply +

If they respond within ${data.daysDeadline} days, you pay nothing

+
+
+
+
+ +
+

💯 100% Money-Back Guarantee

+

You only pay if ${data.recipientEmail} doesn't respond within ${data.daysDeadline} days. + Most people respond within 24-48 hours, so you'll likely get your full deposit back.

+
+ +
+

Why does this work?

+

This micro-deposit proves you're a real person with a genuine message, not spam. It helps ${data.recipientEmail} + prioritize legitimate emails while earning a small reward for managing their inbox effectively.

+
+
` + setDynamicMessage(newMessage) + } else { + throw new Error("Failed to fetch email details") + } + } catch (error) { + console.error("ERROR", error) + } + } + + // Format deposit amount to avoid scientific notation and add context + const formatDepositAmount = amount => { + const numAmount = parseFloat(amount) + + // Format with appropriate decimals + let formatted = numAmount.toFixed(8).replace(/\.?0+$/, "") + + // Add context for very small amounts + if (numAmount <= 0.0001) { + const emailsPer1Cent = 0.01 / numAmount + if (emailsPer1Cent >= 1000) { + const thousands = Math.round(emailsPer1Cent / 1000) + return `$${formatted} (just 1¢ per ${thousands}k emails!)` + } else { + return `$${formatted} (just 1¢ per ${Math.round(emailsPer1Cent)} emails!)` + } + } + + return `$${formatted}` + } + + // Function to render the payment button or any other elements based on the blocked email details + function renderPaymentButton() { + if (blockedEmailDetails) { + console.log("data is here from {}", blockedEmailDetails) + const stripeUrl = `https://buy.stripe.com/fZe5obgilbJa5lm001?prefilled_email=${blockedEmailDetails.senderEmailRaw}&client_reference_id=${blockedEmailDetails.blockedEmailLogId}` + + return ( +
+

Choose Your Deposit Method

+ +

+ Remember: Full refund if they respond within {blockedEmailDetails.daysDeadline} days +

+ {isModalOpen && } +
+ ) + } else { + return ( +
+

Loading email details...

+
+ ) + } + } + + return ( +
+ +
+
+
+

🎯 Get Your Email to the Top of Their Inbox

+

+ Make a tiny deposit. Get immediate attention. Pay nothing if they respond. +

+
+ + {dynamicMessage ? ( +
+ ) : ( +
+
+

📧 Your Email Was Filtered

+

+ You're here because someone is using FynCom's email filtering system. Your message was automatically moved to a secondary folder, but you can + get it prioritized! +

+
+ +
+

How This Works (It's Simple!)

+
+
+ 1 +
+ Make a tiny refundable deposit +

This moves your email to their main inbox instantly

+
+
+
+ 2 +
+ Recipient gets notified immediately +

Your message goes to the top of their inbox

+
+
+
+ 3 +
+ Get your full refund when they reply +

If they respond within their deadline, you pay nothing

+
+
+
+
+ +
+

💯 100% Money-Back Guarantee

+

+ You only pay if the recipient doesn't respond within their specified timeframe. Most people respond within 24-48 hours, so you'll likely get + your full deposit back. +

+
+ +
+

Why does this work?

+

+ This micro-deposit proves you're a real person with a genuine message, not spam. It helps email recipients prioritize legitimate messages while + earning a small reward for managing their inbox effectively. +

+
+
+ )} + + {renderPaymentButton()} + +
+

Why Trust This System?

+
+
+ 🔒 + Secure Payments +

Processed through Stripe & Nano crypto

+
+
+ + Instant Results +

Your email moves to their inbox immediately

+
+
+ 💰 + Fair Pricing +

Tiny amounts that prove you're real

+
+
+
+ +
+

💡 Like This Idea?

+

+ Tired of spam in your own inbox? You can use this same system! Sign up at app.fyncom.com to + filter your emails and earn rewards when genuine senders reach out to you. +

+
+ +
+

Why Do Spam Calls & Emails Still Exist?

+

We asked ourselves this question and built a solution. Here's how we're fixing communication for everyone.

+

+ Our approach creates trust between strangers with shared interests using tiny "proof-of-intent" deposits. Read our original white paper that became{" "} + our first patent, powers our KarmaCall app, and + forms the foundation of FynCom. +

+ +
+
+
+
+ ) +} + +export default MakeADepositV1 diff --git a/src/pages/make-a-deposit-v2.js b/src/pages/make-a-deposit-v2.js index 8e2b485..b4b3226 100644 --- a/src/pages/make-a-deposit-v2.js +++ b/src/pages/make-a-deposit-v2.js @@ -167,7 +167,7 @@ export default function MakeADepositV2() { className="learn-more-btn cash primary" target="_blank" rel="noreferrer" - onClick={() => logEvent("Deposit", "Click", "Stripe Deposit")} + onClick={() => logEvent("Deposit", "Click", "Stripe Deposit - Variant B")} > 💳 Deposit cash diff --git a/src/pages/make-a-deposit-v3.js b/src/pages/make-a-deposit-v3.js index c44993c..4230eb0 100644 --- a/src/pages/make-a-deposit-v3.js +++ b/src/pages/make-a-deposit-v3.js @@ -1,312 +1,298 @@ -import React, { useEffect, useMemo, useState } from "react" +import React, { useState, useEffect } from "react" import Header from "../components/header" import Footer from "../components/footer" -import Seo from "../components/seo" +import "../components/white-paper.css" import "../components/blocked-email.css" +import "../components/contact.css" +import "../components/make-a-deposit-v3.css" +import { useLocation } from "@reach/router" +import whitePaper from "../../static/pdfs/fyncom-Original-White-Paper-For-KarmaCall-Update.pdf" +import Seo from "../components/seo" +import PdfContent from "../components/PdfContent" import { MakeADepositModal } from "../components/Modal" import { logEvent } from "../utils/analytics" -/** - * MakeADepositV3 – a UX-focused redesign for your refundable deposit page. - * - * Highlights - * - Clear hero + promise - * - Smart empty-state (no backend data) with explainer + self-serve input - * - Data-present state with rich summary, trust copy, and strong CTAs - * - Inline FAQ and "How it works" with visual steps - * - Subtle motion + modern card layout - * - Handles loading, error, and edge cases - */ - -const API_URL = process.env.GATSBY_API_URL +const STRIPE_CHECKOUT_URL = "https://buy.stripe.com/fZe5obgilbJa5lm001" -export default function MakeADepositV2() { - const [details, setDetails] = useState(null) - const [loading, setLoading] = useState(true) - const [error, setError] = useState(null) +const MakeADepositV3 = () => { + const [blockedEmailDetails, setBlockedEmailDetails] = useState(null) + const location = useLocation() + const [dynamicMessage, setDynamicMessage] = useState( + `

You're here because someone you're emailing protects their inbox with FynCom refundable deposits.

+

Send a quick, fully refundable deposit to fast-track your note into their main inbox. When they reply, every cent comes right back to you.

` + ) const [isModalOpen, setIsModalOpen] = useState(false) - const [manualId, setManualId] = useState("") - // Parse depositId from URL on first load + const toggleModal = () => { + setIsModalOpen(!isModalOpen) + logEvent("Deposit", "Toggle Nano Deposit Modal", isModalOpen ? "Close" : "Open") + } + useEffect(() => { - const search = new URLSearchParams(window.location.search) - const id = search.get("depositId") - if (id) fetchDetails(id) - else setLoading(false) - }, []) + const searchParams = new URLSearchParams(location.search) + const blockedEmailId = searchParams.get("depositId") + if (blockedEmailId) { + getBlockedEmailDetails(blockedEmailId) + } + }, [location]) - async function fetchDetails(id) { + const getBlockedEmailDetails = async blockedEmailId => { + const apiUrl = `${process.env.GATSBY_API_URL}email/blocked/${blockedEmailId}` try { - setLoading(true) - const res = await fetch(`${API_URL}email/blocked/${id}`) - if (!res.ok) throw new Error("Failed to fetch deposit details") - const data = await res.json() - setDetails(data) - setError(null) - } catch (e) { - setError(e?.message ?? "Something went wrong") - setDetails(null) - } finally { - setLoading(false) + const response = await fetch(apiUrl, { + method: "GET", + headers: { + "Content-Type": "application/json", + Accept: "application/json", + }, + }) + + if (!response.ok) { + throw new Error("Failed to fetch email details") + } + + const data = await response.json() + const depositPaid = data.depositPaid + const secondaryLabel = data.emailLabel ? data.emailLabel : "FynFiltered" + const fynMail = "FynMail" + + setBlockedEmailDetails(data) + + const senderEmail = data.senderEmail || data.senderEmailRaw || "you" + const thankYouMessage = `

Thanks for sending the $${data.recipientMin} deposit for ${data.recipientEmail}.

+

We're alerting them now so they can reply and release your refund. You can manage everything inside app.fyncom.com.

` + + const invitationMessage = `

Your message from ${senderEmail} is ready for ${data.recipientEmail}, but it's waiting in ${secondaryLabel}.

+

Send a fully refundable $${data.recipientMin} deposit to move it to their main inbox with a verified ${fynMail} badge. If they reply within ${data.daysDeadline} days, the funds return to you instantly.

` + + setDynamicMessage(depositPaid ? thankYouMessage : invitationMessage) + } catch (error) { + console.error("ERROR", error) } } - const stripeUrl = useMemo(() => { - if (!details) return "https://buy.stripe.com/fZe5obgilbJa5lm001" // default checkout - const email = encodeURIComponent(details.senderEmailRaw || details.senderEmail || "") - const ref = encodeURIComponent(details.blockedEmailLogId || "") - return `https://buy.stripe.com/fZe5obgilbJa5lm001?prefilled_email=${email}&client_reference_id=${ref}` - }, [details]) + const buildStripeUrl = () => { + if (!blockedEmailDetails) { + return STRIPE_CHECKOUT_URL + } - const minDeposit = details?.recipientMin ? Number(details.recipientMin).toFixed(2) : "0.00" - const deadlineDays = details?.daysDeadline ?? 30 - const labelName = details?.labelName || "INBOX" - const secondaryLabel = details?.emailLabel || "FynFiltered" + const queryParts = [] - function handleNano() { - setIsModalOpen(true) + if (blockedEmailDetails.senderEmailRaw) { + queryParts.push(`prefilled_email=${encodeURIComponent(blockedEmailDetails.senderEmailRaw)}`) + } + + if (blockedEmailDetails.blockedEmailLogId) { + queryParts.push(`client_reference_id=${encodeURIComponent(blockedEmailDetails.blockedEmailLogId)}`) + } + + const queryString = queryParts.join("&") + return queryString ? `${STRIPE_CHECKOUT_URL}?${queryString}` : STRIPE_CHECKOUT_URL } - return ( -
- -
-
-
-

- 🎯 Get your email noticed with a refundable deposit -

-

- Unknown senders stake a tiny deposit to reach the main inbox. If the recipient engages, the sender gets it back. If not, the user keeps it. Simple. -

-
- 🛡️ Patent-backed - ⏱️ Time-based escrow - 💰 User‑rewarded -
+ const renderPaymentButton = () => { + const stripeUrl = buildStripeUrl() + + return ( + <> + + {isModalOpen && } + + ) + } - {/* Loading state */} - {loading && ( -
-

📧 Loading Email Details...

-

Fetching your deposit details…

-
- )} + const heroTitle = blockedEmailDetails?.recipientEmail + ? `Guarantee ${blockedEmailDetails.recipientEmail} sees your email` + : "Make your email impossible to ignore" - {/* Error state */} - {!loading && error && ( -
-

⚠️ We couldn't load that link

-

{error}

-
- )} + const recipientInboxLabel = blockedEmailDetails?.recipientEmail ? `${blockedEmailDetails.recipientEmail}'s inbox` : "the inbox you're trying to reach" - {/* DATA PRESENT */} - {!loading && !error && details && ( -
-
-
-
-

- This message is waiting in {secondaryLabel} -

-

- From {details.senderEmail} to {details.recipientEmail} -

-
-
-
Minimum deposit
-
${minDeposit}
-
-
-
+ const depositAmountDisplay = blockedEmailDetails?.recipientMin ? `$${blockedEmailDetails.recipientMin}` : "a small, refundable deposit" -
-

How This Works

-
-
- 1 -
- 📧 Move to main inbox -

Pay the deposit to move this email to the recipient's {labelName} immediately.

-
-
-
- 2 -
- ⏱️ Refund window -

- If they respond within {deadlineDays} days, your deposit is automatically refunded. -

-
-
-
- 3 -
- 💰 User gets paid if ignored -

If there's no response, the recipient keeps a portion as a reward for their time.

-
-
-
-
+ const responseDeadlineText = blockedEmailDetails?.daysDeadline + ? `${blockedEmailDetails.daysDeadline} day${blockedEmailDetails.daysDeadline === 1 ? "" : "s"}` + : "the response window" -
-

Choose Your Deposit Method

- -

- Remember: Full refund if they respond within {deadlineDays} days -

- {isModalOpen && setIsModalOpen(false)} />} -
+ const recipientDisplay = blockedEmailDetails?.recipientEmail || "the recipient" + const recipientPossessive = blockedEmailDetails ? "their" : "the recipient's" + const senderDisplay = blockedEmailDetails?.senderEmail || blockedEmailDetails?.senderEmailRaw || "you" + const heroSubtitleText = blockedEmailDetails + ? `You're emailing ${recipientDisplay} from ${senderDisplay}. They ask new email contacts to post ${depositAmountDisplay} so serious conversations rise above the noise.` + : `Use ${depositAmountDisplay} to move your message to ${recipientInboxLabel} and prove you value their time. Get every cent back the moment they reply.` -
-

🔒 Why a deposit?

-

It's an economic good‑faith signal that discourages spam. If the recipient engages, you're refunded automatically.

-
-
🛡️ Patent‑backed, time‑based escrow
-
⏱️ Response‑based, automatic refunds
-
💰 Rewards recipients for attention
+ return ( +
+ +
+
+
+
+

Refundable deposits powered by FynCom

+

{heroTitle}

+

{heroSubtitleText}

+ {blockedEmailDetails && ( +
+ Recipient: {recipientDisplay} + You: {senderDisplay} + Deposit: {depositAmountDisplay} + Refund window: {responseDeadlineText}
+ )} + {renderPaymentButton()} +

+ Deposits stay in secure escrow until the conversation moves forward. No reply? You decide what happens next inside{" "} + app.fyncom.com. +

+
+ Backed by U.S. Patent 11,310,368 + Automatic refunds when your recipient responds + Built for founders, investors, and elite teams
- )} - - {/* EMPTY STATE (NO DATA) */} - {!loading && !error && !details && ( -
-
-

Got a FynCom PayCation email?

-

- Paste your depositId from the link to see your sender/recipient details and complete a deposit. No worries—if they reply, - you're refunded. -

- -
- setManualId(e.target.value)} - style={{ flex: 1, minWidth: "200px", padding: "0.75rem", borderRadius: "8px", border: "1px solid #ccc" }} - /> - -
-
- -
-

How This Works (It's Simple!)

-
-
- 1 -
- 💰 Make a tiny deposit -

Stake a small, refundable amount to signal good faith.

-
+
+

What happens when you deposit

+
+
+ {(blockedEmailDetails?.recipientMin || blockedEmailDetails?.recipientEmail || blockedEmailDetails?.daysDeadline) && ( +
+ {blockedEmailDetails?.recipientMin && ( +
+ Refundable deposit + ${blockedEmailDetails.recipientMin} +
+ )} + {blockedEmailDetails?.recipientEmail && ( +
+ Recipient + {blockedEmailDetails.recipientEmail} +
+ )} + {blockedEmailDetails?.daysDeadline && ( +
+ Refund window + + {blockedEmailDetails.daysDeadline} day{blockedEmailDetails.daysDeadline === 1 ? "" : "s"} + +
+ )}
-
- 2 -
- 📧 Jump the queue -

Your email moves to the main inbox instantly.

-
-
-
- 3 -
- ⏱️ Auto‑refund on reply -

If they respond within the window, you get it back.

-
-
-
+ )} +
    +
  • Your message is elevated to {recipientPossessive} main inbox with a verified FynMail badge.
  • +
  • We notify {recipientDisplay} that a serious, refundable deposit is waiting for them.
  • +
  • If they reply within {responseDeadlineText}, the deposit snaps right back to you.
  • +
+
+
-
-

Why this works

+
+
+

Lead with trust, not noise

+

Refundable deposits flip outreach from interruption to invitation. Show you respect their focus and they'll reciprocate.

+
+
+
+

Signal real intent

+

Your deposit proves this isn't another spray-and-pray blast. You're demonstrating that the conversation is worth pursuing.

+
+
+

Respect their timeline

+

Busy people filter ruthlessly. A refundable deposit switches the frame from "stranger" to "partner" and earns a thoughtful read.

+
+
+

Create shared upside

+

When they reply, you get your money back. If they decline, they can keep the deposit as a fair trade for their time and attention.

+
+
+
+ +
+
+

How it works

+

Three simple steps move your message from the sidelines to the spotlight.

+
+
+
+ 1 +

Send your deposit

+

Use Stripe or Nano to post the refundable deposit. We secure the funds and attach the verified FynMail badge to your message.

+
+
+ 2 +

We elevate your email

- Spam is cheap to send. A refundable deposit flips the economics—only serious senders stake it. If it's not useful, the user keeps a portion. + Your note leaps to the top of {recipientPossessive} inbox, and we notify {recipientDisplay} that a serious sender is waiting.

-
+
-

Prefer crypto? Use Nano (XNO) via the app wallet.

-
+ . +

+
- )} + -
-

Why Trust This System?

-
-
- 🔒 - Secure Payments -

Processed through Stripe & Nano crypto

-
-
- - Instant Results -

Your email moves to their inbox immediately

-
-
- 💰 - Fair Pricing -

Tiny amounts that prove you're real

-
+
+
+ "Inboxes finally feel balanced. People who value our time reach us instantly, and the rest learn to respect the process." + - Team FynCom +
+
+ +
+

Want refundable deposits inside your product?

+

Use the same trust engine to protect your community, marketplace, or sales outreach program. We'll help you launch in days, not months.

+ -
+ -
-

💡 Like This Idea?

+
+

Explore the economics behind PayCation

- Tired of spam in your own inbox? You can use this same system! Sign up at app.fyncom.com to - filter your emails and earn rewards when genuine senders reach out to you. + Ever wonder why spam persists? Our original whitepaper breaks down the incentives and shows how refundable deposits make legitimate outreach win. + Take a peek and imagine this framework inside your own product.

-
- -
-

FAQ

-
-
- Do I lose money if they never read it? -

- If there's no response in the refund window, the recipient keeps a portion of the deposit as a reward for their time. -

-
-
- What if I'm an approved contact? -

Known contacts are automatically whitelisted—no deposit needed.

-
-
- Is this secure? -

- Deposits are processed through trusted providers, and refunds are automatic based on recipient engagement. -

-
-
-
-
+ + +
) } + +export default MakeADepositV3 diff --git a/src/pages/make-a-deposit.js b/src/pages/make-a-deposit.js index 5132376..b566eb7 100644 --- a/src/pages/make-a-deposit.js +++ b/src/pages/make-a-deposit.js @@ -1,314 +1,71 @@ import React, { useState, useEffect } from "react" -import Header from "../components/header" -import Footer from "../components/footer" -import "../components/white-paper.css" -import "../components/blocked-email.css" -import "../components/contact.css" import { useLocation } from "@reach/router" -import whitePaper from "../../static/pdfs/fyncom-Original-White-Paper-For-KarmaCall-Update.pdf" -import Seo from "../components/seo" -import PdfContent from "../components/PdfContent" -import { MakeADepositModal } from "../components/Modal" import { logEvent } from "../utils/analytics" +// Import the three variant components +import MakeADepositV1 from "./make-a-deposit-v1" +import MakeADepositV2 from "./make-a-deposit-v2" +import MakeADepositV3 from "./make-a-deposit-v3" + +/** + * MakeADeposit - A/B/C Test Router + * + * This component routes users to one of three design variants based on their depositId. + * The same depositId will always see the same variant for consistency. + * + * Variants: + * - A: Original design (make-a-deposit-v1.js) - Current production design + * - B: UX-focused redesign (make-a-deposit-v2.js) - Modern card layout with FAQ + * - C: Premium design (make-a-deposit-v3.js) - From makeADeposit-Codex-nice branch + */ + const MakeADeposit = () => { - const [blockedEmailDetails, setBlockedEmailDetails] = useState(null) const location = useLocation() - const [dynamicMessage, setDynamicMessage] = useState("") - const [isModalOpen, setIsModalOpen] = useState(false) - const [urlToExecute, setUrlToExecute] = useState(null) - const [stripeUrl, setStripeUrl] = useState("") + const [variant, setVariant] = useState(null) - const toggleModal = () => { - setIsModalOpen(!isModalOpen) - logEvent("Deposit", "Toggle Nano Deposit Modal", isModalOpen ? "Close" : "Open") - } + // Simple hash function to consistently assign variant based on depositId + const getVariantFromDepositId = (depositId) => { + if (!depositId) return 'A' // default variant for no depositId - useEffect(() => { - const searchParams = new URLSearchParams(location.search) - const blockedEmailId = searchParams.get("depositId") - console.log("deposit ID is %s", blockedEmailId) - if (blockedEmailId) { - getBlockedEmailDetails(blockedEmailId) - } - }, [location]) - - useEffect(() => { - if (urlToExecute) { - window.location.href = urlToExecute + // Simple hash: sum character codes + let hash = 0 + for (let i = 0; i < depositId.length; i++) { + hash = ((hash << 5) - hash) + depositId.charCodeAt(i) + hash = hash & hash // Convert to 32-bit integer } - }, [urlToExecute]) - const getBlockedEmailDetails = async blockedEmailId => { - let newUrl = `${process.env.GATSBY_API_URL}email/blocked/${blockedEmailId}` - try { - const response = await fetch(newUrl, { - method: "GET", - headers: { - "Content-Type": "application/json", - Accept: "application/json", - }, - }) - - if (response.ok) { - const data = await response.json() - const depositPaid = data.depositPaid - console.log("deposit paid status: " + depositPaid) - - if (depositPaid) { - // provide extra info - we'll handle this later as it's an edge case for now - } - setBlockedEmailDetails(data) - - // Format the deposit amount properly (avoiding scientific notation) - const formattedAmount = formatDepositAmount(data.recipientMin) - - const newMessage = data.depositPaid - ? `
-

✓ Deposit Received!

-

Thank you for your ${formattedAmount} deposit. ${data.recipientEmail} has been notified and will see your email in their main -inbox.

-
` - : `
-
-

📧 Your Email Status

-

Your email from ${data.senderEmail} to ${data.recipientEmail} was automatically filtered.

-
- -
-

How This Works (It's Simple!)

-
-
- 1 -
- Make a tiny deposit of ${formattedAmount} -

This moves your email to their main inbox instantly

-
-
-
- 2 -
- ${data.recipientEmail} gets notified immediately -

Your message goes to the top of their inbox

-
-
-
- 3 -
- Get your full refund when they reply -

If they respond within ${data.daysDeadline} days, you pay nothing

-
-
-
-
- -
-

💯 100% Money-Back Guarantee

-

You only pay if ${data.recipientEmail} doesn't respond within ${data.daysDeadline} days. - Most people respond within 24-48 hours, so you'll likely get your full deposit back.

-
- -
-

Why does this work?

-

This micro-deposit proves you're a real person with a genuine message, not spam. It helps ${data.recipientEmail} - prioritize legitimate emails while earning a small reward for managing their inbox effectively.

-
-
` - setDynamicMessage(newMessage) - } else { - throw new Error("Failed to fetch email details") - } - } catch (error) { - console.error("ERROR", error) - } + // Map to variant A, B, or C + const variantIndex = Math.abs(hash) % 3 + const variants = ['A', 'B', 'C'] + return variants[variantIndex] } - // Format deposit amount to avoid scientific notation and add context - const formatDepositAmount = amount => { - const numAmount = parseFloat(amount) + useEffect(() => { + const searchParams = new URLSearchParams(location.search) + const blockedEmailId = searchParams.get("depositId") - // Format with appropriate decimals - let formatted = numAmount.toFixed(8).replace(/\.?0+$/, "") + // Determine variant based on depositId + const assignedVariant = getVariantFromDepositId(blockedEmailId) + setVariant(assignedVariant) + console.log("Assigned variant:", assignedVariant, "for depositId:", blockedEmailId) - // Add context for very small amounts - if (numAmount <= 0.0001) { - const emailsPer1Cent = 0.01 / numAmount - if (emailsPer1Cent >= 1000) { - const thousands = Math.round(emailsPer1Cent / 1000) - return `$${formatted} (just 1¢ per ${thousands}k emails!)` - } else { - return `$${formatted} (just 1¢ per ${Math.round(emailsPer1Cent)} emails!)` - } - } + // Log variant assignment for analytics + logEvent("AB Test", "Variant Assigned", assignedVariant) + }, [location]) - return `$${formatted}` + // Show nothing until variant is determined + if (!variant) { + return null } - // Function to render the payment button or any other elements based on the blocked email details - function renderPaymentButton() { - if (blockedEmailDetails) { - console.log("data is here from {}", blockedEmailDetails) - const stripeUrl = `https://buy.stripe.com/fZe5obgilbJa5lm001?prefilled_email=${blockedEmailDetails.senderEmailRaw}&client_reference_id=${blockedEmailDetails.blockedEmailLogId}` - - return ( -
-

Choose Your Deposit Method

- -

- Remember: Full refund if they respond within {blockedEmailDetails.daysDeadline} days -

- {isModalOpen && } -
- ) - } else { - return ( -
-

Loading email details...

-
- ) - } + // Render the appropriate variant + if (variant === 'A') { + return + } else if (variant === 'B') { + return + } else { + return } - - return ( -
- -
-
-
-
-

🎯 Get Your Email to the Top of Their Inbox

-
-
-

- Make a tiny deposit. Get immediate attention. Pay nothing if they respond. -

-
- 🛡️ Patent-backed - ⏱️ Time-based escrow - 💰 User‑rewarded -
-
-
- - {dynamicMessage ? ( -
- ) : ( -
-
-

📧 Your Email Was Filtered

-

- You're here because someone is using FynCom's email filtering system. Your message was automatically moved to a secondary folder, but you can - get it prioritized! -

-
- -
-

How This Works (It's Simple!)

-
-
- 1 -
- Make a tiny refundable deposit -

This moves your email to their main inbox instantly

-
-
-
- 2 -
- Recipient gets notified immediately -

Your message goes to the top of their inbox

-
-
-
- 3 -
- Get your full refund when they reply -

If they respond within their deadline, you pay nothing

-
-
-
-
- -
-

💯 100% Money-Back Guarantee

-

- You only pay if the recipient doesn't respond within their specified timeframe. Most people respond within 24-48 hours, so you'll likely get - your full deposit back. -

-
- -
-

Why does this work?

-

- This micro-deposit proves you're a real person with a genuine message, not spam. It helps email recipients prioritize legitimate messages while - earning a small reward for managing their inbox effectively. -

-
-
- )} - - {renderPaymentButton()} - -
-

Why Trust This System?

-
-
- 🔒 - Secure Payments -

Processed through Stripe & Nano crypto

-
-
- - Instant Results -

Your email moves to their inbox immediately

-
-
- 💰 - Fair Pricing -

Tiny amounts that prove you're real

-
-
-
- -
-

💡 Like This Idea?

-

- Tired of spam in your own inbox? You can use this same system! Sign up at app.fyncom.com to - filter your emails and earn rewards when genuine senders reach out to you. -

-
- -
-

Why Do Spam Calls & Emails Still Exist?

-

We asked ourselves this question and built a solution. Here's how we're fixing communication for everyone.

-

- Our approach creates trust between strangers with shared interests using tiny "proof-of-intent" deposits. Read our original white paper that became{" "} - our first patent, powers our KarmaCall app, and - forms the foundation of FynCom. -

- -
-
-
- ) } export default MakeADeposit