Fran Sola | Conectá con quien sos

Si mis videos te incomodaron Si mis videos te hicieron reflexionar esperá a ver mi Introducción Gratuita a Un Curso de Milagros

Si sentís que tu vida “funciona” pero algo por dentro no tiene sentido, esta página es para vos. No busco likes, busco gente lista para romper su piloto automático.

Soy Fran Sola. Grabé un video corto y una clase completa para dos tipos de personas:

max-width: 100%; margin: 0; box-sizing: border-box; } #ff-form-${FORM_CSS_ID} * { box-sizing: border-box; } #ff-form-${FORM_CSS_ID} .ff-card { background: ${STYLES.cardBg}; border-radius: ${STYLES.radiusLg}; padding: 24px; border: 1px solid ${STYLES.border}; } #ff-form-${FORM_CSS_ID} .ff-progress { display: flex; justify-content: space-between; align-items: center; font-size: 14px; margin-bottom: 16px; padding-bottom: 16px; border-bottom: 1px solid ${STYLES.border}; } #ff-form-${FORM_CSS_ID} .ff-progress-bar { width: 160px; height: 8px; background: ${STYLES.inputBg}; border-radius: 4px; overflow: hidden; } #ff-form-${FORM_CSS_ID} .ff-progress-fill { height: 100%; background: ${STYLES.primary}; transition: width 0.3s ease; } #ff-form-${FORM_CSS_ID} .ff-title { font-size: 24px; font-weight: bold; margin: 0 0 8px 0; color: ${STYLES.text}; } #ff-form-${FORM_CSS_ID} .ff-desc { color: ${STYLES.textSecondary}; margin: 0 0 16px 0; } #ff-form-${FORM_CSS_ID} .ff-options { display: flex; flex-direction: column; gap: 12px; margin-bottom: 24px; } #ff-form-${FORM_CSS_ID} .ff-option { width: 100%; padding: 12px 20px; border-radius: ${STYLES.radiusSm}; border: 2px solid ${STYLES.border}; background: ${STYLES.bg}; color: ${STYLES.text}; text-align: left; cursor: pointer; font-size: 16px; font-family: inherit; transition: all 0.2s ease; } #ff-form-${FORM_CSS_ID} .ff-option:hover { border-color: ${STYLES.primary}; background: ${STYLES.inputBg}; } #ff-form-${FORM_CSS_ID} .ff-option.selected { border-color: ${STYLES.primary}; background: ${STYLES.primary}; color: #ffffff; font-weight: 600; transform: scale(1.02); } #ff-form-${FORM_CSS_ID} .ff-input { width: 100%; padding: 16px; border-radius: ${STYLES.radiusSm}; border: 2px solid ${STYLES.border}; background: ${STYLES.inputBg}; color: ${STYLES.text}; font-size: 18px; font-family: inherit; margin-bottom: 0; } #ff-form-${FORM_CSS_ID} .ff-input:focus { outline: none; border-color: ${STYLES.primary}; } #ff-form-${FORM_CSS_ID} .ff-textarea { min-height: 120px; resize: vertical; } #ff-form-${FORM_CSS_ID} .ff-input-wrap { margin-bottom: 24px; } #ff-form-${FORM_CSS_ID} .ff-error { display: none; color: #ef4444; font-size: 14px; margin-top: 8px; } #ff-form-${FORM_CSS_ID} .ff-nav { display: flex; justify-content: space-between; gap: 16px; } #ff-form-${FORM_CSS_ID} .ff-btn { display: flex; align-items: center; gap: 8px; padding: 10px 20px; border-radius: ${STYLES.radiusSm}; font-size: 16px; font-family: inherit; cursor: pointer; transition: all 0.2s ease; border: none; } #ff-form-${FORM_CSS_ID} .ff-btn-prev { background: transparent; color: ${STYLES.textSecondary}; border: 2px solid ${STYLES.border}; } #ff-form-${FORM_CSS_ID} .ff-btn-prev:hover:not(:disabled) { border-color: ${STYLES.borderHover}; color: ${STYLES.text}; } #ff-form-${FORM_CSS_ID} .ff-btn-next { background: ${STYLES.primary}; color: #ffffff; font-weight: 600; box-shadow: 0 0 20px ${STYLES.primary}66; } #ff-form-${FORM_CSS_ID} .ff-btn-next:hover:not(:disabled) { background: ${STYLES.primaryHover}; transform: translateY(-2px); box-shadow: 0 0 30px ${STYLES.primary}99; } #ff-form-${FORM_CSS_ID} .ff-btn:disabled { opacity: 0.5; cursor: not-allowed; } #ff-form-${FORM_CSS_ID} .ff-success { text-align: center; padding: 40px 20px; } #ff-form-${FORM_CSS_ID} .ff-success-icon { width: 80px; height: 80px; background: ${STYLES.primary}22; border-radius: 50%; display: flex; align-items: center; justify-content: center; margin: 0 auto 24px; } #ff-form-${FORM_CSS_ID} .ff-success-icon svg { width: 40px; height: 40px; color: ${STYLES.primary}; } #ff-form-${FORM_CSS_ID} .ff-success h2 { font-size: 28px; font-weight: bold; margin: 0 0 16px 0; } #ff-form-${FORM_CSS_ID} .ff-success-btn { display: inline-flex; align-items: center; gap: 8px; padding: 16px 32px; background: ${STYLES.primary}; color: #ffffff; font-size: 18px; font-weight: 600; border: none; border-radius: ${STYLES.radiusSm}; cursor: pointer; margin-top: 24px; transition: all 0.2s ease; } #ff-form-${FORM_CSS_ID} .ff-success-btn:hover { background: ${STYLES.primaryHover}; transform: translateY(-2px); } @keyframes ff-fade-in { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } #ff-form-${FORM_CSS_ID} .ff-animate { animation: ff-fade-in 0.3s ease-out; } @media (max-width: 640px) { #ff-form-${FORM_CSS_ID} { padding: 0; max-width: 100%; margin: 0; } #ff-form-${FORM_CSS_ID} .ff-card { padding: 20px; border-radius: 18px; } #ff-form-${FORM_CSS_ID} .ff-title { font-size: 1.3rem; } #ff-form-${FORM_CSS_ID} .ff-desc { font-size: 0.95rem; } #ff-form-${FORM_CSS_ID} .ff-progress-bar { width: 100px; } #ff-form-${FORM_CSS_ID} .ff-option { padding: 14px 16px; font-size: 0.95rem; } #ff-form-${FORM_CSS_ID} .ff-input { padding: 14px; font-size: 1rem; } #ff-form-${FORM_CSS_ID} .ff-btn { padding: 12px 18px; font-size: 0.95rem; } #ff-form-${FORM_CSS_ID} .ff-success h2 { font-size: 1.2rem; } #ff-form-${FORM_CSS_ID} .ff-success-btn { padding: 14px 24px; font-size: 1rem; } } `; document.head.appendChild(styleEl); // Tracking functions function initTracking() { if (TRACKING.googleAnalyticsId) { const script = document.createElement('script'); script.async = true; script.src = 'https://www.googletagmanager.com/gtag/js?id=' + TRACKING.googleAnalyticsId; document.head.appendChild(script); window.dataLayer = window.dataLayer || []; window.gtag = function() { dataLayer.push(arguments); }; gtag('js', new Date()); gtag('config', TRACKING.googleAnalyticsId); } if (TRACKING.googleTagManagerId) { (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer',TRACKING.googleTagManagerId); } if (TRACKING.facebookPixelId) { !function(f,b,e,v,n,t,s) {if(f.fbq)return;n=f.fbq=function(){n.callMethod? n.callMethod.apply(n,arguments):n.queue.push(arguments)}; if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; n.queue=[];t=b.createElement(e);t.async=!0; t.src=v;s=b.getElementsByTagName(e)[0]; s.parentNode.insertBefore(t,s)}(window, document,'script', 'https://connect.facebook.net/en_US/fbevents.js'); fbq('init', TRACKING.facebookPixelId); } } function trackEvent(eventName, params) { if (TRACKING.googleAnalyticsId && window.gtag) { gtag('event', eventName, params); } if (TRACKING.googleTagManagerId && window.dataLayer) { dataLayer.push({ event: eventName, ...params }); } if (TRACKING.facebookPixelId && window.fbq) { fbq('trackCustom', eventName, params); } } // Send Lead event to Meta Pixel (always fires if fbq exists, even without config) function trackLeadEvent(email) { if (window.fbq) { var params = email ? { email: email } : {}; fbq('track', 'Lead', params); console.log('[Tracking] Lead event sent to Meta Pixel', params); } } // Generate session ID for tracking var sessionId = 'embed_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9); // Save event to database function saveEventToDb(eventType, stepNumber) { try { fetch(SUPABASE_URL + '/rest/v1/form_events', { method: 'POST', headers: { 'Content-Type': 'application/json', 'apikey': SUPABASE_KEY, 'Authorization': 'Bearer ' + SUPABASE_KEY, 'Prefer': 'return=minimal' }, body: JSON.stringify({ form_id: FORM_ID, event_type: eventType, step_number: stepNumber || null, session_id: sessionId, form_version: 1 }) }); } catch (e) { console.error('[FormFlow] Error saving event:', e); } } // Initialize tracking initTracking(); trackEvent('Form_Load', { form_id: FORM_ID, form_name: FORM_NAME }); saveEventToDb('form_load'); // Render functions function render() { if (currentStep >= QUESTIONS.length) { renderSuccess(); return; } renderQuestion(); } function renderQuestion() { const q = QUESTIONS[currentStep]; const progress = ((currentStep + 1) / QUESTIONS.length) * 100; const isLast = currentStep === QUESTIONS.length - 1; const isMultipleChoice = q.type === 'multiple-choice'; let optionsHtml = ''; if (isMultipleChoice && q.options) { optionsHtml = '

' + q.options.map(opt => { const selected = responses[q.id]?.answer === opt.label ? 'selected' : ''; return ''; }).join('') + '
'; } else if (q.type === 'long-text') { const val = textInputs[q.id] || ''; optionsHtml = ''; } else { const placeholder = q.type === 'email' ? T.emailPlaceholder : q.type === 'lead-capture' && q.leadCaptureType === 'instagram' ? T.instagramPlaceholder : q.type === 'lead-capture' && q.leadCaptureType === 'whatsapp' ? T.whatsappPlaceholder : T.yourAnswer; const inputType = q.type === 'email' || (q.type === 'lead-capture' && q.leadCaptureType === 'email') ? 'email' : (q.type === 'lead-capture' && q.leadCaptureType === 'whatsapp') ? 'tel' : 'text'; const inputMode = (q.type === 'lead-capture' && q.leadCaptureType === 'whatsapp') ? ' inputmode="tel"' : ''; const val = textInputs[q.id] || ''; optionsHtml = '
'; } // Show nav buttons (hide next for last multiple choice question - auto submit on click) const showNav = !(isLast && isMultipleChoice); const navHtml = showNav ? '
' + '' + '' + '
' : (currentStep > 0 ? '
' : ''); container.innerHTML = '
' + '
' + '' + T.step + ' ' + (currentStep + 1) + ' ' + T.of + ' ' + QUESTIONS.length + '' + '
' + '
' + '

' + escapeHtml(q.title) + '

' + (q.description ? '

' + escapeHtml(q.description) + '

' : '') + optionsHtml + navHtml + '
'; // Track step trackEvent('Form_Step', { form_id: FORM_ID, step: currentStep + 1, total_steps: QUESTIONS.length, question: q.title }); saveEventToDb('step_view', currentStep + 1); // Bind events bindEvents(); } function renderSuccess() { const checkIcon = ''; let ctaHtml = ''; let ctaUrl = ''; if (SUCCESS_CONFIG.redirectType === 'whatsapp' && SUCCESS_CONFIG.whatsappNumber) { // Build message: custom message + optional responses let finalMessage = SUCCESS_CONFIG.whatsappMessage || formatWhatsAppMessage(); if (SUCCESS_CONFIG.whatsappMessage && SUCCESS_CONFIG.includeResponsesInWhatsapp) { finalMessage += formatResponsesList(); } const msg = encodeURIComponent(finalMessage); const num = SUCCESS_CONFIG.whatsappNumber.replace(/\D/g, ''); ctaUrl = 'https://wa.me/' + num + '?text=' + msg; // Use button with onclick to handle iframe context - wa.me blocks iframe embeds ctaHtml = ''; } else if (SUCCESS_CONFIG.redirectUrl) { ctaUrl = SUCCESS_CONFIG.redirectUrl; ctaHtml = ''; } container.innerHTML = '
' + '
' + '
' + checkIcon + '
' + '

' + escapeHtml(SUCCESS_CONFIG.successMessage) + '

' + ctaHtml + '
'; // Track finish const totalScore = Object.values(responses).reduce((sum, r) => sum + (r.score || 0), 0); trackEvent('Form_Finish', { form_id: FORM_ID, form_name: FORM_NAME, total_score: totalScore }); saveEventToDb('form_submit'); // Track CTA click and handle navigation (works in iframe context) const ctaBtn = container.querySelector('.ff-success-btn'); if (ctaBtn) { ctaBtn.addEventListener('click', function() { trackEvent('Form_ClickCTA', { form_id: FORM_ID, cta_type: SUCCESS_CONFIG.redirectType }); const url = this.dataset.url; if (url) { // Use window.open with _blank to escape iframe context // This works better than target="_blank" on anchors inside iframes // For wa.me links especially, we need to open in a new tab/window try { const newWindow = window.open(url, '_blank', 'noopener,noreferrer'); if (!newWindow || newWindow.closed || typeof newWindow.closed === 'undefined') { // Popup was blocked, try top-level redirect as fallback if (window.top) { window.top.location.href = url; } else { window.location.href = url; } } } catch (e) { // Cross-origin restriction, fallback to current window redirect window.location.href = url; } } }); } // Submit to backend submitToBackend(); } function formatWhatsAppMessage() { let msg = '📋 Respuestas del formulario:\n\n'; QUESTIONS.forEach(q => { const r = responses[q.id]; if (r) { msg += '• ' + q.title + ': ' + r.answer + '\n'; } }); return msg; } function formatResponsesList() { let msg = '\n\n📋 *Respuestas:*\n'; QUESTIONS.forEach(q => { const r = responses[q.id]; if (r) { msg += '• ' + q.title + ': ' + r.answer + '\n'; } }); return msg; } async function submitToBackend() { const responsesArray = Object.values(responses); const totalScore = responsesArray.reduce((sum, r) => sum + (r.score || 0), 0); // Get UTM data const params = new URLSearchParams(window.location.search); const utmData = {}; ['utm_source', 'utm_medium', 'utm_campaign', 'utm_content', 'utm_term'].forEach(key => { if (params.get(key)) utmData[key] = params.get(key); }); // Get lead identifier let leadId = ''; QUESTIONS.forEach(q => { if ((q.type === 'email' || q.type === 'lead-capture') && responses[q.id]) { leadId = responses[q.id].answer; } }); try { await fetch(SUPABASE_URL + '/functions/v1/submit-form', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + SUPABASE_KEY }, body: JSON.stringify({ formId: FORM_ID, responses: responsesArray, totalScore: totalScore, leadIdentifier: leadId, utmData: Object.keys(utmData).length > 0 ? utmData : null, deviceInfo: { userAgent: navigator.userAgent, language: navigator.language } }) }); } catch (e) { console.error('Form submit error:', e); } } function bindEvents() { const q = QUESTIONS[currentStep]; const isLast = currentStep === QUESTIONS.length - 1; // Multiple choice container.querySelectorAll('.ff-option').forEach(btn => { btn.addEventListener('click', function() { const label = this.dataset.label; const score = parseInt(this.dataset.score) || 0; responses[q.id] = { questionId: q.id, answer: label, score: score }; // Update UI container.querySelectorAll('.ff-option').forEach(o => o.classList.remove('selected')); this.classList.add('selected'); // Auto advance after short delay setTimeout(() => { if (isLast) { currentStep++; render(); } else { currentStep++; render(); } }, 200); }); }); // Text inputs const input = container.querySelector('.ff-input'); if (input) { input.addEventListener('input', function() { textInputs[q.id] = this.value; }); input.addEventListener('keypress', function(e) { if (e.key === 'Enter' && !e.shiftKey && this.tagName !== 'TEXTAREA') { e.preventDefault(); handleNext(); } }); } // Navigation const prevBtn = container.querySelector('.ff-btn-prev'); const nextBtn = container.querySelector('.ff-btn-next'); if (prevBtn) { prevBtn.addEventListener('click', () => { if (currentStep > 0) { currentStep--; render(); } }); } if (nextBtn) { nextBtn.addEventListener('click', handleNext); } } function validateEmail(email) { return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email.trim()); } function validatePhone(phone) { var clean = phone.replace(/[\s\-\(\)\+]/g, ''); return /^\d{8,15}$/.test(clean); } function getValidationError(val, type, leadCaptureType) { if (!val.trim()) return null; if (type === 'email') return validateEmail(val) ? null : (T.invalidEmail || 'Ingresa un email válido'); if (type === 'lead-capture') { if (leadCaptureType === 'email') return validateEmail(val) ? null : (T.invalidEmail || 'Ingresa un email válido'); if (leadCaptureType === 'whatsapp') return validatePhone(val) ? null : (T.invalidPhone || 'Ingresa un número de teléfono válido'); } return null; } function handleNext() { const q = QUESTIONS[currentStep]; // Save text response if (['short-text', 'long-text', 'email', 'lead-capture'].includes(q.type)) { const val = textInputs[q.id] || ''; // Validate format var error = getValidationError(val, q.type, q.leadCaptureType); var errorEl = container.querySelector('.ff-error'); if (error) { if (errorEl) { errorEl.textContent = error; errorEl.style.display = 'block'; } return; } else if (errorEl) { errorEl.style.display = 'none'; } if (val.trim()) { responses[q.id] = { questionId: q.id, answer: val.trim(), score: 10 }; // Send Lead event to Meta Pixel when email is captured var isEmailField = q.type === 'email' || (q.type === 'lead-capture' && q.leadCaptureType === 'email'); if (isEmailField) { trackLeadEvent(val.trim()); } } else if (q.required) { return; // Don't advance if required and empty } } // Check if can proceed if (q.required && !responses[q.id]) { return; } currentStep++; render(); } function escapeHtml(str) { if (!str) return ''; return String(str).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"'); }

Soy Fran Sola. Grabé un video corto y una clase completa para dos tipos de personas:

— las que viven esa mezcla rara de éxito visible y vacío interno…

— y las que escucharon hablar de Un Curso de Milagros, lo abrieron, leyeron un rato y no entendieron nada.

Si estás en crisis existencial, te sentís sin propósito y sabés que no podés seguir en automático, quedate. No vengo a prometerte que “el universo te manda todo lo que quieras” si repetís una frase frente al espejo.

Vengo a incomodarte, a pensar distinto y a darte un mapa simple para dos cosas: entender qué te está pasando por dentro y empezar a vivir lo que Un Curso de Milagros dice, aunque hasta hoy te haya parecido imposible de comprender.