Motion and Shifts as Weapons

Why NFL offenses now move someone before most snaps, what each kind of motion is for, and how to read the defense’s answer before the ball is snapped.

Show the Python (shared drawing helpers for this chapter)
import logging
import os
import shutil
import textwrap

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.patches import Circle, Ellipse, FancyArrowPatch, FancyBboxPatch, Rectangle, RegularPolygon, Patch
from matplotlib.lines import Line2D
from IPython.display import HTML, display

from gridiron import Play, Player, routes as r, style
from gridiron.animate import animate
from gridiron.play import MARKER_R

logging.getLogger("matplotlib.font_manager").setLevel(logging.ERROR)
style.apply()
PDF = os.environ.get("RTG_FORMAT", "").lower() in ("pdf", "typst", "print")


# ---------------------------------------------------------------- building plays by hand
def O(key, pos, d, w, label=None):
    return Player(key, pos, "off", d, w, label=label)


def D(key, pos, d, w, label=None):
    return Player(key, pos, "def", d, w, label=label)


def line(d=-0.7):
    """The five offensive linemen (only the center labelled)."""
    return [O(k, k, d, w, label="C" if k == "C" else "") for k, w in
            (("LT", -3.2), ("LG", -1.6), ("C", 0.0), ("RG", 1.6), ("RT", 3.2))]


def gun_2x1_te(z_w=15.0):
    """11 personnel from the gun: X on the line to the left, H in the left slot, the tight end (Y)
    attached on the right and Z a step off the ball outside him. Seven on the line (five linemen, X
    and Y), so Z, H, the back and the quarterback are backfield players: any one of them may go in motion."""
    return line() + [O("QB", "QB", -5.0, 0.0, "Q"), O("RB", "RB", -5.0, -1.6, "R"),
                     O("X", "WR", -0.7, -15.0, "X"), O("H", "WR", -1.5, -9.0, "H"),
                     O("Y", "TE", -0.7, 4.8, "Y"), O("Z", "WR", -1.5, z_w, "Z")]


def gun_2x2_spread():
    """11 personnel 2x2 with the tight end flexed into the right slot; X and Z on the line."""
    return line() + [O("QB", "QB", -5.0, 0.0, "Q"), O("RB", "RB", -5.0, -1.6, "R"),
                     O("X", "WR", -0.7, -15.0, "X"), O("H", "WR", -1.5, -9.0, "H"),
                     O("Y", "TE", -1.5, 9.0, "Y"), O("Z", "WR", -0.7, 15.0, "Z")]


def under_wing():
    """Under center: tight end on the right, a wingback (H) just outside and behind him, a tailback."""
    return line() + [O("QB", "QB", -1.9, 0.0, "Q"), O("RB", "RB", -7.0, 0.0, "R"),
                     O("X", "WR", -0.7, -15.0, "X"), O("Y", "TE", -0.7, 4.8, "Y"),
                     O("H", "WR", -1.6, 6.4, "H"), O("Z", "WR", -1.5, 15.0, "Z")]


def front4(sde=4.3):
    """A four-man front against a tight end on the right (the end on that side outside the tackle)."""
    return [D("WDE", "DE", 1.0, -5.0, "E"), D("WDT", "DT", 1.0, -0.7, "T"),
            D("SDT", "DT", 1.0, 2.35, "T"), D("SDE", "DE", 1.0, sde, "E")]


def dashed_motion(p, key, to, head=0.5):
    """Pre-snap movement to the spot `to` (absolute d, w), drawn dashed with a short solid head.
    (gridiron draws the last part of a path's final segment solid, so one long segment would
    look like a route.)"""
    d0, w0 = p._cur(key)
    dd, dw = to[0] - d0, to[1] - w0
    f = max(0.0, 1 - head / float(np.hypot(dd, dw)))
    p.motion(key, pts=[(dd * f, dw * f), (dd, dw)])


def schedule(p, plan):
    """Re-time pre-snap movement. plan = {key: (t_start, t_end)} in seconds from the snap.
    gridiron ends every pre-snap motion exactly at the snap and starts it whenever its length and
    speed require, so two players who should move together drift apart. This stretches each listed
    player's pre-snap path into his window (and holds him still until the snap if it ends early).
    Implemented here rather than in gridiron; call it after every action has been added."""
    kf, t0, t1 = p._compile()
    for key, (a, b) in plan.items():
        arr = kf[key]
        pre, post = arr[arr[:, 0] <= 1e-9], arr[arr[:, 0] > 1e-9]
        T0, T1 = pre[0, 0], pre[-1, 0]
        new = pre.copy()
        new[:, 0] = a + (pre[:, 0] - T0) / ((T1 - T0) or 1.0) * (b - a)
        rows = [new] + ([np.array([[0.0, *new[-1, 1:]]])] if b < 0 else []) + [post]
        kf[key] = np.vstack(rows)
    p._compiled = (kf, min(float(f[0, 0]) for f in kf.values()), t1)
    return p


# ---------------------------------------------------------------- drawing helpers
def no_numbers(ax):
    """Remove the painted yard numbers (in these zoomed windows they sit where players stand)."""
    for t in list(ax.texts):
        if t.get_alpha() == 0.55:
            t.remove()


def P_of(fld, p):
    """(d, w) in the play's frame -> plot coordinates on this field."""
    return lambda d, w: tuple(float(v) for v in fld.xy(*p.to_abs(d, w)))


def tag(ax, xy, text, ec=style.BASELINE, fs=6.8, lw=0.6, ha="center"):
    ax.text(*xy, text, fontsize=fs, color=style.INK, ha=ha, va="center", zorder=12, linespacing=1.15,
            bbox=dict(boxstyle="round,pad=0.22", fc=style.SURFACE, ec=ec, lw=lw))


def callout(ax, P, text, at, to, fs=6.8, ec=style.BASELINE):
    """A label at `at` with a thin leader line to `to` (both (d, w))."""
    ax.annotate(text, xy=P(*to), xytext=P(*at), fontsize=fs, color=style.INK, ha="center", va="center", zorder=12,
                linespacing=1.15, bbox=dict(boxstyle="round,pad=0.22", fc=style.SURFACE, ec=ec, lw=0.6),
                arrowprops=dict(arrowstyle="-", color=style.INK_2, lw=0.7, shrinkA=0, shrinkB=4))


def ghost_marker(ax, x, y, label, ppy, side="def"):
    """A hollow, dashed marker: where a player stood before he moved."""
    col = style.DEFENSE if side == "def" else style.OFFENSE
    if side == "def":
        pat = RegularPolygon((x, y), 4, radius=MARKER_R * 1.25, orientation=np.pi / 4, facecolor="none",
                             edgecolor=col, lw=1.1, ls=(0, (2, 1.2)), zorder=6)
    else:
        pat = Circle((x, y), MARKER_R, facecolor="none", edgecolor=col, lw=1.1, ls=(0, (2, 1.2)), zorder=6)
    ax.add_patch(pat)
    if label:
        ax.text(x, y, label, ha="center", va="center", color=col, fontweight="bold", zorder=6,
                fontsize=max(4.0, min(8.0, ppy * 0.72)))


def mpath(ax, P, pts, kind="pre"):
    """A path through (d, w) points drawn by hand. 'pre' = pre-snap motion (dashed, blue);
    'post' = what he does after the snap (thin, solid, grey)."""
    col = style.OFFENSE if kind == "pre" else style.INK_2
    xy = [P(d, w) for d, w in pts]
    xs, ys = zip(*xy)
    lw = 1.6 if kind == "pre" else 1.0
    cut = (xs[-2] + 0.75 * (xs[-1] - xs[-2]), ys[-2] + 0.75 * (ys[-1] - ys[-2]))
    ax.plot(list(xs[:-1]) + [cut[0]], list(ys[:-1]) + [cut[1]], color=col, lw=lw,
            ls=(0, (3, 2)) if kind == "pre" else "-", zorder=5, solid_capstyle="round")
    head = (xs[-2] + 0.7 * (xs[-1] - xs[-2]), ys[-2] + 0.7 * (ys[-1] - ys[-2]))
    ax.add_patch(FancyArrowPatch(head, xy[-1], arrowstyle="-|>", mutation_scale=8, color=col, lw=lw,
                                 shrinkA=0, shrinkB=0, zorder=5))


def dpath(ax, P, a, b):
    """A defender's pre-snap slide, dashed, in the defense's colour."""
    ax.add_patch(FancyArrowPatch(P(*a), P(*b), arrowstyle="-|>", mutation_scale=7, color=style.DEFENSE,
                                 lw=1.2, ls=(0, (3, 2)), shrinkA=5, shrinkB=5, zorder=4))


def snap_dot(ax, P, at, dd=-1.4, dw=0.0):
    """Mark where the moving player is when the ball is snapped."""
    x, y = P(*at)
    ax.plot([x], [y], marker="o", ms=3.6, color=style.BALL, zorder=9)
    ax.text(*P(at[0] + dd, at[1] + dw), "snap", fontsize=6.2, color=style.BALL, ha="center", va="center",
            zorder=9, style="italic")


# ---------------------------------------------------------------- animations and their print strips
def snapshot(play, t, ax=None, lateral=(-21, 21), window=(-8.5, 15.5), ghosts=(), ghost_t=None, notes=()):
    """Everyone where he is at time t, a faint trail behind each mover since the first frame, and a
    hollow 'ghost' where each listed player stood at `ghost_t`."""
    pos = {k: play.position(k, t) for k in play.players}
    moved = [pl.moved(d=float(pos[k][0]), w=float(pos[k][1])) for k, pl in play.players.items()]
    q = Play([m for m in moved if m.side == "off"], [m for m in moved if m.side == "def"],
             los=play.los, ball_y=play.ball_y, to_go=play.to_go)
    q.highlights = dict(play.highlights)
    for n in notes:
        q.note(*n)
    fld = q.draw(ax=ax, lateral=lateral, window=window, title=False)
    ax, ppy = fld.ax, fld.pts_per_yard()
    no_numbers(ax)
    P = P_of(fld, play)
    start = play._compile()[1]
    for k, pl in play.players.items():
        if pl.pos in ("LT", "LG", "C", "RG", "RT", "DE", "DT", "NT"):
            continue
        pts = np.array([play.position(k, tt) for tt in np.linspace(start, t, 40)])
        if np.ptp(pts[:, 0]) + np.ptp(pts[:, 1]) < 0.4:
            continue
        xs, ys = fld.xy(*play.to_abs(pts[:, 0], pts[:, 1]))
        col = style.OFFENSE if pl.side == "off" else style.DEFENSE
        ax.plot(xs, ys, color=col, lw=1.2, alpha=0.55, ls="-" if pl.side == "off" else (0, (3, 2)), zorder=3)
    if ghost_t is not None:
        for k in ghosts:
            d0, w0 = play.position(k, ghost_t)
            d1, w1 = play.position(k, t)
            if abs(d1 - d0) + abs(w1 - w0) > 1.0:
                ghost_marker(ax, *P(d0, w0), play.players[k].label, ppy, play.players[k].side)
    bd, bw = play.ball_position(t)
    carried = any(np.hypot(*(play.position(k, t) - np.array([bd, bw]))) < 0.3
                  for k, pl in play.players.items() if pl.side == "off" and k != "C")
    bx, by = P(bd + (0.95 if carried and t > 0 else 0.0), bw)   # a carried ball sits just in front of him
    ax.add_patch(Ellipse((bx, by), 0.75, 1.1, facecolor=style.BALL, edgecolor="white", lw=0.6, zorder=9.5))
    return fld


def strip(play, times, labels, ncols=2, **kw):
    """The print version of an animation: one panel per chosen moment, each with a caption."""
    lateral, window = kw.get("lateral", (-21, 21)), kw.get("window", (-8.5, 15.5))
    n = len(times)
    nrows = int(np.ceil(n / ncols))
    pw = 6.5 / ncols
    h = nrows * (pw * (window[1] - window[0]) / abs(lateral[1] - lateral[0]) + 0.36) + 0.35
    fig, axes = plt.subplots(nrows, ncols, figsize=(6.5, h), squeeze=False)
    for ax in axes.flat[n:]:
        ax.axis("off")
    for ax, t, lab in zip(axes.flat, times, labels):
        snapshot(play, t, ax=ax, **kw)
        ax.set_title(lab, fontsize=8.2, color=style.INK, loc="left", pad=3)
    fig.tight_layout(h_pad=0.5, w_pad=0.5, rect=(0, 0.05, 1, 1))
    hs = [Line2D([], [], color=style.OFFENSE, lw=1.2, alpha=0.7, label="Offense: path so far"),
          Line2D([], [], color=style.DEFENSE, lw=1.2, ls=(0, (3, 2)), label="Defense: path so far"),
          Patch(facecolor="none", edgecolor=style.DEFENSE, lw=1.1, ls=(0, (2, 1.2)), label="Dashed outline: where he started")]
    fig.legend(handles=hs, loc="lower center", ncol=3, fontsize=7.2, frameon=False, bbox_to_anchor=(0.5, 0.0))
    return fig


def show_play(play, times, labels, web_caption, **kw):
    """Web: an animation with a caption that changes with the phase of the play.
    Print: a labelled frame strip (panel titles = `labels`)."""
    if PDF:
        strip(play, times, labels, **kw)
        plt.show()
        return
    df = play.to_tracking()
    tmap = df.groupby("frameId")["time"].first()
    anim = animate(df, to_go=play.to_go)
    ax = anim._fig.axes[0]
    cap = ax.text(0.01, 0.02, "", transform=ax.transAxes, ha="left", va="bottom", fontsize=9, color=style.INK,
                  zorder=21, bbox=dict(boxstyle="round,pad=0.3", fc=style.SURFACE, ec=style.THIRD, lw=1.0))
    base = anim._func

    def upd(fid, *a):
        out = base(fid, *a)
        cap.set_text(web_caption(float(tmap.get(fid, 0.0))))
        return out
    anim._func = upd
    if shutil.which("ffmpeg"):
        html = anim.to_html5_video(embed_limit=40).replace("<video ", '<video style="max-width:100%;height:auto" ')
    else:
        html = anim.to_jshtml(default_mode="once")
    plt.close(anim._fig)
    display(HTML(html))


def phases(cuts):
    """[(t_upper, caption), ...] -> function of t (seconds from the snap) for show_play."""
    def f(t):
        for up, txt in cuts:
            if t < up:
                return txt
        return cuts[-1][1]
    return f

First-and-10, early in the second quarter. The receiver split wide on the right turns and jogs toward the ball, then breaks into a sprint, running flat along the line, across the whole formation. The cornerback who had been standing seven yards in front of him turns and runs too, step for step, all the way across the field. “There’s your man coverage,” says the analyst, and before he finishes the sentence the ball is snapped, the receiver takes a little flip from the quarterback without breaking stride, and he is ten yards upfield before the corner chasing him can turn the corner. How did the analyst know? Why did the offense want him to know? And if the run was coming anyway, why didn’t the defense simply let the receiver go? This chapter is about the most common thing an NFL offense does before the snap, moving somebody, and about what each kind of movement is for.

You’ll be able to…

NoteYou’ll need
  • The pre-snap rules (The Pre-Snap Phase): after a shift (two or more players moving at once) everyone must be set for a full second; in motion only one backfield player may be moving at the snap, parallel to or away from the line, never toward it.
  • Formations (Spread and Modern Formations): 2x2 is two receivers on each side, 3x1 (trips) three to one side and one to the other, a bunch is three receivers squeezed into a tight triangle, and an empty set has no back beside the quarterback. The side with more players (usually the tight end’s side) is the strength.
  • A first look at defense (A First Look at Defense): in man coverage each defender is assigned a receiver; in zone coverage each is assigned an area. The safeties’ picture is one-high (one deep in the middle) or two-high (two deep, one per side), and the box is the area near the ball where run defenders stand. Counting blockers against box defenders tells you whether the run has the numbers.

Motion has a job

The Pre-Snap Phase gave you the rules (who may move, which way, and when everyone has to freeze) and three reasons motion exists: it asks the defense a question, it gives a player a running start, and it changes the formation late. The rules set the shape: a receiver running across the formation moves flat, parallel to the line, because he may not be angling toward it at the snap, and two receivers never sprint at the snap together, because only one player may be moving. This chapter splits those three reasons into five jobs, gives every kind of motion a name, and shows you how to read the defense’s answer.

Here is the idea to hold on to: no good offense moves a player for decoration. Kyle Shanahan, whose 49ers have been among the league’s heaviest motion users since 2017, put it plainly: “You do it for a reason. You do it to help one of your players or you do it because you see something that you think will affect the defense.” Sean McVay of the Rams added the warning every coach repeats: “It’s not just to look cool.”1

Every motion does one or more of five jobs:

  1. It asks a question: man or zone? Someone on the defense has to deal with the moving player, and how they deal with him is a clue to the coverage.
  2. It changes the strength and the numbers. A player who moves from one side to the other changes how many receivers (or blockers) are on each side, and the defense has to rebalance in a second or two.
  3. It gives a running start. A player moving at the snap is already at speed when the play begins, and nobody on the defense is.
  4. It creates leverage. A defender’s position relative to his receiver, inside or outside, in front or behind, is planned against a standing receiver. A moving one changes it.
  5. It stresses communication. Each time the formation changes, the defense has to re-declare its calls, and every re-declared call is a chance for two defenders to take the same man and none to take another.

The costs from The Pre-Snap Phase still apply (play-clock time, precise timing, and the risk of tipping the play), and this chapter adds one more when it reaches motion at the snap. First, the vocabulary: the motions themselves.

The motion family

Motions are named by path (where the player goes) and timing (whether he is still moving when the ball is snapped). Here is the family the rest of this book uses.

Show the Python
LAT_F, WIN_F = (-18.5, 18.5), (-8.6, 2.6)
PANELS = []


def panel(fn):
    PANELS.append(fn)
    return fn


def base(ax, off, ring=()):
    p = Play(off, None, los=50, to_go=None)
    p.highlight(*ring)
    fld = p.draw(ax=ax, title=False, lateral=LAT_F, window=WIN_F)
    return fld, P_of(fld, p)


@panel
def f_jet(ax):
    fld, P = base(ax, gun_2x1_te(), ("Z",))
    mpath(ax, P, [(-1.5, 15), (-2.6, 9), (-3.0, 4), (-3.1, 1.2)])
    mpath(ax, P, [(-3.1, 1.2), (-3.2, -3.6), (-1.4, -6.4)], kind="post")
    snap_dot(ax, P, (-3.1, 1.2), dd=-0.9, dw=3.6)
    return "Jet", "full speed across, in front of the gun QB"


@panel
def f_fly(ax):
    fld, P = base(ax, under_wing(), ("H",))
    mpath(ax, P, [(-1.6, 6.4), (-2.6, 4.0), (-3.2, 1.5)])
    mpath(ax, P, [(-3.2, 1.5), (-3.4, -3.5), (-2.5, -8.5)], kind="post")
    snap_dot(ax, P, (-3.2, 1.5), dd=-1.5, dw=1.4)
    return "Fly", "the wing's sprint behind an under-center QB"


@panel
def f_rocket(ax):
    off = [q.moved(w=1.6) if q.key == "RB" else q for q in gun_2x1_te()]
    fld, P = base(ax, off, ("RB",))
    mpath(ax, P, [(-5.0, 1.6), (-5.6, 4.0), (-6.2, 6.8)])
    mpath(ax, P, [(-6.2, 6.8), (-5.8, 10.5), (-3.5, 13.5)], kind="post")
    snap_dot(ax, P, (-6.2, 6.8), dd=-1.4, dw=-0.5)
    return "Rocket", "a back's deep sprint toward the sideline"


@panel
def f_orbit(ax):
    off = [q.moved(w=1.6) if q.key == "RB" else q for q in gun_2x1_te()]
    fld, P = base(ax, off, ("H",))
    mpath(ax, P, [(-1.5, -9.0), (-3.2, -5.0), (-6.0, -2.0), (-6.9, 0.0), (-6.8, 2.6)])
    mpath(ax, P, [(-6.8, 2.6), (-6.2, 6.5), (-4.5, 9.5)], kind="post")
    snap_dot(ax, P, (-6.8, 2.6), dd=-1.3, dw=-0.6)
    return "Orbit", "loops behind the QB to the far side"


@panel
def f_return(ax):
    fld, P = base(ax, gun_2x1_te(z_w=14.0), ("Z",))
    mpath(ax, P, [(-1.5, 13.2), (-1.6, 10.0), (-1.7, 7.4)])
    ax.plot(*zip(P(-1.7, 7.4), P(-2.2, 6.9), P(-2.9, 7.3)), color=style.OFFENSE, lw=1.6, ls=(0, (3, 2)), zorder=5)
    mpath(ax, P, [(-2.9, 7.3), (-3.0, 10.0), (-3.0, 11.8)])
    snap_dot(ax, P, (-3.0, 11.8), dd=-1.3, dw=0.6)
    tag(ax, P(-5.6, 6.2), "in, then back out", fs=6.2)
    return "Return (yo-yo)", "in one way, back the other"


@panel
def f_zoom(ax):
    off = [q.moved(d=-1.5, w=-6.6) if q.key == "Z" else q for q in gun_2x1_te()]
    off = [q.moved(w=-10.0) if q.key == "H" else q.moved(w=-15.5) if q.key == "X" else q for q in off]
    fld, P = base(ax, off, ("Z",))
    ghost_marker(ax, *P(-1.5, 15.0), "Z", fld.pts_per_yard(), side="off")
    mpath(ax, P, [(-1.5, 15), (-2.4, 9.0), (-2.9, 2.0), (-2.7, -4.6), (-1.9, -5.9)])
    tag(ax, P(-5.0, -10.5), "sets as #3: now 3x1", fs=6.2)
    return "Zoom", "across the formation, then sets"


@panel
def f_glide(ax):
    fld, P = base(ax, gun_2x1_te(), ("Z",))
    mpath(ax, P, [(-1.5, 15), (-1.6, 12.6), (-1.7, 10.4)])
    mpath(ax, P, [(-1.7, 10.4), (0.0, 9.3), (1.8, 8.6)], kind="post")
    snap_dot(ax, P, (-1.7, 10.4), dd=-1.4, dw=0.6)
    return "Glide", "in toward the ball; snap halfway"


@panel
def f_trade(ax):
    end = {"Y": (-0.7, -4.8), "X": (-1.5, -15.0), "Z": (-0.7, 15.0)}
    off = [q.moved(d=end[q.key][0], w=end[q.key][1]) if q.key in end else q for q in gun_2x1_te()]
    fld, P = base(ax, off, ("Y",))
    ghost_marker(ax, *P(-0.7, 4.8), "Y", fld.pts_per_yard(), side="off")
    mpath(ax, P, [(-0.7, 4.8), (-2.2, 3.6), (-2.4, -3.6), (-1.4, -4.6)])
    tag(ax, P(-4.0, -14.2), "X steps off", fs=6.2)
    tag(ax, P(-4.0, 14.2), "Z steps up", fs=6.2)
    tag(ax, P(-7.2, 8.6), "all three at once: a shift", fs=6.2)
    return "Trade", "the tight end changes sides"


@panel
def f_short(ax):
    fld, P = base(ax, gun_2x1_te(), ("Z",))
    mpath(ax, P, [(-1.5, 15.0), (-1.5, 12.5), (-1.5, 10.2)])
    tag(ax, P(-4.8, 12.4), "a few yards; sets", fs=6.2)
    return "Short (rip/liz)", "a few yards to a new split"


@panel
def f_bunch(ax):
    start = {"H": (-1.5, -9.0), "Y": (-1.5, 9.0), "Z": (-0.7, 15.0)}
    end = {"H": (-2.0, 10.7), "Y": (-2.0, 7.3), "Z": (-0.7, 9.0)}
    off = [q.moved(d=end[q.key][0], w=end[q.key][1]) if q.key in end else q for q in gun_2x2_spread()]
    fld, P = base(ax, off)
    for k, (d0, w0) in start.items():
        if k != "Y":
            ghost_marker(ax, *P(d0, w0), k, fld.pts_per_yard(), side="off")
    mpath(ax, P, [(-1.5, -9.0), (-2.8, -5.0), (-3.2, 4.0), (-3.0, 9.5), (-2.4, 10.4)])
    mpath(ax, P, [(-0.7, 15.0), (-0.7, 12.0), (-0.7, 10.0)])
    tag(ax, P(-6.4, 11.2), "three move at once:\na shift into a bunch", fs=6.2)
    return "Shift to bunch", "three receivers squeeze together"


fig, axes = plt.subplots(5, 2, figsize=(6.5, 6.3))
for ax, fn in zip(axes.flat, PANELS):
    name, sub = fn(ax)
    no_numbers(ax)
    ax.set_title(name, loc="left", fontsize=9, fontweight="bold", color=style.INK, pad=2)
    ax.text(1.0, 1.015, sub, transform=ax.transAxes, fontsize=6.8, color=style.INK_2, ha="right", va="bottom")
fig.tight_layout(h_pad=0.6, w_pad=0.8)
plt.show()
Figure 14.1: The motion family, offense only, each drawn from a typical alignment. The ringed player is the one who moves. Dashed blue lines are pre-snap movement; thin grey lines show what the player does after the snap; a brown dot marks where he is when the ball is snapped (motions with no dot stop and set before the snap). Jet, fly, rocket, orbit, glide and return are usually run as motion at the snap; zoom and short motion usually set first. The trade and the shift to bunch move several players at once, so they are shifts: dashed outlines show where those players started. Where a player sets before the snap (zoom, trade, bunch) he is drawn at his new spot. Names vary from playbook to playbook; the shapes are what matter.
CautionCommon misconception

“Jet motion” sounds like a technical term with one meaning. It isn’t. Motion names are playbook dialect: each staff names its motions in its own language, often after the letter of the player who moves (“zip” and “zoom” for the Z receiver, “yo-yo” for Y), and the same word can mean different things in two buildings. Some teams use jet and fly for the same motion; some use orbit only for a running back. The names below are the common ones in NFL film breakdowns and coaching clinics, and the glossary records them.2 Learn the shapes, and you’ll recognise the motion whatever the broadcast calls it.

Motions that cross the formation. These are the big, fast ones, almost always timed so the ball is snapped while the player is still moving.

  • Jet motion: a receiver sprints across the formation, flat along the line, timed so that the ball is snapped just before he reaches the quarterback. In the shotgun he passes between the quarterback and the line, close enough to take a handoff or a little forward flip (the jet sweep, a run to the edge by the motion man himself). That little flip travels forward, so in the rules it is a forward pass: if it hits the ground it is an incomplete pass, not a fumble.3 Most of the time he doesn’t get the ball at all: the jet is a threat, and the defense has to respect it either way.
  • Fly motion: the older name for the same idea from the Wing-T, a run-heavy offense of the 1950s onward. A wingback (a back lined up just outside and behind the tight end) sprints across behind an under-center quarterback, who turns and hands him the ball on the “fly sweep.” Many staffs say jet and fly interchangeably. Where they distinguish them, fly is usually the under-center version, with the runner passing behind the quarterback.
  • Orbit motion: a receiver comes in toward the ball and swings behind the quarterback (and behind the back), like a moon around a planet, and is still moving toward the far side at the snap. Going behind the quarterback means he can take a pitch or a shovel pass (a short underhand toss), or turn into a receiver out of the backfield, and he is harder for the defense to track because he disappears behind the offensive line for a moment.
  • Zoom motion: a receiver goes all the way across the formation and then sets on the other side, usually as the new inside receiver (#3, counting from the sideline in). It isn’t about speed; it is about the new formation. A 2x2 becomes a 3x1, and the defense has to rebalance (Job 2, below).

Motions out of the backfield.

  • Rocket motion (also rock motion): a back sprints from his spot in the backfield straight out toward the sideline, staying deep, so he is already running wide when the ball is snapped. In option offenses such as the flexbone the same name is used for a slotback (a back set just behind the line, outside the tackle) sprinting on a deep path behind the quarterback.4 The play it sets up is the rocket toss, a pitch to the back at the edge, and the rocket motion is a fine way to get a back into a pass route with a head start, too.

Motions that come back, or come in. These are subtler, and they matter most in the passing game.

  • Return motion (also yo-yo motion or yo-yo): a receiver motions one way, then reverses back toward where he started, usually right at the snap. Its targets are the defenders who follow motion: whoever chased the first move is now running the wrong way.
  • Glide motion: a wide receiver motions in toward the ball at a controlled pace, and the snap comes when he is about halfway to the formation, and he is still moving when the ball is snapped (that is the difference from short motion, which stops and sets). He starts the play already moving inside, which helps a crossing route, a quick break back outside, or a crack block (a receiver blocking back inside on a linebacker or safety, taught with the perimeter runs in Perimeter Runs and Misdirection).
  • Short motion (also rip/liz motion, after the “right” and “left” tags some playbooks use): a few yards and no more, usually a receiver tightening his split, or tucking in beside or behind a teammate to form a stack, and usually set again before the snap. Short motion looks like nothing, which is part of the point: a receiver who starts closer to the ball has more room to the outside, and a defender who lined up against his old spot is a step out of place. (Don’t confuse these rip/liz tags with the Rip/Liz strength call from Formation Rules: the same two words are a direction tag in some offensive playbooks and the defense’s strength call in others.)

Moves that change the whole formation. These are usually shifts, because more than one player moves.

  • A trade (a TE trade): the tight end changes sides. Because he leaves the line, someone else has to keep the offense legal (seven on the line, with only the end men eligible): usually a receiver on the new side steps off the line and one on the old side steps on, all at once. The strength flips, and the defense has to flip its front and its coverage calls with it. Because a trade is a shift, the offense must then hold still for a full second, which guarantees the defense that beat to re-set; offenses often follow the trade with a motion to take it back. (You saw a trade, and the defense flipping in answer, in The Pre-Snap Phase.)
  • The shift to bunch: three receivers squeeze into a tight triangle at the last moment. Against man coverage a bunch is a traffic jam that defenders have to fight through (the crossing routes it makes possible are the rub routes of the passing chapters), and creating it late means the defense can’t line up in its planned answer to bunch until it’s almost too late to communicate it.

And the timing word: motion at the snap. Motion at the snap isn’t a path. It means the player is still moving when the ball is snapped. Jet, fly, rocket, orbit, glide and return motion are almost always run this way; zoom and short motion usually aren’t. The distinction matters so much in the modern game that it gets its own section later in the chapter.

NoteMadden vs. real life

In Madden, you can send almost any player in motion from a menu before any play, in any direction you like. Real NFL motion is almost never improvised. It is written into the play call (“Gun Trips Right, Z Jet, 26 Zone”, where 26 Zone is a zone run to the right), rehearsed dozens of times in practice so that the snap arrives when the motion man reaches an exact spot, and paired with the play it is meant to help. The quarterback’s job isn’t to choose the motion. It’s to read what the defense does with it, and to snap the ball at the right instant.

Job 1: asking man or zone

Start with the question in the opening scene. When a receiver goes in motion, the defense has three basic ways to deal with him, and each one looks different.

Travel: somebody goes with him

In man coverage each defender has a receiver, so the simplest answer to motion is for that defender to go with him. A defender who follows a man in motion across the formation is said to travel with him.

Show the Python
LAT_J, WIN_J = (-20.0, 20.0), (-8.0, 15.5)
JET = [(-1.5, 15.0), (-2.4, 10.0), (-2.9, 5.5), (-3.0, 2.6)]          # Z's motion: ends 2.6 yd short of the QB
SWEEP = [(-3.1, -1.0), (-3.0, -6.0), (-1.8, -10.5), (0.5, -14.0), (3.5, -16.4), (7.5, -17.4)]
JET_T = [-2.3, -1.1, 0.0, 2.9]            # the man strip; the zone strip uses its own times


def jet_offense(p):
    """The same offensive play in both jet diagrams: jet motion by Z, then a jet sweep to the left."""
    p.motion("Z", pts=[(d - JET[0][0], w - JET[0][1]) for d, w in JET[1:]], speed=6.5)
    p.run("Z", [(d - JET[-1][0], w - JET[-1][1]) for d, w in SWEEP], speed=8.5)
    p.pitch("Z", t=0.5)
    for k in ("LT", "LG", "C", "RG", "RT"):
        p.block(k, pts=[(0.25, -0.8)])
    p.block("Y", pts=[(0.4, -0.8)])
    p.run("RB", [(0.9, 1.0), (1.8, 3.2), (2.6, 5.0)], speed=5.5, delay=0.3)  # fakes inside zone the other way
    p.block("X", pts=[(3.2, 0.6)], speed=3.5)                                # blocks the corner
    p.block("H", pts=[(2.4, 1.2)], speed=3.5)


def jet_vs_man():
    dfn = front4() + [
        D("LCB", "CB", 6.0, -15.3, "CB"), D("RCB", "CB", 6.5, 15.3, "CB"),
        D("NB", "NB", 5.0, -9.6, "NB"), D("SS", "SS", 6.0, 6.4, "SS"),
        D("MIKE", "MIKE", 4.5, 1.2, "M"), D("WILL", "WILL", 4.5, -3.0, "W"),
        D("FS", "FS", 13.5, 0.0, "FS")]
    p = Play(gun_2x1_te(), dfn, los=40, to_go=10)
    jet_offense(p)
    p.motion("RCB", pts=[(0.0, -5.0), (0.2, -10.0), (0.2, -11.6)])            # travels with Z, at his depth
    p.path("RCB", [(-0.4, -5.0), (-1.2, -12.0), (-1.4, -17.0)], speed=7.6, delay=0.2)
    p.path("NB", [(-1.2, -0.4)], speed=2.0)
    p.path("LCB", [(-2.4, 0.8)], speed=3.0)
    p.path("WILL", [(-0.6, 1.8), (-1.0, 3.6)], speed=4.0, delay=0.35)      # man on the back: goes with his fake
    p.path("MIKE", [(-0.8, -3.5), (-1.4, -6.5)], speed=4.5, delay=0.35)
    p.path("FS", [(-3.0, -5.5), (-5.0, -10.0)], speed=6.0, delay=0.3)
    p.path("SS", [(-0.8, -1.5)], speed=3.0, delay=0.2)
    p.highlight("RCB", color=style.THIRD)
    return schedule(p, {"Z": (-2.3, 0.0), "RCB": (-2.2, 0.0)})


show_play(jet_vs_man(), JET_T,
          ["1 · Set: the corner (ringed) is over Z", "2 · Z goes in jet motion; the corner travels",
           "3 · Snap: the corner is trailing Z, deep", "4 · Z turns the edge; the corner is late"],
          phases([(-2.0, "set: the corner is over Z"), (-0.05, "jet motion: the corner travels with him"),
                  (0.25, "snap: the corner trails a receiver at full speed"), (1.6, "jet sweep: the corner chases"),
                  (9, "Z turns the edge outside the corner")]),
          lateral=LAT_J, window=WIN_J, ghosts=("RCB",), ghost_t=-2.3)
Figure 14.2: Jet motion against man coverage (simulated, in Big Data Bowl tracking coordinates). The defense is in Cover 1: each defender has a receiver, and one free safety (FS) stays deep in the middle. When Z sprints across in jet motion, his cornerback (ringed) travels with him, step for step, at his own depth: that is the man coverage giving itself away. At the snap (panel 3) the corner is still on the right of the ball, nine yards deep, trailing a receiver who is already at full speed. The ball is flipped to Z on a jet sweep; the running back fakes a run the other way, and the linebacker who has him in man coverage goes with the fake. In panel 4 Z has turned upfield outside the blocked left corner, and the travelling corner, who had to stop running sideways and redirect, is a step inside and behind him. Faint lines are paths so far; the dashed outline is where the corner started. The defensive linemen are left standing to keep the picture readable.

To the quarterback, a corner running across the formation is about the loudest signal a defense can send. A zone defender has no reason to leave his area to follow one receiver across the field, so a traveller almost always means man coverage.

Why travel at all, if it’s so obvious? Because it keeps the defense simple. The matchups the coaches planned all week (our best corner on their best receiver) survive any motion, and nobody has to make a new call in the last two seconds. That’s a real advantage against a team that motions on most snaps.

The price shows in the last two panels. At the snap the traveller is trailing a receiver who is already running at full speed, and he himself is moving sideways, so the moment Z turns upfield the corner has to stop, redirect and chase; by panel 4 he is a step inside and behind. Anything that goes toward the side the motion is heading (a jet sweep, a flat route, a wheel up the sideline) is a race the defender begins already losing. And when the corner crosses the formation he ends up somewhere he wasn’t built to play, near the box, where a run might come straight at him. That’s why many man defenses don’t travel on every motion: on a full-speed jet across the formation, they exchange instead, passing him to a teammate on the other side (more on that in a moment).

Bump and spin: the zone answer

A zone defense doesn’t care who the receiver is; it cares where he is. So when a receiver crosses the formation, nobody follows him. The defenders adjust their spacing, each moving over one spot toward the motion, and the safeties may rotate so that the side the motion is heading to gets an extra man.

Show the Python
def jet_vs_zone():
    dfn = front4() + [
        D("LCB", "CB", 7.0, -15.5, "CB"), D("RCB", "CB", 7.0, 15.5, "CB"),
        D("NB", "NB", 5.0, -9.8, "NB"), D("MIKE", "MIKE", 4.5, 1.2, "M"), D("WILL", "WILL", 4.5, -3.0, "W"),
        D("FS", "FS", 13.0, -9.0, "FS"), D("SS", "SS", 13.0, 9.0, "SS")]
    p = Play(gun_2x1_te(), dfn, los=40, to_go=10)
    jet_offense(p)
    p.motion("WILL", to=(4.3, -5.2))           # bump: each linebacker a step toward the motion
    p.motion("MIKE", to=(4.5, -1.2))
    p.motion("FS", to=(8.0, -11.0))            # spin: motion-side safety down ...
    p.motion("SS", to=(13.5, 0.5))             # ... the other to the deep middle
    p.motion("RCB", to=(8.0, 15.0))
    p.path("NB", [(-1.0, -0.5)], speed=2.0)
    p.path("LCB", [(-1.2, -0.3)], speed=2.0)
    p.path("FS", [(-3.5, -2.6), (-6.5, -3.4)], speed=6.5, delay=0.05)      # the force player
    p.path("WILL", [(-0.5, -2.0), (-1.0, -3.2)], speed=5.5, delay=0.15)
    p.path("MIKE", [(-0.4, -2.0), (-1.0, -3.5)], speed=4.5, delay=0.25)
    p.path("SS", [(-1.0, -4.0)], speed=4.0, delay=0.3)
    p.path("RCB", [(1.0, 0.0)], speed=3.0)
    p.highlight("FS", "SS", "WILL", "MIKE", color=style.THIRD)
    return schedule(p, {"Z": (-2.3, 0.0), "WILL": (-1.7, -0.4), "MIKE": (-1.6, -0.4), "FS": (-1.5, 0.0),
                        "SS": (-1.5, 0.0), "RCB": (-1.6, -0.3)})


show_play(jet_vs_zone(), [-2.3, -0.6, 0.0, 1.8],
          ["1 · Set: two deep safeties", "2 · Nobody follows Z; linebackers bump over",
           "3 · Snap: one safety down, one to the middle", "4 · The spun safety is waiting at the edge"],
          phases([(-2.0, "set: two deep safeties"), (-1.4, "jet motion: nobody follows Z"),
                  (-0.05, "bump and spin: linebackers slide, safeties rotate"),
                  (0.25, "snap: one high, an extra man on the motion side"), (9, "the spun safety meets the sweep")]),
          lateral=LAT_J, window=WIN_J, ghosts=("FS", "SS"), ghost_t=-2.3)
Figure 14.3: The same jet motion and jet sweep against a zone defense (simulated, in Big Data Bowl tracking coordinates). The defense starts two-high: one deep safety on each side. When Z goes in motion, nobody follows him. The two linebackers (W and M) bump a step or two toward the side Z is heading, and the safeties spin: the one on that side (FS) comes down toward the line, and the other (SS) rotates to the deep middle, so the shell turns into one-high. The right corner stays home over empty grass. At the snap the defense has an extra player on the side of the sweep, and the safety who spun down is waiting at the edge. Ringed players are the ones to watch; dashed outlines are where the safeties started. (This defense starts two-high and the man defense above started one-high; that difference is not the lesson. What separates them is who follows Z.)

Two things happened, and both have names.

  • The bump. The linebackers each slid a step toward the motion. A bump is defenders shuffling one spot toward the motion instead of following it, each taking over a new area or a new receiver. Nobody crossed the formation; everyone just re-spaced. Coaches also call it a slide or a shuffle.
  • The spin. The two safeties rotated. A spin is one safety coming down while the other moves to the deep middle, so two deep safeties become one. The safety who comes down is usually the one on the side the motion is heading to, as here, but some calls rotate the other way on purpose, and the safety who comes down may stop in the middle of the field rather than out wide. (The rotation itself, and every variety of it, is taught in Disguise, Rotation, and Split-Field Coverage.)

Why answer motion this way? Because it keeps the numbers right without sending anyone on a long run. Once the motion is over there will be more receivers on the left, so the defense moves more men to the left. Notice the timing in the strip: at the snap Z is still just right of the ball, yet the defense has already shifted. It moves to where the jet is heading, not where he is, because a defender who waits for Z to arrive is too late. The safety who spins down becomes an extra defender on the motion side, the man who stops the jet sweep in the fourth panel. Every receiver is still inside somebody’s area, and no defender ended up on the wrong side of the formation.

The price: the defense has shown its hand. Nobody travelled, so it’s probably zone. The safeties spun, so it’s probably one-high now, with three deep defenders (the two corners and the middle safety) and four or five underneath, the shape of Cover 3. The side the motion left is thinner than it was, with a corner standing alone over empty grass. And the spin took time: a safety who must cover the deep middle had to run eight or nine yards before the snap, which is exactly why offenses love to snap the ball while he is still running.

The man/zone indicator, and the running back version

Put the two pictures together and you have the man/zone indicator: reading the defense’s reaction to motion as a clue to its coverage.

Table 14.1: Reading the defense’s answer to motion. Each row is a hint, not a guarantee; the next section explains why.
What the defense does with the motion What it suggests
One defender runs with the motion man (travel) Man coverage
Defenders slide over without following (bump) Usually zone, but a man defense that exchanges looks the same; check where the slid defenders end up (next section)
A safety comes down and the other goes to the middle (spin) A rotation to one-high (often Cover 3, or man with one deep safety if someone also travelled)
Safeties don’t move at all The shell you see may be the shell you get, or the rotation is coming at the snap

The cleanest version of the test doesn’t use a receiver at all. Motion the running back out of the backfield to a wide spot, leaving the quarterback alone (an empty formation). In man coverage, someone is assigned to that back, usually a linebacker, and that linebacker has to walk out of the box with him. In zone, the defender already standing out there (a nickel back or an outside linebacker) simply takes him, and the linebackers stay home. A linebacker walking out to the numbers with a running back is one of the most reliable pre-snap tells in football (and when it doesn’t happen, the next section shows you what to check before you call zone). It also tells the quarterback that the middle of the field has one fewer defender in it, which is why quarterbacks who can run love to see it.

The same reading works when the tight end motions. In man, whoever has him (often a safety or a linebacker) goes with him; in zone, nobody follows and the defense re-declares its strength toward his new side. Because the tight end is also the run strength, expect the front to shift with him as well as the coverage.

These are this book’s words. Defensive staffs have their own: following the motion man is also called locking or tracking him, the man-coverage hand-off a switch, and the safety rotation a rotate; when two defenders swap two receivers who cross, the call is a banjo.5 If you read a breakdown that uses different words, match the shapes, not the labels.

ImportantWhy it exists

The man/zone indicator exists because coverage is the defense’s best-kept secret, and motion is the cheapest way to make it leak. A defense can hide its coverage while everyone stands still. It can’t avoid reacting to a player who moves, and each way of reacting has a different shape. For the offense the information is worth a lot: man coverage invites crossing routes, rubs and quarterback runs; zone invites throws into the gaps between defenders. A concrete version: the call has two receivers crossing on one side and a seam route between the linebackers; if the motion says man, the quarterback expects the crossers to rub their defenders off and throws to the one who comes free; if it says zone, he looks for the seam in the hole between the linebackers. When the motion sets early, the quarterback has time for more: with a kill call or a built-in check he can swap the play for one that suits the answer. When the motion is at the snap, the answer arrives too late to change the play; it feeds only his read after the snap. Motion that sets early buys a check; motion at the snap buys a head start.

When the indicator lies

Defensive coordinators know exactly what you just learned, and they spend their careers making it unreliable. Three counters are worth knowing now; the full treatment is in Disguise, Rotation, and Split-Field Coverage.

Man defenses that exchange. A man defense doesn’t have to travel. Many play man with a rule that says, in effect, “if he crosses the formation, pass him on.” That is an exchange: nobody follows the motion man across; instead the defenders slide one spot over and swap receivers, so the defender on the side he arrives at picks him up and the one he left behind takes a new job. The coverage is still man, but nobody ran across the field, so from the stands it looks exactly like a zone bump. Defenses often decide this by the kind of motion: they might travel on a short motion (cheap to follow) and exchange on a full-speed jet (expensive to chase).

Show the Python
LAT_E, WIN_E = (-18.0, 18.0), (-6.6, 15.5)
H_SET = (-1.5, 5.8)
START = {"NB": (5.0, -9.5), "MIKE": (4.5, 1.5), "SS": (7.0, 9.5)}
AFTER = {
    "zone": {"NB": (5.5, -5.6), "MIKE": (6.2, 3.0), "SS": (7.5, 12.4)},
    "man": {"NB": (6.0, -1.5), "MIKE": (3.2, 5.0), "SS": (3.6, 8.4)},
}
EYES = {"zone": {"NB": "QB", "MIKE": "QB", "SS": "QB"}, "man": {"MIKE": "H", "SS": "Y"}}



def slide_panel(ax, kind):
    off = [q.moved(d=H_SET[0], w=H_SET[1]) if q.key == "H" else q for q in gun_2x2_spread()]
    pos = {**START, **AFTER[kind]}
    dfn = front4(sde=5.0) + [
        D("LCB", "CB", 6.0, -15.5, "CB"), D("RCB", "CB", 6.0, 15.5, "CB"),
        D("NB", "NB", *pos["NB"], "NB"), D("MIKE", "MIKE", *pos["MIKE"], "M"),
        D("WILL", "WILL", 4.5, -3.0, "W"), D("SS", "SS", *pos["SS"], "SS"), D("FS", "FS", 13.5, 0.0, "FS")]
    p = Play(off, dfn, los=45, to_go=None)
    for k, tgt in EYES[kind].items():
        p.read(tgt, key=k)
    p.highlight("MIKE", color=style.THIRD)
    fld = p.draw(ax=ax, title=False, lateral=LAT_E, window=WIN_E)
    no_numbers(ax)
    P = P_of(fld, p)
    ghost_marker(ax, *P(-1.5, -9.0), "H", fld.pts_per_yard(), side="off")
    mpath(ax, P, [(-1.5, -9.0), (-2.8, -5.0), (-3.0, 2.0), (-2.4, 4.8), (-1.6, 5.4)])
    for k in ("NB", "MIKE", "SS"):
        if np.hypot(*np.subtract(START[k], AFTER[kind][k])) > 1.0:
            ghost_marker(ax, *P(*START[k]), dict(NB="NB", MIKE="M", SS="SS")[k], fld.pts_per_yard())
            dpath(ax, P, START[k], AFTER[kind][k])
    return P


fig, axes = plt.subplots(1, 2, figsize=(6.5, 3.75))
for ax, kind in zip(axes, ("zone", "man")):
    P = slide_panel(ax, kind)
    if kind == "zone":
        ax.set_title("1  Zone bump (Cover 3)", loc="left", fontsize=9, fontweight="bold", color=style.INK)
        callout(ax, P, "sits in a space,\n5-7 yds, eyes on QB", (11.0, 8.6), (6.6, 3.6), fs=6.6, ec=style.THIRD)
    else:
        ax.set_title("2  Man exchange (Cover 1)", loc="left", fontsize=9, fontweight="bold", color=style.INK)
        callout(ax, P, "squared up on H,\nclose and inside", (10.6, 9.0), (3.9, 5.3), fs=6.6, ec=style.THIRD)
        callout(ax, P, "NB: now the free\ndefender, middle", (10.6, -9.0), (6.6, -2.4), fs=6.6)
fig.tight_layout(w_pad=0.6)
plt.show()
Figure 14.4: The same slide, two coverages. In both panels H motions from the left slot and sets on the right as the third receiver (#3), and the defense answers the same way at a glance: nobody follows him; the Mike (M) slides out toward H and the nickel (NB) slides in toward the box. Left, zone (Cover 3): the slid defenders stop at area depth, 5 to 7 yards, in the spaces between receivers, and their eyes (dashed lines) are on the quarterback. Right, man (Cover 1) with an exchange: the Mike stops close to H and just inside him, squared up on one man, and the strong safety tightens on Y; their eyes are on their receivers. The nickel who lost H becomes the free defender in the middle. Dashed outlines are where the defenders started.

How do you tell them apart? Not by the slide itself, which is the same, but by where the slid defenders end up:

  • Distance and leverage. In man, the defender who picked up the motion man stops close to him (often two to four yards off) and on one side of him, usually inside, squared up to that receiver. In zone, he stops at area depth (five to seven yards) in the space between receivers, and doesn’t seem to care which one is nearest.
  • Eyes. A man defender looks at his receiver; a zone defender looks into the backfield at the quarterback. On a tight shot you can often see which.
  • Everyone else. Man teams tend to show it elsewhere too: corners pressed or tight with inside leverage, a single deep safety. If one defender exchanged and the rest look like man, believe man.
  • After the snap. The final answer: man defenders turn and run with receivers, zone defenders drop to spots. That is a replay check, not a pre-snap one, but it is how you keep score.

One practical limit: the standard broadcast angle, the high sideline camera behind the offense that How to Watch a Broadcast described, usually shows the box and the slot defenders at the snap, but often not the far corner or the deep safeties. A linebacker walking out, or a nickel travelling, you can read live. A spin, or a corner on the far side, you usually confirm on the replay or the All-22.

Zone defenses that follow. Modern zones are pattern-matching coverages: each defender starts with an area but plays the receiver who comes into it like man coverage. Under some of those rules a defender follows the motion man a few steps before passing him on. The quarterback sees a defender move with the motion and thinks man; the coverage is zone.

Fake spins. A safety spins down with the motion, the quarterback concludes “one-high,” and at the snap the safety backs out again into a two-high shell. Defenses that disguise heavily rehearse every rotation from several starting pictures for exactly this reason.

That last counter is why offenses have pushed motion closer and closer to the snap. If the ball is snapped while the motion man is still running, the defense has to react once, at full speed, with no time for a second move. A defender who travels at the snap really is chasing; a safety who spins at the snap really is rotating. Motion at the snap doesn’t make the defense tell the truth, but it leaves much less time to lie.

Is the indicator wearing out, now that almost every offense motions on most plays and every defense has drilled its answers for years? Probably somewhat, but there is no clean public measure of it yet. Disguise, Rotation, and Split-Field Coverage shows how to measure a defense’s lie with tracking data, and Tendencies: PROE, Personnel, Motion, and Coverage how to check a team’s motion habits against its coverage. For watching, treat the indicator as one strong clue to combine with the shell and the alignment, never as the answer.

Job 2: changing the strength and the numbers

The second job of motion is simpler and older: change the formation after the defense has lined up against it.

Defenses align to the offense’s strength (usually the tight end’s side, or the side with more receivers), and they assign their pass defenders by counting receivers on each side. When a player crosses the formation, both of those change, and somebody on the defense has to move.

Show the Python
def numbers_play(after):
    off = [q.moved(w=-10.5) if q.key == "H" else q.moved(w=-16.0) if q.key == "X" else q for q in gun_2x1_te()]
    if after:
        off = [q.moved(d=-1.5, w=-7.5) if q.key == "Z" else q for q in off]
    dfn = front4() + [
        D("LCB", "CB", 7.0, -16.3, "CB"), D("RCB", "CB", 7.0, 15.5, "CB"),
        D("NB", "NB", 5.0, -10.8, "NB"), D("MIKE", "MIKE", 4.5, 1.2, "M"), D("WILL", "WILL", 4.5, -3.0, "W"),
        D("FS", "FS", 13.0, -9.0, "FS"), D("SS", "SS", 13.0, 9.0, "SS")]
    return Play(off, dfn, los=40, to_go=10)


BOX_L, BOX_R, BOX_D = -5.2, 6.8, 6.2    # the box: about 2 yd outside the LT to 2 yd outside the attached Y
fig, axes = plt.subplots(1, 2, figsize=(6.5, 4.15))
for ax, after in zip(axes, (False, True)):
    p = numbers_play(after)
    fld = p.draw(ax=ax, title=False, lateral=(-19.5, 19.5), window=(-7.5, 19.0))
    no_numbers(ax)
    P = P_of(fld, p)
    (x0, y0), (x1, y1) = P(0.3, BOX_L), P(BOX_D, BOX_R)
    ax.add_patch(Rectangle((min(x0, x1), min(y0, y1)), abs(x1 - x0), abs(y1 - y0), fc=style.DEFENSE, alpha=0.06,
                           ec=style.DEFENSE, lw=0.8, ls=(0, (4, 2)), zorder=1.7))
    if not after:
        tag(ax, P(-5.0, -13.0), "left: 2 v 2", ec=style.THIRD, lw=1.0, fs=7)
        tag(ax, P(-5.0, 12.0), "right: Z v CB", ec=style.THIRD, lw=1.0, fs=7)
        tag(ax, P(7.5, 0.8), "box: 6 v 6", fs=7)
        ax.set_title("1  Before: balanced", loc="left", fontsize=9, fontweight="bold", color=style.INK)
    else:
        ghost_marker(ax, *P(-1.5, 15.0), "Z", fld.pts_per_yard(), side="off")
        mpath(ax, P, [(-1.5, 15.0), (-2.6, 8.0), (-2.9, 0.0), (-2.5, -5.4), (-1.7, -6.9)])
        tag(ax, P(-5.6, -13.0), "left: 3 v 2", ec=style.DEFENSE_DARK, lw=1.2, fs=7)
        tag(ax, P(-5.0, 12.5), "right: CB v nobody", ec=style.DEFENSE_DARK, lw=1.2, fs=7)
        callout(ax, P, "a linebacker?\n(box 5 v 6)", (8.6, -1.0), (5.0, -2.8), fs=6.6)
        callout(ax, P, "a safety?\n(one-high)", (16.6, -14.0), (13.6, -9.4), fs=6.6)
        callout(ax, P, "the corner?\n(man)", (16.6, 13.5), (7.8, 15.3), fs=6.6)
        ax.set_title("2  After Z zooms across: who goes?", loc="left", fontsize=9, fontweight="bold",
                     color=style.INK)
fig.tight_layout(w_pad=0.6)
plt.show()
Figure 14.5: Motion forces the defense to rebalance. Left: two receivers on the left (X and H), and on the right the tight end (Y) attached to the line with Z outside him, against a two-high nickel defense. Count each group: the left has two receivers against two defenders (CB and NB), the right one receiver (Z) against one corner, and the shaded box six blockers (five linemen and Y) against six defenders. Every group is matched, which is what ‘balanced’ means here, even though the tight end makes the right the strength for the run. Right: Z zooms across and sets on the left as the third receiver, making it 3x1. If the defense doesn’t move, it is three receivers against two defenders on the left, and a corner on the right guarding nobody. Someone has to go left: a linebacker (and the box drops to five against six, good for the run), a safety (and the shell turns one-high), or the corner himself (man coverage, and the travel gives it away). Whichever moves, the spot he left is weaker.

This is the arithmetic every motion forces. The defense has eleven players, and each one it moves toward the motion comes from somewhere. If a linebacker walks out, the box gets lighter, and the run game gets the numbers advantage that A First Look at Defense taught you to count. If a safety rotates over, the deep coverage changes and the lone receiver on the other side may be in a one-on-one with no help over the top. If the corner follows, the coverage is man and the quarterback knows it. Offensive coordinators design motions to make the defense choose among those three, then call plays that attack whichever spot the defense gave up.

The trade does the same thing to the defensive front. Defensive linemen and linebackers set their alignment to the tight end: the bigger end lines up across from him, the strong-side linebacker walks out to his side, and the strong safety cheats toward him. When the tight end trades sides, all of that has to flip in the two or three seconds before the snap, which is why offenses that like to run at the strength love to trade at the last moment. A defense that flips late and loses a gap in the confusion is a run waiting to happen; a defense that refuses to flip has its strength on the wrong side. The defense does get one guaranteed beat: a trade is a shift, so the offense must then stand still for a full second. Defenses use it by declaring the strength late, not setting the front until the shift is over, and offenses answer by following the trade with a motion, the “shift, freeze, motion” sequence from The Pre-Snap Phase.

The shift to bunch attacks the coverage the same way. Most defenses have a pre-planned answer to a bunch, because man coverage against three receivers in a tight triangle invites collisions and picks. If the bunch appears with two seconds left, that answer has to be called, heard and applied by four or five defenders at once.

Motion changes the numbers for the run game too. A receiver or a fullback who motions toward the ball can become an extra blocker: a lead blocker through the hole, or a receiver arriving with momentum to crack back on the defender who has to set the edge. Either way the offense has added a blocker, or a better blocking angle, on the side of the run, and every player who arrives in the box adds a gap the defense must fill. The blocks themselves are taught in Zone Running and Perimeter Runs and Misdirection.

Why shift instead of motion?

The trade and the bunch are shifts, not motions, and a shift buys different things. Several players can move at once: the tight end, a back and a receiver can all change spots, so the offense can build a formation no single motion could reach (the strength flipped, the back on the other side, a receiver now on the line), and the defense has to re-declare almost everything. It also lets the offense line up in one look, watch the defense align to it, and then move into the formation it really wants. The price is the one-second freeze: after a shift everyone must be set for a full second, so the shift itself gives nobody a running start, and the defense gets a full beat to re-set. That is why the modern pattern is so often both: shift to change the formation, freeze, then motion one man to get the running start and ask the man-or-zone question.

Jobs 3 and 4: the running start and leverage

The third and fourth jobs are about the moment the ball is snapped, and they are really one idea: a player who is moving at the snap begins the play somewhere the defense didn’t plan for, at a speed the defense doesn’t have.

The running start

How big is a running start? You can estimate it with simple physics. A football player accelerates roughly like a sprinter: hard at first, then levelling off near his top speed. The chart below compares two receivers with the same top speed, one starting from a standstill and one already running at jet-motion pace when the ball is snapped.

Show the Python
TAU, VMAX = 0.55, 10.0
t = np.linspace(0, 2.0, 201)


def dist(v0):
    """Distance covered by t, starting at speed v0 and approaching VMAX exponentially."""
    return VMAX * t - (VMAX - v0) * TAU * (1 - np.exp(-t / TAU))


still, moving = dist(0.0), dist(7.0)
fig, ax = plt.subplots(figsize=(6.5, 2.8))
ax.plot(t, moving, color=style.OFFENSE, lw=2.2, label="Already moving at the snap (7 yd/s)")
ax.plot(t, still, color=style.MUTED, lw=2.2, label="Standing still at the snap")
for tt in (0.5, 1.0, 1.5):
    i = int(tt * 100)
    ax.plot([tt, tt], [still[i], moving[i]], color=style.INK_2, lw=0.9)
    ax.text(tt + 0.03, (still[i] + moving[i]) / 2, f"+{moving[i] - still[i]:.1f} yd", fontsize=7.4,
            color=style.INK, va="center")
ax.set_xlabel("Seconds after the snap", fontsize=8)
ax.set_ylabel("Yards covered", fontsize=8)
ax.set_xlim(0, 2.0)
ax.set_ylim(0, 20.5)
ax.tick_params(labelsize=7.5)
ax.legend(fontsize=7.5, loc="upper left")
plt.show()
Figure 14.6: The running start, in a simple model. Each receiver accelerates toward a top speed of 10 yards per second (about 20 mph), reaching about two-thirds of it in about half a second, which gives a 40-yard dash of about 4.5 seconds from a standstill. The standing receiver starts at 0; the one in jet motion is already moving at 7 yards per second when the ball is snapped. After one second the moving receiver has covered about 3 more yards than the standing one, and he keeps nearly all of that lead. A defender who reacts to the snap starts from zero as well, so motion at the snap turns a race into a head start. This is an illustrative model, not tracking data; the real numbers vary by player and by how fast the motion is.

Three yards in a second is enormous. It is the difference between a jet sweep that reaches the edge before the defensive end can widen and one that is tackled for no gain; between a receiver who is covered and one who is open. A defender can match a receiver’s speed. He can’t match a head start, because he isn’t allowed to have one: he must react to the snap like everybody else.

One catch: the head start points in the direction of the motion, which the rules make sideways or backward. A play that keeps going that way gets nearly all of it: a jet sweep, a flat route, a wheel up the sideline, a crack block. A receiver who has to turn upfield, or cut back the other way, spends some of it on the turn, and a return motion deliberately throws it away to punish the defender who matched it. That is why offenses kept looking for motions that end pointed nearly upfield at the snap, which is exactly what the “cheat motion” later in this chapter was about.

In the model, the lead depends on two things: how fast the motion is run, and how long the standing player still needs to reach top speed. That is why offenses with very fast receivers motion so much: a head start is worth most to receivers who run their motion at a high speed and still have a long acceleration phase ahead of them, and very fast receivers tend to do both. It’s also why defenses hate pressing a receiver who is in motion: press coverage (a defender lined up right on the receiver to jam him at the line) depends on getting hands on a man who is standing still. You can’t jam somebody who is already running past you.

Leverage: start where he didn’t plan for

Every defender aligns with leverage, a deliberate position inside or outside his receiver that tells him which way to force him and where his help is. That alignment is planned against a receiver who is standing still. Motion changes it in a way the defender can’t fully fix:

  • A defender who travels with motion is, by definition, behind the receiver in the direction he is moving. A receiver moving inside at the snap (glide motion) is already inside his defender, which helps routes that break inside. A receiver moving outside at the snap (orbit, rocket) is already outside his.
  • A defender who bumps is standing in a spot chosen for the old formation, a step or two from where he would have lined up if the offense had started in the new one.

The most famous way to exploit the first of these is the return motion.

Show the Python
def return_vs_man():
    off = line() + [O("QB", "QB", -5.0, 0.0, "Q"), O("RB", "RB", -5.0, -1.6, "R"),
                    O("X", "WR", -0.7, -13.0, "X"), O("H", "WR", -1.5, -7.5, "H"),
                    O("Y", "TE", -0.7, 4.8, "Y"), O("Z", "WR", -1.5, 13.0, "Z")]
    dfn = front4() + [
        D("LCB", "CB", 1.5, -13.0, "CB"), D("RCB", "CB", 2.5, 12.5, "CB"),
        D("NB", "NB", 2.5, -7.6, "NB"), D("SS", "SS", 3.6, 4.2, "SS"),
        D("FS", "FS", 5.6, -1.4, "FS"), D("MIKE", "MIKE", 3.3, 1.7, "M"), D("WILL", "WILL", 3.3, -2.6, "W")]
    p = Play(off, dfn, los=105, to_go=5)
    p.motion("Z", pts=[(-0.1, -2.8), (-0.2, -5.0)])                       # in toward the ball
    p.motion("RCB", pts=[(-0.1, -2.7), (-0.2, -4.8)])                     # travels with him
    p.route("Z", r.path((-0.2, 2.6), (0.8, 6.6), (3.2, 8.8), (6.8, 9.6)), side=1, speed=7.5)  # back out
    p.path("RCB", [(-0.1, -1.1), (-0.2, 1.8), (0.4, 5.5), (1.4, 8.0)], speed=5.6, delay=0.2)
    p.dropback(1.5)
    p.pass_to("Z", t=0.55)
    p.route("X", r.fade(9)); p.route("H", r.path((2.5, 0.5), (5.0, 3.0)))
    p.route("Y", r.path((2.5, -0.3), (4.0, -0.5)))
    p.block("RB", pts=[(0.6, 1.0)])
    for k, dw in (("LT", -0.5), ("LG", -0.2), ("C", 0.0), ("RG", 0.2), ("RT", 0.5)):
        p.block(k, pts=[(-1.0, dw)])
    for k in ("WDE", "WDT", "SDT", "SDE", "MIKE", "WILL"):
        p.rush(k, speed=2.6)
    p.path("LCB", [(1.5, -0.6), (5.0, -1.6)], speed=6.5)
    p.path("NB", [(1.0, -1.5), (2.5, -3.0)], speed=5.5)
    p.path("SS", [(1.0, -0.3), (2.0, -0.8)], speed=4.5)                    # man on Y
    p.path("FS", [(-1.0, -0.5)], speed=2.0)                               # has the back; the back blocks, so he sits
    p.highlight("RCB", color=style.THIRD)
    return schedule(p, {"Z": (-1.4, 0.0), "RCB": (-1.35, 0.0)})


show_play(return_vs_man(), [-1.4, 0.0, 0.4, 1.55],
          ["1 · Goal to go: Z starts in toward the ball", "2 · Snap: the corner (ringed) followed; Z plants",
           "3 · Z is going out; the corner is still going in", "4 · The ball arrives; the corner is a stride late"],
          phases([(-1.3, "goal to go, Cover 0: Z starts in motion"), (-0.05, "the corner travels with him"),
                  (0.25, "snap: Z plants and turns back out"), (0.9, "the corner is still moving the wrong way"),
                  (9, "the throw beats him toward the corner of the end zone")]),
          lateral=(-17.5, 22.5), window=(-7.5, 10.5), ghosts=("RCB",), ghost_t=-1.4)
Figure 14.7: Return motion against man coverage at the goal line (simulated, in Big Data Bowl tracking coordinates). The ball is at the 5, so the orange line here is the goal line and the shaded area beyond it is the end zone. The defense is in Cover 0: man coverage with nobody deep. The four linemen and both linebackers rush (six rushers), and the free safety (FS) has the running back, who stays in to block, so the safety just sits. Z motions in toward the ball and his cornerback (ringed) travels with him, still moving inward when the ball is snapped. Z plants and runs back out toward the corner of the end zone. The corner has to stop, turn around and restart, and by the time the quick throw arrives he is a stride behind. This is the idea behind the Chiefs’ ‘Corn Dog’ touchdowns in Super Bowl LVII (see the film room); the diagram is illustrative, not those plays.

Look at the defender’s problem in the third panel. A man defender’s whole technique is to mirror the receiver, and here the receiver has reversed direction at the one instant the defender can’t anticipate. Every step the corner took following the motion is now a step in the wrong direction. Against zone the same motion does little (the zone defenders bump and then sit in their areas), which is why return motion is called most often when the offense expects man coverage: near the goal line, on third-and-short, against blitzes.

The jet as a fake

Most jet motions end with the ball going to somebody else. That’s not wasted motion. A receiver sprinting across the formation at the snap is a threat to run a sweep, so the defenders responsible for the edge on that side must take a step toward him, and the linebackers’ eyes go with him. A run the other way, or a play-action pass behind the flowing linebackers, now has one fewer defender in its way, or one who is a step late. Offenses that run a lot of jet motion build their plays in pairs: the jet sweep itself, and the plays that take advantage of the defense respecting the jet sweep. That pairing, and why the sweep has to be run often enough to stay believable, is the subject of Perimeter Runs and Misdirection.

Job 5: stressing the defense’s communication

The fifth job doesn’t show up on a diagram, but defensive coaches talk about it constantly. Every change in the formation obliges the defense to re-communicate: the linebacker who makes the front call (usually the Mike, who tells the linemen which way to align) re-declares the strength; the safeties re-call the coverage check (the pre-planned adjustment of the called coverage to the formation in front of them, since many coverages change when a 2x2 becomes a 3x1); the corners confirm who has whom; and in a man defense the players involved have to agree in one word whether they’re travelling or exchanging.

All of that happens with the offense deciding when the ball moves. If the motion starts with ten seconds on the play clock, the defense has time. If it starts with three, and the ball is snapped as the motion man passes the quarterback, the defense has one chance to get every call right, often in a loud stadium. The typical failure isn’t dramatic: two defenders take the same receiver and nobody takes another, or a safety rotates the wrong way. But one blown assignment is usually all an NFL offense needs for a big play.

The stress runs both ways. The offense, too, has to execute the motion perfectly: the motion man has to start on the right signal, run at the right pace and be at the right spot when the ball is snapped, and the center has to snap it at precisely that moment. You can often see the machinery on the broadcast. In the shotgun, the quarterback commonly starts the motion with a leg lift or a tap of his heel or hand, with no words at all, and the snap then comes on a count the center and quarterback have timed to the motion man’s landmark.6 A motion that arrives early leaves the receiver standing and waiting; one that arrives late leaves the quarterback holding the snap while the defense sorts itself out. And a rhythm that never varies is one the defense can learn, which matters in the next section.

Motion at the snap

Everything above points to one conclusion: the later the motion, the more it’s worth. A motion that ends two seconds before the snap gives the defense two seconds to adjust, disguise and re-communicate. A motion that is still going when the ball is snapped gives it none. Through the late 2010s and 2020s, NFL offenses learned that lesson fast.

ESPN Analytics, which charts specifically whether a player is moving at the snap, found that the average team did it on about 4% of its plays in 2017 and about 22% in 2023.7 The 2023 Miami Dolphins, coordinated by head coach Mike McDaniel, were the extreme: early that season ESPN had them with a player in motion at the snap on 59% of plays, by far the most of any team since ESPN began tracking in 2017.8 By 2025 other offenses had caught up: according to Next Gen Stats, the Atlanta Falcons under offensive coordinator Zac Robinson led the league in 2025 with motion at the snap on 60.8% of their plays (and used some pre-snap motion on 70.1%, sixth in the league).9

Why is motion at the snap so valuable? Because it does jobs 3, 4 and 5 at full strength at once: the running start is at full value, the leverage can’t be fixed after the snap, and the defense’s adjustment, with its communication, has to happen in real time, with no time left to disguise.

And what does it cost? The motion man can’t be a pass blocker, and his route has to start from wherever the motion takes him. The timing has to be perfect on every snap. The quarterback gives up the chance to check the play after seeing the defense’s reaction: the information arrives in time for his read after the snap, not for his call before it. And it hands the defense one piece of information that defensive coordinators have learned to use: if the snap comes when the motion man reaches the quarterback, the defense knows when the snap is coming. A defense that times its own movement (a blitzer creeping up, a safety rotating) to the motion man’s arrival can move at the last instant without risking an offside penalty. Writing in January 2024, Ben Solak of The Ringer pointed out that the two defenses then meeting in the AFC Championship Game, Steve Spagnuolo’s Chiefs and Mike Macdonald’s Ravens, ranked first (Baltimore) and sixth (Kansas City) in EPA per play allowed on snaps with motion, according to Next Gen Stats, and that both made a habit of changing the whole picture as the motion triggered the snap.10 The arms race moves to the last half-second.

The “cheat motion” and the 2024 rule language

Motion at the snap reached the edge of the rulebook in 2023. Instead of sending a fast receiver all the way across the formation, the Dolphins (and soon the 49ers and Rams) lined him up tight, close to the tackle, and had him take a short, quick motion outward, toward his own sideline, just before the snap, so that he could turn upfield at full speed the instant the ball moved: a sprinter’s rolling start. Kyle Shanahan called it a “little cheat motion” and admitted the 49ers had copied it “in Week 2 after we saw it.”11 Reporters noticed that Tyreek Hill sometimes seemed to be turning upfield a fraction early, but he was never flagged for illegal motion all season.

Was it legal? The rule said a player may not be moving toward the line at the snap, and the officials judged that these motions were sideways at the moment the ball moved. For 2024 the league added language to the false-start rule that was widely reported as aimed at the trick. An eligible receiver who is on the line and moves backward or changes his stance (from a two-point to a three-point stance, or back) now has to come to a complete stop before the snap, or it’s a false start; a player in the backfield who changes his stance doesn’t have to stop, as long as his movement isn’t abrupt (a false start) or forward (illegal motion).12

Read that language next to the trick and you’ll notice they don’t quite meet. The cheat motion was run by a receiver who had to be off the line to go in motion at all, moving sideways; the new sentence is about receivers on the line stepping back or changing stance. League officials later told reporters exactly that: it was a clarification, not a rule change, aimed at abrupt stance changes, and it did not outlaw sideways motion that turns upfield at the snap. So the honest summary is that the cheat motion itself survived. What the clarification ruled out was a neighbouring way to steal a start: a receiver on the line rocking back or dropping into a stance at the last instant.

The rulebook: NFL, college and Canada

You have the NFL’s rule from the “You’ll need” box: one backfield player, moving parallel to or away from the line. Two details are worth adding.

First, a player who is on the line can’t go in motion at all without first getting off it, and that has real consequences. In Super Bowl LVII, when the Chiefs wanted to run their return-motion play a second time, Patrick Mahomes signalled for Kadarius Toney to go in motion, but Toney was lined up on the line of scrimmage and couldn’t. Toney pointed across the field at Skyy Moore, who was in the backfield, and Moore went instead; he scored the touchdown.13

Second, the rule’s purpose is the same as the one-second set’s: the offense may move before the snap, but it may not get a running start at the line of scrimmage. A sideways head start is allowed; a forward one isn’t.

Table 14.2: Motion rules in three codes. American college rules match the NFL’s in substance; Canadian rules are different in kind.
NFL NCAA (college) CFL (Canada)
Players in motion at the snap One One Any number of backfield players
Direction Parallel to or away from the line Not toward the opponent’s goal line Any direction, including toward the line
Who may move A backfield player A backfield player Backfield players (not the quarterback)

College football’s rule is essentially the same as the NFL’s: one player, not moving toward the opponent’s goal line at the snap, and a player who starts on the line has to become a back and come to a complete stop before he can go in motion.14 The big outlier is Canadian football. In the CFL, every backfield player except the quarterback may be in motion at the snap, in any direction, including forward.15 Canadian receivers routinely hit the line of scrimmage at full speed as the ball is snapped (a “waggle”), which is one reason the Canadian game, on a bigger field with twelve players a side, is so pass-heavy. If you’ve wondered what would happen if the NFL allowed forward motion, the CFL is the experiment: receivers that are nearly impossible to jam, and defenders who line up far off the ball to avoid being run past.

The motion boom, by the numbers

Motion is as old as the T formation (the Bears’ man in motion in the 1940 championship game is in The Pre-Snap Phase), and some coaches made pre-snap movement a signature long before it was fashionable. Tom Landry’s Cowboys of the 1960s to 1980s famously had their offensive linemen stand up in unison and then drop back into their stances while the backs shifted behind them, the “Landry shift,” partly to hide the new backfield alignment behind a wall of standing linemen.16 But for most of NFL history motion was a tool for particular plays, not a habit.

That changed in the late 2010s. Kyle Shanahan (49ers head coach from 2017) and Sean McVay (Rams head coach from 2017) built offenses in which motion was part of almost every call, and as their assistants became coordinators and head coaches around the league, the habit spread. By ESPN’s count, the 49ers used pre-snap motion on 69.1% of their plays from 2017 through 2021, the most in the league, and on 76.9% in 2021 alone, while the league as a whole rose from 34.9% (2017) to 46.8% (2021).17 PFF’s longer shift-or-motion series, which The Pre-Snap Phase quoted, shows the same climb to a record 63.9% in 2025, when every team except the Giants moved someone before at least half of its snaps.18

Why the boom? Three reasons, each from earlier in this chapter. Defenses started hiding their coverage better: Next Gen Stats measured two-high (split-safety) coverage on 32.9% of plays in 2018 and 42.0% in 2025, the highest since its tracking began,19 and two-high shells are built to rotate, so offenses needed a way to make them commit. The head start became more valuable as offenses filled with very fast receivers. And it worked visibly for the offenses that did it most, so it was copied.

Here is how the 32 teams moved, in FTN’s charting.

Show the Python
T = TEAM.sort_values(2025, ascending=True) * 100
fig, ax = plt.subplots(figsize=(6.5, 6.0))
y = np.arange(len(T))
FOCUS = {"MIA", "SF", "LA", "KC", "ATL", "NYG"}
for yi, (team, row) in zip(y, T.iterrows()):
    ax.plot([row[2022], row[2025]], [yi, yi], color=style.GRID, lw=2.2, zorder=1, solid_capstyle="round")
    ax.plot([row[2023], row[2024]], [yi, yi], ls="", marker="|", ms=6, color=style.MUTED, zorder=2)
    ax.plot(row[2022], yi, ls="", marker="o", ms=5.2, mfc=style.SURFACE, mec=style.OFFENSE, mew=1.2, zorder=3)
    ax.plot(row[2025], yi, ls="", marker="o", ms=5.6, color=style.OFFENSE_DARK, zorder=3)
for yr, txt in ((2022, "league 2022"), (2025, "league 2025")):
    v = LEAGUE[yr] * 100
    ax.axvline(v, color=style.INK_2, lw=0.8, ls=(0, (3, 2)), zorder=0)
    ax.text(v + 0.6, len(T) - 0.2, f"{txt}\n{v:.1f}%", fontsize=6.8, color=style.INK_2, ha="left", va="bottom")
ax.set_yticks(y, T.index, fontsize=7)
for lab in ax.get_yticklabels():
    if lab.get_text() in FOCUS:
        lab.set_fontweight("bold")
        lab.set_color(style.INK)
mia = T.loc["MIA"]
ax.annotate(f"MIA 2023: {mia[2023]:.1f}%", xy=(mia[2023], y[list(T.index).index("MIA")]),
            xytext=(83.5, y[list(T.index).index("MIA")] - 3.2), fontsize=7, color=style.INK, ha="right",
            arrowprops=dict(arrowstyle="-", color=style.MUTED, lw=0.7))
ax.set_xlim(15, 85)
ax.set_ylim(-0.8, len(T) + 1.6)
ax.set_xlabel("Plays with motion (%)", fontsize=8)
ax.tick_params(axis="x", labelsize=7.5)
ax.grid(axis="y", visible=False)
hs = [Line2D([], [], ls="", marker="o", ms=5.2, mfc=style.SURFACE, mec=style.OFFENSE, mew=1.2, label="2022"),
      Line2D([], [], ls="", marker="|", ms=6, color=style.MUTED, label="2023, 2024"),
      Line2D([], [], ls="", marker="o", ms=5.6, color=style.OFFENSE_DARK, label="2025")]
ax.legend(handles=hs, fontsize=7.2, loc="lower right", ncol=3)
plt.show()
Figure 14.8: Share of each offense’s plays with motion, NFL regular seasons 2022–2025, in FTN’s charting (is_motion: motion before or at the snap; runs and passes only). Teams are sorted by 2025 and labelled with their standard abbreviations (LA is the Rams, LAC the Chargers); the teams this chapter discusses (MIA, SF, LA, KC, ATL, NYG) are in bold. Hollow circles are 2022, small grey ticks 2023 and 2024, filled circles 2025; the dashed lines are the league averages for 2022 and 2025. Almost every offense moved more in 2025 than in 2022. The 2023 Dolphins (79.4%) are the highest team-season in the four years. Only the Giants moved on fewer than 40% of their plays in 2025. Source: nflverse FTN charting and play-by-play; course calculation.

The league average rose from about 38% to 55% in four seasons in FTN’s data, and the spread between teams is wide: the Dolphins, 49ers, Rams and Falcons sat near the top for most of the period, while the Giants were the one 2025 offense below 40%. Notice how some teams jumped as soon as they changed play-callers: the Saints went from about 30% to 51% in 2024, Klint Kubiak’s first season as their offensive coordinator, and the Eagles from 23% to 44% in Kellen Moore’s. Motion is a coaching choice more than a personnel one; it follows the play-caller.

Why the motion numbers disagree

You will see wildly different “motion rates” quoted for the same season: 22%, 55%, 64%. They are not contradictions. They are different measurements.

Show the Python
SERIES = [
    ("PFF: shift or motion", {2014: 37.6, 2016: 38.4, 2018: 43.0, 2019: 46.8, 2020: 50.0, 2021: 51.8, 2022: 55.4,
                                   2023: 56.4, 2024: 61.5, 2025: 63.9}, True),
    ("FTN: motion by the snap", {yr: LEAGUE[yr] * 100 for yr in SEASONS}, True),
    ("ESPN: motion at the snap", {2017: 4.0, 2023: 22.0}, False),
]
fig, axes = plt.subplots(1, 3, figsize=(6.5, 2.55), sharey=True)
for ax, (ttl, ser, solid) in zip(axes, SERIES):
    xs, ys = list(ser), list(ser.values())
    if solid:
        ax.plot(xs, ys, color=style.OFFENSE, lw=1.8, marker="o", ms=3.4)
    else:
        ax.plot(xs, ys, color=style.OFFENSE, ls="", marker="o", ms=4.8, mfc=style.SURFACE, mew=1.3)
    for x_, y_ in ((xs[0], ys[0]), (xs[-1], ys[-1])):
        ax.text(x_, y_ + 3.2, f"{y_:.0f}%" if solid else f"~{y_:.0f}%", fontsize=7, ha="center", color=style.INK)
    ax.set_title(ttl, fontsize=7.8, loc="left")
    ax.set_xlim(2013.3, 2025.9)
    ax.set_xticks([2014, 2018, 2022, 2025])
    ax.tick_params(labelsize=6.8)
    ax.grid(axis="x", visible=False)
axes[0].set_ylim(0, 75)
axes[0].set_ylabel("Share of plays (%)", fontsize=7.5)
fig.tight_layout(w_pad=0.6)
plt.show()
Figure 14.9: Three published motion series, each on its own panel because they measure different things. PFF counts any pre-snap shift or motion (2014–2025). FTN’s is_motion counts plays with motion before or at the snap, charted by FTN (2022–2025, course calculation from nflverse). ESPN Analytics counts a player in motion at the moment of the snap; only two league-average points are published in the sources used here (2017 and 2023), drawn as hollow, unconnected points because they come from press reports, not a data file. All three rise; the levels differ because the definitions do. Never plot them on one axis as if they were one series.

Four things make the numbers differ, and each is worth knowing before you quote one:

  1. What counts as movement. PFF counts shifts and motion. FTN’s is_motion flag means “motion occurred on the play before or at the time of the snap.” ESPN’s headline series counts only a player still moving at the snap, a much smaller set. Next Gen Stats publishes yet another pair, total pre-snap motion and motion at the snap: Atlanta’s 70.1% and 60.8% in 2025, quoted above.
  2. Who or what does the charting. PFF and FTN use human charters watching video; Next Gen Stats uses the player-tracking chips. A human charter and a tracking threshold can disagree about whether a receiver’s two-step shuffle “counts.”
  3. Which plays are in the denominator. All snaps, or only runs and passes? Are kneel-downs, spikes and penalty-only plays included? Playoffs? These shift a rate by a point or two.
  4. Which seasons exist. FTN’s charting in nflverse starts in 2022, ESPN’s motion-at-the-snap series in 2017, PFF’s runs back further.

The rule this book follows: every motion number carries its source, and two sources never share an axis. When you compare teams or seasons, compare them inside one series.

Does motion work?

The honest answer is “yes, but not in the way a simple average suggests.” In FTN’s data, plays with motion and plays without it look surprisingly alike. On first and second downs in 2025, passes with motion averaged about +0.10 EPA per play against +0.06 without, and runs about −0.05 against −0.08; in 2024 the two were nearly identical, and in 2022 passes without motion did better.20 Teams that motion more did have slightly better offenses in each of the four seasons, but the relationship is loose.

CautionCommon misconception

“Motion plays gain more, so offenses should motion on every play.” The averages above don’t show that, and even if they did, the comparison wouldn’t prove it. Offenses choose when to motion: some save it for their best-designed plays, some motion on almost everything, and defenses adjust to teams that motion a lot. The plays with and without motion aren’t a controlled experiment. Other comparisons find more: ESPN’s numbers for 2017–2023, as reported by The Ringer in 2024, had runs with motion at the snap gaining about 0.11 EPA per play more than runs with no motion, and dropbacks about 0.08 more.21 That is a simple with-and-without comparison too, though, so it carries the same caution. Part of motion’s value is also invisible in its own plays: a motion that always meant “run” would be a tell, so offenses use the same motions on different plays to keep the defense from reading them. Measuring that kind of value is part of Tendencies: PROE, Personnel, Motion, and Coverage.

Film room

NoteFilm room: Miami Dolphins 2023, motion at the snap

No offense in the tracking era moved like Mike McDaniel’s 2023 Dolphins. In FTN’s charting they used motion on 79.4% of their runs and passes, the highest team-season from 2022 to 2025; ESPN had them with a player in motion at the snap on 59% of plays early that season, a record. They scored 70 points against Denver in Week 3, and Tyreek Hill led the NFL with 1,799 receiving yards.22

What to notice when you watch the film: the motion is short and timed. Hill or Jaylen Waddle moves a few yards, sometimes in toward the formation, sometimes out toward the sideline (the “cheat” version), and the ball is snapped as he gets going. The defense rarely gets a clean look at its own assignment, and Hill starts every route already running. Then watch the defenses that slowed Miami down. The Chiefs, who beat the Dolphins twice that season (in Frankfurt in November and in the wild-card round), mostly refused to chase: in the November game they played zone on a season-high 61% of Miami’s dropbacks, by ESPN’s count, with Steve Spagnuolo’s instruction to keep “22 eyeballs” on Hill, and L’Jarius Sneed matched Hill when they did play man.23 McDaniel was let go by Miami in January 2026 and is the Chargers’ offensive coordinator for the 2026 season.

NoteFilm room: Kansas City Chiefs, Super Bowl LVII (February 12, 2023)

Two of the most famous motion plays of the decade came less than three minutes of game clock apart. In the fourth quarter against the Eagles, Kansas City ran a play its coaches call “Corn Dog”: a receiver motions in toward the formation, then turns and runs back toward the sideline at the snap, a return motion built to beat man coverage. Kadarius Toney caught a 5-yard touchdown on it with 12:04 left to give the Chiefs the lead, and Skyy Moore scored from 4 yards on a mirrored version at 9:22. Both times the Eagles were in man coverage, the defender went with the first move, and the receiver was alone when he turned around. Kansas City won 38–35. A year later in Super Bowl LVIII the Chiefs ran a renamed relative of the play for Mecole Hardman’s winning touchdown in overtime.24

What to notice: the motion does two jobs on one play. First it asks the question (did the defender follow?), and then it attacks the answer (the defender who followed is moving the wrong way). Andy Reid’s offense has used motion that way for years, including orbit motion that loops a receiver behind the quarterback and out to the flat, pulling defenders with him while the real target comes open elsewhere.25

NoteFilm room: San Francisco 49ers 2021, Deebo Samuel

In 2021 the 49ers motioned on 76.9% of their plays, the most in the league by ESPN’s count. Much of it went through Deebo Samuel, a wide receiver who spent part of the season lining up and motioning into the backfield. Motion let Shanahan move Samuel from receiver to ball carrier and back again before the snap, so the defense never knew which position it was defending. He caught passes for 1,405 yards and ran for 365 more, with eight rushing touchdowns.26

What to notice: the motion creates the matchup. When Samuel motioned from a receiver spot into the backfield, the defender assigned to him in man coverage had to follow him into the box, where a cornerback or safety is suddenly playing run defense against a 215-pound receiver with a head start. Against zone, the defense now faced a backfield with two ball carriers in it, one of them very fast, and had to respect both.

NoteFilm room: Los Angeles Rams 2017–2025, the same look, different plays

McVay’s Rams were not the league’s most frequent motion team in his first seasons (ESPN had them eighth from 2017 to 2021), but they made the jet motion famous, and by 2024 FTN charted them with motion on 76.7% of their plays, the highest in the league that season. The Rams’ trademark is pairing: over a game, the same jet look comes before an outside-zone run, a jet sweep and a play-action pass, so the motion tells the defense nothing about the play. What to notice: the play was called in the huddle, so the defense’s reaction doesn’t change this play; it tells you which one should work. Watch the linebackers when the jet man crosses the quarterback. If they jump toward him, the run the other way should hit; if they stay home, expect the Rams to give it to the jet man on a later snap.

The checklist so far

Part 2 ends here, and with it the first version of the card you will carry through the rest of the book. Each line is a question you can answer before the snap, in the order the answers become visible on a broadcast (the order Personnel introduced): the situation first, then who is on the field, then where they line up, then what the motion draws out of the defense, then the box and the safeties.

Show the Python
items = [
    ("BEFORE THE SNAP", None, None, False),
    ("1", "Situation: down, distance, field zone, clock and score", "Part 1", False),
    ("2", "Personnel: who is on the field for each side (two digits for the offense; base, nickel or dime)",
     "02-01, 02-05", True),
    ("3", "Formation and strength: under center or gun, 2x2 or 3x1, where is the tight end?", "02-02 to 02-04", True),
    ("4", "Motion: does a defender travel (man)? Do they bump (zone, unless the slid defenders end up tight "
          "on one man: an exchange)? Does a safety spin (one-high)? Is the ball snapped while he's still moving?",
     "02-06", True),
    ("5", "Box count: blockers against defenders near the line (light box: run; loaded box: pass)", "02-05", True),
    ("6", "Shell: one-high or two-high? Did the motion change it?", "02-05, 02-06", True),
    ("AFTER THE PLAY", None, None, False),
    ("7", "Log it: your run/pass and man/zone calls against what happened", "01-06, 02-06", False),
]
rows = []
for num, text, where, new in items:
    if text is None:
        rows.append(("head", num, 1))
    else:
        lines_ = textwrap.wrap(text, 62)
        rows.append(("item", (num, lines_, where, new), len(lines_)))
n_lines = sum(h for _, _, h in rows) + 4
fig, ax = plt.subplots(figsize=(6.5, 0.24 * n_lines))
ax.set_xlim(0, 100); ax.set_ylim(0, n_lines); ax.axis("off")
ax.add_patch(FancyBboxPatch((0.8, 0.3), 98.4, n_lines - 0.6, boxstyle="round,pad=0.2,rounding_size=0.8",
                            fc=style.SURFACE, ec=style.BASELINE, lw=1.2))
ax.text(3, n_lines - 1.3, "Watching checklist · after Part 2", fontsize=11, fontweight="bold", color=style.INK,
        va="center")
ax.text(97, n_lines - 1.3, "new in Part 2", fontsize=8, color=style.INK_2, ha="right", va="center",
        bbox=dict(boxstyle="round,pad=0.3", fc=style.OFFENSE_TINT, ec="none"))
yy = n_lines - 2.8
for kind, payload, h in rows:
    if kind == "head":
        ax.text(3, yy, payload, fontsize=8, fontweight="bold", color=style.INK_2, va="center")
        yy -= 1.0
        continue
    num, lines_, where, new = payload
    top, bottom = yy + 0.45, yy - (h - 1) - 0.45
    if new:
        ax.add_patch(FancyBboxPatch((2.2, bottom), 95.6, top - bottom, boxstyle="round,pad=0.05,rounding_size=0.4",
                                    fc=style.OFFENSE_TINT, ec="none"))
    ax.text(5.5, yy, num, fontsize=8.5, fontweight="bold", color=style.OFFENSE_DARK, va="center", ha="center")
    for j, ln in enumerate(lines_):
        ax.text(9.0, yy - j, ln, fontsize=8, color=style.INK, va="center")
    ax.text(97, yy, where, fontsize=7, color=style.INK_2, va="center", ha="right")
    yy -= h + 0.15
plt.show()
Figure 14.10: The watching checklist after Part 2. Line 1 comes from Part 1; lines 2 to 6 are the pre-snap reads Part 2 taught, in the order they become visible during a snap; line 7 is the habit from How to Watch a Broadcast. The motion line is this chapter’s. The card grows after Parts 4, 6 and 7, and becomes the master checklist of the capstone.

Two habits make the card work. Say each answer out loud, or write it down, before the snap. A guess you didn’t commit to can’t teach you anything. And read the lines in order. The motion line comes after the formation line because you can’t interpret a defender’s reaction until you know what the motion did to the formation; the shell line comes last because the motion may have changed it.

Watch for it on Sunday

TipWatch for it: follow the motion

For one quarter, every time an offensive player moves before the snap, do four things.

  • Name it. Jet, orbit, return, zoom, glide, short, a trade, a shift? If you aren’t sure, describe the path (“across, in front of the quarterback”).
  • Watch who follows. Pick up the defender who was across from the motion man before he moved. Did that defender travel across (T), did the defenders bump over (B), did a safety spin (S)? Write the letters. If it was a bump, look at where the slid defender stopped: tight on one man (an exchange, so man) or in a space between receivers (zone)?
  • Call it. Man or zone? One-high or two-high at the snap? Write your call before the ball is snapped.
  • Note the timing. Was the ball snapped while he was still moving (motion at the snap), or did he set first?

Then check your calls on the replay, or better, on the All-22 film, which shows the whole secondary. Add a column for it in your prediction log from How to Watch a Broadcast. After a few games you’ll notice two things: travellers are rarer than you expect (many man defenses exchange instead), and your calls get better when the motion is at the snap.

Predict the play

TipPredict the play 1: who went with him?
Show the Python
off = gun_2x2_spread()
dfn = front4(sde=5.0) + [
    D("LCB", "CB", 5.5, -15.5, "CB"), D("RCB", "CB", 5.5, 15.5, "CB"), D("NB", "NB", 4.8, -9.5, "NB"),
    D("MIKE", "MIKE", 4.5, 1.5, "M"), D("WILL", "WILL", 4.5, -2.5, "W"), D("SS", "SS", 13.0, 8.5, "SS"),
    D("FS", "FS", 13.0, -8.5, "FS")]
q = Play(off, dfn, los=45, to_go=7)
q.motion("H", pts=[(-1.0, 5.0), (-1.3, 14.0), (-0.5, 20.0), (-0.5, 21.0)])
q.motion("NB", pts=[(0.2, 4.0), (0.3, 12.0), (0.2, 20.0), (0.1, 21.5)])
dashed_motion(q, "SS", (9.2, -0.5))
dashed_motion(q, "FS", (14.0, -0.5))
q.highlight("NB", color=style.THIRD)
fld = q.draw(lateral=(-20.5, 20.5), window=(-7.5, 17.5), title=False)
no_numbers(fld.ax)
P = P_of(fld, q)
callout(fld.ax, P, "snap as H\narrives", (-5.6, 15.0), (-2.2, 12.0), fs=7.2, ec=style.THIRD)
plt.show()
Figure 14.11: Second-and-7. Before the motion the defense shows two deep safeties. Then H, in the left slot, motions across the formation, and the nickel back (NB, ringed) runs with him the whole way. As he does, the safety on the right (SS) comes down to about 8 yards in the middle of the field and the safety on the left (FS) slides over to the deep middle. Dashed paths are pre-snap movement. The ball is snapped as H reaches the right side.

Man or zone? How many deep safeties? And what does the offense like about the picture?

Man coverage, with one deep safety: Cover 1, almost certainly. Two things happened at once. The nickel back travelled with H all the way across the formation, which a zone defender has no reason to do: that says man. And the safeties spun: the two-high picture turned into one safety in the deep middle and one at 8 yards in the middle of the field, a classic spot for a “robber” who lurks underneath looking for crossing routes (see Man Coverage). Notice that this spin didn’t drop the safety out toward the motion side; it dropped him into the middle. Spins vary in where the down safety lands; the part that matters for your call is that two deep became one. Travel plus spin is the signature of man coverage disguised as two-high before the motion.

What the offense likes: H’s defender is now behind and inside a receiver who is moving toward the sideline at full speed. A flat route, a wheel up the sideline, or a quick throw to H the instant the ball is snapped all start as races the nickel back is losing. On the other side, X is alone with his corner, and with the single deep safety in the middle there is no help over the top on the outside. Man coverage also means most defenders have their backs turned to the quarterback, so a quarterback who can run has open grass if the routes clear out the middle.

The caution: a robber in the middle is there precisely to jump the crossing routes that beat man coverage, so throwing a shallow cross into him is the mistake the defense is hoping for.

TipPredict the play 2: the third-quarter jet
Show the Python
off = gun_2x1_te()
dfn = front4() + [
    D("LCB", "CB", 7.0, -15.5, "CB"), D("RCB", "CB", 7.0, 15.5, "CB"), D("NB", "NB", 5.5, -10.0, "NB"),
    D("MIKE", "MIKE", 4.5, 1.2, "M"), D("WILL", "WILL", 4.5, -2.5, "W"),
    D("FS", "FS", 13.0, -9.0, "FS"), D("SS", "SS", 13.0, 9.0, "SS")]
q = Play(off, dfn, los=40, to_go=10)
q.motion("Z", pts=[(-0.9, -5.0), (-1.4, -10.0), (-1.5, -12.6)])
dashed_motion(q, "WDE", (1.0, -3.4))
q.highlight("MIKE", "WILL", "WDE", color=style.THIRD)
fld = q.draw(lateral=(-20.5, 20.5), window=(-7.5, 15.5), title=False)
no_numbers(fld.ax)
P = P_of(fld, q)
callout(fld.ax, P, "linebackers:\nsame spots", (9.5, -6.5), (5.0, -1.6), ec=style.THIRD)
callout(fld.ax, P, "end: shifts\ninside", (-4.5, -11.0), (0.7, -3.9), ec=style.THIRD)
plt.show()
Figure 14.12: Third quarter, first-and-10. Six times in the first half the offense ran this exact jet motion by Z and handed the ball to the running back going the other way. This time, as Z starts across, the defensive end on the side he is heading to (E, ringed) shifts his alignment about a yard and a half inside, and the two linebackers (ringed) stay on their spots. The nickel (NB) is over H, the left corner (CB) 7 yards off X, and the safeties 13 yards deep, one on each side. Z is 2 yards from the quarterback when the ball is snapped.

What should the offense call here, and why does it work only because of the first half?

Give the ball to Z: the jet sweep itself. The defense has learned that the jet is a fake and the run is coming the other way, so it has stopped spending players on the jet. The linebackers stay home to play the running back, and the end on Z’s side has pinched inside to close the back’s path, a pre-snap tell that he means to crash. Now count the jet side. H blocks the nickel, who is the defender responsible for turning the play back inside (the force player); X stalks the corner; and the only unblocked defender left on that side is the safety 13 yards deep, too far away to get to the edge before Z does. Z already has a head start; with the end inside and nobody flowing with him, he gets the corner.

That is the logic of jet motion as a constraint: the fake is only worth something if the real thing is a threat. Run the inside handoff enough and the defense ignores the jet; run the jet when it does. Offenses build their game plans around exactly this pairing (more in Perimeter Runs and Misdirection and Constraint Theory and Sequencing). The defense’s counter is to keep at least one player honest on the jet side: a safety who spins toward the motion, as in the zone animation earlier, would have been waiting.

TipPredict the play 3: nobody went with him
Show the Python
RB_SET, SS_SET, M_SET = (-1.5, 12.3), (1.6, 11.6), (3.0, 8.2)
off = [q.moved(d=RB_SET[0], w=RB_SET[1]) if q.key == "RB" else q for q in gun_2x2_spread()]
dfn = front4(sde=5.0) + [
    D("LCB", "CB", 7.5, -15.5, "CB"), D("RCB", "CB", 7.5, 15.5, "CB"), D("NB", "NB", 5.0, -9.5, "NB"),
    D("SS", "SS", *SS_SET, "SS"), D("MIKE", "MIKE", *M_SET, "M"), D("WILL", "WILL", 4.5, -3.0, "W"),
    D("FS", "FS", 13.5, 0.0, "FS")]
q = Play(off, dfn, los=45, to_go=6)
q.highlight("SS", "MIKE", color=style.THIRD)
fld = q.draw(lateral=(-20.5, 20.5), window=(-7.5, 16.5), title=False)
no_numbers(fld.ax)
P = P_of(fld, q)
ghost_marker(fld.ax, *P(-5.0, -1.6), "R", fld.pts_per_yard(), side="off")
mpath(fld.ax, P, [(-5.0, -1.6), (-4.6, 2.4), (-3.2, 8.0), (-2.2, 11.0), (-1.7, 11.7)])
for start, end, lab in (((7.5, 8.0), SS_SET, "SS"), ((4.5, 0.8), M_SET, "M")):
    ghost_marker(fld.ax, *P(*start), lab, fld.pts_per_yard())
    dpath(fld.ax, P, start, end)
callout(fld.ax, P, "box: 5 defenders", (10.0, -7.0), (4.6, -3.0))
plt.show()
Figure 14.13: Third-and-6. The running back (R) motions out of the backfield and sets wide on the right, between Y and Z, leaving the backfield empty. Nobody follows him across. The strong safety (SS, ringed), who was 7 yards deep over Y, slides out and stops about 3 yards in front of the back, just inside him. The Mike linebacker (M, ringed) slides out of the box and stops about 4 yards in front of Y, just inside him. One deep safety (FS) stays in the middle. Dashed paths are pre-snap movement; dashed outlines are where the two defenders started.

The running-back test said that in man coverage a linebacker walks out with the back. Nobody did. Is this zone? Look at where the two defenders who slid ended up.

Probably still man coverage, Cover 1, played with an exchange. Nobody travelled, so the first-glance read is zone, and that is exactly what the defense wants you to think. But look at where the slid defenders stopped. The strong safety is three yards in front of the back and just inside him, squared up on one man. The Mike is four yards in front of Y and just inside him, also squared up on one man. Zone defenders on that side would have stopped at area depth, five to seven yards, between Y and the back, waiting for whoever came into their space. Two defenders each pairing up with one receiver is man coverage; the defense simply passed the back to the safety and pushed the Mike out onto Y instead of sending the Mike across with the back.

So the running-back test needs one refinement: the tell isn’t “the Mike walks out”, it’s “a box defender leaves to take a receiver”. Here one did, just not the one you were watching. The box is down to five defenders (four linemen and the Will) against five blockers, with one deep safety behind them.

What the offense likes: a linebacker in man coverage on Y in open space, and a safety on a running back, are both matchups the offense created on purpose; a quick option route by Y or an out by the back is often the first read. With every defender’s back turned and the middle thinned, a quarterback scramble is open on third-and-6. The caution: an empty backfield leaves no back to pick up an extra rusher, so if the Will or the nickel blitzes, the ball has to come out quickly (see Pass Protection). And if at the snap the safety and the Mike drop instead of turning to run with their men, the read was wrong: log it, and look for what you missed.

Takeaways

  • Motion is never decoration. Every motion does at least one of five jobs: it asks man or zone?, changes the strength and the numbers (receivers or blockers), gives a running start, creates leverage, or stresses the defense’s communication. A shift moves several players and rebuilds the formation, but it costs a one-second freeze and gives nobody a running start.
  • Learn the shapes, not just the names. Jet, fly and orbit cross the formation (in front of, behind, and looping behind the quarterback); rocket sprints a back to the edge; return goes and comes back; zoom crosses and sets; glide comes in and is still moving at the snap, short motion comes in and sets; a trade or a shift to bunch rebuilds the formation. Names vary by playbook.
  • Read the answer, then check it. A defender who travels suggests man; defenders who bump suggest zone; safeties who spin turn two-high into one-high. But a man defense can exchange, sliding over just like a zone, so look at where the slid defenders stop: tight on one receiver means man, sitting in a space between receivers means zone. Pattern-matching zones can follow, and safeties can spin back. This read is line 4 of the checklist so far: situation → personnel → formation and strength → the motion response → box → shell, then log it.
  • The later the motion, the more it’s worth. Motion at the snap gives a running start worth about three yards in the first second (in the direction of the motion) and leaves the defense no time to disguise, but it also leaves the quarterback no time to check the play. NFL use of it rose from about 4% of plays in 2017 to over 20% by 2023 (ESPN).
  • The rules shape the motion. American rules allow one backfield player moving sideways or back at the snap; Canadian rules let backs move forward. The 2024 NFL language on receivers who change stance on the line was a clarification that left the sideways “cheat motion” legal.
  • Motion numbers depend on the source. PFF (any shift or motion: 63.9% in 2025), FTN (motion before or at the snap: 55.1%), ESPN and Next Gen Stats (motion at the snap) all measure different things. Quote one source at a time.

Connections

Builds on: The Pre-Snap Phase (the rules of the set, the shift and motion, and the first look at why motion exists), Spread and Modern Formations (2x2, 3x1, bunch, stack and empty, the formations motion moves between), and A First Look at Defense (man and zone, one-high and two-high, the box), with Personnel and Formation Rules and the Language of Alignment behind the checklist’s early lines.

Sets up: Perimeter Runs and Misdirection (the jet sweep, the reverse and the plays that live off the jet fake); Coverage Fundamentals and Man Coverage (what travelling and exchanging look like from the defense’s side); Disguise, Rotation, and Split-Field Coverage (how defenses make the motion indicator lie, and the full anatomy of the spin); Play-Action, Bootlegs, and Screens (motion that sells a run); Constraint Theory and Sequencing (why the jet has to be real for the fake to work); and Tendencies: PROE, Personnel, Motion, and Coverage (measuring a team’s motion habits yourself). Case studies with motion at their heart: Shanahan’s wide-zone tree and Andy Reid’s Chiefs.

NoteGo deeper
  • Big Data Bowl 2025 was built around exactly this chapter’s question: what pre-snap movement reveals about the play. Its files include, for every player on every play from the first nine weeks of 2022, flags for whether he was in motion at the snap and whether he shifted or went in motion after the line set. Once you have the files, this is how you’d start:
Show the Python (Big Data Bowl 2025: motion flags and coverage)
import pandas as pd
from gridiron import bdb, show_animation

pp = pd.read_csv("data/bdb/player_play.csv")      # one row per player per play
plays = pd.read_csv("data/bdb/plays.csv")         # one row per play, with PFF's coverage labels
FLAGS = ["inMotionAtBallSnap", "motionSinceLineset", "shiftSinceLineset"]
KEYS = ["gameId", "playId"]
flags = pp.groupby(KEYS)[FLAGS].max().reset_index()          # True if any player did it
flags = flags.merge(plays[KEYS + ["possessionTeam", "pff_manZone"]], on=KEYS)
print(flags[FLAGS].mean())                                   # share of plays with each
print(pd.crosstab(flags.inMotionAtBallSnap, flags.pff_manZone, normalize="index"))

# animate one play with motion at the snap, drawn like this chapter's diagrams
trk = bdb.load_tracking("data/bdb/tracking_week_1.csv")
wk1 = flags[flags.gameId.isin(trk.gameId.unique())]          # only plays in the week-1 file just loaded
g, pl = wk1.loc[wk1.inMotionAtBallSnap == True, KEYS].iloc[0]
show_animation(bdb.prepare(trk, plays, game_id=g, play_id=pl))
  • Ben Solak’s January 2024 piece in The Ringer on how the Chiefs’ and Ravens’ defenses answered motion, and Nick Wagoner and Lindsey Thiry’s 2022 ESPN piece on Shanahan’s and McVay’s motion habits (both linked in the notes).
  • Chris B. Brown, The Art of Smart Football (2015), for the older roots of motion and shifts in offensive design.

  1. Nick Wagoner and Lindsey Thiry, “49ers’ Kyle Shanahan and Rams’ Sean McVay always thinking pre-snap motion,” ESPN (Jan. 29, 2022): 49ers 69.1% pre-snap motion 2017–2021 (first), Rams 46.3% (eighth); 2021: 49ers 76.9% (first), Rams 47.4%; league 34.9% (2017) to 46.8% (2021); quotes from Shanahan and McVay: https://www.espn.com/nfl/story/_/id/32598845/↩︎

  2. Definitions of jet, orbit and return motion as coaches teach them: Ryan Swingle, “Install Motion Into Your Offense (Coaching Guide),” Viqtory Sports (updated Jan. 27, 2026): https://www.viqtorysports.com/pre-snap-movement-in-the-offense/ . The guide notes that jet motion is “also known as the ‘Fly’ motion in some terminology, especially in the Wing-T.” Glide, zoom and short (rip/liz) motion have no single published standard; the meanings used here are this book’s convention, and individual playbooks differ.↩︎

  3. “Sweep (American football),” Wikipedia, on the shotgun jet sweep: “the pitch is considered a forward pass, resulting in an incomplete pass rather than a fumble if the ball is dropped”: https://en.wikipedia.org/wiki/Sweep_(American_football) . The NFL’s forward-pass rules are in Rule 8 (Forward Pass, Backward Pass, Fumble) of the rulebook: https://operations.nfl.com/the-rules/nfl-rulebook/↩︎

  4. In the flexbone rocket toss the backside A-back (slotback) leaves in fast motion about a second before the snap (“If the cadence is Down, Ready, Set-hut, the Backside A-back leaves after the Down”) and the quarterback pitches to him at the edge: “Flexbone Triple Option Offense Coaching: Drilling the Rocket Toss with the Skill Positions,” Triple Option Football (Oct. 13, 2013): https://tripleoptionfootball.com/?p=1496 . The use of “rocket” for a running back’s fast motion out of a shotgun backfield is playbook dialect, not a standard.↩︎

  5. Jon Svec, “Adjusting to Motion in Man Coverage” (May 12, 2023), on LOCK (“each defender lines up across from a certain Receiver, and they know they are covering that player for the entire play, no matter what”) versus SWITCH (exchanging assignments, which “disguise[s] things better … but now some communication is required”): https://jonsvec.substack.com/p/adjusting-to-motion-in-man-coverage ; Svec, “Defensive Reactions to Jet Motion” (Feb. 25, 2022), on Track, Rotate (aka Spin) and Bump: https://jonsvec.substack.com/p/defensive-reactions-to-jet-motion ; “ITP Glossary: Banjo Coverage,” Integrated Scouting Academy: https://scoutingacademy.com/itp-glossary-banjo-coverage/↩︎

  6. Chris Haddad, “Different Types of Offensive Cadences in the Shotgun,” Viqtory Sports (updated June 1, 2026): “The leg lift, or a back tap, is a simple way to send players in motion across the formation before the ball is snapped”: https://www.viqtorysports.com/?p=3342↩︎

  7. ESPN Analytics (Seth Walder), as reported by Ben Solak, The Ringer (Jan. 25, 2024): an average NFL team snapped the ball with a player in motion on 4% of plays in 2017 and 22% in 2023: https://www.theringer.com/nfl/2024/1/25/24050457/kansas-city-chiefs-baltimore-ravens-afc-championship-steve-spagnuolo-mike-macdonald-defense-motion . (ESPN’s league figures for 2024 and 2025 appear only second-hand, with conflicting numbers, so this book does not quote them.)↩︎

  8. Seth Walder, ESPN, reported via 4for4 (Sept. 26, 2023): “The Dolphins have had a player in motion at the snap on 59 percent of plays this season,” the most since ESPN’s tracking began in 2017 (league about 20% at the time): https://www.4for4.com/news/dolphins-using-motion-more-any-other-team . FTN figure (79.4% of 2023 regular-season runs and passes with is_motion) is a course calculation from nflverse.↩︎

  9. Brianna Dix, “Rise of motion in NFL offenses,” Buccaneers.com (Feb. 3, 2026), citing Next Gen Stats: Atlanta under Zac Robinson ranked first in motion at the snap in 2025 (60.8%) and sixth in pre-snap motion (70.1%): https://www.buccaneers.com/news/rise-of-motion-nfl-offenses-what-it-means-bucs-2026-robinson↩︎

  10. Ben Solak, The Ringer (Jan. 25, 2024), on the Chiefs’ and Ravens’ defenses “changing the picture” as motion triggered the snap, and their Next Gen Stats ranks (Ravens first, Chiefs sixth) in EPA per play on snaps with motion; URL in the motion-at-the-snap note above.↩︎

  11. John Breech, “NFL shuts down rulebook loophole that Dolphins, 49ers and Rams were exploiting during 2023 season,” CBS Sports (Aug. 1, 2024), including Shanahan’s “The [Dolphins] did that in Week 1 with a little cheat motion. We did it in Week 2 after we saw it”: https://www.cbssports.com/nfl/news/nfl-shuts-down-rulebook-loophole-that-dolphins-49ers-and-rams-were-exploiting-during-2023-season ; on the alignment (receivers set close to the tackle, sprinting toward the near sideline just before the snap), San Francisco Chronicle (Sept. 29, 2023): https://preview-prod.w.sfchronicle.com/sports/49ers/article/ex-49er-coordinator-s-cheat-motion-brings-bit-18394475.php ; Alain Poupart, Sports Illustrated (All Dolphins, Aug. 1, 2024): “Hill never was called for an illegal forward motion penalty last season”: https://www.si.com/nfl/dolphins/tyreek-and-the-commotion-about-the-cheat-motion-01j47qrysqyj↩︎

  12. NFL rule language added for 2024, now Rule 7, Section 4, Article 2, Item 2 (False Start, Eligible Receiver) of the 2026 rulebook (https://operations.nfl.com/the-rules/nfl-rulebook/): “If an eligible receiver who is on the line of scrimmage moves backward or changes his stance (two point to three point or conversely) and does not come to a complete stop before the snap, it is a false start. Any eligible backfield player who changes his stance does not have to come to a complete stop prior to the snap, as long as his actions are not abrupt (false start) or forward (illegal motion).” That NFL officials described it as a clarification, not a rule change, aimed at sudden stance changes rather than lateral jet motion: Alain Poupart, “Clarity on the Cheat Motion Commotion,” Sports Illustrated (All Dolphins, Aug. 14, 2024): https://www.si.com/nfl/dolphins/news/clarity-on-the-cheat-motion-commotion-01j591m7stgc↩︎

  13. “Chiefs lined up in wrong formation on pivotal Super Bowl play and Patrick Mahomes still managed to throw a TD,” John Breech, CBS Sports (Feb. 16, 2023): Toney “was lined up on the line of scrimmage, so he couldn’t move,” pointed across to Moore, and Mahomes sent Moore in motion instead: https://www.cbssports.com/nfl/news/chiefs-lined-up-in-wrong-formation-on-pivotal-super-bowl-play-and-patrick-mahomes-still-managed-to-throw-a-td↩︎

  14. NCAA, Football Rules and Interpretations, Rule 7-1-4-b: “One back may be in motion, but he may not be moving toward his opponent’s goal line”; “The player who goes in motion may not start from the line of scrimmage unless he first becomes a back and comes to a complete stop”; text as reproduced in the BAFA rulebook, which adopts the NCAA code: https://rules.bafra.info/rulebook/bafa2020/7.html ; NCAA rules: https://www.ncaapublications.com/c-4-rules.aspx ; summary of the NFL/NCAA/high-school rule (one player, not moving toward the line) in “Motion (gridiron football),” Wikipedia: https://en.wikipedia.org/wiki/Motion_(gridiron_football)↩︎

  15. CFL rulebook (2025), Rule 4: the motion limits apply to line players, who must be motionless for one second before the snap and “No player of Team A, who is a Line Player, shall be moving towards the opponent’s Goal Line when the ball is put in play” (Section 5, Article 4); the quarterback’s movements are restricted separately (Section 2, Article 2); no article limits the other backs, who must only be behind the line at the snap (Section 2, Article 3). Rulebook text via CFLdb: https://cfldb.ca/rulebook/scrimmage/player-restrictions/ and https://cfldb.ca/rulebook/scrimmage/method-of-scrimmage/ ; official rules: https://www.cfl.ca/rules-and-regulations/ ; summary in “Motion (gridiron football),” Wikipedia: https://en.wikipedia.org/wiki/Motion_(gridiron_football)↩︎

  16. “ITP Glossary: Landry Shift,” Integrated Scouting Academy: https://scoutingacademy.com/itp-glossary-landry-shift/ (all linemen but the center rise from a three-point stance to a two-point stance and back down before the snap, while the backs shift behind them, “making it more difficult to see the new alignment of the backs”; used in the 1960s, ’70s and ’80s); “Cowboys’ homage to Landry was a player decision,” DallasCowboys.com (2014), with Jason Garrett’s description (“when Roger said ‘Shift,’ … the backs would shift behind him”): https://www.dallascowboys.com/news/cowboys-homage-to-landry-was-a-player-decision-358106↩︎

  17. Wagoner and Thiry, ESPN (Jan. 29, 2022), as in the first note of this chapter; their figures come from ESPN Stats & Information. FTN’s 2024 figure for the Rams (76.7%) is a course calculation from nflverse.↩︎

  18. Daire Carragher, “NFL pre-snap motion usage reaches new highs across the NFL,” PFF (Feb. 23, 2026): shift/motion rate 37.6% (2014), 38.4% (2016), 43.0% (2018) … 61.5% (2024), 63.9% (2025); every team but the Giants at 50% or more in 2025: https://www.pff.com/news/nfl-pre-snap-motion-usage-reaches-new-highs-across-the-nfl↩︎

  19. Next Gen Stats via NFL.com, “The coverage that turned the Seahawks into Super Bowl winners and is taking the NFL by storm”: split-safety coverage 32.9% (2018), 42.0% (2025): https://www.nfl.com/news/the-coverage-that-turned-the-seahawks-into-super-bowl-winners-and-is-taking-the-nfl-by-storm↩︎

  20. Course calculation, nflverse play-by-play joined to FTN charting, regular seasons 2022–2025, runs and passes on first and second down. EPA per play with / without is_motion: passes 2022 +0.049 / +0.073, 2023 +0.045 / +0.021, 2024 +0.089 / +0.086, 2025 +0.098 / +0.058; runs 2022 −0.051 / −0.060, 2023 −0.092 / −0.101, 2024 −0.081 / −0.067, 2025 −0.049 / −0.079. Correlation between a team’s motion rate and its EPA per play (all downs): 0.24 (2022), 0.43 (2023), 0.23 (2024), 0.24 (2025).↩︎

  21. Solak, The Ringer (Jan. 25, 2024), citing ESPN Analytics; URL in the motion-at-the-snap note above.↩︎

  22. Tyreek Hill, Pro Football Reference (2023: 119 catches, 1,799 yards, league leader): https://www.pro-football-reference.com/players/H/HillTy00.htm ; Dolphins 70, Broncos 20 (Week 3, Sept. 24, 2023), box score: https://www.pro-football-reference.com/boxscores/202309240mia.htm↩︎

  23. Adam Teicher, “How do the Chiefs defend Tyreek Hill and the Dolphins’ speed?,” ESPN (Jan. 13, 2024): “the Chiefs played zone coverage on a season-high 61% of dropbacks against the Dolphins” (ESPN Analytics and Next Gen Stats) in the Nov. 5 game; Spagnuolo’s “If you are in the zone, we have to have 22 eyeballs on him”; L’Jarius Sneed covered Hill on 12 of his routes: https://www.espn.com/nfl/story/_/id/39281137/how-do-chiefs-defend-tyreek-hill-dolphins-speed . The Nov. 5, 2023 game (Chiefs 21, Dolphins 14) was played at Deutsche Bank Park in Frankfurt: https://www.bundesliga.com/en/bundesliga/news/nfl-germany-frankfurt-dolphins-chiefs-colts-patriots-stadium-guide-25090 ; wild-card result (Chiefs 26, Dolphins 7, Jan. 13, 2024): https://www.arrowheadpride.com/2024/1/13/24037516/chiefs-dolphins-rapid-recap-defense-wild-card-win↩︎

  24. “Corn Dog (American football),” Wikipedia: https://en.wikipedia.org/wiki/Corn_Dog_(American_football) (Toney 5-yard TD at 12:04 and Moore 4-yard TD at 9:22 of the fourth quarter; Super Bowl LVIII’s version, renamed “Tom and Jerry,” for Hardman’s walk-off touchdown); “The Xs and Os: How the Chiefs won the Super Bowl with a couple of ‘Corn Dogs’,” Yahoo Sports: https://sports.yahoo.com/xs-os-chiefs-won-super-110132971.html↩︎

  25. Coach Kou, “Andy Reid KC Chiefs and his use of motion in his offense” (Aug. 13, 2023), on the Chiefs’ orbit-motion variations with “the wr coming into the backfield” and Hill to the flat: https://coachkoufootball.substack.com/p/andy-reid-kc-chiefs-and-his-use-of↩︎

  26. Deebo Samuel, Pro Football Reference (2021: 77 catches for 1,405 yards; 59 carries for 365 yards and 8 rushing touchdowns): https://www.pro-football-reference.com/players/S/SamuDe00.htm↩︎