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(