ChatGPT Project Export Missing Attachments

You ran Data Export, the zip arrives, but PDFs and images you uploaded into Projects are not there — file payloads often live in a separate export channel.

You hit Settings → Data Export, waited for the email, downloaded the zip — and found chat transcripts (conversations.json, HTML versions) but no PDFs, images, or other attachments you had uploaded into Projects. This is a known gap: the standard export ships text and metadata; file payloads from Project Files and chat uploads are partially or fully omitted depending on plan and timing. The fix is to pull files back from each Project before relying on the export, or use the Team / Enterprise admin export which is more complete.

Common causes

Ordered by hit rate, highest first.

1. Standard export omits binary uploads by design

The most common cause. The personal Data Export packages conversations, custom instructions, and metadata into JSON / HTML, but uploaded binaries (PDF, PNG, XLSX) live in a separate object store and are not included in the export zip.

How to spot it: Unzip the export, search for *.pdf or *.png — none found = binaries omitted as expected.

2. Project Files export is a separate UI action

To get Project Files specifically, you must enter each Project and download files individually — there is no “export all Projects + Files” button.

How to spot it: Settings → Data Export gives you chats only; downloading files requires Project → Files → per-file Download.

3. Recently uploaded files have not propagated to the export pipeline

If you uploaded a file 1-2 hours before triggering export, the pipeline may not have indexed it for inclusion yet, even on plans where files are normally included.

How to spot it: Older Project files appear (or their references appear in metadata) but the file you uploaded this morning is missing.

4. Personal export when files live in a Team workspace

You ran the personal Data Export but the Project lives in a Team workspace. Personal export covers your personal-workspace data only.

How to spot it: Conversations from Team workspace are missing too, not just files = wrong export channel.

5. Files marked as “shared with org” follow the workspace, not the user

In Team / Enterprise, certain files are owned by the workspace, not by you. Personal export will not include them even when you uploaded them.

How to spot it: Admin Console shows files as workspace-owned; your personal export omits them.

6. Export was generated before the files existed

Export captures state at request time. If you triggered export on day 1 and uploaded files on day 3, the day-1 export does not contain day-3 files.

How to spot it: Export filename timestamp predates the upload — generate a fresh export.

Before you start

  • Decide what “complete” means: chats only, files only, or both. Different exports cover different scopes.
  • List every Project that holds files you care about — you may need to walk through each.
  • Confirm plan: Free / Plus exports differ from Team / Enterprise admin exports.

Info to collect

  • Export request timestamp + delivered timestamp.
  • Plan tier and workspace (personal vs Team / Enterprise).
  • List of expected files (filenames, Projects they live in, upload dates).
  • Diff between expected files and what is in the zip.
  • Whether you need this for compliance, migration, or personal backup — drives which strategy to use.

Shortest fix path

Ordered by ROI. Steps 1 and 2 cover most personal backup needs.

Step 1: Walk each Project and download Files manually

The reliable backup path:

For each Project:
  Project → Files panel
  → hover each file → Download
  → save into /backup/<project-name>/

For scripting at scale, the official desktop app does not currently expose a bulk-download API. For 5-10 Projects, manual works in 15 minutes. For 50+, see Step 6.

Step 2: Save Project Instructions and metadata separately

Instructions are in the JSON export but easier to preserve as Markdown:

For each Project:
  Project → Edit instructions → copy text
  → save as /backup/<project-name>/instructions.md
  → also note Project name, creation date, list of files

This lets you rebuild the Project elsewhere if needed.

Step 3: For chat history, parse conversations.json

The standard export includes chat history in conversations.json. Reparse to extract Project-specific chats:

import json

with open("conversations.json") as f:
    convos = json.load(f)

# Each conversation has a "conversation_id"; Project association
# may be in a metadata field — inspect first
for c in convos[:3]:
    print(c.keys())
    print(c.get("conversation_template_id"))  # may map to Project

Filter by Project, then export each chat as Markdown.

Step 4: For Team / Enterprise, use admin export

Admin Console (Team / Enterprise):

Admin Console → Compliance → Export workspace data
→ Select Projects + Files + Chats
→ Submit → wait for completion email
→ Download more comprehensive zip

Admin export typically includes file payloads. Coordinate with your org admin if you do not have admin rights.

Step 5: For ongoing backup, mirror to external storage

Don’t rely on one-shot export. For files you care about:

Source-of-truth pattern:
  Local folder (or Google Drive) → sync to Project Files
  → never edit only inside Project
  → if you lose Project access, files are still in source

Treat Project Files as a cache, not the canonical store.

Step 6: For 50+ Projects, scriptable workaround

There is no official bulk-export API for personal Plus accounts. Workarounds:

  • Use a desktop automation tool (e.g., Hammerspoon, AutoHotkey) to drive the Files panel for each Project.
  • For Team / Enterprise, request the admin to run a programmatic export via the workspace data-export endpoint.
  • Open a help.openai.com ticket asking for a one-off complete export — sometimes honored for migration scenarios.

Step 7: Verify the export is usable, not just present

After downloading:

For each file in /backup/<project-name>/:
  - Open it (PDF reader, image viewer)
  - Check page count / dimensions match what you remember
  - Cross-reference filename and timestamp against Project Files panel

A “file present but corrupted” backup is worse than knowing it is missing.

How to confirm the fix

  • Every Project listed in your inventory has its own backup folder with Files + instructions.md.
  • Open three random PDFs from the backup — they render correctly.
  • Chats you care about exist as Markdown / JSON, retrievable by Project name.
  • For Team / Enterprise: admin export’s manifest lists the expected file count.

Common pitfalls

  • Assuming the personal Data Export is comprehensive — it is text + metadata, not files.
  • Triggering export and uploading files afterward, then expecting the older export to include them.
  • Running personal export when your data lives in a Team workspace — wrong channel.
  • Backing up file references (filenames in JSON) without the binary payloads.
  • Treating one export as forever — file content changes; rerun exports on a schedule for critical Projects.

FAQ

Q: How long does the Data Export take to arrive? A: Usually 5-30 minutes for personal accounts. Team / Enterprise admin exports can take hours depending on data volume.

Q: Can I request a specific Project’s data? A: Not directly via the standard export. Manually download Files from that Project, and filter conversations.json for chats inside it.

Q: Will images in conversations be exported? A: Inline image URLs are in the JSON, but the binaries are often hosted externally and may expire. Save images you care about while the chat is fresh.

Q: Is there a way to back up Custom GPT Knowledge? A: Yes — Custom GPT settings page → Configure → Knowledge → download each file manually. Same caveat: no bulk export.

Q: Does cancelling my subscription delete my files? A: Files become inaccessible if you lose access to the workspace. Always back up before cancelling, not after.

Tags: #ChatGPT #Troubleshooting #chatgpt-projects #data-export