import streamlit as st import urllib.request import urllib.error import time import re # ============================================ # CONFIGURAZIONE E COSTANTI # ============================================ st.set_page_config(page_title="Ticino Digital Radar 2026", page_icon="🔍", layout="wide") st.title("🔍 Ticino Digital Radar 2026") st.markdown("### Piattaforma di Analisi Strategica per il Mercato Ticinese") st.write("Moduli separati per PMI esistenti e Nuove Attività in trasferimento.") st.markdown("---") CATEGORIE = { "Edilizia e Costruzioni": ["Impresa edile generale", "Ristrutturazioni", "Idraulico", "Elettricista", "Pittore", "Falegname", "Architetto", "Geometra", "Giardiniere", "Coperture"], "Ristorazione e Turismo": ["Ristorante", "Pizzeria", "Bar", "Gelateria", "Hotel", "B&B", "Agriturismo", "Catering"], "Retail e Commercio": ["Abbigliamento", "Elettronica", "Alimentari", "Farmacia", "Libreria", "Fioraio", "Gioielleria", "Arredamento"], "Servizi B2B e Professionisti": ["Avvocato", "Commercialista", "Fiduciaria", "Consulente aziendale", "Agenzia marketing", "Agenzia immobiliare", "Assicurazioni"], "Salute e Benessere": ["Medico", "Dentista", "Fisioterapista", "Psicologo", "Palestra", "Centro estetico", "Parrucchiere", "Nutrizionista"], "Servizi Auto e Trasporti": ["Officina meccanica", "Elettrauto", "Gommista", "Carrozzeria", "Autoscuola", "Noleggio auto", "Trasporti"], "Altri Servizi": ["Pulizie", "Sicurezza", "Fotografo", "Eventi", "Lavanderia"] } DATI_MERCATO = { "Edilizia e Costruzioni": {"richieste_perse": 18, "valore_medio": 4500, "ltv": 13500, "crescita_annua": "4.2%"}, "Ristorazione e Turismo": {"richieste_perse": 45, "valore_medio": 85, "ltv": 1200, "crescita_annua": "6.8%"}, "Retail e Commercio": {"richieste_perse": 60, "valore_medio": 120, "ltv": 1800, "crescita_annua": "3.1%"}, "Servizi B2B e Professionisti": {"richieste_perse": 12, "valore_medio": 2800, "ltv": 28000, "crescita_annua": "5.5%"}, "Salute e Benessere": {"richieste_perse": 35, "valore_medio": 150, "ltv": 2400, "crescita_annua": "7.2%"}, "Servizi Auto e Trasporti": {"richieste_perse": 25, "valore_medio": 380, "ltv": 3800, "crescita_annua": "2.9%"}, "Altri Servizi": {"richieste_perse": 30, "valore_medio": 200, "ltv": 1600, "crescita_annua": "4.0%"} } STRATEGIE_SETTORE = { "Edilizia e Costruzioni": [ "Ottimizzare Google Business Profile con foto cantieri reali e zona intervento precisa.", "Creare landing page 'Pronto Intervento' ottimizzata per mobile con CTA WhatsApp.", "Registrarsi su Edilizia.ch e Preventivi.ch per intercettare lead qualificati." ], "Ristorazione e Turismo": [ "Configurare TheFork/TripAdvisor con menu digitale e foto professionali.", "Implementare sistema prenotazioni dirette sul sito per ridurre commissioni.", "Lanciare campagna Instagram geo-tagged con hashtag locali (#ticinofood)." ], "Retail e Commercio": [ "Attivare Instagram Shopping con catalogo prodotti e tag posizione negozio.", "Implementare Click & Collect semplice via form o WhatsApp Business.", "Registrarsi su Ricardo.ch e Galaxus Marketplace per visibilità e-commerce." ], "Servizi B2B e Professionisti": [ "Creare profilo LinkedIn Company con casi studio e contenuti educativi.", "Preparare Lead Magnet specifico per il mercato ticinese (es. guida fiscale).", "Partecipare a eventi UCBS/Camera di Commercio per networking B2B." ], "Salute e Benessere": [ "Ottimizzare Google Business Profile con servizi dettagliati e link prenotazioni.", "Implementare sistema prenotazioni online per ridurre no-show e chiamate.", "Registrarsi su Doctor.ch/Treatwell.ch per visibilità immediata nel settore." ], "Servizi Auto e Trasporti": [ "Creare pagina 'Preventivo Rapido' con form minimi (targa, problema, contatto).", "Attivare WhatsApp Business per preventivi veloci e conferme appuntamenti.", "Registrarsi su Garage.ch e AutoScout24.ch per lead locali qualificati." ], "Altri Servizi": [ "Creare landing page one-page con servizi, prezzi indicativi e contatti chiari.", "Ottimizzare Google Business Profile con foto lavori e recensioni iniziali.", "Registrarsi su directory generali e di nicchia del proprio settore." ] } DIRECTORY_GRATUITE = { "Generali": [ ("Google Business Profile", "https://www.google.com/business/", "Fondamentale - appare su Maps"), ("Bing Places", "https://www.bing.com/business/", "Secondo motore di ricerca"), ("Apple Maps Connect", "https://mapsconnect.apple.com/", "Per utenti iPhone"), ("Yelp Svizzera", "https://www.yelp.ch/", "Recensioni e visibilità"), ("PagineGialle.ch", "https://www.paginegialle.ch/", "Directory storica svizzera"), ("Facebook Business", "https://www.facebook.com/business/", "Pagina aziendale gratuita"), ("Instagram Business", "https://business.instagram.com/", "Profilo business gratuito"), ("LinkedIn Company", "https://www.linkedin.com/company/", "Profilo B2B essenziale") ], "Edilizia e Costruzioni": [("Edilizia.ch", "https://www.edilizia.ch/", "Settoriale edile"), ("Preventivi.ch", "https://www.preventivi.ch/", "Lead generation")], "Ristorazione e Turismo": [("TheFork", "https://www.thefork.ch/", "Prenotazioni"), ("TripAdvisor", "https://www.tripadvisor.it/", "Recensioni turismo")], "Retail e Commercio": [("Ricardo.ch", "https://www.ricardo.ch/", "Marketplace CH"), ("Galaxus", "https://www.galaxus.ch/", "E-commerce leader")], "Servizi B2B e Professionisti": [("Fiduciari.ch", "https://www.fiduciari.ch/", "Directory fiduciarie"), ("Avvocati.ch", "https://www.avvocati.ch/", "Directory legali")], "Salute e Benessere": [("Doctor.ch", "https://www.doctor.ch/", "Medici svizzeri"), ("Treatwell.ch", "https://www.treatwell.ch/", "Prenotazioni benessere")], "Servizi Auto e Trasporti": [("Garage.ch", "https://www.garage.ch/", "Officine svizzere"), ("AutoScout24.ch", "https://www.autoscout24.ch/", "Settore automotive")] } # ============================================ # INPUT UTENTE E SELEZIONE MODULO # ============================================ modulo_selezionato = st.radio( "Seleziona il modulo di analisi:", ["🏢 PMI Esistente in Ticino", "🚀 Nuova Attività / Trasferimento in Ticino"], horizontal=True, label_visibility="collapsed" ) st.subheader("📋 Dati Base") col_nome, col_cat, col_zona = st.columns([2, 1, 1]) with col_nome: nome_azienda = st.text_input("Nome Azienda / Progetto", placeholder="Es. Rossi SA o Progetto Alpha") with col_cat: macro_categoria = st.selectbox("Settore", list(CATEGORIE.keys())) categoria = st.selectbox("Tipologia", CATEGORIE[macro_categoria]) with col_zona: zona = st.selectbox("Zona", ["Seleziona...", "Luganese", "Mendrisiotto", "Locarnese", "Bellinzonese e Valli", "Tutto il Ticino"]) sito_web = st.text_input("Sito Web (opzionale)", placeholder="www.esempio.ch") st.markdown("---") # ============================================ # MODULO TRASFERIMENTO: DATI AGGIUNTIVI # ============================================ dati_trasferimento = None if modulo_selezionato == "🚀 Nuova Attività / Trasferimento in Ticino": st.info("🇭 **Modulo Ricerca Mercato: Trasferimento in Ticino**") col_t1, col_t2 = st.columns(2) with col_t1: provenienza = st.selectbox("Provenienza", ["Italia", "Altro Cantone CH", "Estero", "Già presente <1 anno"]) concorrenza_percepita = st.radio("Concorrenza locale percepita", ["Alta", "Media", "Bassa", "Non so"]) with col_t2: obiettivo_principale = st.selectbox("Obiettivo Anno 1", ["Acquisizione Clienti Rapida", "Brand Awareness", "Networking B2B", "Test di Mercato"]) dati_trasferimento = { "provenienza": provenienza, "obiettivo": obiettivo_principale, "concorrenza": concorrenza_percepita } st.markdown("---") # ============================================ # FUNZIONE ANALISI SITO WEB # ============================================ def analizza_sito(url): r = {'raggiungibile': False, 'https': False, 'mobile': False, 'veloce': False, 'title': '', 'errore': ''} if not url.startswith('http'): url = 'https://' + url try: req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'}) start = time.time() resp = urllib.request.urlopen(req, timeout=8) dur = time.time() - start r['raggiungibile'] = True r['https'] = url.startswith('https') r['veloce'] = dur < 2.5 html = resp.read().decode('utf-8', errors='ignore').lower() if 'viewport' in html: r['mobile'] = True t = re.search(r'([^<]+)', html) if t: r['title'] = t.group(1).strip()[:80] except Exception as e: r['errore'] = str(e)[:100] return r # ============================================ # ESECUZIONE ANALISI # ============================================ if st.button("🚀 Genera Report Strategico Completo", type="primary", use_container_width=True): if not nome_azienda or zona == "Seleziona...": st.error("⚠️ Inserisci Nome Azienda e Zona Operativa") else: # Analisi sito se presente dati_sito = None if sito_web and sito_web.strip(): with st.spinner(f"🔍 Analisi tecnica di {sito_web}..."): time.sleep(0.5) dati_sito = analizza_sito(sito_web) st.success(f"✅ Report generato per: **{nome_azienda}** ({categoria})") # ========================================================= # MODULO A: PMI ESISTENTE # ========================================================= if modulo_selezionato == "🏢 PMI Esistente in Ticino": st.subheader(" Audit Presenza Digitale e Perdite Economiche") # Calcolo Health Score (0-100) score = 0 max_score = 100 dettagli_score = [] # Punteggio Tecnico Sito (max 40 punti) if dati_sito: if dati_sito['raggiungibile']: score += 20 dettagli_score.append(("✅ Sito Raggiungibile", "+20")) if dati_sito['https']: score += 5 dettagli_score.append((" HTTPS Attivo", "+5")) if dati_sito['mobile']: score += 5 dettagli_score.append(("📱 Mobile Friendly", "+5")) if dati_sito['veloce']: score += 5 dettagli_score.append(("⚡ Velocità Ottimale", "+5")) if dati_sito['title']: score += 5 dettagli_score.append(("🏷️ Title SEO Presente", "+5")) else: dettagli_score.append((" Sito Non Raggiungibile", "0/20")) else: dettagli_score.append(("❌ Nessun Sito Web Rilevato", "0/40")) # Punteggio Social & Directory (max 60 punti - simulato per demo) score_social = 30 # Valore base di esempio score += score_social dettagli_score.append(("📲 Presenza Social/Base", f"+{score_social}/60")) # Visualizzazione Score col_s1, col_s2 = st.columns([1, 3]) with col_s1: st.metric("Health Score Digitale", f"{score}/100") with col_s2: st.progress(score / 100) st.caption("Composto da: Analisi Tecnica Sito (40%) + Presenza Social/Directory (60%)") # Dettaglio Analisi Google e Social st.markdown("### 🔍 Dettaglio Analisi Piattaforme") tab_google, tab_social, tab_tecnico = st.tabs(["Google & Maps", "Social Media", "Analisi Tecnica Sito"]) with tab_google: st.markdown("#### Stato Google Business Profile") if dati_sito and dati_sito['raggiungibile']: st.success("✅ Scheda GBP rilevata e collegata al sito") else: st.warning("️ Verifica manuale necessaria: Assicurati che la scheda GBP sia claimata e ottimizzata") st.info("💡 **Consiglio**: Aggiungi almeno 10 foto recenti e rispondi a tutte le recensioni negli ultimi 30 giorni.") with tab_social: st.markdown("#### Presenza Social Media") st.write("- **Facebook**: Verificare pagina attiva e orari aggiornati") st.write("- **Instagram**: Controllare bio con link diretto e highlight servizi") st.write("- **LinkedIn**: Essenziale per B2B, verificare completezza profilo company") st.warning("⚠️ Per un audit social automatico completo, collega le API delle piattaforme nella versione Pro.") with tab_tecnico: st.markdown("#### Dettagli Tecnici Sito Web") for dettaglio, punti in dettagli_score: if "+" in punti or "✅" in dettaglio: st.success(f"{dettaglio}: {punti}") else: st.error(f"{dettaglio}: {punti}") # Calcolo Perdite Economiche dati_settore = DATI_MERCATO.get(macro_categoria, DATI_MERCATO["Altri Servizi"]) fattore_efficienza = score / 100 perdita_mese = int(dati_settore["richieste_perse"] * dati_settore["valore_medio"] * (1 - fattore_efficienza)) perdita_anno = perdita_mese * 12 st.markdown("---") st.error(f""" ### 💸 Quanto Stai Perdendo Se Non Agisci Con un Health Score di **{score}/100**, stai lasciando sul tavolo circa: ## CHF {perdita_mese:,.0f} / mese ### CHF {perdita_anno:,.0f} / anno *Calcolato su richieste perse medie del settore {macro_categoria} × inefficienza digitale.* """) # Azioni di Miglioramento Concrete st.markdown("### 🛠️ Cosa Devi Fare Ora") if not dati_sito or not dati_sito['raggiungibile']: st.markdown(""" #### 🔴 Priorità Assoluta: Presenza Web Minima - Crea una landing page one-page con: servizi, contatti, mappa, pulsante WhatsApp - Costo stimato: CHF 500-800 | Tempo: 1-2 settimane - Impatto: +100% visibilità online immediata """) else: azioni_immediate = [] if not dati_sito['https']: azioni_immediate.append(("🔒 Attiva HTTPS", "Certificato SSL gratuito con hosting. +15% fiducia clienti.")) if not dati_sito['mobile']: azioni_immediate.append(("📱 Ottimizza per Mobile", "85% clienti cercano da smartphone. +60% traffico mobile.")) if not dati_sito['veloce']: azioni_immediate.append(("⚡ Velocizza il Sito", "Ottimizza immagini e caching. -50% abbandoni.")) if azioni_immediate: st.markdown("#### Azioni Immediate (0-30 giorni)") for azione, impatto in azioni_immediate: st.warning(f"**{azione}** → {impatto}") st.markdown("#### Strategie Settore (30-90 giorni)") strategie = STRATEGIE_SETTORE.get(macro_categoria, STRATEGIE_SETTORE["Altri Servizi"]) for s in strategie: st.info(f"• {s}") # Directory Essenziali st.markdown("---") st.subheader("📋 Dove Registrarti (Gratuito)") col_d1, col_d2 = st.columns(2) with col_d1: st.markdown("**Generali (Obbligatorie)**") for n, u, d in DIRECTORY_GRATUITE["Generali"]: st.write(f"🔹 [{n}]({u}) - {d}") with col_d2: dirs_spec = DIRECTORY_GRATUITE.get(macro_categoria, []) if dirs_spec: st.markdown(f"**Specifiche {macro_categoria}**") for n, u, d in dirs_spec: st.write(f"🔹 [{n}]({u}) - {d}") # ========================================================= # MODULO B: NUOVA ATTIVITÀ / TRASFERIMENTO # ========================================================= elif modulo_selezionato == "🚀 Nuova Attività / Trasferimento in Ticino" and dati_trasferimento: dt = dati_trasferimento dati_settore = DATI_MERCATO.get(macro_categoria, DATI_MERCATO["Altri Servizi"]) st.subheader(f"🇨🇭 Analisi Mercato e Opportunità: {nome_azienda}") # Quadro Situazionale st.markdown("#### 📌 Contesto Operativo") col_q1, col_q2, col_q3 = st.columns(3) with col_q1: st.metric("Provenienza", dt['provenienza']) with col_q2: st.metric("Obiettivo Anno 1", dt['obiettivo']) with col_q3: st.metric("Concorrenza Percepita", dt['concorrenza']) # Mercato Disponibile e Crescita Finanziaria st.markdown("---") st.subheader("💰 Mercato Disponibile e Potenziale di Crescita") richieste_totali_mese = dati_settore["richieste_perse"] valore_transazione = dati_settore["valore_medio"] mercato_mensile_chf = richieste_totali_mese * valore_transazione mercato_annuale_chf = mercato_mensile_chf * 12 crescita = dati_settore["crescita_annua"] col_m1, col_m2, col_m3 = st.columns(3) with col_m1: st.metric("Richieste Mensili Settore", f"{richieste_totali_mese}", "Nel tuo segmento") with col_m2: st.metric("Mercato Annuale Stimato", f"CHF {mercato_annuale_chf:,.0f}", f"Crescita: +{crescita}/anno") with col_m3: share_target = 0.15 if dt['concorrenza'] in ['Bassa', 'Media'] else 0.08 fatturato_target = int(mercato_annuale_chf * share_target) st.metric("Target Realistico Anno 1", f"CHF {fatturato_target:,.0f}", f"{int(share_target*100)}% market share") st.info(f""" **Interpretazione:** Il settore {macro_categoria} nel Ticino genera circa **CHF {mercato_annuale_chf:,.0f}/anno** in richieste non soddisfatte. Con una crescita annua del **{crescita}**, il mercato è in espansione. Un nuovo entrante ben posizionato può realisticamente catturare tra l'**8% e il 15%** di questo mercato nel primo anno. """) # Roadmap di Lancio Pulita e Migliorata st.markdown("---") st.subheader("🗺️ Roadmap di Insediamento Strategico") strategie = STRATEGIE_SETTORE.get(macro_categoria, STRATEGIE_SETTORE["Altri Servizi"]) tab_setup, tab_lancio, tab_crescita = st.tabs(["🏗️ Setup Iniziale", " Go-to-Market", "📈 Consolidamento"]) with tab_setup: st.markdown("#### ✅ Fondamenta (Settimane 1-4)") st.write("- Costituire società e aprire conto bancario svizzero") st.write("- Ottenere licenze/permessi cantonali specifici per il settore") st.write("- Creare presenza digitale minima (GBP + landing page)") st.write("- Registrarsi su directory di settore essenziali") for s in strategie[:1]: st.write(f"- {s}") with tab_lancio: st.markdown("#### Lancio sul Mercato (Settimane 5-12)") st.write("- Evento/open day di inaugurazione con invito stampa locale") st.write("- Campagna Google Ads geo-targeted sulla zona operativa") st.write("- Attivazione social media con contenuti localizzati") for s in strategie[1:]: st.write(f"- {s}") with tab_crescita: st.markdown("#### 📈 Consolidamento (Mesi 4-12)") st.write("- Sistema raccolta recensioni sistematico post-servizio") st.write("- Partnership con attività complementari non concorrenti") st.write("- Ottimizzazione campagne ads basata sui dati reali") st.write("- Espansione offerta servizi in base al feedback clienti") # Directory Essenziali st.markdown("---") st.subheader("📋 Directory Essenziali per il Tuo Settore") col_d1, col_d2 = st.columns(2) with col_d1: st.markdown("**Generali (Obbligatorie)**") for n, u, d in DIRECTORY_GRATUITE["Generali"]: st.write(f"🔹 [{n}]({u}) - {d}") with col_d2: dirs_spec = DIRECTORY_GRATUITE.get(macro_categoria, []) if dirs_spec: st.markdown(f"**Specifiche {macro_categoria}**") for n, u, d in dirs_spec: st.write(f"🔹 [{n}]({u}) - {d}") # ========================================================= # CALL TO ACTION FINALE E LEAD CAPTURE # ========================================================= st.markdown("---") st.subheader(" Sessione Strategica Gratuita con Professionista") st.markdown(""" ### Questo report è solo l'inizio. Esistono **molte altre strategie avanzate** che non possono essere automatizzate in un report standard: - **SEO Tecnica Avanzata**: Schema markup complessi, Core Web Vitals optimization, link building locale - **Content Marketing Strategico**: Piano editoriale geo-targeted, lead magnet ad alta conversione - **Funnel di Vendita Digitali**: Automazione nurturing, retargeting dinamico, email sequence - **Analisi Competitor Approfondita**: Reverse engineering delle strategie dei top player del settore - **Ottimizzazione Conversion Rate**: A/B testing landing page, heatmap analysis, user journey mapping **Queste tecniche le analizzeremo insieme durante una sessione gratuita di 30 minuti con un professionista strategico.** """) st.info("👉 **Prenota ora la tua call gratuita** e ricevi un piano d'azione personalizzato basato su dati reali del tuo business.") c_a, c_b = st.columns(2) with c_a: n_contatto = st.text_input("Nome Referente") e_contatto = st.text_input("Email Contatto") with c_b: tel_contatto = st.text_input("Telefono") if st.button("📅 Prenota Sessione Strategica Gratuita", type="primary", use_container_width=True): if n_contatto and e_contatto: st.balloons() st.success(f"Grazie {n_contatto}! Ti contatteremo entro 24h a {e_contatto} per fissare la call") else: st.error("Compila almeno Nome ed Email") st.caption("Ticino Digital Radar 2026 | Analisi generata automaticamente")