[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fxTxcHz2iEVJTK2ysrGJG6OrDDOV_Ki9z5yH_vd7SgTw":3},{"slug":4,"category":5,"category_label":6,"category_color":7,"featured":8,"author":9,"hero_image":10,"reading_time":11,"title":12,"excerpt":13,"meta_title":14,"meta_desc":15,"tags":16,"products":24,"content":26,"images":27,"related_posts":28},"ai-lead-scoring-sales-core-crm","architecture","Architecture","teal",false,"Fimula","/storage/blog/heroes/ai-lead-scoring-sales-core-crm.jpg",7,"AI Lead Scoring in Sales Core: How We Built It and Why It Works","Most CRMs score leads with static rules. Sales Core uses AI to score every contact based on activity, engagement signals, and deal behavior. Here is the architecture behind it.","AI Lead Scoring in Sales Core CRM | Fimula Blog","How Sales Core implements AI-powered lead scoring with recency, frequency, pipeline, and engagement signals. Architecture decisions and implementation details for GDPR-compliant CRM lead scoring.",[17,21],{"slug":18,"name":19,"color":20},"ai-llm","AI & LLM","emerald",{"slug":22,"name":23,"color":20},"b2b-saas","B2B SaaS",[25],"sales-core","Every CRM claims to help sales teams prioritize leads. Most do it with a simple dropdown: Hot, Warm, Cold. The rep sets the value manually, and it never changes unless someone remembers to update it. That is not lead scoring. That is a label.\\\\n\\\\nSales Core's AI-powered lead scoring engine is designed to evaluate every contact against multiple signal categories and adjust scores as new activity comes in. No manual labels. No stale data. Here is the architecture, what signals matter, and why we chose this design over the alternatives.\\\\n\\\\nThe Problem with Static Lead Scoring\\\\n\\\\nStatic scoring works fine when you have 50 contacts. It collapses the moment you cross 500. Reps forget to update fields. A \"Hot\" lead from three months ago sits untouched. A prospect who opened every email and requested a quote gets the same score as someone who never responded.\\\\n\\\\nThe data is already in the CRM. The activity timeline tracks every call, email, meeting, and deal interaction. The pipeline module records deal stage progression and win/loss outcomes. The problem is that none of this data feeds back into lead prioritization automatically.\\\\n\\\\nWe needed a system that could:\\\\n\\\\n\\\\nRead activity signals from the timeline and pipeline modules\\\\nWeight different signals based on what actually correlates with closed deals\\\\nUpdate scores continuously as new data arrives\\\\nExpose scores in the contact list, pipeline view, and analytics dashboard\\\\n\\\\n\\\\nArchitecture Decisions\\\\n\\\\nWe evaluated three approaches before building the scoring engine.\\\\n\\\\nOption 1: Rule-Based Scoring\\\\n\\\\nThe simplest path. Define rules like \"if contact opened 3+ emails in last 7 days, add 10 points.\" Easy to implement, easy to debug, and every rep understands the logic. The problem: rules get brittle fast. A solar company in summer behaves differently than in winter. Rules don't adapt. You end up with 200 rules that nobody remembers, and the score becomes noise.\\\\n\\\\nOption 2: External ML Service\\\\n\\\\nSend contact data to an external machine learning API. More sophisticated, handles non-linear relationships between signals. The problem: latency, cost, and data residency. Every score update requires an API call. At scale, that is thousands of requests per minute. We host in the EU on Hetzner, and sending contact data to a third-party API outside the EU creates GDPR friction. Not worth it for a scoring feature.\\\\n\\\\nOption 3: Local AI Scoring with Model Fallback\\\\n\\\\nThis is what we chose. The scoring engine runs locally within the Sales Core application. It uses a weighted signal model by default, and tenants on the Professional and Enterprise tiers can enable an AI-enhanced mode that analyzes historical deal data to learn which signals actually predict conversions for their specific business.\\\\n\\\\nThe local approach means no external API calls, no data leaving the tenant's database, and sub-millisecond score updates. The AI enhancement runs as a background process that retrains weekly using the tenant's own closed-won and closed-lost deal data.\\\\n\\\\nThe Scoring Model\\\\n\\\\nEvery contact receives a score from 0 to 100, calculated from four signal categories.\\\\n\\\\nRecency Signals\\\\n\\\\nWhen was the last interaction? A call logged yesterday counts more than a call logged three weeks ago. Recency has a half-life decay: the weight drops by 50% every 14 days. This means a contact who was highly active last month but went silent drifts down naturally, without any manual intervention.\\\\n\\\\nFrequency Signals\\\\n\\\\nHow often does this contact interact? Five emails in two weeks signals active interest. Five emails over six months signals occasional browsing. We track interaction frequency across calls, emails, meetings, and website visits (if integrated).\\\\n\\\\nPipeline Signals\\\\n\\\\nIs there an active deal? What stage is it in? How fast has it progressed? A contact with a deal that moved from \"Qualified\" to \"Proposal\" in four days gets a boost. A deal stuck in \"Discovery\" for three weeks gets a penalty. Deal velocity is one of the strongest predictors of close probability in our data.\\\\n\\\\nEngagement Signals\\\\n\\\\nWhat is the quality of interaction? We look at email opens (not just sends), meeting attendance, proposal views, and callback requests. A contact who requests a callback and views a proposal scores higher than one who received a cold email and never opened it.\\\\n\\\\nImplementation in Sales Core\\\\n\\\\nThe scoring engine is a Laravel service class that hooks into Sales Core's existing event system. When the activity timeline records a new interaction, it dispatches an event. The scoring listener picks it up, recalculates the affected contact's score, and writes it to a dedicated lead_scores table.\\\\n\\\\nThe table stores not just the current score but a historical score timeline. This lets the analytics module show score trends over time, which is useful for identifying leads that are heating up versus ones going cold.\\\\n\\\\nScore updates are fast because we only recalculate for the specific contact that triggered the event, not the entire database. A single score computation is designed to run in milliseconds. Even large batch imports of contacts with full activity histories are processed efficiently.\\\\n\\\\nWhere Scores Appear\\\\n\\\\nLead scores are surfaced in three places within Sales Core:\\\\n\\\\n\\\\nContact list: A sortable column with color-coded badges (green for 70+, amber for 40-69, gray for under 40). Reps can sort by score and focus on the top of the list.\\\\nPipeline view: Each deal card shows the associated contact's score. If a deal has a high-value amount but the contact score is dropping, that is a signal the deal might stall.\\\\nAnalytics dashboard: Aggregate score distribution across the pipeline, average score by stage, and correlation between score ranges and win rates.\\\\n\\\\n\\\\nThe AI Enhancement for Professional and Enterprise\\\\n\\\\nThe base scoring model uses fixed weights that work well out of the box. But every business is different. A solar installation company cares about site assessments and ROI calculator usage. A construction materials supplier cares about repeat order frequency and quote request volume.\\\\n\\\\nFor tenants on the Professional and Enterprise tiers, Sales Core runs a weekly analysis of their historical deal data. It looks at which signal combinations were present in closed-won deals versus closed-lost deals, and adjusts the weights accordingly.\\\\n\\\\nThis runs entirely within the tenant's database. No data is sent externally. The retraining process takes a few minutes on a typical dataset and writes the updated weights to a configuration table. The scoring engine picks up the new weights on its next run.\\\\n\\\\nWhat We Would Do Differently\\\\n\\\\nTwo things we got wrong initially. First, we over-weighted email opens. It turns out that email opens are a weak signal because of image caching and preview panes. We reduced the email open weight by 60% after the first month of production data. Second, we didn't account for seasonality in the base model. Solar companies see massive spikes in spring. A contact who goes quiet in December is not necessarily a bad lead. We added a seasonal adjustment factor that tenants can configure.\\\\n\\\\nThe lead scoring engine in Sales Core is not a machine learning platform. It is a practical, fast, GDPR-compliant system that turns the data your sales team already generates into actionable prioritization. If you want to see it in action, check out Sales Core.\n",[],[29,46,60],{"slug":30,"category":5,"category_label":6,"category_color":7,"featured":8,"author":9,"hero_image":31,"reading_time":11,"title":32,"excerpt":33,"meta_title":34,"meta_desc":35,"tags":36,"products":44},"civic-reporting-duplicate-detection-civicreport","/storage/blog/heroes/civic-reporting-duplicate-detection-civicreport.jpg","Duplicate Detection in CivicReport: Architecture of a Municipal Deduplication Engine","When citizens report the same pothole twelve times, a municipality wastes resources investigating duplicates. CivicReport runs an automated duplicate detection system that merges reports before staff ever see them.","Duplicate Detection in CivicReport: Municipal Deduplication Architecture | Fimula Blog","How CivicReport detects duplicate municipal reports using a three-layer pipeline: spatial proximity, temporal relevance, and semantic similarity. Self-hosted, GDPR-compliant, and fully configurable.",[37,41],{"slug":38,"name":39,"color":40},"open-source","Open Source","cyan",{"slug":42,"name":43,"color":7},"self-hosting","Self-Hosting",[45],"civicreport",{"slug":47,"category":5,"category_label":6,"category_color":7,"featured":8,"author":9,"hero_image":48,"reading_time":49,"title":50,"excerpt":51,"meta_title":52,"meta_desc":53,"tags":54,"products":58},"self-hosted-ai-customer-support-ollama","/storage/blog/heroes/self-hosted-ai-customer-support-ollama.jpg",8,"Self-Hosted AI Customer Support with Ollama: Zero Per-Token Costs, Full Data Privacy","How we built dual AI engine support into our customer support platform — OpenAI for maximum accuracy, Ollama for self-hosted free processing. Full GDPR compliance.","Self-Hosted AI Customer Support with Ollama | Fimula Blog","How to run AI ticket classification with zero per-token costs using Ollama. Dual engine support with OpenAI and GDPR-compliant self-hosted AI for EU companies.",[55,56,57],{"slug":18,"name":19,"color":20},{"slug":38,"name":39,"color":40},{"slug":42,"name":43,"color":7},[59],"ai-customer-support",{"slug":61,"category":5,"category_label":6,"category_color":7,"featured":8,"author":9,"hero_image":62,"reading_time":49,"title":63,"excerpt":64,"meta_title":65,"meta_desc":66,"tags":67,"products":70},"multi-llm-ai-sales-outreach-salesagent","/storage/blog/heroes/multi-llm-ai-sales-outreach-salesagent.jpg","Why Multi-LLM Architecture Beats Single-Provider Lock-in for AI Sales Outreach","SalesAgent uses 12+ LLM providers behind a unified API layer. Here is why we built a multi-LLM architecture for AI sales outreach instead of committing to a single provider.","Multi-LLM Architecture for AI Sales Outreach | Fimula Blog","Why SalesAgent uses 12+ LLM providers behind a unified API layer for AI sales outreach. Cost optimization, GDPR compliance with Ollama, and provider resilience.",[68,69],{"slug":18,"name":19,"color":20},{"slug":22,"name":23,"color":20},[71],"salesagent"]