What Actually Happened When Those Two Teams Met Last Season
I was tracking game flow for a local blog when the Cavaliers and Pacers ran into each other, and I kept thinking there had to be a better way to map out what was going on than just throwing together a scatter plot of possessions. What I ended up building was more of a timeline document than a traditional stat sheet, and I still use it when I need to explain to readers why certain possessions felt different from what the box score suggested. Here is how I approach it, and where the method breaks down if you try to apply it without thinking about the context first. The core idea is simple. You take each quarter and break it into possession-level segments instead of relying on scoring runs, because runs hide the actual mechanism. I usually pull the play-by-play data from NBA.com or the Cleaning the Glass API, then assign each possession a label like "adj 3PT attempt," "turnover off bad screen," or "transition layup after defensive rebound." The labels matter more than the final box score because they show you which possessions actually moved the needle and which were noise.
I started doing this because I kept seeing people call games "decided by momentum" without explaining what momentum looked like in possession terms. The Pacers liked to push pace early, and the Cavaliers preferred half-court sets once they got into a rhythm. That pattern is easier to see when you have a timeline than when you just read a recap. The workflow takes me about 45 to 60 minutes per game if I am starting from raw play-by-play. First I load the CSV, then I filter out dead time, free throws, and obvious garbage possessions. Next I group the remaining possessions into ten-possession blocks to spot the shifts. Finally I write a short paragraph for each block explaining what changed, not just what happened. I use a spreadsheet for the raw data and a text file for the narrative, because trying to do both in one place makes the analysis messy. One thing that surprised me when I first tried this was how much the Pacers relied on misdirection screens in the first six possessions of each quarter. The Cavaliers countered by switching almost everything, which created a mismatch problem for Indiana that showed up in the timeline but not always in the efficiency numbers. I found this by tracking which defensive assignments the Pacers got wrong and cross-referencing it with the shot clock situation.
There are real limitations to this approach. It works best for games where both teams play at a moderate pace, because fast transition games produce too many possessions to label manually. If you have a game with over 120 total possessions, the method becomes impractical unless you have a team helping with the tagging. I also found that overtime periods are harder to analyze because the sample size drops and the noise increases. Sometimes the method fails completely, like when a team bails out of a bad game by playing irrelevant minutes. Those possessions distort the timeline and make the analysis misleading. I usually exclude them or flag them as outliers so readers do not get confused. If you want to try this yourself, start with a single quarter and fifty possessions. Tag them manually, write the paragraphs, and see if the story matches what you remember watching. If it does, you can expand to a full game. If it does not, go back and check whether your labels were too vague or whether you missed a key substitution.
Get the Full Details

The data sources I recommend are the NBA official stats page for basic possession counts, Cleaning the Glass for advanced metrics, and the NBA API for raw play-by-play. None of them are perfect, but they give you enough to work with if you are willing to clean the data yourself. I have seen people complain about the API being slow, but it usually returns data in under five seconds if you are patient. One edge case I encountered was a game where the Cavaliers intentionally fouled late, which created a bunch of free throw possessions that looked like scoring runs but were actually strategic. I solved this by tagging those possessions as "intentional foul" and excluding them from the efficiency calculation. Without that workaround, the timeline looked like the Pacers were outscoring Cleveland, which was not true. Another nuance is that not all possessions are equal. A possession ending in a turnover after a bad screen is different from a possession ending in a miss after a good shot selection. I usually weight them differently in my analysis, though I do not always communicate this to readers because it complicates the explanation. If you are new to this, start with simple tagging and move to weighted analysis once you are comfortable with the basics.
The method is not a replacement for watching the game. I still watch every possession I can, because the timeline shows you what happened but not why it happened. The why comes from film study, player tendencies, and coaching adjustments. The timeline is just a tool to organize the data so you can explain it clearly. If you run into problems with the data, like missing possessions or incorrect timestamps, check the source first. Most issues come from incomplete APIs or manual entry errors, not from the method itself. I have spent hours debugging these problems, and most of the time the fix is just re-downloading the data or adjusting the parsing logic. I do not claim this is the best way to analyze a game, but it is the way I have found most useful for explaining what actually happened to readers who want more than a box score. If you try it and find a better method, let me know. I am always looking for improvements.