{
  "study": "Metadata and third-party exposure across online file converters",
  "measured_date": "2026-08-15",
  "vantage_point": "IN",
  "method": {
    "specimen": "Generated 1600x1200 JPEG with a complete EXIF payload: GPS at a public landmark (Eiffel Tower), camera body serial, owner name, make/model/lens, timestamp, and a unique marker string.",
    "options": "Default only. No metadata toggles were touched.",
    "passes": 1,
    "browser": "Chrome via DevTools Protocol, one isolated context per service",
    "third_party_stage": "Measured on the download page after a real conversion, not the homepage."
  },
  "limitations": [
    "Single geographic vantage point (India). An EEA visitor meets a consent gate first and will see different third-party behaviour.",
    "One pass, one file, one route per service. No claim about consistency over time or across formats.",
    "Default options only; some services may offer a metadata toggle that was not used.",
    "Motive is never observable. We report what came back, not why.",
    "Measured host counts understate data sharing where a consent management platform brokers it (see Convertio: 11 hosts, 193 declared partners).",
    "FreeConvert's third-party figures were captured before the resource-timing buffer was raised; host count is reliable, request volume is understated."
  ],
  "disclosure": "This study was produced by Morphjet, which sells a local file converter and therefore competes with every service measured. Method, specimen, and raw outputs are published so the results can be checked independently.",
  "control": [
    {
      "conversion": "jpg->png (local)",
      "metadata_returned": true,
      "metadata_location": "direct",
      "note": "Library default preserves everything. Stripping is therefore the deliberate act."
    },
    {
      "conversion": "jpg->pdf (local)",
      "metadata_returned": true,
      "metadata_location": "embedded",
      "note": "Full EXIF survives inside the embedded image; exiftool on the PDF shows nothing."
    },
    {
      "conversion": "heic->jpg (local)",
      "metadata_returned": true,
      "metadata_location": "direct",
      "note": "Same as jpg->png."
    }
  ],
  "results": [
    {
      "service": "CloudConvert",
      "slug": "cloudconvert",
      "route": "jpg->png",
      "metadata_returned": true,
      "metadata_location": "direct",
      "output": "8-bit RGB",
      "output_bytes": 208000,
      "tp_hosts": 0,
      "tp_orgs": 0,
      "adtech_orgs": 0,
      "declared_partners": null,
      "session_recorders": [],
      "retention_claim": null,
      "retention_shown": null,
      "notes": "Zero third parties on homepage and download page. First-party Plausible analytics."
    },
    {
      "service": "AnyConv",
      "slug": "anyconv",
      "route": "jpg->png",
      "metadata_returned": true,
      "metadata_location": "direct",
      "output": "8-bit RGB",
      "output_bytes": 204409,
      "tp_hosts": 73,
      "tp_orgs": 46,
      "adtech_orgs": 37,
      "declared_partners": null,
      "session_recorders": [],
      "retention_claim": "1 hour",
      "retention_shown": null,
      "notes": "Largest measured third-party surface: 483 requests, 46 organisations, incl. identity-sync services."
    },
    {
      "service": "Convertio",
      "slug": "convertio",
      "route": "jpg->png",
      "metadata_returned": true,
      "metadata_location": "direct",
      "output": "8-bit RGB",
      "output_bytes": 204708,
      "tp_hosts": 11,
      "tp_orgs": 8,
      "adtech_orgs": 5,
      "declared_partners": 193,
      "session_recorders": [],
      "retention_claim": "we do not store or backup your files",
      "retention_shown": "Files will be stored for 24 hours",
      "notes": "ToS and product contradict on retention. Consent dialog (Clickio) declares 193 partners against 11 measured hosts."
    },
    {
      "service": "Aconvert",
      "slug": "aconvert",
      "route": "jpg->png",
      "metadata_returned": true,
      "metadata_location": "direct",
      "output": "8-bit RGB",
      "output_bytes": 204683,
      "tp_hosts": 8,
      "tp_orgs": 6,
      "adtech_orgs": 4,
      "declared_partners": null,
      "session_recorders": [],
      "retention_claim": "two hours",
      "retention_shown": "1-2 hours",
      "notes": "No terms of service exists; /terms.html serves a 404 body. Three different retention numbers across its own pages."
    },
    {
      "service": "Online-Convert",
      "slug": "online-convert",
      "route": "jpg->png",
      "metadata_returned": true,
      "metadata_location": "direct",
      "output": "8-bit palette",
      "output_bytes": 70973,
      "tp_hosts": 14,
      "tp_orgs": 7,
      "adtech_orgs": 5,
      "declared_partners": null,
      "session_recorders": [],
      "retention_claim": "after the storage period expires (unspecified)",
      "retention_shown": null,
      "notes": "Palettises to 71 KB yet keeps all metadata; the control that disproves 'compression strips metadata'."
    },
    {
      "service": "FreeConvert",
      "slug": "freeconvert",
      "route": "jpg->png",
      "metadata_returned": false,
      "metadata_location": null,
      "output": "8-bit palette",
      "output_bytes": 73113,
      "tp_hosts": 73,
      "tp_orgs": 45,
      "adtech_orgs": null,
      "declared_partners": null,
      "session_recorders": [
        "Microsoft Clarity"
      ],
      "retention_claim": "8 hours",
      "retention_shown": "deleted after 8 hours",
      "notes": "Strips all metadata. Only service whose retention claim matches its product exactly."
    },
    {
      "service": "Zamzar",
      "slug": "zamzar",
      "route": "jpg->png",
      "metadata_returned": false,
      "metadata_location": null,
      "output": "8-bit RGB",
      "output_bytes": 198147,
      "tp_hosts": 7,
      "tp_orgs": 5,
      "adtech_orgs": 3,
      "declared_partners": null,
      "session_recorders": [],
      "retention_claim": null,
      "retention_shown": "Files are stored for 24 hours",
      "notes": "Strips all metadata at full RGB quality; proves stripping is deliberate, not a compression artefact."
    },
    {
      "service": "PDF24",
      "slug": "pdf24",
      "route": "jpg->pdf",
      "metadata_returned": true,
      "metadata_location": "embedded",
      "output": "PDF 1.6",
      "output_bytes": 138820,
      "tp_hosts": 11,
      "tp_orgs": 6,
      "adtech_orgs": 4,
      "declared_partners": null,
      "session_recorders": [],
      "retention_claim": "one hour",
      "retention_shown": null,
      "notes": "Output reads clean to exiftool but contains the full payload inside the embedded image. Ships an immediate-erase button and self-hosted Matomo."
    },
    {
      "service": "Smallpdf",
      "slug": "smallpdf",
      "route": "jpg->pdf",
      "metadata_returned": false,
      "metadata_location": null,
      "output": "PDF 1.4",
      "output_bytes": 137829,
      "tp_hosts": 16,
      "tp_orgs": 12,
      "adtech_orgs": 7,
      "declared_partners": null,
      "session_recorders": [
        "Microsoft Clarity",
        "Hotjar"
      ],
      "retention_claim": null,
      "retention_shown": null,
      "notes": "Cleanest deliberate strip: embedded image passed through at original size with EXIF removed. Runs two session recorders after upload."
    },
    {
      "service": "iLovePDF",
      "slug": "ilovepdf",
      "route": "jpg->pdf",
      "metadata_returned": false,
      "metadata_location": null,
      "output": "PDF 1.7 (resampled 1240x930)",
      "output_bytes": 25956,
      "tp_hosts": 10,
      "tp_orgs": 7,
      "adtech_orgs": 5,
      "declared_partners": null,
      "session_recorders": [],
      "retention_claim": "two (2) hours",
      "retention_shown": null,
      "notes": "Metadata absent, but the image is resampled, so loss may be incidental rather than deliberate. Motive not established. Silently downscales."
    },
    {
      "service": "Sejda",
      "slug": "sejda",
      "route": "jpg->pdf",
      "metadata_returned": false,
      "metadata_location": null,
      "output": "PDF 1.5",
      "output_bytes": 71963,
      "tp_hosts": 0,
      "tp_orgs": 0,
      "adtech_orgs": 0,
      "declared_partners": null,
      "session_recorders": [],
      "retention_claim": null,
      "retention_shown": null,
      "notes": "Only service good on both axes: strips metadata and loads zero third parties."
    }
  ],
  "summary": {
    "services_measured": 11,
    "returned_metadata": 6,
    "removed_metadata": 5,
    "zero_third_parties": 2,
    "with_session_recorders": 2
  }
}