Skip to content

Banking, insurance and financeBI, AI and ML for the business

Customer 360 and segmentation

Payments, chargebacks, support and newsletter live in four different systems. Muvia joins them customer by customer, every Monday a Python function sorts customers into segments by recency, frequency and value, with the reason, and Athena says whom to call back and prepares the list for the branches.

Illustrative scenario: it describes a typical case, not a customer project.

Every department knows one piece of the customer. Nobody sees the whole.

Cards see the payments, the back office the chargebacks, support the complaints, marketing who opens the newsletter. A valuable customer whose card was blocked and who stopped spending only shows up when four extracts are put together.

One view, up to date and with the same definitions for everyone, lets you sort customers into segments that make sense and know whom to call this week, not at the end of the quarter.

Who it's for
Marketing and CRM, the branch network and relationship managers, customer care, the bank's analysts and data scientists.
Payments from the core banking system on Oracle, chargebacks and card blocks from SQL Server, support tickets from Dynamics 365 and newsletter sign-ups from HubSpot flow into Muvia; out come segments refreshed every Monday, a dashboard of spend at risk, Athena's answers and a notebook for the branches.

In Muvia, step by step

Real product screens, recorded on a project with sample data.

1 of 5

The video · Payments, chargebacks, support and newsletter live in four different systems. Muvia joins them customer by customer, every Monday a Python function sorts customers into segments by recency, frequency and value, with the reason, and Athena says whom to call back and prepares the list for the branches.

What you get

One customer, one view
Payments, chargebacks, support and newsletter are read together, with the same definitions for marketing, branches and support.
Segments that explain themselves
Every customer has a segment and the reason next to it: the branch knows why to call.
Whom to call, this week
Segments refresh every Monday, and valuable customers who stop spending surface before they leave.
One question, a list ready to use
Athena answers with the numbers, shows the query it ran and leaves the query and the notebook for the branches in the Lab.

For the technical team

How it is built in Muvia

  1. 1

    Connect the four sources

    Databases and connectors become sources copied on a schedule, incrementally and over an encrypted connection. Every source becomes a table.

  2. 2

    Join by customer

    A query brings payments, chargebacks, tickets and newsletter together on the customer code and becomes a certified dataset: dashboards and Athena start from it.

  3. 3

    Segment every Monday in Python

    A function works out recency, frequency and value and puts each customer in one of eight segments, with the reason spelled out. A flow runs it every Monday and writes the segments to a managed table.

  4. 4

    See the spend at risk

    A dashboard shows how much the valuable customers who are slowing down spend, and what happened before the drop, such as a card block.

  5. 5

    Ask Athena whom to call back

    Whoever coordinates the branches asks, in their own words, whom to call back and why. Athena answers with the numbers, saves the query in the Lab and writes the notebook with the list. It is a module the company chooses to switch on.

Python function

SEGMENTS = {
    (1, 1, 1): "champions", (1, 1, 0): "loyal",
    (1, 0, 1): "valuable newcomers", (1, 0, 0): "newcomers",
    (0, 1, 1): "champions at risk", (0, 1, 0): "slipping",
    (0, 0, 1): "occasional big spenders", (0, 0, 0): "dormant",
}

def transform(inputs, params, ctx):
    df = inputs["rows"]
    r = (df["days_since_last"] <= params["recent_days"]).astype(int)
    f = (df["payments_12m"] >= df["payments_12m"].median()).astype(int)
    m = (df["spend_12m"] >= df["spend_12m"].quantile(0.75)).astype(int)
    out = df[["customer_code", "spend_12m", "card_blocks_90d"]].copy()
    out["segment"] = [SEGMENTS[k] for k in zip(r, f, m)]
    out["reason"] = (
        r.map({1: "recent", 0: "inactive for a while"})
        + f.map({1: ", frequent", 0: ", infrequent"})
        + m.map({1: ", high spend", 0: ", low spend"})
    )
    ctx.logger.info("customers segmented: %d", len(out))
    return {"rows": out}
Recency, frequency and value give eight segments; every Monday each customer comes out with a segment and the reason.
The data it needs
  • Payments and transactions per customer, from the core banking system on Oracle
  • Chargebacks and card blocks, from a SQL Server database
  • Support tickets and complaints, from Microsoft Dynamics 365
  • Newsletter sign-ups and opens, from HubSpot
Parts of Muvia used

Bring us a question you can't answer today.

We start from a real question your business has and walk the path from source to dashboard with your systems, not a demo dataset.