From 58228e3d33e4b588e157134baeac6c6815b63fbd Mon Sep 17 00:00:00 2001 From: "yves.gugger" Date: Fri, 12 Dec 2025 15:27:53 +0100 Subject: [PATCH] feat: integrate Pounce self-promotion & viral growth system MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pounce Eigenwerbung (from pounce_endgame.md): - Add 'pounce_promo' as fallback partner for generic/unclear intent domains - Create dedicated Pounce promo landing page with CTA to register - Update footer on all yield pages: 'Monetized by Pounce • Own a domain? Start yielding' Tech/Investment Domain Detection: - Add 'investment_domains' category (invest, crypto, trading, domain, startup) - Add 'tech_dev' category (developer, web3, fintech, proptech) - Both categories have 'pounce_affinity' flag for higher Pounce conversion Referral Tracking for Domain Owners: - Add user fields: referred_by_user_id, referred_by_domain, referral_code - Parse yield referral codes (yield_{user_id}_{domain_id}) on registration - Domain owners earn lifetime commission when visitors sign up via their domain DB Migrations: - Add referral tracking columns to users table --- backend/app/api/auth.py | 27 ++ backend/app/api/yield_routing.py | 241 +++++++++++++- backend/app/db_migrations.py | 14 + backend/app/models/user.py | 7 +- backend/app/schemas/auth.py | 2 + backend/app/seeds/yield_partners.py | 16 + backend/app/services/intent_detector.py | 27 ++ .../src/components/CommandCenterLayout.tsx | 301 ++++++++++++++++++ pounce_endgame.md | 90 +++++- 9 files changed, 713 insertions(+), 12 deletions(-) create mode 100755 frontend/src/components/CommandCenterLayout.tsx diff --git a/backend/app/api/auth.py b/backend/app/api/auth.py index 36e89ed..467e59e 100644 --- a/backend/app/api/auth.py +++ b/backend/app/api/auth.py @@ -100,6 +100,33 @@ async def register( name=user_data.name, ) + # Process yield referral if present + # Format: yield_{user_id}_{domain_id} + if user_data.ref and user_data.ref.startswith("yield_"): + try: + parts = user_data.ref.split("_") + if len(parts) >= 3: + referrer_user_id = int(parts[1]) + # Store referral info + user.referred_by_user_id = referrer_user_id + user.referral_code = user_data.ref + # Try to get domain name from yield_domain_id + try: + from app.models.yield_domain import YieldDomain + yield_domain_id = int(parts[2]) + yield_domain = await db.execute( + select(YieldDomain).where(YieldDomain.id == yield_domain_id) + ) + yd = yield_domain.scalar_one_or_none() + if yd: + user.referred_by_domain = yd.domain + except Exception: + pass + await db.commit() + logger.info(f"User {user.email} referred by user {referrer_user_id}") + except Exception as e: + logger.warning(f"Failed to process referral code: {user_data.ref}, error: {e}") + # Auto-admin for specific email ADMIN_EMAILS = ["guggeryves@hotmail.com"] if user.email.lower() in [e.lower() for e in ADMIN_EMAILS]: diff --git a/backend/app/api/yield_routing.py b/backend/app/api/yield_routing.py index 8c0b510..fd225b0 100644 --- a/backend/app/api/yield_routing.py +++ b/backend/app/api/yield_routing.py @@ -82,8 +82,226 @@ def generate_tracking_url( if partner.slug in network_urls: return network_urls[partner.slug] - # Generic fallback - show Pounce marketplace - return f"{settings.site_url}/buy?ref={yield_domain.domain}&clickid={click_id}" + # Pounce self-promotion fallback with referral tracking + # Domain owner gets lifetime commission on signups via their domain + referral_code = f"yield_{yield_domain.user_id}_{yield_domain.id}" + return f"{settings.site_url}/register?ref={referral_code}&from={yield_domain.domain}&clickid={click_id}" + + +def is_pounce_affinity_domain(domain: str) -> bool: + """ + Check if a domain has high affinity for Pounce self-promotion. + + Tech, investment, and domain-related domains convert better for Pounce. + """ + intent = detect_domain_intent(domain) + + # Check if the matched category has pounce_affinity flag + if intent.category in ["investment", "tech"] or intent.subcategory in ["domains", "dev"]: + return True + + # Check for specific keywords + pounce_keywords = { + "invest", "domain", "trading", "crypto", "asset", "portfolio", + "startup", "tech", "dev", "saas", "digital", "passive", "income" + } + domain_lower = domain.lower() + return any(kw in domain_lower for kw in pounce_keywords) + + +def generate_pounce_promo_page( + yield_domain: YieldDomain, + click_id: int, +) -> str: + """ + Generate Pounce self-promotion landing page. + + Used as fallback when no high-value partner is available, + or when the domain has high Pounce affinity. + """ + referral_code = f"yield_{yield_domain.user_id}_{yield_domain.id}" + register_url = f"{settings.site_url}/register?ref={referral_code}&from={yield_domain.domain}&clickid={click_id}" + + return f""" + + + + + + {yield_domain.domain} - Powered by Pounce + + + +
+
+ + + + + This domain is monetized by Pounce +
+ +
{yield_domain.domain}
+ +

+ Turn Your Domains Into
+ Passive Income +

+ +

+ Stop paying renewal fees for idle domains.
+ Let them earn money for you — automatically. +

+ + + Start Earning Free + + + + + +
+
+ + + + + Free Forever +
+
+ + + + 70% Revenue Share +
+
+ + + + + Swiss Quality +
+
+ +
+ 👋 The owner of this domain earns a commission when you sign up! +
+
+ + + + +""" def generate_landing_page( @@ -98,18 +316,21 @@ def generate_landing_page( 1. Improve user experience 2. Allow for A/B testing 3. Comply with affiliate disclosure requirements + + If no partner, shows Pounce self-promotion instead. """ + # If no partner or partner is pounce_promo, show Pounce promo page + if partner is None or partner.slug == "pounce_promo": + return generate_pounce_promo_page(yield_domain, click_id) + intent = detect_domain_intent(yield_domain.domain) # Partner info - partner_name = partner.name if partner else "Partner" - partner_desc = partner.description if partner else "Find the best offers" + partner_name = partner.name + partner_desc = partner.description or "Find the best offers" # Generate redirect URL - redirect_url = ( - generate_tracking_url(partner, yield_domain, click_id) - if partner else f"{settings.site_url}/buy" - ) + redirect_url = generate_tracking_url(partner, yield_domain, click_id) return f""" @@ -206,8 +427,8 @@ def generate_landing_page(