Vai al contenuto

Direzione, amministrazione ed ESGBI, AI e ML per l'azienda

Clienti B2B a rischio di abbandono

Un cliente che se ne va non lo annuncia: ordina meno spesso e spende meno. Muvia calcola ogni lunedì il rischio di ogni cliente con una funzione Python sugli ordini e manda a ogni agente la lista di chi chiamare per primo, in ordine di valore.

Scenario illustrativo: descrive un caso tipo, non il progetto di un cliente.

Quando il calo arriva nel fatturato, il cliente è già andato.

Nel B2B un cliente raramente chiude il rapporto con una telefonata. Ordina ogni sei settimane invece che ogni tre, prende meno righe, sposta una parte degli acquisti altrove. Nei totali mensili non si vede, e l'agente se ne accorge quando ormai è tardi.

Il segnale c'è già negli ordini: va calcolato per ogni cliente, confrontato con la sua storia e messo davanti a chi può fare la telefonata, ogni settimana.

Per chi
Direzione commerciale, area manager e agenti; il customer service e il controllo di gestione per il valore a rischio.
Gli ordini dal gestionale su SQL Server, clienti e agenti da Salesforce e i canali di vendita da un file Excel entrano in Muvia, dove una funzione Python calcola il rischio di ogni cliente ogni lunedì; ne escono una tabella dei punteggi, un cruscotto per agente, la lista da chiamare in PDF e un allarme.

In Muvia, passo per passo

Schermate vere del prodotto, registrate su un progetto con dati di esempio.

1 di 5

Il video · Un cliente che se ne va non lo annuncia: ordina meno spesso e spende meno. Muvia calcola ogni lunedì il rischio di ogni cliente con una funzione Python sugli ordini e manda a ogni agente la lista di chi chiamare per primo, in ordine di valore.

Cosa ottieni

Il calo si vede negli ordini
Il rischio cresce mentre il cliente rallenta, settimane prima che il fatturato del trimestre lo mostri.
Ogni agente sa chi chiamare
La lista arriva il lunedì mattina, già in ordine di valore, senza chiedere un'estrazione.
Il rischio ha un valore
Accanto al punteggio c'è il fatturato del cliente: la direzione vede quanto vale ciò che rischia di perdere e dove si concentra.
La regola è del team
Il punteggio è codice che il team legge e cambia; una nuova regola è una nuova versione della funzione, non un altro foglio.

Per il team tecnico

Come si costruisce in Muvia

  1. 1

    Collega ordini e CRM

    Gli ordini arrivano con una copia incrementale ogni notte dal database del gestionale, clienti e agenti dal connettore Salesforce. Una query li unisce sul codice cliente.

  2. 2

    Scrivi il rischio in Python

    Una funzione Python confronta, per ogni cliente, frequenza e spesa degli ultimi tre mesi con il suo ultimo anno e ne fa un punteggio. Un'esecuzione di prova su un campione non scrive nulla; Athena può scrivere una prima bozza del codice.

  3. 3

    Programmala ogni lunedì

    Un flusso esegue la funzione ogni lunedì alle 7 e scrive i punteggi in una tabella gestita, che cruscotti, notebook e allarmi leggono come qualsiasi altro dato.

  4. 4

    Mostra il rischio per agente

    Un cruscotto mette in relazione rischio e valore di ogni cliente e somma il fatturato a rischio per agente: si vede subito dove si concentra.

  5. 5

    Manda la lista all'agente

    Un notebook con i clienti da chiamare, in ordine di valore, diventa un PDF che arriva per email il lunedì mattina. Un allarme segnala il cliente che entra in fascia alta.

Funzione Python

import numpy as np
import pandas as pd

def transform(inputs, params, ctx):
    df = inputs["rows"]
    df["data_ordine"] = pd.to_datetime(df["data_ordine"])
    recenti = df["data_ordine"] > df["data_ordine"].max() - pd.Timedelta(days=90)
    quota = 90 / 365
    anno = df.groupby(["codice_cliente", "agente"], as_index=False).agg(
        ordini_anno=("numero_ordine", "nunique"), spesa_anno=("imponibile", "sum"))
    tre_mesi = df[recenti].groupby("codice_cliente", as_index=False).agg(
        ordini_90g=("numero_ordine", "nunique"), spesa_90g=("imponibile", "sum"))
    out = anno.merge(tre_mesi, on="codice_cliente", how="left").fillna(0)
    attesi = (out["ordini_anno"] * quota).replace(0, np.nan)
    out["calo_frequenza"] = (1 - out["ordini_90g"] / attesi).clip(0, 1)
    attesa = (out["spesa_anno"] * quota).replace(0, np.nan)
    out["calo_spesa"] = (1 - out["spesa_90g"] / attesa).clip(0, 1)
    peso = params["peso_frequenza"]
    out["rischio"] = (peso * out["calo_frequenza"]
                      + (1 - peso) * out["calo_spesa"]).fillna(0).round(2)
    out["fascia"] = np.where(out["rischio"] >= params["soglia"], "alta", "normale")
    return {"rows": out}
Frequenza e spesa degli ultimi tre mesi contro l'ultimo anno di ogni cliente: il punteggio pesa i due cali e la soglia decide la fascia.
I dati che servono
  • Ordini e righe per cliente degli ultimi dodici mesi dal gestionale su SQL Server
  • Clienti, agente assegnato e area da Salesforce
  • Canale (ingrosso o grande distribuzione) e condizioni, da un file Excel
Le parti di Muvia usate

Portaci una domanda a cui oggi non sai rispondere.

Partiamo da una domanda vera della tua azienda e ti mostriamo il percorso dalla fonte al cruscotto, con i tuoi sistemi e non con quelli di una demo.