{"version":3,"file":"AcademyModule.CPsT_IWw.mjs","names":["useState","mod","_Fragment"],"sources":["https:/framerusercontent.com/modules/LThDC3rzN2KcE4UdvC8B/0UDtF19EhPPxIrF3oZEU/AcademyModule.js"],"sourcesContent":["import{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from\"react/jsx-runtime\";import{useEffect,useState}from\"react\";import{addPropertyControls,ControlType}from\"framer\";const MODULES={\"getting-started-with-visitor-identification\":{title:\"Getting Started with Website Visitor Identification\",metaTitle:\"Getting Started with Visitor Identification | LeadExtract Academy\",metaDescription:\"Learn what B2B website visitor identification is, how the technology works, and why it's become essential for modern sales teams.\",moduleNumber:1,duration:\"12 min read\",content:`<h2>What Is Website Visitor Identification?</h2><p>Website visitor identification is the process of turning anonymous website traffic into identifiable companies and individuals. Instead of seeing \"500 sessions\" in your analytics, you see \"James Chen, VP Sales at Acme Corp, viewed your pricing page for 8 minutes.\"</p><p>For B2B sales teams, this changes everything. You go from hoping prospects fill out a form to proactively reaching out to people who are actively evaluating your product.</p><h2>How the Technology Works</h2><p>There are three layers that make visitor identification possible:</p><p><strong>Layer 1: Reverse IP Lookup</strong><br>When someone visits your website, their browser sends a request from an IP address. Reverse IP lookup matches that IP address against databases of corporate networks. If James is browsing from Acme Corp's office, the IP resolves to Acme Corp. This gives you company-level identification — you know which business visited, but not which individual.</p><p><strong>Layer 2: Identity Graph Matching</strong><br>Identity graphs are networks of linked data points — browser cookies, device identifiers, email hashes, and more — built from permissioned data sources. When a visitor arrives, their browser fingerprint is matched against the graph to identify the specific person. This is what enables person-level identification.</p><p><strong>Layer 3: Contact Enrichment</strong><br>Once matched, the system enriches the record with professional data: full name, job title, department, seniority level, verified email address, LinkedIn profile, company size, industry, revenue, and funding stage.</p><h2>Company-Level vs Person-Level Identification</h2><p><strong>Company-level</strong> tells you \"Someone from Acme Corp visited.\" Useful, but you still need to research who to contact and find their email. Match rates are typically 20–60% of B2B traffic.</p><p><strong>Person-level</strong> tells you \"James Chen, VP Sales at Acme Corp, visited your pricing page.\" You have their name, title, and verified email. You can reach out immediately. Match rates are typically 10–35% of B2B traffic.</p><p>For outbound sales teams, person-level identification is significantly more valuable because it eliminates the research step entirely.</p><h2>Why This Matters in 2026</h2><p>Three trends make visitor identification more important than ever:</p><p><strong>1. Remote work has broken IP-based identification.</strong> With 60%+ of knowledge workers remote or hybrid, reverse IP lookup alone catches fewer visitors. Identity graphs fill this gap.</p><p><strong>2. Buyers do more research before engaging.</strong> The average B2B buyer is 60–70% through their decision before they fill out a form. Visitor identification lets you engage during the research phase.</p><p><strong>3. The tools have become accessible.</strong> What was once enterprise-only technology is now available to SMBs at $165/month. There's no longer a reason to let anonymous traffic go unidentified.</p><h2>What You'll Learn in This Academy</h2><p>Over the next five modules, you'll learn how to install LeadExtract and connect your CRM, build outreach sequences that convert identified visitors, master lead scoring and ICP filtering, automate your CRM workflows, and measure and optimise your ROI. By the end, you'll have a complete system for turning anonymous website traffic into qualified pipeline.</p>`},\"setting-up-leadextract\":{title:\"Setting Up LeadExtract: Pixel, CRM & Alerts\",metaTitle:\"Setting Up LeadExtract: Complete Setup Guide | LeadExtract Academy\",metaDescription:\"Step-by-step guide to installing your LeadExtract pixel, connecting your CRM, setting up Slack alerts, and defining your ICP filters.\",moduleNumber:2,duration:\"15 min read\",content:`<h2>Step 1: Install the LeadExtract Pixel</h2><p>The pixel is a lightweight JavaScript snippet that goes on every page of your website. It's what enables visitor identification.</p><p><strong>Option A: Direct Installation</strong><br>Copy the pixel code from your LeadExtract dashboard. Paste it into the <code>&lt;head&gt;</code> tag of your website, before the closing <code>&lt;/head&gt;</code>. This works for any website — HTML, WordPress, Webflow, Framer, Squarespace, or custom-built.</p><p><strong>Option B: Google Tag Manager</strong><br>Create a new Custom HTML tag in GTM. Paste the pixel code. Set the trigger to \"All Pages.\" Publish the container. GTM is ideal if you manage multiple scripts or want to deploy without touching your codebase.</p><p><strong>Verification</strong><br>After installation, visit your own website. Within 2–3 minutes, you should see your own visit appear in the LeadExtract dashboard. If it doesn't appear, check that the pixel is loading (use your browser's Developer Tools → Network tab and search for \"leadextract\").</p><h2>Step 2: Connect Your CRM</h2><p>LeadExtract integrates natively with Salesforce, HubSpot, and Pipedrive. The goal is to automatically create contacts and companies in your CRM when a visitor is identified.</p><p><strong>Salesforce</strong><br>Navigate to Integrations → Salesforce in your LeadExtract dashboard. Authenticate with your Salesforce admin credentials. Map LeadExtract fields to Salesforce fields: Name → Lead Name, Email → Email, Company → Company, Job Title → Title, LeadExtract Score → Custom field (create one called \"Visitor Score\"). Enable auto-creation of Lead records for visitors matching your ICP.</p><p><strong>HubSpot</strong><br>Navigate to Integrations → HubSpot. Connect via OAuth. Map fields similarly. Enable automatic Contact and Company creation. Set up a HubSpot workflow to enroll high-score contacts into a sequence automatically.</p><p><strong>Pipedrive</strong><br>Navigate to Integrations → Pipedrive. Authenticate with your API token. Map fields to Person and Organisation properties. Optionally enable auto-Deal creation for visitors above a certain score threshold.</p><h2>Step 3: Set Up Real-Time Alerts</h2><p><strong>Slack Alerts</strong><br>Connect your Slack workspace from the Integrations page. Choose which channel receives alerts (we recommend a dedicated #website-visitors channel). Configure alert filters: you probably don't want a notification for every visitor — filter by ICP match, minimum score, or specific pages visited (e.g., pricing page only).</p><p><strong>Email Alerts</strong><br>Configure email digests — daily or real-time. Daily digests work well for managers who want a summary. Real-time alerts work for SDRs who need to act fast on hot prospects.</p><h2>Step 4: Define Your ICP Filters</h2><p>ICP (Ideal Customer Profile) filters ensure your team only sees relevant visitors. Set filters for: industry (e.g., SaaS, FinTech, Manufacturing), company size (e.g., 50–500 employees), geography (e.g., US and UK only), job titles (e.g., VP, Director, Head of), and seniority level (e.g., Manager and above).</p><p>Visitors who don't match your ICP are still identified and stored — they're just not surfaced in alerts or active queues. You can always adjust filters later as your ICP evolves.</p><h2>Step 5: Verify Everything Works End-to-End</h2><p>Run a quick end-to-end test: visit your website from an incognito browser, wait 5 minutes for identification, check that a record appears in your CRM, verify that a Slack notification was sent (if the visit matched your alert filters). The entire setup should take under 30 minutes. If something isn't working, check the Troubleshooting section in your dashboard or reach out to support.</p>`},\"building-outreach-sequences\":{title:\"Building Outreach Sequences from Identified Visitors\",metaTitle:\"Building Outreach Sequences from Identified Visitors | LeadExtract Academy\",metaDescription:\"Turn identified website visitors into booked meetings. Learn tiered outreach strategies, messaging templates, timing, and personalisation techniques.\",moduleNumber:3,duration:\"14 min read\",content:`<h2>The Fundamental Difference: Warm vs Cold Outreach</h2><p>When you reach out to an identified visitor, you're not sending a cold email. You know they visited your website. You know which pages they viewed. You know how long they spent. This context changes everything about your messaging — timing, tone, and content.</p><p>Response rates from identified visitor outreach are typically 3–5x higher than cold outreach because the prospect is already in-market and your message is contextually relevant.</p><h2>Tiered Outreach: Match Your Effort to Their Intent</h2><p>Not every visitor deserves the same outreach effort. Segment visitors into three tiers based on their behaviour:</p><p><strong>Tier 1 — Hot (Immediate Outreach)</strong><br>Signals: Visited pricing page, viewed comparison or case study pages, returned 2+ times, spent 5+ minutes on site, or a combination. Action: Personal outreach within 2 hours. This is your highest-priority queue. The SDR should send a LinkedIn connection request and a personalised email the same day.</p><p><strong>Tier 2 — Warm (Structured Sequence)</strong><br>Signals: Visited multiple pages, ICP match, moderate time on site, single visit. Action: Enroll in a 2-week email sequence. Less urgent than Tier 1 but still high-value. These prospects are researching but haven't shown deep evaluation signals yet.</p><p><strong>Tier 3 — Cool (Nurture)</strong><br>Signals: Single page visit, brief session, partial ICP match. Action: Add to a long-term nurture campaign. Monthly value-driven emails. Revisit if they return to the site.</p><h2>Messaging Frameworks That Work</h2><p><strong>The Context-First Email (Tier 1)</strong><br>Subject: Quick question about [specific page they viewed]<br>Body: Reference the specific context — \"I noticed your team was evaluating [category/feature]\" — without being creepy. Offer something genuinely useful: a relevant case study, a quick walkthrough, or a specific data point. End with a low-friction ask: \"Worth a 15-minute call this week?\"</p><p><strong>The Value-First Sequence (Tier 2)</strong><br>Email 1 (Day 1): Share a relevant insight or resource — no ask. Email 2 (Day 3): Brief case study from a similar company. Email 3 (Day 7): Direct but low-pressure ask for a conversation. Email 4 (Day 14): Final follow-up with a different angle or resource.</p><p><strong>The Nurture Drip (Tier 3)</strong><br>Monthly emails with genuinely useful content — blog posts, industry data, benchmarks. No hard sell. The goal is to stay on their radar so when they re-engage (and LeadExtract will tell you when they do), you're a known quantity.</p><h2>Timing Matters More Than You Think</h2><p>Data consistently shows that reaching out within the first hour of a website visit yields 7x higher connection rates than waiting 24 hours. For Tier 1 visitors, speed is your competitive advantage. Set up Slack alerts for pricing page visits and have your SDR respond within minutes, not hours.</p><h2>Personalisation Without Being Creepy</h2><p>There's a line between personalised and invasive. Do reference the general area of interest: \"I saw your team was looking at our integration options.\" Don't say: \"I saw you spent 12 minutes and 34 seconds on our Salesforce integration page at 2:47pm yesterday.\" The goal is to be helpful and relevant, not to demonstrate surveillance capabilities. Frame your outreach around their likely problem, not your tracking data.</p><h2>Measuring Outreach Performance</h2><p>Track these metrics weekly: reply rate by tier (target: 15%+ for Tier 1, 8%+ for Tier 2), meetings booked per 100 identified visitors, time from identification to first outreach, and conversion rate from meeting to opportunity. If any metric drops, diagnose: is it a targeting issue (ICP filters), a messaging issue (email content), or a timing issue (speed to lead)?</p>`},\"mastering-lead-scoring-icp-filtering\":{title:\"Mastering Lead Scoring & ICP Filtering\",metaTitle:\"Mastering Lead Scoring & ICP Filtering | LeadExtract Academy\",metaDescription:\"Understand firmographic vs behavioural scoring, configure scoring tiers, and set up ICP filters so your sales team focuses on the highest-value prospects.\",moduleNumber:4,duration:\"13 min read\",content:`<h2>Why Lead Scoring Matters</h2><p>Without scoring, every identified visitor looks the same. Your SDR team wastes time on poor-fit visitors while high-intent prospects go cold. Lead scoring creates a priority queue — the most likely buyers surface first.</p><p>LeadExtract's AI-powered scoring combines two signal types: firmographic fit (who they are) and behavioural intent (what they did). Together, these predict which visitors are most likely to become customers.</p><h2>Firmographic Signals: Who Are They?</h2><p>Firmographic scoring evaluates whether a visitor matches your ideal customer profile. Key firmographic signals include:</p><p><strong>Company size</strong> — Does their company fall within your target employee range? A 50-person SaaS company and a 50,000-person enterprise have very different buying processes and deal values.</p><p><strong>Industry</strong> — Are they in a vertical you serve well? If your best customers are in FinTech and this visitor works in FinTech, that's a strong fit signal.</p><p><strong>Job title and seniority</strong> — Is this person a decision-maker or influencer? A VP of Sales is more actionable than an intern, but both might visit your pricing page.</p><p><strong>Geography</strong> — Can you actually serve them? If you're US-only, a visitor from a country you can't support shouldn't score highly.</p><p><strong>Technology stack</strong> — Do they use tools that integrate with yours? A HubSpot user scores higher if your product integrates deeply with HubSpot.</p><h2>Behavioural Signals: What Did They Do?</h2><p>Behavioural scoring evaluates how engaged the visitor was — their actions reveal intent:</p><p><strong>Pages visited</strong> — Pricing page visits are the single strongest buying signal. Integration docs, case studies, and comparison pages also indicate active evaluation. Blog posts and homepage are lower intent.</p><p><strong>Time on site</strong> — A visitor who spent 15 minutes across multiple pages is significantly more engaged than someone who bounced after 30 seconds.</p><p><strong>Return visits</strong> — A prospect who comes back multiple times is actively evaluating. Each return visit should increase their score.</p><p><strong>Session depth</strong> — Viewing 5+ pages in a single session indicates deep research. This is a strong intent signal even without a pricing page visit.</p><h2>Setting Up Your Scoring Tiers</h2><p><strong>Hot (Score 80–100)</strong><br>High firmographic fit + strong behavioural signals. Example: VP of Sales at a 200-person SaaS company who visited your pricing page twice and spent 12 minutes on site. Action: Immediate outreach within 2 hours.</p><p><strong>Warm (Score 50–79)</strong><br>Good firmographic fit + moderate behaviour, or strong behaviour + partial fit. Example: Marketing Manager at a mid-market company who read 3 blog posts and visited the features page. Action: Structured email sequence over 2 weeks.</p><p><strong>Cool (Score 20–49)</strong><br>Partial fit or low engagement. Example: Analyst at an enterprise company who visited one blog post. Action: Add to nurture campaign, revisit if they return.</p><p><strong>Cold (Score 0–19)</strong><br>Poor fit or minimal engagement. Example: Student who visited the homepage once. Action: No outreach. Marketing nurture only.</p><h2>Configuring ICP Filters</h2><p>ICP filters work alongside scoring to ensure your team's queue is clean. Think of scoring as ranking and ICP filtering as qualifying. Set your filters in LeadExtract under Settings → ICP Configuration. Start broad and narrow over time as you learn which segments convert best.</p><p>A common mistake is setting filters too narrow too early. Start with 3–4 core criteria (industry, company size, seniority, geography) and refine based on actual conversion data after 30–60 days.</p><h2>Refining Your Model Over Time</h2><p>Review your scoring model monthly. Look at which scored leads actually converted to opportunities and closed deals. If high-scoring leads aren't converting, your firmographic weights may be off. If low-scoring leads are converting, you're likely underweighting a signal. LeadExtract's AI adjusts automatically, but manual review ensures alignment with your evolving sales strategy.</p>`},\"crm-integration-and-automation\":{title:\"CRM Integration & Automation\",metaTitle:\"CRM Integration & Automation Guide | LeadExtract Academy\",metaDescription:\"Deep dive into Salesforce, HubSpot, and Pipedrive integrations. Learn how to automate lead creation, field mapping, re-engagement detection, and follow-up workflows.\",moduleNumber:5,duration:\"16 min read\",content:`<h2>Why CRM Integration Is Non-Negotiable</h2><p>Without CRM integration, visitor identification creates work instead of eliminating it. Your SDR has to manually look up each identified visitor, create a contact in the CRM, copy over their details, and log their outreach. This takes 5–10 minutes per lead. With integration, it happens automatically in seconds.</p><h2>Salesforce Integration Deep Dive</h2><p><strong>Record Creation</strong><br>LeadExtract can create new Lead records automatically when a visitor is identified. Configure which object type to use (Lead vs Contact) based on your Salesforce workflow. Most teams use Leads for new prospects and update existing Contacts when a known prospect revisits.</p><p><strong>Field Mapping</strong><br>Map LeadExtract fields to your Salesforce fields: Full Name → Lead Name, Email → Email, Company → Company, Job Title → Title, LinkedIn URL → Custom field, LeadExtract Score → Custom number field, Pages Visited → Custom text field, First Seen / Last Seen → Custom date fields. Create any custom fields in Salesforce first, then map them in LeadExtract.</p><p><strong>Duplicate Handling</strong><br>Configure how LeadExtract handles duplicates: match on email address (recommended), update existing records with new visit data, or create new records always. Matching on email prevents duplicate leads while keeping visit history current.</p><p><strong>Assignment Rules</strong><br>Use Salesforce assignment rules to route identified leads to the right rep based on territory, industry, or company size. LeadExtract respects your existing assignment logic.</p><h2>HubSpot Integration Deep Dive</h2><p><strong>Contact and Company Records</strong><br>LeadExtract creates both Contact and Company records in HubSpot. If the company already exists, the new contact is associated with it automatically.</p><p><strong>Custom Properties</strong><br>Create custom HubSpot properties for: Visitor Score (number), Pages Viewed (text), Visit Count (number), First Visit Date (date), Last Visit Date (date), and Identification Source (dropdown: \"LeadExtract\").</p><p><strong>Workflow Automation</strong><br>Build HubSpot workflows triggered by LeadExtract data. Example workflows: When Visitor Score > 80 → Enroll in \"Hot Lead\" sequence and notify rep via Slack. When Visit Count > 3 → Move lifecycle stage to \"Sales Qualified Lead.\" When Pages Viewed contains \"pricing\" → Create task for account owner.</p><p><strong>Lists and Segmentation</strong><br>Use LeadExtract properties to build smart lists: \"High-intent visitors this week,\" \"ICP matches who visited pricing,\" \"Re-engaged prospects.\" These lists power targeted email campaigns and reporting.</p><h2>Pipedrive Integration Deep Dive</h2><p><strong>Person and Organisation Records</strong><br>LeadExtract creates Person records linked to Organisation records. If you enable auto-Deal creation, a new Deal is created at a specified pipeline stage for high-scoring visitors.</p><p><strong>Activity Logging</strong><br>Each website visit is logged as an activity on the Person record, giving your rep full context before they pick up the phone.</p><h2>Re-engagement Detection</h2><p>One of the most powerful features across all CRM integrations is re-engagement detection. When an existing CRM contact revisits your website, LeadExtract updates their record with the new visit data, flags them as \"re-engaged,\" notifies the owning rep immediately, and logs the specific pages they viewed.</p><p>A prospect who went cold 3 months ago and just visited your pricing page is one of the strongest buying signals available. Re-engagement detection ensures your team never misses this.</p><h2>Automation Best Practices</h2><p><strong>Start simple.</strong> Begin with auto-contact creation and Slack alerts. Add workflow automation after you've validated the basics work.</p><p><strong>Don't over-automate outreach.</strong> Auto-creating CRM records is safe. Auto-sending emails to identified visitors without human review is risky — you want a human to verify the contact is relevant before reaching out.</p><p><strong>Clean your data regularly.</strong> Review and archive low-quality records monthly. Keep your CRM clean so reporting stays accurate.</p>`},\"measuring-roi-optimizing-match-rates\":{title:\"Measuring ROI & Optimizing Match Rates\",metaTitle:\"Measuring ROI & Optimizing Match Rates | LeadExtract Academy\",metaDescription:\"Track the metrics that matter, understand match rate drivers, and continuously improve your visitor identification and conversion performance.\",moduleNumber:6,duration:\"11 min read\",content:`<h2>The Core Metrics That Matter</h2><p>Track these metrics to understand whether visitor identification is delivering ROI:</p><p><strong>Identification Rate</strong> — What percentage of your total website visitors are being identified? Benchmark: 15–30% for person-level, 30–50% for company-level. This is your top-of-funnel metric.</p><p><strong>ICP Match Rate</strong> — Of identified visitors, what percentage match your Ideal Customer Profile? Benchmark: 20–40%. If this is low, your traffic sources may be attracting the wrong audience — a marketing problem, not an identification problem.</p><p><strong>Outreach Rate</strong> — Of ICP-matching visitors, what percentage does your team actually reach out to? Benchmark: 80%+. If this is low, your team may be overwhelmed or your alert system isn't working.</p><p><strong>Reply Rate</strong> — Of outreach sent, what percentage gets a response? Benchmark: 10–20% for Tier 1, 5–10% for Tier 2. Low reply rates indicate a messaging or timing problem.</p><p><strong>Meeting Rate</strong> — Of replies, what percentage convert to a booked meeting? Benchmark: 40–60%. This measures your team's ability to convert interest into conversations.</p><p><strong>Pipeline Contribution</strong> — How much pipeline (in revenue) has visitor identification generated? This is your ultimate ROI metric. Track it monthly.</p><h2>Calculating Your ROI</h2><p>The ROI formula is straightforward: (Pipeline Generated from Identified Visitors \\xd7 Close Rate) \\xf7 Monthly LeadExtract Cost.</p><p>Example: You identify 200 ICP visitors per month. Your team reaches out to 160. 24 reply (15% reply rate). 12 book meetings (50% meeting rate). 3 become opportunities worth $15K each = $45K pipeline. At a 25% close rate, that's $11,250 in expected revenue per month. At $165/month for LeadExtract, that's a 68x return.</p><p>Even conservative scenarios — lower match rates, lower reply rates — typically show 10–20x returns because the cost is so low relative to B2B deal values.</p><h2>What Drives Match Rates</h2><p>Understanding what affects your match rate helps you optimise it:</p><p><strong>Traffic source</strong> — LinkedIn traffic typically yields the highest match rates because visitors are logged into professional identity networks. Direct traffic (return visitors) also performs well. Organic search is moderate. Paid display is often lowest.</p><p><strong>Geographic distribution</strong> — US traffic has the highest person-level match rates. European traffic is lower due to GDPR constraints on identity graphs. APAC varies significantly by country.</p><p><strong>Visitor company size</strong> — Enterprise visitors on corporate networks are more identifiable via IP. SMB visitors on residential ISPs are identified more through identity graph matching.</p><p><strong>Device type</strong> — Desktop visitors are generally more identifiable than mobile visitors due to richer browser fingerprint data.</p><h2>How to Improve Your Match Rates</h2><p><strong>1. Drive more LinkedIn traffic.</strong> LinkedIn visitors have the highest identification rates. Increase your LinkedIn content distribution and consider LinkedIn ads for high-value pages.</p><p><strong>2. Encourage return visits.</strong> Return visitors are easier to match. Retargeting campaigns that bring prospects back to your site increase cumulative match rates.</p><p><strong>3. Focus on desktop traffic for high-intent pages.</strong> If you're running ads to your pricing page, desktop targeting will yield higher identification rates.</p><p><strong>4. Ensure the pixel loads on every page.</strong> A common issue: the pixel is installed on most pages but missing from a landing page template. Audit your pixel coverage quarterly.</p><p><strong>5. Monitor and report monthly.</strong> Match rates fluctuate with traffic patterns. Track monthly trends rather than daily snapshots. A sustained drop may indicate a technical issue or a shift in traffic composition.</p><h2>Building Your Monthly Review</h2><p>Schedule a monthly 30-minute review covering: identification rate trend, ICP match rate, outreach and reply rates, pipeline contribution, and match rate by traffic source. Use this data to refine your ICP filters, adjust your outreach strategy, and optimise your traffic sources. The teams that treat visitor identification as an ongoing system — not a set-and-forget tool — consistently see the best results.</p>`}};const SITE_URL=\"https://leadextract.io\";const css=`\n* { box-sizing: border-box; margin: 0; padding: 0; }\n.am-container { width: 100%; container-type: inline-size; }\n.am-wrap { width: 100%; background: #fff; display: flex; flex-direction: column; align-items: center; padding: 120px 24px 80px; font-family: Inter, -apple-system, sans-serif; min-height: 100vh; }\n.am-back { max-width: 740px; width: 100%; margin-bottom: 32px; }\n.am-back a { font-size: 14px; color: #888; text-decoration: none; display: inline-flex; align-items: center; gap: 6px; transition: color 0.15s; }\n.am-back a:hover { color: #111; }\n.am-article { max-width: 740px; width: 100%; }\n.am-meta { display: flex; align-items: center; gap: 12px; margin-bottom: 24px; flex-wrap: wrap; }\n.am-mod-badge { background: #7C3AED; color: #fff; border-radius: 999px; padding: 4px 14px; font-size: 11px; font-weight: 600; letter-spacing: 0.05em; text-transform: uppercase; }\n.am-duration { font-size: 13px; color: #999; }\n.am-title { font-size: 44px; font-weight: 700; color: #111; letter-spacing: -0.03em; line-height: 1.15; margin-bottom: 20px; }\n.am-author-row { display: flex; align-items: center; gap: 10px; margin-bottom: 40px; padding-bottom: 32px; border-bottom: 1px solid #E5E7EB; }\n.am-author-avatar { width: 36px; height: 36px; border-radius: 50%; background: #7C3AED; display: flex; align-items: center; justify-content: center; color: #fff; font-size: 14px; font-weight: 700; flex-shrink: 0; }\n.am-author-info { display: flex; flex-direction: column; gap: 2px; }\n.am-author-name { font-size: 14px; font-weight: 600; color: #111; }\n.am-author-role { font-size: 12px; color: #888; }\n.am-content { font-size: 17px; color: #333; line-height: 1.8; }\n.am-content h2 { font-size: 26px; font-weight: 700; color: #111; letter-spacing: -0.02em; margin: 48px 0 16px; line-height: 1.25; }\n.am-content h3 { font-size: 20px; font-weight: 600; color: #111; margin: 32px 0 12px; }\n.am-content p { margin-bottom: 20px; }\n.am-content ul, .am-content ol { margin: 0 0 20px 24px; display: flex; flex-direction: column; gap: 8px; }\n.am-content li { line-height: 1.7; }\n.am-content strong { color: #111; font-weight: 600; }\n.am-content code { background: #F5F3FF; color: #7C3AED; padding: 2px 6px; border-radius: 4px; font-size: 0.9em; }\n.am-nav-footer { max-width: 740px; width: 100%; margin-top: 64px; display: flex; justify-content: space-between; gap: 16px; }\n.am-nav-btn { flex: 1; padding: 20px 24px; background: #FAFAFA; border-radius: 16px; text-decoration: none; border: 1px solid #F0F0F0; transition: transform 0.2s, box-shadow 0.2s; }\n.am-nav-btn:hover { transform: translateY(-2px); box-shadow: 0 8px 24px rgba(0,0,0,0.06); }\n.am-nav-label { font-size: 12px; color: #999; text-transform: uppercase; letter-spacing: 0.05em; font-weight: 600; margin-bottom: 4px; }\n.am-nav-title { font-size: 15px; font-weight: 600; color: #111; }\n.am-nav-prev { text-align: left; }\n.am-nav-next { text-align: right; }\n.am-cta-box { margin-top: 64px; padding: 40px; background: #F5F3FF; border-radius: 20px; text-align: center; display: flex; flex-direction: column; align-items: center; gap: 16px; }\n.am-cta-title { font-size: 24px; font-weight: 700; color: #111; letter-spacing: -0.02em; line-height: 1.3; }\n.am-cta-sub { font-size: 16px; color: #666; line-height: 1.6; max-width: 440px; }\n.am-cta-btn { background: #7C3AED; color: #fff; border-radius: 10px; padding: 14px 28px; font-size: 15px; font-weight: 600; text-decoration: none; display: inline-block; margin-top: 4px; }\n.am-not-found { text-align: center; padding: 80px 24px; color: #999; max-width: 740px; width: 100%; }\n.am-not-found h2 { font-size: 24px; color: #111; margin-bottom: 12px; }\n@container (max-width: 640px) {\n    .am-wrap { padding: 80px 16px 60px; }\n    .am-title { font-size: 28px; }\n    .am-content { font-size: 16px; }\n    .am-content h2 { font-size: 22px; }\n    .am-cta-box { padding: 28px 20px; }\n    .am-cta-title { font-size: 20px; }\n    .am-nav-footer { flex-direction: column; }\n}\n`;const MODULE_ORDER=[\"getting-started-with-visitor-identification\",\"setting-up-leadextract\",\"building-outreach-sequences\",\"mastering-lead-scoring-icp-filtering\",\"crm-integration-and-automation\",\"measuring-roi-optimizing-match-rates\"];function getSlugFromPage(){if(typeof window===\"undefined\")return\"\";const parts=window.location.pathname.split(\"/\");if(parts.length>=3&&parts[1]===\"academy\"&&parts[2]){const pathSlug=parts[2];if(MODULES[pathSlug])return pathSlug;}const hash=window.location.hash.replace(\"#\",\"\");if(hash&&MODULES[hash])return hash;const params=new URLSearchParams(window.location.search);const qs=params.get(\"slug\");if(qs&&MODULES[qs])return qs;return\"\";}function injectSEO(mod,slug){const canonicalUrl=`${SITE_URL}/academy/${slug}`;document.title=mod.metaTitle||`${mod.title} | LeadExtract Academy`;const desc=document.querySelector('meta[name=\"description\"]')||document.createElement(\"meta\");desc.setAttribute(\"name\",\"description\");desc.setAttribute(\"content\",mod.metaDescription||\"\");if(!document.querySelector('meta[name=\"description\"]'))document.head.appendChild(desc);let canonical=document.querySelector('link[rel=\"canonical\"]');if(!canonical){canonical=document.createElement(\"link\");canonical.rel=\"canonical\";document.head.appendChild(canonical);}canonical.href=canonicalUrl;}export default function AcademyModule({calendlyUrl,previewSlug}){const firstSlug=MODULE_ORDER[0];const[slug,setSlug]=useState(previewSlug||firstSlug);useEffect(()=>{let meta=document.querySelector('meta[name=\"viewport\"]');if(!meta){meta=document.createElement(\"meta\");meta.name=\"viewport\";document.head.appendChild(meta);}meta.content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0\";},[]);useEffect(()=>{if(previewSlug&&MODULES[previewSlug]){setSlug(previewSlug);}else{const urlSlug=getSlugFromPage();if(urlSlug)setSlug(urlSlug);}},[previewSlug]);useEffect(()=>{const mod=MODULES[slug];if(mod)injectSEO(mod,slug);},[slug]);const mod=MODULES[slug];const currentIndex=MODULE_ORDER.indexOf(slug);const prevSlug=currentIndex>0?MODULE_ORDER[currentIndex-1]:null;const nextSlug=currentIndex<MODULE_ORDER.length-1?MODULE_ORDER[currentIndex+1]:null;return /*#__PURE__*/_jsxs(_Fragment,{children:[/*#__PURE__*/_jsx(\"style\",{children:css}),/*#__PURE__*/_jsx(\"div\",{className:\"am-container\",children:/*#__PURE__*/_jsxs(\"div\",{className:\"am-wrap\",children:[/*#__PURE__*/_jsx(\"div\",{className:\"am-back\",children:/*#__PURE__*/_jsx(\"a\",{href:\"/academy\",children:\"← Back to Academy\"})}),!mod?/*#__PURE__*/_jsxs(\"div\",{className:\"am-not-found\",children:[/*#__PURE__*/_jsx(\"h2\",{children:\"Module not found\"}),/*#__PURE__*/_jsxs(\"p\",{children:[\"This module doesn't exist. \",/*#__PURE__*/_jsx(\"a\",{href:\"/academy\",style:{color:\"#7C3AED\"},children:\"Browse all modules →\"})]})]}):/*#__PURE__*/_jsxs(\"article\",{className:\"am-article\",children:[/*#__PURE__*/_jsxs(\"div\",{className:\"am-meta\",children:[/*#__PURE__*/_jsxs(\"span\",{className:\"am-mod-badge\",children:[\"Module \",mod.moduleNumber]}),/*#__PURE__*/_jsx(\"span\",{className:\"am-duration\",children:mod.duration})]}),/*#__PURE__*/_jsx(\"h1\",{className:\"am-title\",children:mod.title}),/*#__PURE__*/_jsxs(\"div\",{className:\"am-author-row\",children:[/*#__PURE__*/_jsx(\"div\",{className:\"am-author-avatar\",children:\"O\"}),/*#__PURE__*/_jsxs(\"div\",{className:\"am-author-info\",children:[/*#__PURE__*/_jsx(\"span\",{className:\"am-author-name\",children:\"Omar — LeadExtract\"}),/*#__PURE__*/_jsx(\"span\",{className:\"am-author-role\",children:\"LeadExtract Academy\"})]})]}),/*#__PURE__*/_jsx(\"div\",{className:\"am-content\",dangerouslySetInnerHTML:{__html:mod.content}}),/*#__PURE__*/_jsxs(\"div\",{className:\"am-nav-footer\",children:[prevSlug?/*#__PURE__*/_jsxs(\"a\",{href:`/academy/${prevSlug}`,className:\"am-nav-btn am-nav-prev\",children:[/*#__PURE__*/_jsx(\"div\",{className:\"am-nav-label\",children:\"← Previous\"}),/*#__PURE__*/_jsx(\"div\",{className:\"am-nav-title\",children:MODULES[prevSlug].title})]}):/*#__PURE__*/_jsx(\"div\",{}),nextSlug?/*#__PURE__*/_jsxs(\"a\",{href:`/academy/${nextSlug}`,className:\"am-nav-btn am-nav-next\",children:[/*#__PURE__*/_jsx(\"div\",{className:\"am-nav-label\",children:\"Next →\"}),/*#__PURE__*/_jsx(\"div\",{className:\"am-nav-title\",children:MODULES[nextSlug].title})]}):/*#__PURE__*/_jsx(\"div\",{})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"am-cta-box\",children:[/*#__PURE__*/_jsx(\"span\",{className:\"am-cta-title\",children:\"Ready to put this into practice?\"}),/*#__PURE__*/_jsx(\"p\",{className:\"am-cta-sub\",children:\"Start identifying your anonymous website visitors today. Set up in under 10 minutes.\"}),/*#__PURE__*/_jsx(\"a\",{href:calendlyUrl,target:\"_blank\",rel:\"noopener noreferrer\",className:\"am-cta-btn\",children:\"Book a Demo\"})]})]})]})})]});}AcademyModule.defaultProps={calendlyUrl:\"https://calendly.com/omar-leadextract/1-1\",previewSlug:\"\"};addPropertyControls(AcademyModule,{calendlyUrl:{type:ControlType.String,title:\"Calendly URL\",defaultValue:\"https://calendly.com/omar-leadextract/1-1\"},previewSlug:{type:ControlType.Enum,title:\"Preview Module\",options:[\"\",...Object.keys(MODULES)],optionTitles:[\"(from URL)\",...Object.values(MODULES).map(m=>`Module ${m.moduleNumber}: ${m.title.slice(0,40)}...`)],defaultValue:\"\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"AcademyModule\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./AcademyModule.map"],"mappings":"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"}