Vai al contenuto

Retail e beni di consumoBI, AI e ML per l'azienda

Campagne misurate contro l'atteso

Durante una campagna le vendite salgono, ma una parte sarebbe arrivata comunque. In Muvia una funzione Python confronta ora per ora ordini e ricavi con una settimana tipo senza campagne, e ogni canale mostra il suo effetto netto e quando ripaga la spesa.

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

Le vendite salgono durante la campagna. Quanto sarebbero salite comunque?

Ogni piattaforma pubblicitaria dichiara le sue conversioni, e sommandole si ottiene più del fatturato. Il confronto con la settimana prima non aiuta: c'è la stagione, c'è Ferragosto, ci sono due campagne che si sovrappongono. Così il budget si divide per abitudine.

Per sapere cosa rende una campagna serve una base: quanto avrebbe venduto il negozio in quelle stesse ore senza campagne. Solo la differenza, tolti la spesa e i resi, dice se un canale ripaga.

Per chi
Marketing e direzione commerciale, responsabili e-commerce, controllo di gestione.
La spesa delle campagne da un'API REST, ordini e ricavi del negozio online dal database su PostgreSQL e il calendario delle campagne da Google Sheets entrano in Muvia, dove una funzione Python calcola ogni mattina gli ordini attesi senza campagne; ne escono la tabella dell'effetto netto, un'analisi delle campagne allineate sul lancio, il saldo di ogni campagna e le risposte di Athena.

In Muvia, passo per passo

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

1 di 5

Il video · Durante una campagna le vendite salgono, ma una parte sarebbe arrivata comunque. In Muvia una funzione Python confronta ora per ora ordini e ricavi con una settimana tipo senza campagne, e ogni canale mostra il suo effetto netto e quando ripaga la spesa.

Cosa ottieni

L'effetto netto, non le conversioni dichiarate
Ogni campagna è misurata contro quello che il negozio avrebbe venduto comunque.
Canali confrontabili
Email, social, ricerca e TV stanno sulla stessa scala, allineati sul momento del lancio.
Si sa quando rientra la spesa
Il saldo ora per ora dice se e quando una campagna ripaga, resi compresi.
Il budget segue i numeri
Ogni mattina il bilancio si aggiorna, e la decisione su cosa tagliare parte dagli stessi dati per tutti.

Per il team tecnico

Come si costruisce in Muvia

  1. 1

    Metti spesa e ordini sulla stessa ora

    Le sorgenti portano la spesa per campagna, gli ordini del negozio e il calendario; una query li allinea ora per ora in un dataset.

  2. 2

    Calcola la base in Python

    Una funzione Python costruisce per ogni ora la settimana tipo senza campagne, dalle ore pulite e corretta per stagione e ferie. Lo scarto tra reale e atteso è l'effetto della campagna; margine e giorni dei resi sono parametri.

  3. 3

    Programma il ricalcolo

    Un flusso la esegue ogni mattina e scrive in tabelle gestite l'effetto ora per ora e il bilancio di ogni campagna: spesa, ordini in più, margine in più e giorni per rientrare.

  4. 4

    Allinea le campagne in Analisi

    La vista Strati sovrappone le campagne sul momento del lancio: si vede quale canale risponde in poche ore e quale resta piatto. Il saldo dal lancio mostra quando ciascuna ripaga la spesa.

  5. 5

    Chiedi ad Athena cosa tagliare

    Athena legge il bilancio delle campagne, salva la classifica nel Laboratorio e scrive in un notebook quale campagna tagliare e quale raddoppiare.

Funzione Python

import numpy as np
import pandas as pd

def transform(inputs, params, ctx):
    d = inputs["rows"].copy()
    d["ora"] = pd.to_datetime(d["ora"], utc=True).dt.tz_convert("Europe/Rome")
    d["ora_settimana"] = d["ora"].dt.weekday * 24 + d["ora"].dt.hour
    pulite = d["campagna"].isna()
    # la settimana tipo: la media di ogni ora della settimana nelle ore senza campagne
    tipo = d[pulite].groupby("ora_settimana")["ordini"].mean()
    d["ordini_attesi"] = d["ora_settimana"].map(tipo)
    d["ordini_in_piu"] = np.where(pulite, 0.0, d["ordini"] - d["ordini_attesi"])
    carrello = d["ricavi"].sum() / d["ordini"].sum()
    margine = d["ordini_in_piu"] * carrello * params["margine_lordo_pct"] / 100
    d["saldo_campagna"] = (margine - d["spesa"]).groupby(d["campagna"]).cumsum()
    colonne = ["ora", "campagna", "ordini", "ordini_attesi", "ordini_in_piu", "saldo_campagna"]
    return {"rows": d[colonne]}
Una versione ridotta: gli ordini attesi da una settimana tipo senza campagne, lo scarto e il saldo di ogni campagna.
I dati che servono
  • Spesa oraria per campagna e canale (email, social, ricerca, TV), letta da un'API REST
  • Sessioni, ordini, ricavi e resi del negozio online, ora per ora, dal database su PostgreSQL
  • Calendario delle campagne con canale, inizio e fine, da Google Sheets
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.