Next·Match·Up
Home/Articles/How It Works

How Next Match Up Compiles Fixture Data

Every fixture, score, and standing on this site passes through a pipeline that refreshes every six hours, with additional runs around kick-off on the roughly three matchdays a week during the core European season. Nine leagues, 72+ clubs in our four core competitions alone, and a rolling 14-day fixture window are rebuilt from source data on that schedule — not scraped once and left stale.

Where the data comes from

We pull from public competition feeds and official league sources — the same category of records that any accredited football statistician would reference. Match scores, fixture dates, kick-off times, goal scorers, and league standings are, at root, matters of public record: they happened, they were officially confirmed, and multiple independent outlets report the same numbers. We aggregate and normalise them rather than originate them.

We deliberately avoid naming a single provider API on our front-end, for a practical reason: sourcing arrangements change. A feed we rely on today might be superseded by a better one in six months, and locking a specific vendor name into hundreds of pages creates a maintenance liability with no benefit to the reader. What matters to a visitor is whether the number displayed is correct, not which upstream service supplied it. If you want independent verification of any specific figure, the official league sites (Premier League, LaLiga, Bundesliga, Ligue 1) and UEFA publish their own authoritative records, and we link to them from our FAQ and methodology page.

Refresh cadence: six hours, tighter around matchdays

The baseline is a full pipeline run every six hours, all year, regardless of whether matches are being played. That baseline alone would leave standings feeling stale for up to six hours after a Saturday afternoon kick-off, so on days when fixtures are scheduled in our covered leagues we layer in supplementary refreshes: one shortly before kick-off to catch any late lineup or fixture changes, and one shortly after the final whistle to capture the result and update standings, form, and the head-to-head archive.

In practice this means a result is usually reflected across the site — the match page, both teams' form strips, the relevant league table, and the scorer chart if a goal was involved — within one to three hours of the final whistle. A postponed fixture, which is rarer and depends on an official announcement rather than a predictable in-game event, can take up to 24 hours to update if the postponement is confirmed outside our normal refresh windows.

How we calculate head-to-head (H2H) records

For any pair of teams, our H2H module queries every recorded meeting between them across all competitions — league, domestic cup, and European ties — going back up to five seasons. From that full set we surface the 10 most recent meetings on the match page, ordered newest to oldest, each showing date, venue, competition, and final score. Separately, we compute an aggregate tally across the full lookback window: wins for each side and the number of draws.

Two design choices here are deliberate. First, we include all competitions rather than league matches only, because a cup upset or a European away win is just as much part of the rivalry's texture as a league result — and fans researching a fixture usually want the full picture, not a filtered one. Second, we cap the visible list at 10 meetings even when more exist, because beyond roughly a decade of history the data becomes less relevant to the upcoming match (squads turn over completely) while cluttering the page. The aggregate win/draw/loss tally still reflects the full lookback window, so the summary number and the visible list are deliberately drawn from different-sized samples — the list for recency, the tally for the broader trend.

How standings are computed

League tables follow each competition's own official points and tie-breaker rules rather than a single generic formula, because the four core leagues we cover do not all resolve ties identically. The standard baseline — three points for a win, one for a draw, zero for a loss, ranked by points then goal difference then goals scored — applies broadly, but head-to-head tie-breakers, points deductions for administrative breaches, and mid-season rule changes are competition-specific and we apply the rule set published by that competition's governing body rather than assume a single European standard.

Because standings only change when a match result is confirmed, we recompute the full table for a competition after each round completes rather than trying to maintain a running "live" table during matches in progress — that live-tracking use case is explicitly outside our scope (see our FAQ on why we don't do live scores). Each table on the site carries a visible timestamp showing when it was last recomputed, so you know exactly how current the numbers are rather than having to guess.

Structured data on every page

Match pages carry Schema.org JSON-LD markup describing the fixture and its two competing teams, so that search engines and answer engines can parse the who, when, and where without scraping the visible HTML. League pages carry list markup for standings and scorer tables. Static pages — About, Contact, FAQ, and every article — carry Organization, ContactPage, Article, FAQPage, and BreadcrumbList markup as appropriate. All of it validates against Google's Rich Results Test, and none of it duplicates or contradicts what a human reader sees on the page — the structured data describes the same facts, just in a machine-readable shape.

Quality control: human editing, not raw automation

The pipeline is automated, but the site is not a raw data dump. Every match preview goes through a template that a human editor built and periodically reviews, and the copy conventions — no predictions, no betting language, explicit UTC offsets on every kick-off time, hidden rather than half-filled sections when data is incomplete — are editorial rules enforced in the rendering layer, not aspirations. When a reader reports an error through our contact form, we check it against primary sources before correcting it; we don't take unverified reports at face value, and we don't ignore verified ones either.

We also apply a completeness threshold before publishing any data section: squad news, advanced statistics, and referee data are hidden entirely on a given match page if we don't have reliable data for that specific fixture, rather than shown with a placeholder or a misleading blank. An absent section is a deliberate editorial signal, not a bug — see the FAQ entry on "why are some sections hidden" for the fuller reasoning.

What this approach explicitly does not do

We don't predict outcomes, publish win probabilities, or offer betting recommendations — that's a different product with different incentives, and mixing it with a neutral stats reference would compromise both. We don't provide live, minute-by-minute score tracking; our fastest refresh cycle is measured in hours, not seconds, and presenting it as real-time would be misleading. And we don't reproduce club crests or league logos, since we hold no licence to those trademarked assets — teams are represented by three-letter codes and colour blocks instead, which keeps us on the right side of a genuine legal risk without any loss of clarity for the reader.

Sources & further reading

  • UEFA — official European competition rules and results
  • Premier League — official England top-flight fixtures and standings
  • Bundesliga — official Germany top-flight fixtures and standings
  • Google Rich Results Test — validator for the structured data described above

Related reading: sample H2H analyses · how to read the stats we show · glossary · FAQ

Ask about football