RFM Analysis Part 3: Visualizing
Welcome back to my series on Recency Frequency Monetary (RFM) analysis. In part 1, I shared some background about RFM analysis and showed you how to create the calculated fields in Tableau Desktop. In part 2, we addressed the limitations of building the calcs in Tableau and pushed them to the data prep phase instead. With a nice clean data set, we’re now ready to visualize our data!!
Key
Questions
We have this very rich data set, but
what do we want to know about it? What questions would we like to answer about
our donors and their activities and tendencies? Here are a few questions that
come to mind immediately:
§ Who are our
highest value donors right now?
§ How many donors
are giving frequently?
§ Which previously
loyal donors haven't given recently?
§ Who are we in
danger of losing and what would be the impact of losing them?
§ Who are new
donors we might not be aware of?
§ Which donors are
most likely to "upgrade" and become our next champions?
§ Who gives large
gifts infrequently?
§ Who gives
frequent small gifts?
There are obviously many more
questions we might ask, but I think this is a solid list that will allow us to
get started with visualizing the data.
I want to create something that
allows my users to view the entire list of donors, filter the list, sort the
list, etc. then select a donor and perform a deep dive on that donor’s giving. Finally,
I want to give my users the ability to compare that donor to other donors.
List
View
I started by building the list view.
This is largely just a table with all the key information about each donor. It
includes the RFM scores and segment as well as the key metrics that determine
those scores. It also includes a chart showing monthly donations over time. By default,
the list ranked/sorted by RFM segment, but a parameter allows you to change
that to any of the metrics and RFM score components. You can also filter on
State, Donor Type, or RFM Segment.
Profile
View
When you select a donor from the
list, you’ll be sent to the profile page, which provides details about that
donor. At the top, you’ll see basic information about the donor and the details
of each RFM score component. At the bottom, you’ll see the jitter plot
referenced in part 2, that allows you to compare the donor to all other donors,
a chart showing donations over time, a table of detailed donations, and a
fourth chart showing RFM scores over time (we’ll come back to momentarily).
Comparison
View
While the profile page allows you to
see the donor’s RFM Score in comparison to all others, this doesn’t allow
detailed comparison of the RFM components and related metrics. The comparison
view, however, provides similar jitter plots for Days Since Last Gift, Total
Gifts, Total Gift Amount, Recency Score, Frequency Score, and Monetary Score.
Something’s
Missing
After building these views, I felt
pretty good about the tool I had created. It did a decent job of answering my
key questions and allowing my users to answer lots of additional questions in
an exploratory manner. But it also felt like something was missing.
First, it feels like we’re jumping
right into detail almost immediately. I think we need some sort of overview that
provides us with some high-level metrics. This will help us to understand, from
a 10,000-foot view, how many donors we have, how much money is coming in, and
where we might have some risks.
The second problem is a bit more
complicated. The data allows me to do some amount of trending—of metrics like Total
Gifts and Total Gift Amount—but it feels like those lack important context. For
example, I might see that one of my donors had a huge spike in giving in 2020. I
could conclude that that donor has been slacking the last few years, but I’d be
missing key information. During the COVID years, donations to charitable
organizations generally surged. So that spike in giving was likely to be
observed across all of my donors. Looking at the raw donation amounts doesn’t allow
me to see the donor in the context of all other donors. But that’s exactly what
RFM is intended to do. In this scenario, it would be much more valuable for me
to look at the trending of the Monetary score instead of the raw donation
amounts.
Unfortunately, our data is only
calculating current RFM scores. What we need is point-in-time RFM
scores. We could try to make this work within Tableau, but it’ll be much easier
to do in the data prep layer. So back to the data prep!!
Remember from part 2 that our existing
data prep does the following:
1.
Read
a csv file of donations.
2.
Enrich
the data by calculating Last Gift Date, Days Since Last Gift, Total Gifts,
Total Amount.
3.
Perform
the numeric RFM Scoring 0-10.
4.
Label
each donor with descriptive “Segments” based on the scores.
5.
Output
a file containing all this information.
To get point-in-time scores,
we’ll need to modify the process to take regular snapshots of the data. My modified Python and Tableau Prep processes create
monthly snapshots (as of the end of each month). For example, let’s say we have
donations for all of 2025. I’ll create one snapshot as of January 31, 2025 that
includes all donations up to that date; then I’ll create another for February
28, 2025, including all donations from January 1 to February 28, etc. In total,
we’ll have 12 snapshots. Then, we’ll perform RFM scoring on each of these
snapshots. In the end, we’ll have monthly point-in-time RFM scores,
allowing us to perform trend analysis on the actual scores instead of the
underlying metrics.
We’ll also create one final snapshot
(as of the latest date in the data) and mark it as the “Current” snapshot. That
current snapshot will essentially be the same exact data set as we have been
using. So, any time we just need the current information, we’ll filter to the
current one only.
Overview
View
I now feel like we can provide a much
more in-depth view of this data. I started by creating an overview page that is
intended to provide that higher-level view of information. At the top are
several BANs including basic information like Total Doors, Total Gifts, etc.,
but I also added some to give us an idea of our risk profile.
$ From Top Donors tells us what
percentage of our donations come from donors with Segment, “Champions” and “Platinum”.
Currently, this is 3.5%. What that means likely differs depending on the type
of fundraising, but this number seems extremely low. I’d expect a much larger
percentage of my donations to come from my biggest donors. So, this may be an
indication that I need to work those donors a little harder. If the number were
larger, say 90%, then I’d have a completely different interpretation. This
would mean that far too much of our funds come from a very small group of
donors. Losing even one of those donors could have a huge impact on our ability
to fund our projects. In that case, I’d be working hard to maintain those
existing donors, while also working on broadening our donor base in order to reduce
our risk.
$ From At Risk Donors tells us what
percentage of our donations come from donors with Segment, “At Risk”. These are
donors who have historically given consistently and high amounts, but who haven’t
given recently. This number is 4.5% currently, which probably isn’t too bad,
but I’d still be actively talking to those donors to figure out what’s going on
and see if we can get them to re-engage. This metric gives us a directly
actionable list of donors we can contact immediately.
In addition to the BANs, we have a
chart showing a selected metric, chosen from the top right (default is Total
Donors), for each RFM segment and a related chart showing this same information
over time (using the snapshot information built earlier). The metrics available
are Total Donors, Total Amount, Total Gifts, Amount Per Donor, Gifts Per Donor,
and Median Days Since Last Gift.
Trend
View
Finally, we have a trend view, which
is similar to the Comparison view. Remember that the comparison view allows you
to compare a selected donor to all other donors for six key metrics: Days Since
Last Gift, Total Gifts, Total Gift Amount, Recency Score, Frequency Score, and
Monetary Score. The Trend view does the same thing, but shows that information
over time (using the snapshot data). This allows us to better understand the lifecycle
of the selected donor and how that compares to other donors in context.
Wrap
Up
Obviously, there’s probably a lot
more you can do with this data, but I think this gives you a really good
starting point for your analysis. If you’ve done your own RFM analysis in the past,
I’d love to hear more about what you built and what key questions you were able
to answer. Please drop a comment below.
If you want to review the workbook,
you can check it out on Tableau Public: RFM Analysis. You can also find all of my Python code
and Tableau Prep flows on Github.
Thanks so much for reading!!
Ken Flerlage, June
22, 2026
Twitter | LinkedIn | GitHub | Tableau Public
















No comments: