
Quick Answer
To produce Slack messages defensibly in discovery: (1) Export the full workspace using the standard tool for public channels, or Slack's Discovery API (Enterprise Grid only) for private channels and DMs. (2) Parse the exported JSON and match each message's thread_ts to a parent message's ts to group messages into conversation units. (3) Resolve user IDs to real names using users.json and convert Unix timestamps to human-readable date-times. (4) Produce the threaded units as formatted documents with a processing log documenting every transformation step.
Most guides for Slack discovery stop at the export step, and that is the problem. The export gives you a zip file full of flat JSON, one message per line, one file per channel per day. What it does not give you is a conversation anyone can read. This guide goes past the export to the absent step: transforming raw Slack JSON into threaded, timestamped, user-resolved conversation units that a factfinder can actually follow.
You will find here the structure of Slack's export format, the specific JSON fields that make threading possible, a step-by-step transformation algorithm, and proportionality thresholds for large collections. The Python code is included and ready to run. The goal is not just a technical exercise, it is a defensible production: one where every decision is documented, every transformation is reversible, and no opposing counsel can plausibly argue that you delivered incomplete or unreadable data.
Listen, here is the thing about Slack and discovery. You can run the export in five minutes, hand over a zip file full of JSON, tell opposing counsel you produced the messages, and none of that means the factfinder can actually read a conversation. I have watched this happen in real matters, the messages are all there technically, every byte accounted for, and the thread is in pieces, scattered across a dozen daily files, each piece looking like an orphaned comment with no parent in sight.
The problem is not the export tool, really. Slack exports exactly what it is designed to export: one message per line, organized by date, one file per channel per day. That is perfectly fine for archiving. It is completely unusable for presenting a conversation to a factfinder, because a conversation is not a list of messages, it is a thread, and a thread in Slack exists only in its interface, held together by a single JSON field called thread_ts that the export tool will walk right past.
This article is about the step everyone skips. Export is step one. Transformation is step two. Step two is where most Slack productions fail - and where this guide begins.
Questions this article answers
- Why does a standard Slack export break conversation threads?
- How do you rebuild threaded conversations from raw Slack JSON?
- What proportionality thresholds apply to large Slack collections?
Why Does a Standard Slack Export Break a Conversation?
Slack stores messages in daily JSON files, one folder per channel, one file per day.
Export a channel covering two months and you get roughly sixty files, each containing every message posted that day in timestamp order. That sounds organized, well anyway it is organized the way a filing cabinet is organized when someone dumps everything in by date and calls it done, as of .
The problem is threads. According to Slack's own developer documentation, once a message has replies it becomes a "parent message," and those replies are "threaded replies" - but that nesting exists only inside Slack's interface. In the raw export, a threaded reply looks exactly like a top-level message unless you read the thread_ts JSON field and know what you're looking at.
Now imagine a thread that started Monday at 11pm and continued Tuesday morning. The parent is in Monday's file. The replies are in Tuesday's file. A reviewer who opens Monday's file sees the initial message. They open Tuesday's file and see what looks like a new, unconnected exchange. The thread is split across two files with no visual indication whatsoever, just a thread_ts value that only an expert would know to trace.
Reddit users who have tried Slack's standard export describe getting "unreadable JSON files, also separated in a confusing manner" - and that is from someone who works with JSON regularly. For litigation purposes, a factfinder who can't follow a thread isn't going to find it less confusing. Courts expect ESI produced in a form that does not obscure the relationship between documents. A thread is a document. Producing its parts as separate entries violates that expectation even if you technically delivered all the bytes.
I have watched review teams spend days manually tracing thread_ts values to reconstruct conversations that should have been produced in threaded form from the start. In one matter the producing party had to supplement after opposing counsel flagged the fragmented output at meet-and-confer. The delay cost time and credibility both.
An export is not a production. Between export and production sits the transformation step, and that step is where most Slack discovery fails.
What Does Slack's Raw JSON Actually Contain?
Before you can fix a Slack production, you need to understand what the export contains. A standard Slack workspace export is a zip archive. Inside that zip:
- channels.json: every public channel with its ID, name, creation date, and topic
- users.json: every workspace member with their user ID, display name, real name, and email address
- One folder per channel, named by the channel handle (for example,
generalorproject-alpha) - Inside each channel folder, one JSON file per day, named by date (for example,
2024-10-14.json)
Slack's documentation defines the thread terminology precisely: a message with no replies is an "unthreaded message"; once it has replies it becomes a "parent message"; replies are "threaded replies." Each message object in a daily file contains the fields that matter for discovery:
| Field | What It Contains | Discovery Relevance |
|---|---|---|
ts |
Unix epoch timestamp with microseconds (e.g., 1697284800.123456) |
Exact send time; convert to human-readable format with timezone before production |
user |
Slack user ID (e.g., U04B7XKRM) |
Author identity; cross-reference users.json for real name and email |
text |
Message body, including Slack markup like <@U04B7XKRM> for mentions |
The message content; markup must be resolved to readable names before production |
thread_ts |
Timestamp of the parent message in this thread | Present only on thread replies; links the reply to its parent conversation unit |
reply_count |
Number of replies to this message | Present on parent messages; a nonzero value means a thread exists below |
files |
Array of attached file objects with download URLs, names, and types | Files must be separately downloaded; export URLs expire on a rolling basis |
Two things are absent from a standard export that are critical for complete discovery. First, private channel messages and direct messages are not included. Standard exports cover public channels only. For private channels and DMs, you need Slack's Discovery API (Enterprise Grid required) or a third-party compliance integration.
Second, file attachments are not bundled in the zip. The export contains metadata and download URLs, but the actual files must be separately downloaded before those URLs expire. In a large production, leaving file download to the last step forces a supplemental production you could have avoided.
Understanding this structure is the prerequisite for everything that follows. You cannot group threads correctly without knowing how thread_ts works. The data is all there; it just isn't in any form a factfinder can read without transformation.
How Do You Run a Complete Slack Export?
The export method you use determines what data you get. Choosing the wrong one leaves gaps that opposing counsel will find.
An AmLaw 50 firm handling a high-stakes antitrust matter processed Slack alongside Google Workspace and cloud archives, noting that Slack data "arrives in unstructured formats requiring normalization before review" - the export step is only the beginning.
| Export Method | Covers | Does Not Cover | Plan Required |
|---|---|---|---|
| Standard Workspace Export | Public channels only | Private channels, DMs, group DMs | Any paid plan |
| Discovery API | All public and private channels, DMs, group DMs | Messages deleted before retention capture | Enterprise Grid only |
| Third-Party Compliance Integration (e.g., Theta Lake, Global Relay) | Everything captured since integration was enabled | Messages sent before integration was configured | Any plan with API access |
For most litigation matters, the Discovery API is the right tool. A typical workplace dispute, harassment claim, or contract case is at least as likely to involve DMs as channel messages. People have sensitive conversations in direct messages on purpose. If your export covers only public channels, you have a material gap before you begin processing.
Standard export steps (Workspace Owner required):
- Go to
your-workspace.slack.com/adminand select Import/Export Data - Choose Export, set a date range, and click Start Export
- Wait for an email notification (may take several hours for large workspaces), then download the zip file
- Verify the zip contains the expected channel folders before proceeding to transformation
Discovery API steps (Organization Owner required, Enterprise Grid):
- Create a Discovery app in the Slack API dashboard with the
discovery:readscope - Use
discovery.enterprise.infoto enumerate users and channels - Use
discovery.conversations.historyto pull messages per channel per custodian - Paginate through results using the
cursorparameter until all messages are retrieved
One thing people consistently miss: Slack deletes messages older than the workspace's retention policy, and the export only gives you what is currently in the system. If your client has a 90-day retention setting and the litigation hold wasn't issued until day 95, the first five days are gone. Issue litigation holds immediately on notice of potential litigation and confirm retention settings at the outset. This conversation has to happen before any export runs.
How Do You Rebuild Threaded Conversations from Raw JSON?
Here is the process I use to transform flat Slack JSON into production-ready conversation units.
It is methodical, it is defensible, and it produces output that a factfinder can actually read. The community technical record confirms this is not a solved problem out of the box: developers report that even with the chat.postMessage API, "capturing and storing thread_ts" is the linchpin step for preserving any thread - meaning you have to know to look for it and what to do with it.
Step 1: Parse all daily files into a single message list. Load every JSON file across every channel directory into one data structure. Tag each message with its channel name and original file path for provenance. Do not skip bot messages or system messages without a documented decision - they are part of the record.
Step 2: Resolve user IDs to real names. Every user field and every mention in the text field contains a Slack user ID, not a name. Cross-reference users.json to substitute the real name and email. For in-text mentions, resolve patterns like <@U04B7XKRM> to @Jane Smith. A production that delivers opaque user IDs is not usable.
Step 3: Convert timestamps. The ts field is Unix epoch with microsecond precision. Convert to a human-readable format in the custodian's local timezone with UTC offset: 2024-10-14 11:23:45 EDT (UTC-4). A message sent at 11pm Eastern is the next calendar day in Pacific time, and that can shift a timeline argument.
Step 4: Group messages into conversation units. This is the key step. The rule: if a message's thread_ts equals another message's ts, they belong to the same conversation unit. The message whose ts matches is the parent. All messages sharing that thread_ts are replies. Within each unit, sort by ts ascending. Between units, sort by the parent's ts. The result is a channel view organized thread by thread, every reply under its parent, in send order.
Step 5: Handle orphaned replies. A small percentage of messages will have a thread_ts that does not match any parent in the export - because the parent was deleted, falls outside the export date range, or a workspace quirk. Do not silently drop these. Flag them in your processing log. Their unexplained absence from a production is a challenge waiting to happen.
What Does a Defensible Slack Production Look Like?
A defensible Slack production has three properties: it is complete, it is readable, and it is auditable.
You can produce a technically complete export that fails on the other two, and you will hear about it at meet-and-confer.
Completeness means you captured all custodians in the litigation hold, all channels those custodians participated in during the relevant period, and all DMs and group DMs between custodians. It also means file attachments were separately downloaded and produced with load files that link each attachment to its parent message. In enterprise-scale matters, one AmLaw 50 firm's eDiscovery platform normalized "Slack, Teams, and Google Chat messages into time-ordered transcripts with participants, timestamps, attachments, and even emojis or reactions, ensuring accurate context." That is the benchmark. A production that omits DMs because the standard export was used instead of the Discovery API is incomplete by definition.
Readability means the production is organized so a reviewer can follow a conversation without special software. I recommend one of two formats:
- PDF or rendered HTML per conversation unit, formatted as a chat transcript: timestamp, sender name, message text, attachment references. Replies are visually indented or labeled "Reply to [parent timestamp]." This is the most reviewer-friendly format and it renders well in Relativity, Nuix, and Logikcull.
- Delimited text or CSV with structured columns: Channel, Thread_ID, Parent_Message_ID, Timestamp, Sender_Name, Sender_Email, Message_Text, Attachment_Count. Suitable for loading into any review platform with proper field mapping.
Whichever format you choose, the thread relationship must be structurally apparent to anyone who opens the file. A flat, chronologically sorted CSV with no thread grouping is not a defensible production even if it contains all the data.
Auditability means you can explain exactly how you produced the data if challenged. At Relevant Discovery, our processing pipeline maintains immutable originals with content hashing, append-only audit trails, and a documented chain of custody for every collection. Keep a processing log: the export date, plan and export method used, date range, channels and custodians included, message count before and after processing, orphaned replies flagged, and the script used for transformation.
Before finalizing any production, run a spot check. Take three conversation units at random from the final output, look them up in the live workspace, and verify all replies are present and in order. A 30-minute spot check has caught processing errors more than once. Catching them before production is vastly better than catching them in a motion to compel.
How Do You Apply Proportionality to a Large Slack Collection?
A busy Slack workspace generates between 500,000 and 2 million messages per year per 100 active users.
That is not a document count. It is a fragment count if you don't thread it, and a much smaller conversation-unit count if you do. Threading transformation typically reduces the apparent document count by 40 to 60 percent by grouping messages into conversation units. Proportionality under Rule 26(b)(1) requires thinking before you export, not after the zip file arrives.
Start with custodians, not channels. Most cases have a defined set of key people. Identify their Slack user IDs first. Then identify every channel those custodians participated in during the relevant period. That is your collection scope. Pulling all 300 channels in a workspace when only 14 involve your custodians is not proportionate, and any competent opposing counsel will say so. For broader context on how over-collection creates challenges, see 7 Ways Opposing Counsel Attacks an ESI Collection.
Apply date-range narrowing before export. Slack's Discovery API lets you filter by date. Use it. A two-year export for a dispute that arose in the last quarter of year two is over-collection. Start with the three months immediately before and after the triggering event. Expand if meet-and-confer requires it, but start narrow and document your reasoning.
Use keyword screening before full conversion. After export but before the threading transformation, run keyword searches against the raw JSON message text. Identify conversation units containing at least one keyword hit, then process only those units to final production format. Non-hit messages should be documented as collected but not produced, with a count in the processing log.
| Collection Size (Raw Messages) | Recommended Approach | Expected Output After Threading and Culling |
|---|---|---|
| Under 50,000 | Full threading and production; no keyword pre-culling needed | 5,000 to 20,000 conversation units |
| 50,000 to 500,000 | Keyword pre-cull, then thread and produce hits with immediate thread context | 500 to 10,000 conversation units after culling |
| Over 500,000 | Custodian-channel scoping first, keyword pre-cull, phased production by custodian | Negotiate scope with opposing counsel before committing |
The Slack proportionality conversation belongs at the Rule 26(f) conference, not after the export is already running. If opposing counsel demands a full workspace export with no custodian or date scoping, that is a meet-and-confer argument, not a production task. Document the scope you proposed and the reasoning, and let the record speak.
Python: Reconstructing Threads from a Slack Export
import json
from pathlib import Path
from datetime import datetime
from zoneinfo import ZoneInfo
def load_users(export_dir):
with open(Path(export_dir) / "users.json") as f:
users = json.load(f)
return {
u["id"]: {
"name": u.get("real_name") or u.get("name", u["id"]),
"email": u.get("profile", {}).get("email", "")
}
for u in users
}
def convert_ts(ts, tz="America/New_York"):
dt = datetime.fromtimestamp(float(ts), tz=ZoneInfo(tz))
return dt.strftime("%Y-%m-%d %H:%M:%S %Z (UTC%z)")
def parse_channel(channel_dir, users, channel_name):
messages = []
for json_file in sorted(Path(channel_dir).glob("*.json")):
with open(json_file) as f:
for msg in json.load(f):
if msg.get("type") != "message":
continue
uid = msg.get("user", "UNKNOWN")
messages.append({
"ts": msg["ts"],
"thread_ts": msg.get("thread_ts"),
"user_name": users.get(uid, {}).get("name", uid),
"text": msg.get("text", ""),
"reply_count": msg.get("reply_count", 0),
"timestamp_human": convert_ts(msg["ts"]),
"channel": channel_name,
"source_file": str(json_file),
})
return messages
def group_into_threads(messages):
"""
Rule: if message.thread_ts == parent.ts, same conversation unit.
Orphaned replies (no matching parent) are flagged, never dropped.
"""
parents = {}
orphaned = []
for msg in messages:
ts, thread_ts = msg["ts"], msg.get("thread_ts")
if thread_ts is None or thread_ts == ts:
parents.setdefault(ts, {"parent": msg, "replies": []})
elif thread_ts in parents:
parents[thread_ts]["replies"].append(msg)
else:
orphaned.append(msg)
if orphaned:
print(f"WARNING: {len(orphaned)} orphaned replies - "
"parent outside date range or deleted. Logged; not dropped.")
for unit in parents.values():
unit["replies"].sort(key=lambda m: float(m["ts"]))
return sorted(parents.values(), key=lambda t: float(t["parent"]["ts"]))
Before
Before and After: What a Reviewer Actually Sees
After
| Before: Raw Slack Export (Flat) | After: Threaded Conversation Unit (Production-Ready) |
|---|---|
|
File: 2024-10-14.json (fragment) [10:00:00] U04A: "Did we finalize the MSA terms before the call?" [10:05:12] U03C: "Quarterly report is in the shared drive" [10:07:44] U02D: "Sales call at noon confirmed" File: 2024-10-15.json (fragment) [09:10:00] U05B: "Confirmed for Thursday" [09:15:44] U04A: "And the NDA - is that signed?" [09:22:00] U05B: "Yes, countersigned last Friday" Reviewer sees: 6 unrelated-looking messages across 2 files. Thread is invisible. |
Thread #1 - #legal-contracts - 2024-10-14 [10:00:00 EDT] Jane Smith: "Did we finalize the MSA terms before the call?" ↳ [Reply, 2024-10-15 09:10:00 EDT] Robert Chen: "Confirmed for Thursday" ↳ [Reply, 2024-10-15 09:15:44 EDT] Jane Smith: "And the NDA - is that signed?" ↳ [Reply, 2024-10-15 09:22:00 EDT] Robert Chen: "Yes, countersigned last Friday" Reviewer sees: one contract negotiation thread, all parties identified, full chronology visible. |
What Will Matter Most for Slack Discovery in the Next 12 to 24 Months
Three trends are converging on Slack collections right now, and in my view they will make thread reconstruction less optional and more contested within the next two years.
AI-generated Slack activity will complicate custodian scope
Enterprise Slack workspaces now include bot-generated messages, AI summaries, workflow automations, and integrated tool notifications alongside human conversation. The question of whether AI-generated Slack content is ESI subject to preservation is unsettled, and courts will be asked to answer it. For practical purposes, I would recommend identifying and separating bot messages from human messages during the transformation step today, so you are not reclassifying them under court order later.
Slack's retention defaults are shortening
Under pressure from data minimization requirements in privacy regulations, more organizations are configuring 90-day or 180-day Slack retention policies. That means the litigation hold timing problem I described earlier is getting worse: the window between when a dispute arises and when relevant messages are deleted is narrowing. Expect more Rule 37(e) sanctions motions centered on Slack data as these shorter retention windows catch counsel by surprise.
Courts will begin demanding threading, not just export
The first wave of Slack discovery disputes focused on whether messages were produced at all. The next wave is about whether they were produced in a readable form. I expect within 24 months to see courts issuing explicit orders about Slack production format, the same way courts have addressed email threading and native file production in prior cycles. Establishing your threading methodology now, before you are arguing about it, is the conservative position.
In summary: the teams that build a repeatable Slack processing pipeline today will not be scrambling to defend their methodology in court tomorrow.
Forecast window: 12-24 months
Where Chat Data Litigation Heads Next
Three scored forecasts on how firms, courts, and vendors will handle Slack and other chat evidence over the next one to two years.
Forecasts for chat evidence handling
Use these to judge which chat-discovery capabilities to prioritize when planning a matter.
Buyers comparing Relativity against newer entrants and pressing to cut document-review cost will drive the market toward tools that pair defensible chain-of-custody handling with AI-assisted, cited review, rather than forcing a choice between the two.
Slack, Teams, and Google Chat data will be produced in a widening set of matters, and normalizing raw JSON into time-ordered transcripts that preserve participants, timestamps, attachments, and reactions will become the assumed standard rather than a custom, matter-by-matter build.
As teams run fleets of AI agents that each post under their own workspace identity, a rising share of discoverable chat threads over the next one to two years will contain machine-authored messages, forcing the same timestamp and participant-attribution rigor to be applied to non-human senders.
Weak signals watched: An AmLaw 50 firm already produced Slack, Teams, and Google Chat data every week in an antitrust matter, normalizing it into time-ordered transcripts, while smaller users report that Slack's own export yields unreadable, confusingly separated JSON and omits private channels. One agency has reported running ten AI agents, each with a dedicated Slack identity, direct-message channel, and avatar, set against Slack's own definitions that treat any parent or reply inside a thread as a threaded message regardless of who authored it. Active buyer questions comparing Relativity to other review platforms and asking how to reduce litigation review cost, set against a market where enterprise platforms supply Bates, privilege, and chain-of-custody while newer AI entrants supply cited answers and chronologies.
What supports and counters each call
Both corroborating case studies and contrary community reports sit behind each forecast below.
- Faster, Accurate, Defensible: An AmLaw 50 eDiscovery Story supports this forecast. [Industry Publication]"Slack, Teams, and Google Chat messages were normalized into time-ordered transcripts with participants, timestamps, attachments, and even emojis or reactions, ensuring accurate context.". “No named, attributed human quotes appear in the source. All assertions are vendor-authored narration. Closest to a quotable phrasing: *"delta-ingest →…”
- Export all Slack content into a usable format? is the strongest public backing for this call. [Community / Forum]
- I fired the agent framework and rebuilt our company in Slack is the strongest public backing for this call. [Substack / Newsletter]The author spent six months trying to make off-the-shelf agent platforms work for his agency before abandoning them. “If you can use Slack, you can run an AI company.”
- The case rests on Messaging | Slack Developer Docs. [Industry Publication]"Once the session is closed (for example, the user reloads the app or logs out and back in), ephemeral messages will disappear and cannot be recovered.". “Some messages, however, generate such conversation that replies erupt forth, forming a thread in their wake." [Slack Developer Docs]”
What could shift these forecasts
Scenarios in platform features, agent adoption, and review economics that would change this outlook.
Before you rely on these numbers
Treat these scores as weights, not verdicts. The top signal (88/100) leads on evidence, and the minority view (62/100) marks where sources spread out.
- A reversal by regulators or buyers undercuts Buyers push toward one combined tool before anything else.
- If the balance of sources tips against the consensus, Machine-written messages enter the record becomes the safer call.
Key Takeaways
Key Takeaways
- An export is not a production. The transformation step - threading, user resolution, timestamp conversion - is where defensibility is built or lost.
- Standard exports cover only public channels. Private channels and DMs require the Discovery API (Enterprise Grid) or a pre-configured compliance integration.
- The thread_ts field is the key to thread reconstruction. If a message's thread_ts equals another message's ts, they belong to the same conversation unit.
- Issue litigation holds before you export. Slack deletes messages per the workspace's retention policy; any message outside the active retention window is gone from the export.
- Never drop orphaned replies. Flag them in your processing log; their unexplained absence from a production is a challenge waiting to happen.
- The proportionality conversation belongs at the Rule 26(f) conference. Scope by custodian and date range before collection, not after the zip file arrives.
- Spot-check before production. Take three conversation units at random from the final output and verify them against the live workspace.
The work of producing Slack messages without breaking threads is not glamorous. It is a pipeline: five transformation steps, a spot check, a processing log. But it is the work. A factfinder who reads a flat list of chat messages is not going to understand what the parties discussed, when they agreed, or who said what in a thread that ran from Monday night to Thursday morning. The conversation is the evidence. Threading is how you preserve it.
I have watched productions fail the simplest test: could a factfinder follow the conversation without calling counsel to explain it? The answer was no, and the cost was supplemental production, delayed schedules, and credibility in front of a judge who had already noticed. The producing party had technically delivered all the data. They just hadn't produced it in a form anyone could use.
Export the workspace with the right tool. Transform the JSON into threaded, timestamped, user-resolved conversation units. Document every step in a processing log. Run the spot check. That is defensible Slack discovery. Everything else is just delivering bytes and hoping no one looks too closely.
If Slack processing is part of a larger collection effort, see how we approach the full pipeline in The Processing Exceptions Your Vendor Isn't Showing You - the gaps that don't appear in the production report are usually the ones opposing counsel finds first.
Written by
Michael
Kansky
Michael Kansky is a serial software entrepreneur who has spent more than two decades building and bootstrapping profitable SaaS and services companies.
Connect on LinkedInFrequently Asked Questions: Slack Production in Discovery
Does a standard Slack export include private channels and DMs?
No. A standard Slack workspace export covers only public channels. Private channels, direct messages (DMs), and group DMs require Slack's Discovery API, which is available on Enterprise Grid plans, or a third-party compliance integration configured before the relevant period. If your matter involves custodians who communicated in DMs or private channels, a standard export is an incomplete collection.
What is thread_ts and why does it matter for discovery?
The thread_ts field is a Unix timestamp present in Slack's JSON export on thread reply messages. Its value equals the ts (timestamp) of the parent message that started the thread. By matching thread_ts to ts, you can group a parent message and all its replies into a single conversation unit. Without this grouping, thread replies appear as standalone messages with no visible relationship to the conversation they belong to.
How long does Slack retain messages before they are deleted?
Retention periods are set by each workspace's administrator. The default for most plans is to retain messages indefinitely, but many organizations configure shorter retention windows (30, 90, or 180 days) for data minimization purposes. The key point for litigation: Slack deletes messages older than the active retention policy, and a litigation hold must be issued before messages fall outside that window. Confirm your client's retention settings at the outset of any matter.
What Slack plan do I need for the Discovery API?
The Slack Discovery API is available only on Enterprise Grid plans. Business+ and lower plans do not support it. If your client's workspace is on a lower plan and the matter requires private channel or DM data, the options are: upgrade to Enterprise Grid, use a third-party compliance archive that was configured before the relevant period, or engage directly with Slack's legal process team.
How should I handle Slack file attachments in a production?
File attachments are not bundled in the Slack export zip. The export contains metadata about each file and a download URL. Those URLs expire on a rolling basis. To include attachments in your production, you must download each file separately and produce it with a load file that links the attachment to its parent message. In a large production, complete file download before beginning the threading transformation; waiting until the end risks URL expiration.
How many conversation units will I get from a typical Slack export?
A collection of 50,000 raw messages from an active workspace typically yields 5,000 to 20,000 conversation units after threading. The ratio depends on how heavily the workspace uses threads versus standalone messages. After keyword culling, the number drops substantially - typically to 500 to 10,000 conversation units for a 50,000 to 500,000 message collection. These numbers are the input to your review platform, not the final review count after privilege and responsiveness coding.
Summarize This Article With AI
Open this article in your preferred AI engine for an instant summary.


