{
  "schema": "si-demand-engine/1",
  "site_id": "backoffice",
  "origin": "https://backoffice.syntheticindustry.ai",
  "records": [
    {
      "id": "archive-digitise-and-normalise-one-archive",
      "type": "composed",
      "title": "Turn one scanned and old-format file archive into an organised, searchable collection",
      "description": "You scan the paper. We turn the scans and your old Office files into one organised, searchable collection, with a manifest and a spreadsheet index, for an agreed inventory.",
      "url": "/services/archive-digitise-and-normalise-one-archive/",
      "updated": "2026-10-11",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "file-archives",
        "pdf-documents",
        "microsoft-word",
        "microsoft-excel"
      ],
      "related": [
        "archive-rename-organise-with-manifest",
        "convert-legacy-office-files-batch"
      ],
      "provenance": [
        {
          "label": "RFC 8493 (BagIt) describes a manifest of checksums and relative paths for checking that a set of files is complete and unchanged, the idea the project manifest follows.",
          "url": "https://www.rfc-editor.org/rfc/rfc8493"
        },
        {
          "label": "The Library of Congress format description says level B PDF/A files made from scanned page images do not necessarily support indexing of the text.",
          "url": "https://www.loc.gov/preservation/digital/formats/fdd/fdd000318.shtml"
        }
      ],
      "incoming": [
        "archive-rename-organise-with-manifest",
        "convert-legacy-office-files-batch",
        "pdf-scanned-batch-to-searchable-text",
        "example-archive-rename-manifest",
        "buyer-doc-office-manager-paper-and-pdf-backlog",
        "guide-convert-legacy-office-fidelity",
        "guide-archive-rename-manifest-path-limits",
        "guide-pdf-scan-ocr-search-check"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "archive-digitise-and-normalise-one-archive",
          "source": "/services/archive-digitise-and-normalise-one-archive/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "archive-digitise-and-normalise-one-archive",
          "SI-Mode": "quote",
          "SI-Page": "https://backoffice.syntheticindustry.ai/services/archive-digitise-and-normalise-one-archive/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=archive-digitise-and-normalise-one-archive&source=%2Fservices%2Farchive-digitise-and-normalise-one-archive%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=archive-digitise-and-normalise-one-archive&body=SI-Outcome%3A%20archive-digitise-and-normalise-one-archive%0ASI-Mode%3A%20quote%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fservices%2Farchive-digitise-and-normalise-one-archive%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "archive-rename-organise-with-manifest",
      "type": "outcome",
      "title": "Rename and sort one folder of files into a clear structure, with a manifest",
      "description": "A folder of badly named files, handed over by an agreed secure route, is copied into an agreed naming scheme after you approve a dry run. A manifest has a row for every file and shows none changed.",
      "url": "/services/archive-rename-organise-with-manifest/",
      "updated": "2026-10-11",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "file-archives"
      ],
      "related": [
        "convert-legacy-office-files-batch",
        "pdf-scanned-batch-to-searchable-text",
        "archive-digitise-and-normalise-one-archive"
      ],
      "provenance": [
        {
          "label": "Microsoft documents the characters and reserved names that Windows file names cannot use, that names should not end in a space or period, and that Windows should not be assumed to be case-sensitive.",
          "url": "https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file"
        },
        {
          "label": "Microsoft documents the 260-character MAX_PATH limit and the opt-in route to longer paths.",
          "url": "https://learn.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation"
        },
        {
          "label": "RFC 8493 (BagIt) describes a payload manifest of checksums and relative file paths used to check that a set of files is complete and unchanged.",
          "url": "https://www.rfc-editor.org/rfc/rfc8493"
        }
      ],
      "incoming": [
        "archive-digitise-and-normalise-one-archive",
        "convert-legacy-office-files-batch",
        "pdf-scanned-batch-to-searchable-text",
        "example-archive-rename-manifest",
        "buyer-doc-office-manager-paper-and-pdf-backlog",
        "guide-archive-rename-manifest-path-limits"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "archive-rename-organise-with-manifest",
          "source": "/services/archive-rename-organise-with-manifest/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "archive-rename-organise-with-manifest",
          "SI-Mode": "request",
          "SI-Page": "https://backoffice.syntheticindustry.ai/services/archive-rename-organise-with-manifest/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=archive-rename-organise-with-manifest&source=%2Fservices%2Farchive-rename-organise-with-manifest%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=archive-rename-organise-with-manifest&body=SI-Outcome%3A%20archive-rename-organise-with-manifest%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fservices%2Farchive-rename-organise-with-manifest%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "convert-legacy-office-files-batch",
      "type": "outcome",
      "title": "Convert a batch of old .doc and .xls files to current formats and check them",
      "description": "Every old Word and Excel file in one folder is converted to a current format in a parallel folder structure, with a log of what converted, what did not and a sampled check against the original.",
      "url": "/services/convert-legacy-office-files-batch/",
      "updated": "2026-10-11",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "microsoft-excel",
        "microsoft-word"
      ],
      "related": [
        "archive-rename-organise-with-manifest",
        "pdf-scanned-batch-to-searchable-text",
        "archive-digitise-and-normalise-one-archive"
      ],
      "provenance": [
        {
          "label": "Microsoft documents that Excel opens Excel 97-2003 files in Compatibility Mode, that File, Info, Convert replaces the original with a current-format copy, and that Compatibility Checker lists features that do not carry over.",
          "url": "https://support.microsoft.com/en-us/office/use-excel-with-earlier-versions-of-excel-2fd9ffcb-6fce-485b-85af-fecfd651a5ac"
        },
        {
          "label": "Microsoft documents that workbooks with macros should be saved as macro-enabled .xlsm, and advises checking the converted file for changes.",
          "url": "https://support.microsoft.com/en-us/excel/saving-xls-to-xlsx-xlsm"
        },
        {
          "label": "Microsoft documents that Word documents with macros can be converted to the macro-enabled .docm format, that the Developer tab lists macros, and advises keeping a backup and verifying the content or layout after conversion.",
          "url": "https://support.microsoft.com/en-us/word/saving-doc-to-docx-or-dorm"
        }
      ],
      "incoming": [
        "archive-digitise-and-normalise-one-archive",
        "archive-rename-organise-with-manifest",
        "buyer-doc-office-manager-paper-and-pdf-backlog",
        "guide-convert-legacy-office-fidelity"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "convert-legacy-office-files-batch",
          "source": "/services/convert-legacy-office-files-batch/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "convert-legacy-office-files-batch",
          "SI-Mode": "request",
          "SI-Page": "https://backoffice.syntheticindustry.ai/services/convert-legacy-office-files-batch/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=convert-legacy-office-files-batch&source=%2Fservices%2Fconvert-legacy-office-files-batch%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=convert-legacy-office-files-batch&body=SI-Outcome%3A%20convert-legacy-office-files-batch%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fservices%2Fconvert-legacy-office-files-batch%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "extract-pdf-batches-every-month",
      "type": "recurring",
      "title": "Have each month's batch of same-layout PDFs turned into checked spreadsheet rows",
      "description": "Each month's PDFs in one agreed layout are extracted into your workbook with a page or file reconciliation and an exceptions list, so nobody retypes them.",
      "url": "/services/extract-pdf-batches-every-month/",
      "updated": "2026-10-11",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "pdf-documents",
        "microsoft-excel"
      ],
      "related": [
        "pdf-scanned-batch-to-searchable-text",
        "report-pack-every-period"
      ],
      "provenance": [
        {
          "label": "The pdfplumber project says its table extraction works best on machine-generated PDFs and offers no text recognition, which is why image-only pages are set aside and listed.",
          "url": "https://github.com/jsvine/pdfplumber"
        },
        {
          "label": "Microsoft documents a PDF connector for Excel that returns tables found in a PDF and says rows spread over several lines may need cleaning afterwards.",
          "url": "https://learn.microsoft.com/en-us/power-query/connectors/pdf"
        }
      ],
      "incoming": [
        "extract-pdf-form-fields-to-spreadsheet",
        "extract-pdf-price-lists-to-spreadsheet",
        "platform-pdf-documents",
        "collection-pdf-to-spreadsheet-diagnosis-order",
        "guide-extract-reconciliation-method",
        "guide-pdf-form-field-data-export"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "extract-pdf-batches-every-month",
          "source": "/services/extract-pdf-batches-every-month/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "extract-pdf-batches-every-month",
          "SI-Mode": "quote",
          "SI-Page": "https://backoffice.syntheticindustry.ai/services/extract-pdf-batches-every-month/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=extract-pdf-batches-every-month&source=%2Fservices%2Fextract-pdf-batches-every-month%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=extract-pdf-batches-every-month&body=SI-Outcome%3A%20extract-pdf-batches-every-month%0ASI-Mode%3A%20quote%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fservices%2Fextract-pdf-batches-every-month%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "extract-pdf-form-fields-to-spreadsheet",
      "type": "outcome",
      "title": "Collect the answers from a batch of filled-in PDF forms into one sheet",
      "description": "The values typed into a batch of fillable PDF forms from one template arrive as one spreadsheet, one row per form, checked against the field list, with unreadable files listed.",
      "url": "/services/extract-pdf-form-fields-to-spreadsheet/",
      "updated": "2026-10-11",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "pdf-documents",
        "microsoft-excel"
      ],
      "related": [
        "extract-pdf-price-lists-to-spreadsheet",
        "pdf-scanned-batch-to-searchable-text",
        "extract-pdf-batches-every-month"
      ],
      "provenance": [
        {
          "label": "The pypdf documentation describes form fields stored in a PDF's interactive form data, with values read by field name. It also notes that an XFA form entry can override the page content.",
          "url": "https://pypdf.readthedocs.io/en/stable/user/forms.html"
        }
      ],
      "incoming": [
        "extract-pdf-batches-every-month",
        "extract-pdf-price-lists-to-spreadsheet",
        "platform-pdf-documents",
        "collection-pdf-to-spreadsheet-diagnosis-order",
        "guide-extract-reconciliation-method",
        "guide-pdf-form-field-data-export"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "extract-pdf-form-fields-to-spreadsheet",
          "source": "/services/extract-pdf-form-fields-to-spreadsheet/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "extract-pdf-form-fields-to-spreadsheet",
          "SI-Mode": "request",
          "SI-Page": "https://backoffice.syntheticindustry.ai/services/extract-pdf-form-fields-to-spreadsheet/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=extract-pdf-form-fields-to-spreadsheet&source=%2Fservices%2Fextract-pdf-form-fields-to-spreadsheet%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=extract-pdf-form-fields-to-spreadsheet&body=SI-Outcome%3A%20extract-pdf-form-fields-to-spreadsheet%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fservices%2Fextract-pdf-form-fields-to-spreadsheet%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "extract-pdf-price-lists-to-spreadsheet",
      "type": "outcome",
      "title": "Turn a text-based PDF price list into one checked spreadsheet",
      "description": "One PDF price list in one layout becomes one spreadsheet whose row counts match the source page by page. Every row we could not read with confidence is listed for you to decide.",
      "url": "/services/extract-pdf-price-lists-to-spreadsheet/",
      "updated": "2026-10-11",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "pdf-documents",
        "microsoft-excel"
      ],
      "related": [
        "extract-pdf-form-fields-to-spreadsheet",
        "pdf-scanned-batch-to-searchable-text",
        "extract-pdf-batches-every-month"
      ],
      "provenance": [
        {
          "label": "Microsoft documents a PDF connector for Excel and Power Query that returns the tables it finds in a PDF, and says rows that run over several lines may need cleaning afterwards.",
          "url": "https://learn.microsoft.com/en-us/power-query/connectors/pdf"
        },
        {
          "label": "The pdfplumber project says its table extraction works best on machine-generated PDFs, offers no text recognition and is weak on tables from scanned documents. This is why a text layer is an eligibility test.",
          "url": "https://github.com/jsvine/pdfplumber"
        },
        {
          "label": "Docparser advertises plan prices and a per-layout setup fee for parsing PDFs into spreadsheets. This is a competing seller ask, not a paid price or a buyer request.",
          "url": "https://docparser.com/pricing/",
          "checked": "2026-10-11"
        }
      ],
      "incoming": [
        "extract-pdf-batches-every-month",
        "extract-pdf-form-fields-to-spreadsheet",
        "pdf-scanned-batch-to-searchable-text",
        "example-pdf-price-list-reconciliation",
        "platform-pdf-documents",
        "collection-pdf-to-spreadsheet-diagnosis-order",
        "guide-pdf-text-layer-or-scan-check",
        "guide-extract-reconciliation-method"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "extract-pdf-price-lists-to-spreadsheet",
          "source": "/services/extract-pdf-price-lists-to-spreadsheet/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "extract-pdf-price-lists-to-spreadsheet",
          "SI-Mode": "request",
          "SI-Page": "https://backoffice.syntheticindustry.ai/services/extract-pdf-price-lists-to-spreadsheet/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=extract-pdf-price-lists-to-spreadsheet&source=%2Fservices%2Fextract-pdf-price-lists-to-spreadsheet%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=extract-pdf-price-lists-to-spreadsheet&body=SI-Outcome%3A%20extract-pdf-price-lists-to-spreadsheet%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fservices%2Fextract-pdf-price-lists-to-spreadsheet%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "pdf-scanned-batch-to-searchable-text",
      "type": "outcome",
      "title": "Make a batch of scanned PDFs searchable and test it with terms you choose",
      "description": "Image-only PDFs in one folder get an added text layer, with originals kept. A search test of terms you choose is held to a floor agreed in writing beforehand, and poor pages are listed.",
      "url": "/services/pdf-scanned-batch-to-searchable-text/",
      "updated": "2026-10-11",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "pdf-documents"
      ],
      "related": [
        "extract-pdf-price-lists-to-spreadsheet",
        "archive-rename-organise-with-manifest",
        "archive-digitise-and-normalise-one-archive"
      ],
      "provenance": [
        {
          "label": "The OCRmyPDF documentation says it adds a text layer to scanned PDFs, can produce a minimally altered PDF, defaults to PDF/A-2b, may not match commercial accuracy, depends on input quality and cannot recognise handwriting.",
          "url": "https://ocrmypdf.readthedocs.io/en/latest/introduction.html"
        },
        {
          "label": "The Tesseract documentation says it works best on images of at least 300 dpi, and that heavy skew, noise and borders reduce recognition quality.",
          "url": "https://tesseract-ocr.github.io/tessdoc/ImproveQuality.html"
        },
        {
          "label": "The Library of Congress format description says level B PDF/A files made from scanned page images do not necessarily support indexing of the document text.",
          "url": "https://www.loc.gov/preservation/digital/formats/fdd/fdd000318.shtml"
        }
      ],
      "incoming": [
        "archive-digitise-and-normalise-one-archive",
        "archive-rename-organise-with-manifest",
        "convert-legacy-office-files-batch",
        "extract-pdf-batches-every-month",
        "extract-pdf-form-fields-to-spreadsheet",
        "extract-pdf-price-lists-to-spreadsheet",
        "platform-pdf-documents",
        "collection-pdf-to-spreadsheet-diagnosis-order",
        "guide-pdf-text-layer-or-scan-check",
        "guide-pdf-scan-ocr-search-check"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "pdf-scanned-batch-to-searchable-text",
          "source": "/services/pdf-scanned-batch-to-searchable-text/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "pdf-scanned-batch-to-searchable-text",
          "SI-Mode": "request",
          "SI-Page": "https://backoffice.syntheticindustry.ai/services/pdf-scanned-batch-to-searchable-text/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=pdf-scanned-batch-to-searchable-text&source=%2Fservices%2Fpdf-scanned-batch-to-searchable-text%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=pdf-scanned-batch-to-searchable-text&body=SI-Outcome%3A%20pdf-scanned-batch-to-searchable-text%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fservices%2Fpdf-scanned-batch-to-searchable-text%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "quote-pack-from-customer-brief",
      "type": "outcome",
      "title": "Produce a batch of customer quotations from your price list and briefs",
      "description": "Each customer brief (a reference, item codes and quantities) becomes one checked quotation in your template, with totals worked from your price list and rules and a proof sheet of every calculation.",
      "url": "/services/quote-pack-from-customer-brief/",
      "updated": "2026-10-11",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "microsoft-excel",
        "microsoft-word"
      ],
      "related": [
        "spreadsheet-repair-broken-formulas",
        "report-pack-every-period",
        "zapier-sheets-to-xero-missing-columns"
      ],
      "provenance": [
        {
          "label": "Microsoft documents that for a Word mail merge the column names in the spreadsheet should match the field names, that all the data to be merged should be on the first sheet and that Preview Results steps through the records.",
          "url": "https://support.microsoft.com/en-us/word/mail-merge-using-an-excel-spreadsheet"
        },
        {
          "label": "Microsoft documents that merged numbers come through without currency or percent symbols, so symbols are added in the Word document, and that a percentage format multiplies the cell value by 100.",
          "url": "https://support.microsoft.com/en-us/word/prepare-your-excel-data-source-for-a-word-mail-merge"
        },
        {
          "label": "Microsoft documents that Excel follows the IEEE 754 specification with 15 digits of precision and offers the ROUND function to compensate for rounding errors.",
          "url": "https://learn.microsoft.com/en-us/troubleshoot/microsoft-365-apps/excel/floating-point-arithmetic-inaccurate-result"
        }
      ],
      "incoming": [
        "report-pack-every-period",
        "example-quote-line-rounding",
        "platform-microsoft-excel",
        "buyer-report-operations-lead-weekly-pack",
        "guide-mailmerge-fields-and-number-formats"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "quote-pack-from-customer-brief",
          "source": "/services/quote-pack-from-customer-brief/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "quote-pack-from-customer-brief",
          "SI-Mode": "request",
          "SI-Page": "https://backoffice.syntheticindustry.ai/services/quote-pack-from-customer-brief/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=quote-pack-from-customer-brief&source=%2Fservices%2Fquote-pack-from-customer-brief%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=quote-pack-from-customer-brief&body=SI-Outcome%3A%20quote-pack-from-customer-brief%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fservices%2Fquote-pack-from-customer-brief%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "report-pack-every-period",
      "type": "recurring",
      "title": "Get your weekly or monthly report pack built from your standard export",
      "description": "Each period we turn the export you send into the same formatted report pack, check its totals against the export and note anything odd, month after month.",
      "url": "/services/report-pack-every-period/",
      "updated": "2026-10-11",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "microsoft-excel",
        "csv"
      ],
      "related": [
        "quote-pack-from-customer-brief",
        "spreadsheet-flatten-merged-cell-report"
      ],
      "provenance": [
        {
          "label": "Microsoft says a PivotTable works from a snapshot of its source and must be refreshed when the source data changes, and that an Excel table as the source includes newly added rows on refresh.",
          "url": "https://support.microsoft.com/en-us/office/create-a-pivottable-to-analyze-worksheet-data-a9a84538-bfe9-40a9-a8e9-f99134456576"
        }
      ],
      "incoming": [
        "extract-pdf-batches-every-month",
        "quote-pack-from-customer-brief",
        "platform-microsoft-excel",
        "buyer-report-operations-lead-weekly-pack",
        "guide-report-pack-repeatable-export"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "report-pack-every-period",
          "source": "/services/report-pack-every-period/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "report-pack-every-period",
          "SI-Mode": "quote",
          "SI-Page": "https://backoffice.syntheticindustry.ai/services/report-pack-every-period/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=report-pack-every-period&source=%2Fservices%2Freport-pack-every-period%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=report-pack-every-period&body=SI-Outcome%3A%20report-pack-every-period%0ASI-Mode%3A%20quote%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fservices%2Freport-pack-every-period%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "spreadsheet-flatten-merged-cell-report",
      "type": "outcome",
      "title": "Turn a merged-cell Excel report into a flat table you can sort and pivot",
      "description": "One sheet of merged cells, repeated headings and subtotal rows becomes a flat table with one row per record, whose row count and totals reconcile with the original.",
      "url": "/services/spreadsheet-flatten-merged-cell-report/",
      "updated": "2026-10-11",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "microsoft-excel"
      ],
      "related": [
        "spreadsheet-repair-broken-formulas",
        "spreadsheet-normalise-mixed-dates-and-numbers",
        "spreadsheet-make-workbook-set-import-ready"
      ],
      "provenance": [
        {
          "label": "Microsoft says Excel does not sort data in a column that contains merged cells, and describes how to find them.",
          "url": "https://support.microsoft.com/en-us/office/find-merged-cells-d02b2a5a-a08d-4641-8d4d-b3f233daca2c"
        },
        {
          "label": "Microsoft says merging keeps only the upper-left cell's contents, and that unmerging moves the data to the left cell.",
          "url": "https://support.microsoft.com/en-us/office/merge-and-unmerge-cells-5cbd15d5-9375-4540-907f-c673a93fcedf"
        },
        {
          "label": "Microsoft says a PivotTable source should avoid double header rows and merged cells and have no blank rows or columns.",
          "url": "https://support.microsoft.com/en-us/office/create-a-pivottable-to-analyze-worksheet-data-a9a84538-bfe9-40a9-a8e9-f99134456576"
        }
      ],
      "incoming": [
        "report-pack-every-period",
        "spreadsheet-make-workbook-set-import-ready",
        "spreadsheet-normalise-mixed-dates-and-numbers",
        "spreadsheet-remove-duplicate-contacts",
        "spreadsheet-repair-broken-formulas",
        "example-merged-report-flattened",
        "platform-microsoft-excel",
        "collection-spreadsheet-messy-workbook-diagnosis-order",
        "guide-excel-merged-cells-and-tidy-tables"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "spreadsheet-flatten-merged-cell-report",
          "source": "/services/spreadsheet-flatten-merged-cell-report/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "spreadsheet-flatten-merged-cell-report",
          "SI-Mode": "request",
          "SI-Page": "https://backoffice.syntheticindustry.ai/services/spreadsheet-flatten-merged-cell-report/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=spreadsheet-flatten-merged-cell-report&source=%2Fservices%2Fspreadsheet-flatten-merged-cell-report%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=spreadsheet-flatten-merged-cell-report&body=SI-Outcome%3A%20spreadsheet-flatten-merged-cell-report%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fservices%2Fspreadsheet-flatten-merged-cell-report%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "spreadsheet-make-workbook-set-import-ready",
      "type": "composed",
      "title": "Make one set of messy workbooks clean enough to import, analyse or hand over",
      "description": "A defined set of inherited workbooks is repaired, flattened and date-fixed into consistent tables that pass a column-by-column readiness check you can use before any import.",
      "url": "/services/spreadsheet-make-workbook-set-import-ready/",
      "updated": "2026-10-11",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "microsoft-excel",
        "csv"
      ],
      "related": [
        "spreadsheet-repair-broken-formulas",
        "spreadsheet-flatten-merged-cell-report",
        "zapier-sheets-to-xero-missing-columns"
      ],
      "provenance": [
        {
          "label": "Microsoft says a PivotTable source should have one header row, no merged cells, no blank rows or columns and one data type per column; the readiness sheet applies the same ideas to any import.",
          "url": "https://support.microsoft.com/en-us/office/create-a-pivottable-to-analyze-worksheet-data-a9a84538-bfe9-40a9-a8e9-f99134456576"
        },
        {
          "label": "PostgreSQL documents that in CSV input an unquoted empty string is read as NULL by default, one example of why blank cells need an explicit rule before a load.",
          "url": "https://www.postgresql.org/docs/current/sql-copy.html"
        }
      ],
      "incoming": [
        "spreadsheet-flatten-merged-cell-report",
        "spreadsheet-normalise-mixed-dates-and-numbers",
        "spreadsheet-remove-duplicate-contacts",
        "platform-microsoft-excel",
        "buyer-report-operations-lead-weekly-pack",
        "collection-spreadsheet-messy-workbook-diagnosis-order",
        "guide-excel-error-values-trace",
        "guide-excel-merged-cells-and-tidy-tables",
        "guide-excel-date-serials-and-regional-order",
        "guide-spreadsheet-contact-duplicate-match-rules",
        "guide-spreadsheet-import-readiness"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "spreadsheet-make-workbook-set-import-ready",
          "source": "/services/spreadsheet-make-workbook-set-import-ready/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "spreadsheet-make-workbook-set-import-ready",
          "SI-Mode": "quote",
          "SI-Page": "https://backoffice.syntheticindustry.ai/services/spreadsheet-make-workbook-set-import-ready/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=spreadsheet-make-workbook-set-import-ready&source=%2Fservices%2Fspreadsheet-make-workbook-set-import-ready%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=spreadsheet-make-workbook-set-import-ready&body=SI-Outcome%3A%20spreadsheet-make-workbook-set-import-ready%0ASI-Mode%3A%20quote%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fservices%2Fspreadsheet-make-workbook-set-import-ready%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "spreadsheet-normalise-mixed-dates-and-numbers",
      "type": "outcome",
      "title": "Fix mixed date and decimal formats in one spreadsheet or CSV export",
      "description": "Dates typed as text, day-first and month-first entries mixed together, and comma or point decimals become real dates and numbers. Ambiguous rows are listed, not guessed.",
      "url": "/services/spreadsheet-normalise-mixed-dates-and-numbers/",
      "updated": "2026-10-11",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "microsoft-excel",
        "csv"
      ],
      "related": [
        "spreadsheet-repair-broken-formulas",
        "spreadsheet-flatten-merged-cell-report",
        "spreadsheet-make-workbook-set-import-ready"
      ],
      "provenance": [
        {
          "label": "Microsoft documents that Excel stores dates as serial numbers in either a 1900 or a 1904 system 1,462 days apart, and that pasting dates between workbooks that use different systems can shift them.",
          "url": "https://support.microsoft.com/en-us/excel/date-systems-in-excel"
        },
        {
          "label": "Microsoft documents text dates (left-aligned) and conversion with DATEVALUE. It says that a date with a two-digit year entered in a text-formatted cell, or as a text argument in a function, is read as 2000 to 2029 for 00 to 29 and as 1930 to 1999 for 30 to 99, and that in Windows the cutoff can be changed for all programs.",
          "url": "https://support.microsoft.com/en-us/office/change-the-date-system-format-or-two-digit-year-interpretation-aaa2159b-4ae8-4651-8bce-d4707bc9fb9f"
        },
        {
          "label": "The W3C note on date and time formats gives YYYY-MM-DD as an unambiguous date representation.",
          "url": "https://www.w3.org/TR/NOTE-datetime"
        }
      ],
      "incoming": [
        "archive-digitise-and-normalise-one-archive",
        "report-pack-every-period",
        "spreadsheet-flatten-merged-cell-report",
        "spreadsheet-make-workbook-set-import-ready",
        "spreadsheet-remove-duplicate-contacts",
        "spreadsheet-repair-broken-formulas",
        "example-date-ambiguity-matrix",
        "platform-microsoft-excel",
        "collection-spreadsheet-messy-workbook-diagnosis-order",
        "guide-excel-date-serials-and-regional-order"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "spreadsheet-normalise-mixed-dates-and-numbers",
          "source": "/services/spreadsheet-normalise-mixed-dates-and-numbers/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "spreadsheet-normalise-mixed-dates-and-numbers",
          "SI-Mode": "request",
          "SI-Page": "https://backoffice.syntheticindustry.ai/services/spreadsheet-normalise-mixed-dates-and-numbers/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=spreadsheet-normalise-mixed-dates-and-numbers&source=%2Fservices%2Fspreadsheet-normalise-mixed-dates-and-numbers%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=spreadsheet-normalise-mixed-dates-and-numbers&body=SI-Outcome%3A%20spreadsheet-normalise-mixed-dates-and-numbers%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fservices%2Fspreadsheet-normalise-mixed-dates-and-numbers%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "spreadsheet-remove-duplicate-contacts",
      "type": "outcome",
      "title": "Merge duplicate rows in one product, part, asset or company list, with a review file",
      "description": "One list of items, parts, assets or companies, with no personal data, is checked against written rules. Clear duplicates are merged with a log; uncertain pairs stay separate for you to decide.",
      "url": "/services/spreadsheet-remove-duplicate-contacts/",
      "updated": "2026-10-11",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "microsoft-excel",
        "csv"
      ],
      "related": [
        "spreadsheet-normalise-mixed-dates-and-numbers",
        "spreadsheet-flatten-merged-cell-report",
        "spreadsheet-make-workbook-set-import-ready"
      ],
      "provenance": [
        {
          "label": "Microsoft says Remove Duplicates judges duplicates by the value displayed in the cell, deletes rows permanently and removes data from all columns, and recommends copying the original data first.",
          "url": "https://support.microsoft.com/en-us/office/filter-for-unique-values-or-remove-duplicate-values-ccf664b0-81d6-449b-bbe1-8daaec1e83c2"
        },
        {
          "label": "Microsoft documents that Power Query's Remove Duplicates works on the columns you select, so a different selection can give a different result.",
          "url": "https://support.microsoft.com/en-us/office/keep-or-remove-duplicate-rows-power-query-d9cffc69-dc5d-4d94-8b66-72779688874d"
        }
      ],
      "incoming": [
        "spreadsheet-make-workbook-set-import-ready",
        "platform-microsoft-excel",
        "collection-spreadsheet-messy-workbook-diagnosis-order",
        "guide-spreadsheet-contact-duplicate-match-rules"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "spreadsheet-remove-duplicate-contacts",
          "source": "/services/spreadsheet-remove-duplicate-contacts/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "spreadsheet-remove-duplicate-contacts",
          "SI-Mode": "request",
          "SI-Page": "https://backoffice.syntheticindustry.ai/services/spreadsheet-remove-duplicate-contacts/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=spreadsheet-remove-duplicate-contacts&source=%2Fservices%2Fspreadsheet-remove-duplicate-contacts%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=spreadsheet-remove-duplicate-contacts&body=SI-Outcome%3A%20spreadsheet-remove-duplicate-contacts%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fservices%2Fspreadsheet-remove-duplicate-contacts%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "spreadsheet-repair-broken-formulas",
      "type": "outcome",
      "title": "Repair the broken formulas in one Excel workbook so its totals check out",
      "description": "The error values and wrong totals in one workbook are traced and fixed until your agreed check cases return the answers you calculated by hand, with every change listed.",
      "url": "/services/spreadsheet-repair-broken-formulas/",
      "updated": "2026-10-11",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "microsoft-excel"
      ],
      "related": [
        "spreadsheet-flatten-merged-cell-report",
        "spreadsheet-normalise-mixed-dates-and-numbers",
        "zapier-sheets-to-xero-missing-columns"
      ],
      "provenance": [
        {
          "label": "Microsoft documents #REF! as a formula that points at deleted or overwritten cells, and #NAME? as most often a misspelt function or undefined name; it says not to use IFERROR to mask the #NAME? error.",
          "url": "https://support.microsoft.com/en-us/excel/how-to-correct-a-ref-error"
        },
        {
          "label": "Microsoft documents Excel's error checking rules, including inconsistent formulas and numbers stored as text, and states that the rules do not guarantee an error-free worksheet.",
          "url": "https://support.microsoft.com/en-us/excel/detect-formula-errors-in-excel"
        },
        {
          "label": "Microsoft documents that Manual calculation mode updates formulas only when you recalculate, and that Automatic is the default.",
          "url": "https://support.microsoft.com/en-us/office/change-formula-recalculation-iteration-or-precision-in-excel-73fc7dac-91cf-4d36-86e8-67124f6bcce4"
        }
      ],
      "incoming": [
        "quote-pack-from-customer-brief",
        "report-pack-every-period",
        "spreadsheet-flatten-merged-cell-report",
        "spreadsheet-make-workbook-set-import-ready",
        "spreadsheet-normalise-mixed-dates-and-numbers",
        "platform-microsoft-excel",
        "collection-spreadsheet-messy-workbook-diagnosis-order",
        "guide-excel-error-values-trace",
        "guide-excel-stale-or-text-numbers"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "spreadsheet-repair-broken-formulas",
          "source": "/services/spreadsheet-repair-broken-formulas/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "spreadsheet-repair-broken-formulas",
          "SI-Mode": "request",
          "SI-Page": "https://backoffice.syntheticindustry.ai/services/spreadsheet-repair-broken-formulas/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=spreadsheet-repair-broken-formulas&source=%2Fservices%2Fspreadsheet-repair-broken-formulas%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=spreadsheet-repair-broken-formulas&body=SI-Outcome%3A%20spreadsheet-repair-broken-formulas%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fservices%2Fspreadsheet-repair-broken-formulas%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "zapier-facebook-leads-to-salesforce",
      "type": "outcome",
      "title": "Make new Facebook leads appear in Salesforce again",
      "description": "A new synthetic lead submitted to the agreed Facebook form starts one Zap and creates one Salesforce test lead with the agreed fields.",
      "url": "/services/zapier-facebook-leads-to-salesforce/",
      "updated": "2026-10-09",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "zapier",
        "facebook-lead-ads",
        "salesforce"
      ],
      "related": [
        "zapier-sheets-to-xero-missing-columns"
      ],
      "provenance": [
        {
          "label": "Commercial hypothesis for this bounded outcome, not verified buyer demand or a tested price. The 9 October direction permits reasonable offers without inventing prior sales. Earlier unverified marketplace and community quotations are not used in this release."
        }
      ],
      "incoming": [
        "buyer-finance-manager-invoice-integration",
        "guide-zapier-field-mapping",
        "tool-workflow-value",
        "platform-zapier"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "zapier-facebook-leads-to-salesforce",
          "source": "/services/zapier-facebook-leads-to-salesforce/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "zapier-facebook-leads-to-salesforce",
          "SI-Mode": "request",
          "SI-Page": "https://backoffice.syntheticindustry.ai/services/zapier-facebook-leads-to-salesforce/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=zapier-facebook-leads-to-salesforce&source=%2Fservices%2Fzapier-facebook-leads-to-salesforce%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=zapier-facebook-leads-to-salesforce&body=SI-Outcome%3A%20zapier-facebook-leads-to-salesforce%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fservices%2Fzapier-facebook-leads-to-salesforce%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "zapier-sheets-to-xero-missing-columns",
      "type": "outcome",
      "title": "Send every mapped Google Sheets invoice field to Xero",
      "description": "One disposable row with the agreed columns makes one draft Xero invoice containing every agreed line item and amount.",
      "url": "/services/zapier-sheets-to-xero-missing-columns/",
      "updated": "2026-10-09",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "zapier",
        "google-sheets",
        "xero"
      ],
      "related": [],
      "provenance": [
        {
          "label": "Commercial hypothesis for this bounded outcome, not verified buyer demand or a tested price. The 9 October direction permits reasonable offers without inventing prior sales. Earlier unverified marketplace and community quotations are not used in this release."
        }
      ],
      "incoming": [
        "quote-pack-from-customer-brief",
        "spreadsheet-make-workbook-set-import-ready",
        "spreadsheet-repair-broken-formulas",
        "zapier-facebook-leads-to-salesforce",
        "buyer-finance-manager-invoice-integration",
        "guide-zapier-field-mapping",
        "guide-sheets-xero-line-item-shape",
        "tool-workflow-value",
        "platform-zapier",
        "platform-xero",
        "tool-invoice-rounding-bench",
        "example-invoice-tax-rounding-reconciliation",
        "example-invoice-retry-identity-matrix",
        "collection-finance-invoice-integrity-checks",
        "guide-sheets-invoice-value-rendering",
        "guide-invoice-tax-amount-basis",
        "guide-invoice-create-unknown-outcome"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "zapier-sheets-to-xero-missing-columns",
          "source": "/services/zapier-sheets-to-xero-missing-columns/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "zapier-sheets-to-xero-missing-columns",
          "SI-Mode": "request",
          "SI-Page": "https://backoffice.syntheticindustry.ai/services/zapier-sheets-to-xero-missing-columns/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=zapier-sheets-to-xero-missing-columns&source=%2Fservices%2Fzapier-sheets-to-xero-missing-columns%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=zapier-sheets-to-xero-missing-columns&body=SI-Outcome%3A%20zapier-sheets-to-xero-missing-columns%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fservices%2Fzapier-sheets-to-xero-missing-columns%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "buyer-finance-manager-invoice-integration",
      "type": "buyer",
      "title": "For a finance manager: make an invoice integration complete and safe to repeat",
      "description": "Define authoritative fields, duplicate rules and reconciliation before repairing a spreadsheet-to-accounting automation.",
      "slug": "finance-manager-invoice-integration",
      "url": "/buyers/finance-manager-invoice-integration/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "Zapier: action troubleshooting",
          "url": "https://help.zapier.com/hc/en-us/articles/8496037690637-Test-your-Zap-actions",
          "checked": "2026-10-10",
          "claims": [
            "The retrieved official page describes inspecting step errors, response details and outbound requests, and resolving missing values, formatting or permission problems before retry."
          ]
        }
      ],
      "related": [
        "zapier-sheets-to-xero-missing-columns",
        "guide-zapier-field-mapping",
        "tool-workflow-value",
        "zapier-facebook-leads-to-salesforce"
      ],
      "sections": [
        {
          "heading": "Specify the record, not just the connection",
          "body": [
            "Write an example invoice using synthetic values: supplier/customer reference, dates, currency, line items, amounts and the agreed accounting codes. Identify which system is authoritative for each field. A connection test can succeed while the business record is incomplete or assigned to the wrong organisation."
          ],
          "items": [
            "No real supplier bank details, invoice documents or customer records in an enquiry.",
            "Name mandatory fields and validation rules.",
            "Separate account mapping from tax or accounting advice, which is not included."
          ]
        },
        {
          "heading": "Decide duplicate behaviour before retrying",
          "body": [
            "If a run fails after creating a target record, retrying can create another one. Agree a stable source reference and the intended create-versus-update behaviour. The finance owner should define how exceptions are reconciled; a provider error message does not prove that no write occurred."
          ],
          "items": [
            "Test with disposable records on an authorised route.",
            "Inspect target state before replaying a failed action.",
            "Do not bulk replay historical invoices as a diagnostic step."
          ]
        },
        {
          "heading": "What acceptance should include",
          "body": [
            "Inspect the agreed synthetic invoice in the destination with every required field, expected totals and correct organisation. Repeat the same source input and verify the agreed duplicate rule. Test a missing mandatory field and ensure it is visibly rejected or routed for review instead of silently creating incomplete accounting data."
          ],
          "items": [
            "Keep redacted source-to-target results and exception evidence.",
            "Human approval stays with the finance owner for posting or consequential live changes."
          ]
        },
        {
          "heading": "Evaluate value honestly",
          "body": [
            "Estimate time saved using your own measured case volume and effort, including checking and exceptions. Time value is not automatically cash savings: staff may use freed capacity elsewhere rather than reduce payroll. The workflow calculator uses your inputs, not a promised provider ROI or our service quote."
          ],
          "items": []
        }
      ],
      "incoming": [
        "guide-zapier-field-mapping",
        "guide-sheets-xero-line-item-shape",
        "tool-workflow-value",
        "tool-invoice-rounding-bench",
        "example-invoice-retry-identity-matrix",
        "collection-finance-invoice-integrity-checks",
        "guide-invoice-tax-amount-basis",
        "guide-invoice-create-unknown-outcome"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/buyers/finance-manager-invoice-integration/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/buyers/finance-manager-invoice-integration/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fbuyers%2Ffinance-manager-invoice-integration%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fbuyers%2Ffinance-manager-invoice-integration%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "guide-zapier-field-mapping",
      "type": "guide",
      "title": "A Zap runs, but fields are missing: trace the value from trigger to destination",
      "description": "Inspect one synthetic record through each step and separate missing input, transformation, permissions and destination validation.",
      "slug": "zapier-field-mapping",
      "url": "/guides/zapier-field-mapping/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "Zapier: action troubleshooting",
          "url": "https://help.zapier.com/hc/en-us/articles/8496037690637-Test-your-Zap-actions",
          "checked": "2026-10-10",
          "claims": [
            "The retrieved official article describes inspecting failed steps, logs, response details and outbound requests.",
            "Missing values, formatting, permissions, expired credentials and limits can cause action problems."
          ]
        }
      ],
      "related": [
        "zapier-sheets-to-xero-missing-columns",
        "zapier-facebook-leads-to-salesforce",
        "buyer-finance-manager-invoice-integration",
        "tool-workflow-value"
      ],
      "sections": [
        {
          "heading": "Follow one value across the boundaries",
          "body": [
            "Choose one authorised synthetic source record with known values. Check what the trigger provided, what each transformation returned, what the action sent and what the destination stored. A workflow marked successful is not enough to prove all intended fields were mapped."
          ],
          "items": [
            "Name the destination organisation, object and field.",
            "Record whether the source value was absent, blank, transformed or rejected.",
            "Do not export real lead or invoice payloads for an enquiry."
          ]
        },
        {
          "heading": "Read the step evidence",
          "body": [
            "Zapier's retrieved troubleshooting article describes inspecting the affected step's response and outgoing request. Missing inputs may mean useful logs are absent. Distinguish an absent source field from a stale mapping, invalid format or account permission problem; those require different changes."
          ],
          "items": [
            "Compare field names and expected types, not just display labels.",
            "Resolve expired access with the account holder without sending its credential.",
            "Check the destination after a failure before assuming it contains no record."
          ]
        },
        {
          "heading": "Testing is not assumed to be a dry run",
          "body": [
            "Do not assume a button labelled Test or Replay leaves connected systems unchanged. Agree a disposable destination and review the specific action's effects before invoking it. Lead creation, invoice creation and notification can have consequences even with made-up input. The operator needs written authority for the named test route."
          ],
          "items": [
            "Use a stable synthetic reference to identify created records.",
            "Test the create-versus-update or duplicate rule.",
            "Avoid bulk replay until reconciliation and recovery are agreed."
          ]
        },
        {
          "heading": "Prove the complete business record",
          "body": [
            "Acceptance should show the required values in the intended target record, correct object/account mapping and a controlled missing-field case. Keep redacted before-and-after step evidence and any remaining exclusions. Credentials, client access and purchases are not part of first-contact diagnosis; scope is confirmed before private work."
          ],
          "items": []
        }
      ],
      "platforms": [
        "zapier"
      ],
      "incoming": [
        "buyer-finance-manager-invoice-integration",
        "guide-sheets-xero-line-item-shape",
        "tool-workflow-value",
        "guide-zapier-duplicate-records-five-causes",
        "platform-zapier",
        "guide-sheets-invoice-value-rendering",
        "guide-invoice-create-unknown-outcome"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/guides/zapier-field-mapping/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/guides/zapier-field-mapping/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fzapier-field-mapping%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fguides%2Fzapier-field-mapping%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "guide-sheets-xero-line-item-shape",
      "type": "guide",
      "title": "One Sheets row becomes one Xero invoice line: check the line-item shape",
      "description": "Distinguish missing spreadsheet headers from multiple products mapped into one invoice line, using a disposable two-product acceptance case.",
      "slug": "sheets-xero-line-item-shape",
      "url": "/guides/sheets-xero-line-item-shape/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "platforms": [
        "zapier",
        "google-sheets",
        "xero"
      ],
      "provenance": [
        {
          "label": "Canonical SI offer: five mapped fields and one draft invoice, not arbitrary workbook transformation",
          "checked": "2026-10-11",
          "claims": [
            "The existing offer excludes variable many-to-many transformation and live invoice sending. The guide's two-product arithmetic and acceptance checklist are authored proposals derived from this scope, not an executed integration or a provider-documented configuration recipe."
          ],
          "url": "https://backoffice.syntheticindustry.ai/services/zapier-sheets-to-xero-missing-columns/"
        }
      ],
      "related": [
        "zapier-sheets-to-xero-missing-columns",
        "guide-zapier-field-mapping",
        "buyer-finance-manager-invoice-integration",
        "tool-workflow-value"
      ],
      "sections": [
        {
          "heading": "Identify which of three different things is missing",
          "body": [
            "If a column is absent from the trigger sample, inspect the header and sample before editing Xero. If the trigger contains both products but the action exposes only one product's values, inspect the transformation and action mapping. If the action receives both products but the draft invoice has one merged description or the wrong amount, inspect how those values are represented as invoice lines. A successful Zap run does not distinguish these cases."
          ],
          "items": [
            "Record whether your source is one row with several product columns, several rows for one invoice, or already structured line items.",
            "Write down the number of invoices and lines you expect before changing the Zap.",
            "Do not assume a comma-separated description is two invoice lines, or that looping over two products should create two invoices."
          ]
        },
        {
          "heading": "Use a small example that makes a collapsed line obvious",
          "body": [
            "This is an invented test specification, not a tested integration or accounting advice. In an authorised demo context, use product A with quantity 2 and unit amount 10, and product B with quantity 1 and unit amount 7. With tax excluded solely for this synthetic arithmetic example, the expected line amounts are 20 and 7 and the total is 27. The result should be one unsent draft with two separate lines, not one line worth 27 and not two invoices. Your finance owner specifies actual currency, account and tax rules separately."
          ],
          "items": [
            "Use two clearly different descriptions and quantities so misaligned positions are visible.",
            "Compare each description with its own quantity, unit amount and resulting line amount; a correct grand total can conceal swapped lines.",
            "Use the finance owner's authorised demo or disposable draft route. Test buttons can create records; do not connect this example to real customers."
          ]
        },
        {
          "heading": "Keep the line-item attributes aligned",
          "body": [
            "This checklist specifies the business result; it does not establish which current Zapier action or formatter supports your source layout. The authorised implementer must confirm that separately before agreeing the repair. Inspect the proposed output before the invoice step: each description must remain paired with the intended quantity, amount and agreed accounting attributes. A correct total alone cannot show whether two products retained their separate identities."
          ],
          "items": [
            "A blank second description paired with a second amount should be caught rather than silently omitted.",
            "Variable-length product groups, several source rows per invoice or grouping several customers are larger transformation problems; do not squeeze them into a five-field remapping quote.",
            "Do not bulk replay runs to test the transformation. Inspect destination state first and agree how repeated source references are handled."
          ]
        },
        {
          "heading": "What a useful enquiry contains",
          "body": [
            "For the existing Sheets-to-Xero mapping service, send synthetic headers, whether one row already triggers the Zap, expected invoice and line counts, and the point where the second product disappears. State who owns the Xero organisation, can approve a disposable draft test and can decide on the posted price. We confirm whether the bounded field-mapping offer fits; variable line-item transformation needs a separate scope, not a hidden extension of that price."
          ],
          "items": [
            "Do not send customer names, bank details, invoice exports, credentials or access invitations initially.",
            "Keep the expected and actual line counts in the enquiry even if the Zap shows success.",
            "After agreement, acceptance also needs the agreed repeated-input and missing-field checks; no live invoice is sent by this diagnostic guide."
          ]
        }
      ],
      "incoming": [
        "example-invoice-tax-rounding-reconciliation",
        "collection-finance-invoice-integrity-checks",
        "guide-sheets-invoice-value-rendering"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/guides/sheets-xero-line-item-shape/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/guides/sheets-xero-line-item-shape/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fsheets-xero-line-item-shape%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fguides%2Fsheets-xero-line-item-shape%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "tool-workflow-value",
      "type": "tool",
      "tool_kind": "workflow-value",
      "title": "Workflow time-value calculator: show the assumptions behind automation payback",
      "description": "Use your own time, volume, cost and running-cost inputs to calculate simple monthly value and payback; not a quote or guaranteed saving.",
      "slug": "workflow-value",
      "url": "/tools/workflow-value/",
      "version": 3,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "Calculator implementation",
          "url": "https://syntheticindustry.ai/demand.js",
          "checked": "2026-10-10",
          "claims": [
            "Hours equal minutes per case times cases per month divided by 60.",
            "Gross monthly time value equals those hours times hourly cost; net subtracts monthly running cost.",
            "Payback is setup cost divided by positive net monthly value; otherwise there is no positive payback.",
            "Inputs must be finite non-negative numbers no greater than 100000000."
          ]
        }
      ],
      "related": [
        "buyer-finance-manager-invoice-integration",
        "guide-zapier-field-mapping",
        "zapier-sheets-to-xero-missing-columns",
        "zapier-facebook-leads-to-salesforce"
      ],
      "sections": [
        {
          "heading": "Enter savings, not total workflow duration",
          "body": [
            "Use the minutes you expect to remove from each case, not all minutes currently spent if checking and exceptions will remain. Supply cases per month, hourly cost, one-time setup cost and monthly running cost. All monetary values must use the same currency. Your inputs are assumptions; the page has no measured volume, provider benchmark or quoted service price."
          ],
          "items": [
            "Use observed baseline timing when available.",
            "Subtract expected exception-handling and review effort from the minutes saved.",
            "Include provider fees in running cost where applicable."
          ]
        },
        {
          "heading": "The arithmetic",
          "body": [
            "Monthly hours = minutes saved per case × monthly cases ÷ 60. Gross monthly time value = hours × hourly cost. Net monthly value = gross value − monthly running cost. Simple payback = setup cost ÷ positive net monthly value. A zero or negative net value has no positive payback under these assumptions."
          ],
          "items": [
            "Worked arithmetic, not an observed case: 10 minutes × 120 cases ÷ 60 = 20 hours.",
            "At 30 per hour, gross value is 600; running cost of 100 leaves 500.",
            "Setup cost of 1500 divided by 500 gives three months; none of these inputs is our quote or a proven saving."
          ]
        },
        {
          "heading": "Time value is not cash received",
          "body": [
            "Freed time may allow other work without reducing payroll. Taxes, financing, changing volumes, implementation delays and new ongoing exceptions are not modelled. A positive result does not prove that an integration can be safely delivered or that a buyer will pay for it. Test the complete business record and duplicate behaviour separately."
          ],
          "items": [
            "Compare conservative and optimistic input assumptions.",
            "Measure the actual workflow after an authorised delivery before claiming savings."
          ]
        },
        {
          "heading": "Local calculation and its limits",
          "body": [
            "The inspected calculator computes from numeric browser inputs; it does not submit or store these values. Do not enter confidential figures if you do not want them visible on your screen. An enquiry is separate from this calculator, not an automatic payment or quote."
          ],
          "items": []
        }
      ],
      "incoming": [
        "buyer-finance-manager-invoice-integration",
        "guide-zapier-field-mapping",
        "guide-sheets-xero-line-item-shape"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/tools/workflow-value/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/tools/workflow-value/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Ftools%2Fworkflow-value%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Ftools%2Fworkflow-value%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "guide-zapier-duplicate-records-five-causes",
      "type": "guide",
      "title": "A Zap created the record twice: find which of five causes it was",
      "description": "Count the runs, then check for a second Zap on the same trigger, a self-trigger, a replay and a plain create step before you change anything.",
      "url": "/guides/zapier-duplicate-records-five-causes/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "provenance": [
        {
          "label": "Zapier: how Zapier handles duplicate data",
          "url": "https://help.zapier.com/hc/en-us/articles/8496260269965-How-Zapier-handles-duplicate-data-in-Zap-workflows",
          "checked": "2026-10-11",
          "claims": [
            "For polling triggers Zapier compares each item's unique ID with IDs the Zap has already seen and runs only for a new ID.",
            "De-duplication checks only within the same Zap, so two Zaps built on one trigger both fire.",
            "How an action step handles duplicate data depends on the destination app, and an app that allows duplicates gets a duplicate record."
          ]
        },
        {
          "label": "Zapier: how Zap triggers work",
          "url": "https://help.zapier.com/hc/en-us/articles/8496244568589-How-Zap-triggers-work",
          "checked": "2026-10-11",
          "claims": [
            "A Zap that writes back to the app and resource it monitors can retrigger itself in a loop."
          ]
        },
        {
          "label": "Zapier: Zap is stuck in a loop",
          "url": "https://help.zapier.com/hc/en-us/articles/8496232045453-Zap-is-stuck-in-a-loop",
          "checked": "2026-10-11",
          "claims": [
            "Recommended fixes include a marker plus a filter, a dedicated processed field and replacing create steps with Find or Create actions."
          ]
        },
        {
          "label": "Zapier: what is replay",
          "url": "https://help.zapier.com/hc/en-us/articles/19220226086797-What-is-replay",
          "checked": "2026-10-11",
          "claims": [
            "Replay from Zap history retries only steps that errored; replay from the editor re-runs every step of the Zap starting with the trigger."
          ]
        },
        {
          "label": "Zapier: search steps",
          "url": "https://help.zapier.com/hc/en-us/articles/8496241402253",
          "checked": "2026-10-11",
          "claims": [
            "Some search actions offer a create-if-it-does-not-exist option; when a search finds nothing the step is halted unless set to succeed."
          ]
        }
      ],
      "related": [
        "platform-zapier",
        "guide-zapier-errored-halted-and-replay",
        "guide-zapier-field-mapping"
      ],
      "sections": [
        {
          "heading": "Count the runs before you change anything",
          "body": [
            "Open Zap history and find the time the duplicate was created. The number of runs around that moment tells you which half of the Zap to look at. Two runs for one source event points at the trigger side. One run that wrote two records points at the action side. A run followed some time later by a replay points at replay. Write down which pattern you see before you edit anything, because the fixes differ and a wrong fix can hide the real cause."
          ],
          "items": [
            "Two runs with the same source record ID: a second Zap, or a trigger that fired twice.",
            "Two runs with different source IDs: two real events, so the Zap is doing what it was built to do.",
            "One run and two records: two create steps, or a repeated branch inside the Zap.",
            "A run and a replay: a replay ran a step again that had already succeeded."
          ]
        },
        {
          "heading": "Trigger-side causes",
          "body": [
            "Zapier says that for a polling trigger it compares each item's unique ID with the IDs the Zap has already seen, and runs only when it sees a new one. It also says this check works only inside one Zap, so two Zaps built on the same form or app event both fire. Instant triggers do not use the check, because the app is expected to send each event once. If the sending app delivers an event twice, the Zap runs twice.",
            "A Zap can also trigger itself. Zapier's trigger documentation warns that a Zap that writes back to the app and resource it watches can loop, and its loop article lists a trigger for new or updated records that fires again when the Zap's own action edits the record. Look for a Zap whose action changes the same kind of record its trigger watches."
          ],
          "items": [
            "Search your Zap list for every Zap that uses the same trigger app and event, including old ones that were switched off and on again.",
            "Check whether the action step edits the record type the trigger watches.",
            "Ask the source app whether it can send one event twice, for example after a retry."
          ]
        },
        {
          "heading": "Action-side causes and replay",
          "body": [
            "How an action behaves when the data already exists depends on the destination app. Zapier's article says that if an app allows duplicate data, Zapier creates a duplicate record; if the app does not allow it, Zapier returns an error; and on rare occasions the app ignores the duplicate. A plain create step is therefore safe only when the destination refuses repeats.",
            "Replay is a second route to duplicates. Zapier documents that replaying from Zap history retries only the steps that errored, while replaying a whole run from the editor re-runs every step, starting with the trigger, whatever happened before. A create step that had succeeded can run again. As a caution rather than a documented rule: a step that reported an error after its request reached the destination may already have created a record, so look at the destination before you replay."
          ],
          "items": [
            "Treat the editor's full-run replay as a deliberate second run of everything.",
            "Check the destination for the record before replaying an errored create step.",
            "Do not replay a run on live data just to test a fix."
          ]
        },
        {
          "heading": "What usually fixes it",
          "body": [
            "The durable fix is to make creation find-first. Zapier's loop article recommends swapping plain create steps for find-or-create actions so that an existing record is not duplicated. Its search-step article explains that only some searches offer a create-if-it-does-not-exist option, and that when a search finds nothing the step stops as halted unless it is set to count as successful. Where the app has no such option, a search step followed by a filter or a path can do the same job.",
            "Choose the field that identifies one real thing, such as an order number or an email address, and use that field for the search. If the Zap edits its own source, add a processed marker field and a filter that stops records already marked."
          ],
          "items": [
            "Write down one unique key for each record type.",
            "Decide whether a match should be left alone or updated, and which fields may be overwritten.",
            "Test with disposable records: the same event twice, a full-run replay, and one different event."
          ]
        },
        {
          "heading": "What this guide does not cover",
          "body": [
            "This guide does not clean up duplicates that already exist. Merging or deleting records can lose information and needs its own decision about which record wins. It also does not cover a Zap that never starts, or a mapping that drops fields; the existing field-mapping guide covers the second.",
            "The paid outcome for this problem is one Zap and one create step. It is accepted when one synthetic event creates one record, the same event again and a full-run replay still leave one record, and a different event creates its own record. Send the Zap's trigger and destination, with no customer data, and fit is confirmed before any access."
          ],
          "items": []
        }
      ],
      "platforms": [
        "zapier"
      ],
      "incoming": [
        "guide-zapier-errored-halted-and-replay",
        "platform-zapier"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/guides/zapier-duplicate-records-five-causes/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/guides/zapier-duplicate-records-five-causes/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fzapier-duplicate-records-five-causes%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fguides%2Fzapier-duplicate-records-five-causes%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "guide-zapier-errored-halted-and-replay",
      "type": "guide",
      "title": "A Zap stopped or shows Errored or Halted: what each status means and what to replay",
      "description": "Read the run status first, understand why a Zap turns itself off, and know what a replay repeats and why error emails can arrive hours late.",
      "url": "/guides/zapier-errored-halted-and-replay/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "provenance": [
        {
          "label": "Zapier: troubleshoot errors in Zap workflows",
          "url": "https://help.zapier.com/hc/en-us/articles/8496037690637-How-to-troubleshoot-errors-in-Zap-workflows",
          "checked": "2026-10-11",
          "claims": [
            "A Zap automatically turns off if 95% of its runs result in errors in the last 7 days.",
            "Errored runs did not finish; safely halted runs stopped on purpose, usually when a search step found nothing, and do not turn the Zap off.",
            "Other statuses include On hold, Handled error and Scheduled."
          ]
        },
        {
          "label": "Zapier: what is replay",
          "url": "https://help.zapier.com/hc/en-us/articles/19220226086797-What-is-replay",
          "checked": "2026-10-11",
          "claims": [
            "Autoreplay tries a failed step up to 5 times, at 5 minutes, 30 minutes, 1 hour, 3 hours and 6 hours after the previous attempt.",
            "Replay must happen within 60 days of the initial trigger event.",
            "Replay from history breaks if steps are added, deleted or moved, full-run replay is billed again, and autoreplay and full-run replay need a paid plan.",
            "Error emails and Zapier Manager triggers wait until the final autoreplay attempt fails."
          ]
        },
        {
          "label": "Zapier: set up custom error handling",
          "url": "https://help.zapier.com/hc/en-us/articles/22495436062605-Set-up-custom-error-handling",
          "checked": "2026-10-11",
          "claims": [
            "Publishing a Zap with error handling turns its autoreplay off, and no error notification email is sent when a handler runs.",
            "Custom error handling is available on Professional, Team and Enterprise plans."
          ]
        },
        {
          "label": "Zapier: how Zap triggers work",
          "url": "https://help.zapier.com/hc/en-us/articles/8496244568589-How-Zap-triggers-work",
          "checked": "2026-10-11",
          "claims": [
            "A Zap does not fire for data created in the app before the Zap was turned on.",
            "If a Zap stops triggering with no errors, turning it off, waiting about a minute and turning it on resets the trigger connection."
          ]
        }
      ],
      "related": [
        "platform-zapier",
        "guide-zapier-duplicate-records-five-causes"
      ],
      "sections": [
        {
          "heading": "Read the status before you touch the Zap",
          "body": [
            "Zapier's troubleshooting article separates runs that errored from runs that were safely halted. An errored run hit a problem and did not finish. A safely halted run stopped on purpose, usually because a search step found nothing, and halted runs do not cause the Zap to switch off. The article also names other statuses you will meet in Zap history."
          ],
          "items": [
            "Errored: the run did not finish because of a problem, such as a rejected value or an expired connection.",
            "Safely halted: the run stopped deliberately, often because a search found no match.",
            "On hold: the run is paused, for example because an app is disconnected or a task limit was reached.",
            "Handled error: a custom error handler took over the run.",
            "Scheduled: the run errored and Autoreplay will try it again."
          ]
        },
        {
          "heading": "Why a Zap can switch itself off",
          "body": [
            "Zapier states that a Zap will turn off automatically if 95% of its runs result in errors in the last 7 days. The article describes warning emails and a grace period for Team and Enterprise accounts. The practical effect is that a Zap with one broken step can go quiet without anyone choosing to stop it, and then nothing runs until someone notices.",
            "A Zap that is off is not collecting anything. Zapier's trigger documentation says a Zap does not fire for data created in the app before it was turned on, which means records created while a Zap was off may need separate handling when you turn it back on. Decide how you will catch up before you switch it back on, rather than after."
          ],
          "items": [
            "Check whether the Zap was switched off by Zapier, by a colleague or by an error rate.",
            "List what happened in the source app while the Zap was off.",
            "Fix the cause of the errors before switching on; otherwise the error rate can climb again."
          ]
        },
        {
          "heading": "Replay and Autoreplay: what each repeats",
          "body": [
            "Zapier's replay article says replay from Zap history retries only steps that errored, and leaves successful steps alone. Replaying a whole run from the editor re-runs every step, starting with the trigger, whatever each step's earlier status, and bills the tasks again. A replay must happen within 60 days of the initial trigger event, and it fails if you have added, removed or moved steps since. Zapier also says it cannot guarantee a replay will succeed.",
            "Autoreplay retries an errored step up to five times. The article gives the gaps as 5 minutes, 30 minutes, 1 hour, 3 hours and 6 hours, so the last attempt lands about ten and a half hours after the first error. It is meant for temporary problems such as a short outage. For an error you have already fixed, a manual replay recovers the data."
          ],
          "items": [
            "Use history replay for a fixed errored step, after checking the destination for a half-finished record.",
            "Use full-run replay only when every step should run again.",
            "Plan features differ: autoreplay and full-run replay need a paid plan."
          ]
        },
        {
          "heading": "Why the alert can be late or missing",
          "body": [
            "With Autoreplay on, Zapier holds back error emails and Zapier Manager triggers until the final attempt fails. A person waiting for an email about a broken Zap may therefore hear about it hours after it first failed. A custom error handler changes this again: publishing a Zap with error handling turns that Zap's autoreplay off, and no error notification email is sent when a handler runs. The handler must send its own alert, and a failure inside the handler needs its own check.",
            "None of this is a fault. It means that who is told, and when, depends on settings that someone chose once and may have forgotten. A named alert route with a test is the only way to know it works."
          ],
          "items": [
            "Find out whether each important Zap uses Autoreplay, a custom handler or neither.",
            "Send a test failure on a copy and see who receives what, and when.",
            "Use a shared mailbox, so the alert does not depend on one person."
          ]
        },
        {
          "heading": "A Zap that stops without any error",
          "body": [
            "If a Zap simply stops triggering and shows no errors, Zapier's trigger documentation suggests turning it off, waiting about a minute and turning it on again, which resets the trigger connection. It also warns that sample records shown while building can differ from live data, and that large bulk results, for example from a data migration, may be held for review rather than run at once. These explain some quiet Zaps without any fault in the Zap's steps.",
            "If you have to guess whether a Zap is healthy, compare the number of source records with the number of runs for a day you can check by hand. A gap that grows is a trigger problem, not an action problem."
          ],
          "items": []
        },
        {
          "heading": "What this guide does not cover",
          "body": [
            "This guide helps you read what happened. It does not fix a Zap, recover records from a live replay or promise that an alert will arrive. The paid outcome for alerts hooks up a shared alert for up to five named automations and proves it with a deliberate failure on a copy. A standing service watches named automations and prepares corrected copies for you to switch on. Neither includes round-the-clock cover or a response-time guarantee."
          ],
          "items": []
        }
      ],
      "platforms": [
        "zapier"
      ],
      "incoming": [
        "guide-zapier-duplicate-records-five-causes",
        "platform-zapier"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/guides/zapier-errored-halted-and-replay/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/guides/zapier-errored-halted-and-replay/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fzapier-errored-halted-and-replay%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fguides%2Fzapier-errored-halted-and-replay%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "platform-zapier",
      "type": "platform",
      "title": "Zapier automations: what repeats, what stops and who is told",
      "description": "The documented behaviours behind duplicate records, switched-off Zaps, late alerts and scheduled runs, and which outcome fits each problem.",
      "url": "/platforms/zapier/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "provenance": [
        {
          "label": "Zapier: how Zapier handles duplicate data",
          "url": "https://help.zapier.com/hc/en-us/articles/8496260269965-How-Zapier-handles-duplicate-data-in-Zap-workflows",
          "checked": "2026-10-11",
          "claims": [
            "De-duplication of polling triggers checks only within one Zap, and an action on an app that allows duplicates creates a duplicate record."
          ]
        },
        {
          "label": "Zapier: troubleshoot errors in Zap workflows",
          "url": "https://help.zapier.com/hc/en-us/articles/8496037690637-How-to-troubleshoot-errors-in-Zap-workflows",
          "checked": "2026-10-11",
          "claims": [
            "A Zap turns off automatically if 95% of its runs result in errors in the last 7 days; halted runs do not count."
          ]
        },
        {
          "label": "Zapier: what is replay",
          "url": "https://help.zapier.com/hc/en-us/articles/19220226086797-What-is-replay",
          "checked": "2026-10-11",
          "claims": [
            "Replay from history retries only errored steps, replay from the editor re-runs every step, and error emails wait for the final autoreplay attempt."
          ]
        },
        {
          "label": "Zapier: schedule Zap workflows",
          "url": "https://help.zapier.com/hc/en-us/articles/8496288648461-Schedule-Zap-workflows-to-run-at-specific-intervals",
          "checked": "2026-10-11",
          "claims": [
            "Schedule triggers use the Zapier account's time zone, not the Zap's."
          ]
        }
      ],
      "related": [
        "guide-zapier-duplicate-records-five-causes",
        "guide-zapier-errored-halted-and-replay",
        "guide-zapier-field-mapping",
        "zapier-facebook-leads-to-salesforce",
        "zapier-sheets-to-xero-missing-columns"
      ],
      "sections": [
        {
          "heading": "Four things Zapier does that surprise people",
          "body": [
            "A Zap looks simple, but several documented behaviours decide whether it can be trusted. De-duplication for polling triggers compares item IDs, but only inside one Zap, so two Zaps on one trigger both fire, and it does not stop an action creating a second record. A Zap that errors on 95% of its runs over seven days is switched off by Zapier. Replay comes in two kinds: from history it repeats only errored steps, from the editor it repeats every step. And scheduled Zaps follow the account's time zone, not the Zap's."
          ],
          "items": []
        },
        {
          "heading": "Failure is quiet unless someone arranges it",
          "body": [
            "With Autoreplay on, error emails and Zapier Manager triggers wait until the final attempt fails, so the first person to hear may hear about ten and a half hours late. A custom error handler turns the standard emails off. Halted runs, which are deliberate stops often caused by a search finding nothing, are described separately from errors and do not switch the Zap off, so they are easy to overlook. If an important Zap matters daily, someone has to decide who is told, test it with a deliberate failure on a copy, and look at run history from time to time."
          ],
          "items": []
        },
        {
          "heading": "Choose the outcome that matches the symptom",
          "body": [
            "Records appear twice: the duplicate-records outcome examines one Zap and one create step. A Facebook Lead Ads Zap shows a sample lead but no live ones: the existing Facebook-to-Salesforce outcome. Fields go missing on the way to Xero: the existing Sheets-to-Xero mapping outcome. Nobody is told when Zaps fail: the failure-alerts outcome covers up to five named automations. Zaps fail now and then and nobody has time to watch: the standing monitor-and-repair service. Each is separate, with its own test and its own boundaries."
          ],
          "items": [
            "Duplicate records: one Zap, one create step, three synthetic sends and a replay.",
            "Alerts: a deliberate failure on a copy reaches a shared place and two named people.",
            "Standing monitoring: weekly review and up to two repairs a month, no response-time promise."
          ]
        },
        {
          "heading": "Safe first contact",
          "body": [
            "Describe the Zap's trigger and destination, what you see and when it started. Do not send passwords, API keys, customer lists, invoices or an account invitation. Fit, scope and price are confirmed in writing before any access, and we work on a copy with synthetic data. Every price on the linked outcome pages is an untested proposal, and payment for fixed jobs follows the agreed checks and your sign-off."
          ],
          "items": []
        }
      ],
      "incoming": [
        "guide-zapier-duplicate-records-five-causes",
        "guide-zapier-errored-halted-and-replay"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/platforms/zapier/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/platforms/zapier/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fplatforms%2Fzapier%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fplatforms%2Fzapier%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "example-pdf-price-list-reconciliation",
      "type": "example",
      "title": "Synthetic price list: a page-by-page row count that finds two mistakes a matching total hides",
      "description": "An invented three-page price list shows why rows are counted per page. A first extraction matches on the total, 14 of 14, while page 1 is a row short and page 2 has an extra row.",
      "url": "/examples/pdf-price-list-reconciliation/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "platforms": [
        "pdf-documents",
        "microsoft-excel"
      ],
      "buyer_role": "Office or purchasing manager who has to trust data taken from a PDF",
      "purchase_trigger": "A spreadsheet built from a supplier list has the right number of rows but nobody trusts it",
      "problem": "A total that matches can hide two errors that cancel each other out.",
      "related": [
        "guide-extract-reconciliation-method",
        "guide-pdf-text-layer-or-scan-check",
        "extract-pdf-price-lists-to-spreadsheet",
        "platform-pdf-documents"
      ],
      "provenance": [
        {
          "label": "Power Query PDF connector (Microsoft Learn)",
          "url": "https://learn.microsoft.com/en-us/power-query/connectors/pdf",
          "checked": "2026-10-11",
          "claims": [
            "Pdf.Tables returns tables found in a PDF; where multi-line rows are not identified properly the data may need cleaning, and similar tables on consecutive pages are combined by default."
          ]
        },
        {
          "label": "pdfplumber README",
          "url": "https://github.com/jsvine/pdfplumber",
          "checked": "2026-10-11",
          "claims": [
            "Table extraction works best on machine-generated PDFs and the project offers no text recognition."
          ]
        }
      ],
      "sections": [
        {
          "heading": "The invented source",
          "body": [
            "This is a made-up three-page price list from an imaginary supplier, with invented codes and prices. It was not taken from any real document or customer. Page 2 has one description that wraps onto a second line and one entry with no numeric price. Page 3 begins with a repeated heading line, which is layout and not a record. The correct count is 14 data rows: 6, 5 and 3."
          ],
          "items": [],
          "code": "page | code | description                           | unit  | price\n1    | A100 | Pine batten 25x50 mm, 2.4 m           | each  | 3.20\n1    | A101 | Pine batten 25x50 mm, 3.0 m           | each  | 4.05\n1    | A102 | Pine batten 38x63 mm, 2.4 m           | each  | 5.10\n1    | A110 | Plywood sheet 9 mm, 2440x1220         | sheet | 28.50\n1    | A111 | Plywood sheet 12 mm, 2440x1220        | sheet | 36.90\n1    | A120 | Wood screw 4x40 mm, box of 200        | box   | 7.45\n2    | A130 | Hinge, zinc, 75 mm                    | pair  | 2.60\n2    | A131 | Gate hinge, galvanised, heavy duty,   | pair  | 9.95\n2    |      |   with fixing bolts   (wrapped line)  |       |\n2    | A132 | Door latch, black                     | each  | 4.30\n2    | A140 | Paint, white satin, 2.5 l             | tin   | 18.40\n2    | A141 | Paint, colour match to sample         | each  | on request\n3    | (repeated heading line, not a record)\n3    | A150 | Dust sheet, 3.6x2.7 m                 | each  | 3.75\n3    | A151 | Masking tape, 50 m                    | roll  | 1.95\n3    | A160 | Cable clips, box of 100               | box   | 2.15"
        },
        {
          "heading": "First pass: the total matches, two pages do not",
          "body": [
            "Imagine a first extraction. Two tightly spaced lines on page 1 were read as a single row, and the wrapped second line of A131 on page 2 was read as a row of its own with an empty code. The repeated heading line on page 3 was correctly left out. The total is 14 against 14, so a check of the total alone would pass. Counting per page shows what happened."
          ],
          "items": [
            "A total of 14 extracted rows against 14 expected passes a total-only check.",
            "Page 1 is one row short and page 2 has one row too many, so two errors cancel each other."
          ],
          "code": "page | rows counted | first pass | difference | note\n1    | 6            | 5          | -1         | A101 and A102 read as one row\n2    | 5            | 6          | +1         | wrapped line of A131 became a row with no code\n3    | 3            | 3          | 0          | repeated heading line left out\nall  | 14           | 14         | 0          | total matches; two pages do not"
        },
        {
          "heading": "After correction: 13 clean rows and one exception",
          "body": [
            "The corrections join the wrapped description to A131 and split A101 from A102. Entry A141 has no numeric price. The agreed rule for this example is that a row without a numeric price goes to the exceptions sheet with the price left blank, so the data sheet holds 13 rows and the exceptions sheet holds one. The rule is invented for this example; a real job agrees it with the owner first."
          ],
          "items": [
            "Rows counted 14 = data rows 13 + exceptions 1.",
            "Every extracted row keeps its source page, so the counts can be repeated by filtering."
          ],
          "code": "page | rows counted | data sheet | exceptions | difference\n1    | 6            | 6          | 0          | 0\n2    | 5            | 4          | 1 (A141)   | 0\n3    | 3            | 3          | 0          | 0\nall  | 14           | 13         | 1          | 0"
        },
        {
          "heading": "The sample check, chosen before looking",
          "body": [
            "A sample of three rows is fixed in advance: one that was wrongly joined, one with a wrapped description and the last row of the last page. Each field is compared with the source."
          ],
          "items": [
            "A real sample would be larger, with a size and method agreed in writing; three rows keep the example short."
          ],
          "code": "row  | field       | source                              | extracted                           | result\nA101 | description | Pine batten 25x50 mm, 3.0 m         | Pine batten 25x50 mm, 3.0 m         | match\nA101 | price       | 4.05                                | 4.05                                | match\nA131 | description | Gate hinge, galvanised, heavy duty, with fixing bolts | Gate hinge, galvanised, heavy duty, with fixing bolts | match\nA160 | price       | 2.15                                | 2.15                                | match"
        },
        {
          "heading": "What this does not prove",
          "body": [
            "Matching counts and a matching sample do not show that every unsampled row is right, and nothing here checks that the invented prices are sensible. The result of a real job is reported as the measured counts and the sample outcomes, never as a percentage accuracy."
          ],
          "items": [
            "No real list was extracted: this is an authored illustration of the method.",
            "No extraction tool, supplier or customer is implied."
          ]
        },
        {
          "heading": "Use it to specify an enquiry",
          "body": [
            "If your own list is a text-based PDF in one layout, the one-off extraction job starts from £295 for up to 60 pages, after we have seen a redacted sample page and agreed the columns. The price is an untested proposal and payment follows the agreed checks and your sign-off. Send the page count, whether the text can be selected and the column headings you want, never the document."
          ],
          "items": []
        }
      ],
      "incoming": [
        "platform-pdf-documents",
        "collection-pdf-to-spreadsheet-diagnosis-order",
        "guide-extract-reconciliation-method"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/examples/pdf-price-list-reconciliation/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/examples/pdf-price-list-reconciliation/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fexamples%2Fpdf-price-list-reconciliation%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fexamples%2Fpdf-price-list-reconciliation%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "example-merged-report-flattened",
      "type": "example",
      "title": "Synthetic merged-cell report flattened: nine rows in, five records out, every total reconciled",
      "description": "An invented printed-style sales report with merged region labels, subtotal rows and a spacer becomes a flat five-record table, with a reconciliation showing 9 original rows = 5 records + 4 removed.",
      "url": "/examples/merged-report-flattened/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "platforms": [
        "microsoft-excel"
      ],
      "buyer_role": "Administrator who needs to sort or summarise a report built for printing",
      "purchase_trigger": "A report has merged group labels and subtotal lines, and Excel will not sort it",
      "problem": "Flattening by hand risks dropping rows, double-counting subtotals or putting a label on the wrong rows.",
      "related": [
        "guide-excel-merged-cells-and-tidy-tables",
        "spreadsheet-flatten-merged-cell-report",
        "platform-microsoft-excel",
        "guide-spreadsheet-import-readiness"
      ],
      "provenance": [
        {
          "label": "Merge and unmerge cells (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/office/merge-and-unmerge-cells-5cbd15d5-9375-4540-907f-c673a93fcedf",
          "checked": "2026-10-11",
          "claims": [
            "Merging keeps only the upper-left cell's contents; unmerging moves the data to the left cell."
          ]
        },
        {
          "label": "Find merged cells (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/office/find-merged-cells-d02b2a5a-a08d-4641-8d4d-b3f233daca2c",
          "checked": "2026-10-11",
          "claims": [
            "Excel does not sort data in a column that contains merged cells."
          ]
        },
        {
          "label": "Create a PivotTable to analyze worksheet data (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/office/create-a-pivottable-to-analyze-worksheet-data-a9a84538-bfe9-40a9-a8e9-f99134456576",
          "checked": "2026-10-11",
          "claims": [
            "Source data should have one header row, no merged cells, no blank rows or columns and one type of data per column."
          ]
        }
      ],
      "sections": [
        {
          "heading": "The invented report",
          "body": [
            "This is a made-up report with invented products and figures. In the original, each region name is one merged cell spanning the rows of that region, so the name is stored once. Subtotal lines, a blank spacer row and a grand total sit inside the data area. Below the header there are nine rows."
          ],
          "items": [],
          "code": "row | Region (merged)       | Product | Units | Value\n1   | North (3 rows merged) | Anvil   | 4     | 120.00\n2   |                       | Hinge   | 10    | 25.00\n3   |                       | Latch   | 6     | 33.00\n4   |                       | Subtotal North | 20 | 178.00\n5   | (blank spacer row)\n6   | South (2 rows merged) | Anvil   | 2     | 60.00\n7   |                       | Latch   | 9     | 49.50\n8   |                       | Subtotal South | 11 | 109.50\n9   | Grand total           |         | 31    | 287.50"
        },
        {
          "heading": "The hazard in a quick unmerge",
          "body": [
            "Unmerging alone puts North only in the first row of its block and leaves empty cells below, because Microsoft says the data in a merged cell moves to the left cell when it is split. Sorting that table would separate Hinge and Latch from their region. The label must be repeated on every row it covered, and the subtotal and spacer rows must leave the data."
          ],
          "items": []
        },
        {
          "heading": "The flat table",
          "body": [
            "One header row, no merged cells and one record per row, with the region repeated."
          ],
          "items": [
            "Five records, one per product line, each carrying its own region."
          ],
          "code": "Region | Product | Units | Value\nNorth  | Anvil   | 4     | 120.00\nNorth  | Hinge   | 10    | 25.00\nNorth  | Latch   | 6     | 33.00\nSouth  | Anvil   | 2     | 60.00\nSouth  | Latch   | 9     | 49.50"
        },
        {
          "heading": "The reconciliation",
          "body": [
            "Original rows must equal records plus removed rows, and totals must match. The removed rows are listed by type so nothing disappears unexplained."
          ],
          "items": [
            "Original rows 9 = records 5 + removed 4 (one spacer, two subtotals, one grand total).",
            "Units: records sum to 4 + 10 + 6 + 2 + 9 = 31, equal to the grand total 31.",
            "Value: records sum to 287.50, equal to the grand total 287.50; North 178.00 and South 109.50 equal the original subtotals."
          ],
          "code": "check                         | original | flat sheet | result\nrecord rows                   | 5        | 5          | match\nremoved: spacer               | 1        | 0          | listed\nremoved: subtotal lines       | 2        | 0          | listed, recomputed: 20/178.00 and 11/109.50 match\nremoved: grand total          | 1        | 0          | listed, recomputed: 31/287.50 matches\nall rows                      | 9        | 5 + 4      | match"
        },
        {
          "heading": "The label sample",
          "body": [
            "Totals cannot reveal a label put on the wrong row, so a sample compares labels record by record. In a real job at least twenty records are compared; with five records here, all five are."
          ],
          "items": [
            "Anvil/North, Hinge/North, Latch/North, Anvil/South and Latch/South each carry the label that covered them in the original."
          ]
        },
        {
          "heading": "Use it to specify an enquiry",
          "body": [
            "If your report has one repeating layout and up to 5,000 data rows, the flattening job is from £145 (an untested proposal, with the final price confirmed after we see the layout description), accepted by checks like these, with payment after your sign-off. It does not correct figures, build a pivot or deal with labels whose rows nobody can identify. Send a description of the layout and the row count, never the report."
          ],
          "items": []
        }
      ],
      "incoming": [
        "platform-microsoft-excel",
        "guide-excel-merged-cells-and-tidy-tables"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/examples/merged-report-flattened/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/examples/merged-report-flattened/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fexamples%2Fmerged-report-flattened%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fexamples%2Fmerged-report-flattened%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "example-quote-line-rounding",
      "type": "example",
      "title": "Synthetic quotation: why the same three lines total 4.38 or 4.39 depending on the rounding rule",
      "description": "Three invented lines of 1.30 plus a 12.5 per cent add-on give 4.38 if the add-on is rounded per line and 4.39 if it is rounded on the total. The rule must be written down.",
      "url": "/examples/quote-line-rounding/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "platforms": [
        "microsoft-excel",
        "microsoft-word"
      ],
      "buyer_role": "Owner or office manager who produces quotations from a price list",
      "purchase_trigger": "Two quotes with the same lines differ by a penny, or a customer queries a total",
      "problem": "A rounding rule chosen by habit gives different totals for the same lines, and a merge template can hide which rule was used.",
      "related": [
        "guide-mailmerge-fields-and-number-formats",
        "guide-excel-stale-or-text-numbers",
        "quote-pack-from-customer-brief",
        "platform-microsoft-excel"
      ],
      "provenance": [
        {
          "label": "Floating-point arithmetic may give inaccurate result in Excel (Microsoft Learn)",
          "url": "https://learn.microsoft.com/en-us/troubleshoot/microsoft-365-apps/excel/floating-point-arithmetic-inaccurate-result",
          "checked": "2026-10-11",
          "claims": [
            "Excel stores 15 digits of precision and offers the ROUND function to compensate for rounding errors."
          ]
        },
        {
          "label": "ROUND function (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/excel/functions/round-function",
          "checked": "2026-10-11",
          "claims": [
            "=ROUND(2.15, 1) returns 2.2 and =ROUND(-1.475, 2) returns -1.48."
          ]
        },
        {
          "label": "Prepare your Excel data source for a Word mail merge (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/word/prepare-your-excel-data-source-for-a-word-mail-merge",
          "checked": "2026-10-11",
          "claims": [
            "Merged numbers come through without currency or percent symbols."
          ]
        }
      ],
      "sections": [
        {
          "heading": "The invented inputs",
          "body": [
            "All figures here are invented for the example. The 12.5 per cent add-on is a made-up rate chosen only to make the rounding visible. It is not a real or recommended tax rate and nothing here is tax or accounting advice; a real rate and its rule come from you."
          ],
          "items": [],
          "code": "price list (invented)\ncode | description       | unit price\nS01  | Spacer, plastic   | 0.26\nW10  | Widget, standard  | 0.65\nW20  | Widget, long      | 1.30\n\nbrief 1: S01 x 5, W10 x 2, W20 x 1\nadd-on rate for this example: 12.5%"
        },
        {
          "heading": "The lines",
          "body": [
            "Each line is quantity times unit price. All three come to the same figure, which is what makes the difference between the two rules show."
          ],
          "items": [],
          "code": "line | code | qty | unit | net\n1    | S01  | 5   | 0.26 | 1.30\n2    | W10  | 2   | 0.65 | 1.30\n3    | W20  | 1   | 1.30 | 1.30\nnet total               | 3.90"
        },
        {
          "heading": "Two rules, two totals",
          "body": [
            "Rule A rounds the add-on on each line to two decimal places and then adds the lines. Rule B adds the net lines and rounds the add-on once on the total. Both are consistent, but they are not the same, and a quote should say which one it uses."
          ],
          "items": [
            "Rule A: 12.5% of 1.30 is 0.1625, which rounds to 0.16 on each line; three lines give 0.48; the total is 3.90 + 0.48 = 4.38.",
            "Rule B: 12.5% of 3.90 is 0.4875, which rounds to 0.49; the total is 3.90 + 0.49 = 4.39.",
            "Neither is wrong. The owner of the quote chooses and writes the rule down."
          ],
          "code": "rule | add-on          | add-on rounded | total\nA    | 3 x 0.1625      | 3 x 0.16 = 0.48 | 4.38\nB    | 0.4875 on 3.90  | 0.49            | 4.39"
        },
        {
          "heading": "Where the workbook and the template come in",
          "body": [
            "Excel stores 15 digits of precision and cannot hold some decimals exactly, so rounding should be applied with the ROUND function at the step the rule names, not left to cell formatting. Microsoft's ROUND page shows, for example, =ROUND(2.15, 1) giving 2.2. The merge template should then show the finished figures. Microsoft notes merged numbers arrive without currency symbols, so the symbol is added in the template next to the field."
          ],
          "items": []
        },
        {
          "heading": "Edge cases in a proof set",
          "body": [
            "A real proof set includes cases like these, each calculated by hand beforehand."
          ],
          "items": [
            "Brief 2 includes code S09, which is not on the price list: the proof sheet lists it as an exception and the quote has no priced line for it, never a blank or guessed price.",
            "Brief 3 includes a line with quantity 0: the written rule says whether it is omitted or shown, and the proof sheet records which.",
            "Brief 4 has a quantity at a price break: the break rule is applied and tested on both sides of the boundary."
          ]
        },
        {
          "heading": "Use it to specify an enquiry",
          "body": [
            "A batch of up to 40 quotations from one template and one price list, with your written rules, is a one-off job from £495 (an untested proposal), accepted by hand-calculated test briefs like these, with payment after your sign-off. We never send quotations. Send your rules in words and the counts, not the price list or customers."
          ],
          "items": []
        }
      ],
      "incoming": [
        "platform-microsoft-excel",
        "guide-excel-stale-or-text-numbers",
        "guide-mailmerge-fields-and-number-formats"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/examples/quote-line-rounding/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/examples/quote-line-rounding/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fexamples%2Fquote-line-rounding%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fexamples%2Fquote-line-rounding%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "example-archive-rename-manifest",
      "type": "example",
      "title": "Synthetic rename manifest: three clean renames with matching checksums and four held names",
      "description": "An invented seven-file folder shows a dry run and a manifest with a row for every file, with three renamed files whose checksums match, and four held, a pair of names that differ only in letter case, a reserved device name and a name ending in a period, all listed, not guessed.",
      "url": "/examples/archive-rename-manifest/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "platforms": [
        "file-archives"
      ],
      "buyer_role": "Administrator tidying a shared drive before a move",
      "purchase_trigger": "A bulk rename is planned and nobody knows how to show that nothing was lost",
      "problem": "Renames fail quietly on collisions and rejected names, and without a manifest nobody can reverse or verify them.",
      "related": [
        "guide-archive-rename-manifest-path-limits",
        "archive-rename-organise-with-manifest",
        "archive-digitise-and-normalise-one-archive",
        "guide-convert-legacy-office-fidelity"
      ],
      "provenance": [
        {
          "label": "Naming Files, Paths, and Namespaces (Microsoft Learn)",
          "url": "https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file",
          "checked": "2026-10-11",
          "claims": [
            "Windows file names cannot be reserved names such as CON, should not end with a space or period, and case sensitivity should not be assumed."
          ]
        },
        {
          "label": "RFC 8493: The BagIt File Packaging Format",
          "url": "https://www.rfc-editor.org/rfc/rfc8493",
          "checked": "2026-10-11",
          "claims": [
            "A payload manifest pairs a checksum with a relative path for each file so that completeness and fixity can be checked."
          ]
        }
      ],
      "sections": [
        {
          "heading": "The invented folder and rule",
          "body": [
            "These seven files and their contents are invented, and no name here holds a person's name, which a real job would also require. The first three each hold one line of text, so their checksums are real SHA-256 values that anyone could recompute. The naming rule is also invented: year-month, a subject, then a three-digit number, with no spaces. Its inputs are invented too: the year-month is each file's modified date (March 2024 for the two scans, November 2023 for the Word file) and the subject comes from a mapping sheet the buyer supplies (supplier letters for the two scans, annual report for the Word file)."
          ],
          "items": [],
          "code": "old path                       | content (one line)\nScans/scan0001.pdf             | synthetic file one\nScans/scan0002.pdf             | synthetic file two\nOld/Report FINAL.doc           | synthetic file three\nLetters/Summary.pdf            | (content not needed for this example)\nLetters/summary.pdf            | (content not needed for this example)\nMisc/CON.txt                   | (content not needed for this example)\nMisc/notes.                    | (content not needed for this example)"
        },
        {
          "heading": "The dry run, approved before anything changes",
          "body": [
            "The dry run proposes names and flags problems; it changes nothing. Microsoft says Windows should not be assumed to be case-sensitive, so Summary.pdf and summary.pdf would be the same name there and cannot both keep it. CON is a reserved device name, and Microsoft says a name should not end in a period. These four are marked held and go to the exceptions list for a person to decide; they are not copied under a new name until then."
          ],
          "items": [
            "Three files can be renamed by the rule.",
            "Four files are held: two that collide when case is ignored, one reserved name and one trailing period."
          ],
          "code": "old path                 | proposed new path                 | status\nScans/scan0001.pdf       | 2024-03_supplier-letters_001.pdf  | renamed\nScans/scan0002.pdf       | 2024-03_supplier-letters_002.pdf  | renamed\nOld/Report FINAL.doc     | 2023-11_annual-report_001.doc     | renamed\nLetters/Summary.pdf      | (held)                            | exception: differs only in case from summary.pdf\nLetters/summary.pdf      | (held)                            | exception: differs only in case from Summary.pdf\nMisc/CON.txt             | (held)                            | exception: reserved device name\nMisc/notes.              | (held)                            | exception: name ends in a period"
        },
        {
          "heading": "The manifest of all seven files",
          "body": [
            "The manifest has one row for every source file and pairs a checksum with a path, the same idea as a BagIt payload manifest. For each renamed file the source checksum and the checksum at the new path must be identical. These are SHA-256 values of the invented contents above, each including its trailing line break. The four held files have rows too, with status held, no new path and no copy until a person decides."
          ],
          "items": [
            "A mismatch on any renamed row would mean the file changed or was damaged.",
            "The reversal list is the same table read backwards for the renamed rows: the new path returns to the old path."
          ],
          "code": "status  | checksum (SHA-256)                                                | old path             | new path\nrenamed | e46e10b85f229616d8a988252da2cb5bbe562a89403d0feb9eb05cf40f68fd62  | Scans/scan0001.pdf   | 2024-03_supplier-letters_001.pdf\nrenamed | 442d39082e03d9002d710f5e09d78412d58755aff911d064ac17031be36bbd82  | Scans/scan0002.pdf   | 2024-03_supplier-letters_002.pdf\nrenamed | 3a4b2c6ac81fe538ca96417064742b5ecf8b010ed0d27ae926da9f79ecd3856e  | Old/Report FINAL.doc | 2023-11_annual-report_001.doc\nheld    | (content not given in this example)                               | Letters/Summary.pdf  | (not copied)\nheld    | (content not given in this example)                               | Letters/summary.pdf  | (not copied)\nheld    | (content not given in this example)                               | Misc/CON.txt         | (not copied)\nheld    | (content not given in this example)                               | Misc/notes.          | (not copied)"
        },
        {
          "heading": "The counts",
          "body": [
            "Counts reconcile in the same way whatever the folder size."
          ],
          "items": [
            "Source files 7 = renamed 3 + held 4.",
            "Manifest rows 7 = source files 7, with 3 rows marked renamed and 4 marked held.",
            "Files at new paths 3 = rows marked renamed 3.",
            "Originals untouched: the three source checksums are the same before and after the copy."
          ]
        },
        {
          "heading": "Use it to specify an enquiry",
          "body": [
            "For one folder tree of up to 5,000 files, the rename-and-organise job starts from £245 (an untested proposal), accepted by checks like these, with payment after your sign-off. The files are handed over as a copy through a secure route agreed in writing first; no upload portal exists yet, and folders whose names or contents hold personal data are not covered. Originals are never changed or deleted. Send counts and a few example names, not files."
          ],
          "items": []
        }
      ],
      "incoming": [
        "guide-archive-rename-manifest-path-limits"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/examples/archive-rename-manifest/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/examples/archive-rename-manifest/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fexamples%2Farchive-rename-manifest%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fexamples%2Farchive-rename-manifest%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "example-date-ambiguity-matrix",
      "type": "example",
      "title": "Synthetic date column: which rows a rule can settle, and which must stay on the ambiguity list",
      "description": "Nine invented entries show day-first and month-first typing, a two-digit year, a row where only one reading is possible, an impossible date and a four-year shift, with the decision and reason for each.",
      "url": "/examples/date-ambiguity-matrix/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "platforms": [
        "microsoft-excel",
        "csv"
      ],
      "buyer_role": "Administrator who combines lists typed by different offices",
      "purchase_trigger": "A date column from several sources sorts wrongly and nobody can say which entries are right",
      "problem": "The same typed text can mean two dates, and the honest result for some rows is a list, not an answer.",
      "related": [
        "guide-excel-date-serials-and-regional-order",
        "spreadsheet-normalise-mixed-dates-and-numbers",
        "platform-microsoft-excel",
        "guide-spreadsheet-import-readiness"
      ],
      "provenance": [
        {
          "label": "Date systems in Excel (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/excel/date-systems-in-excel",
          "checked": "2026-10-11",
          "claims": [
            "The 1900 and 1904 systems differ by 1,462 days; July 5, 2011 is 40729 and 39267."
          ]
        },
        {
          "label": "Change the date system, format, or two-digit year interpretation (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/office/change-the-date-system-format-or-two-digit-year-interpretation-aaa2159b-4ae8-4651-8bce-d4707bc9fb9f",
          "checked": "2026-10-11",
          "claims": [
            "Two-digit years 00 to 29 are read as 2000 to 2029 and 30 to 99 as 1930 to 1999."
          ]
        },
        {
          "label": "W3C Note: Date and Time Formats",
          "url": "https://www.w3.org/TR/NOTE-datetime",
          "checked": "2026-10-11",
          "claims": [
            "YYYY-MM-DD is an unambiguous date representation."
          ]
        }
      ],
      "sections": [
        {
          "heading": "The invented rules",
          "body": [
            "All entries, offices and rules here are invented. The Leeds office types day first. The Austin office types month first. The system export writes year-month-day. Two-digit years follow Microsoft's documented reading: 00 to 29 mean 2000 to 2029 and 30 to 99 mean 1930 to 1999. Output is year-month-day."
          ],
          "items": []
        },
        {
          "heading": "Nine entries and what is done with each",
          "body": [
            "Each row shows the source, the typed text, the decision and the reason. Only rows with a stated source or a logical impossibility are converted."
          ],
          "items": [],
          "code": "row | source  | typed text   | decision                | result      | reason\n1   | Leeds   | 03/04/2026   | converted by rule       | 2026-04-03  | Leeds is day-first\n2   | Austin  | 03/04/2026   | converted by rule       | 2026-03-04  | Austin is month-first\n3   | system  | 2026-04-03   | converted               | 2026-04-03  | already year-month-day\n4   | unknown | 05/06/2026   | ambiguity list          | (blank)     | 2026-06-05 or 2026-05-06; no source\n5   | Leeds   | 27/04/2026   | converted by rule       | 2026-04-27  | day-first, valid\n6   | unknown | 27/04/2026   | converted, logged       | 2026-04-27  | 27 cannot be a month, so only day-first is possible\n7   | Austin  | 31/12/2025   | exception               | (blank)     | month-first rule makes month 31, which is impossible; typo or wrong source\n8   | Leeds   | 5 Mar 26     | converted, logged       | 2026-03-05  | two-digit year 26 is read as 2026 by the agreed cutoff\n9   | system  | 2030-04-04   | exception               | (blank)     | paper record says 2026-04-03; difference is exactly 1,462 days"
        },
        {
          "heading": "What the last row shows",
          "body": [
            "Microsoft documents two date systems, 1900 and 1904, that differ by 1,462 days, which is four years and one day; its example is July 5, 2011, which is 40729 in one and 39267 in the other. A date that is exactly 1,462 days away from a known source date suggests a workbook that used the other system. Row 9 is an authored illustration of that pattern."
          ],
          "items": [
            "A whole column offset by 1,462 days suggests a date-system mismatch, which can be corrected for the whole column once confirmed.",
            "A single row offset by that amount is listed for the owner to check against the source."
          ]
        },
        {
          "heading": "The result, as counts",
          "body": [
            "The conversion is reported as counts, with every uncertain row visible."
          ],
          "items": [
            "Converted by a stated source: rows 1, 2, 3 and 5 (four).",
            "Converted by logic or a cutoff and logged: rows 6 and 8 (two).",
            "On the ambiguity list: row 4 (one).",
            "Exceptions for the owner: rows 7 and 9 (two).",
            "Four + two + one + two = nine entries, with none left unaccounted for."
          ],
          "code": "category                          | rows           | count\nconverted by stated source        | 1, 2, 3, 5     | 4\nconverted by logic or cutoff      | 6, 8           | 2\nambiguity list                    | 4              | 1\nexceptions for the owner          | 7, 9           | 2\nall                               |                | 9"
        },
        {
          "heading": "Use it to specify an enquiry",
          "body": [
            "For one file of up to 20,000 rows with up to three date columns, the clean-up job is from £125 (an untested proposal, with the final price confirmed after we see the column list), accepted by checks like these and a reference set of at least thirty dates you confirm, with payment after your sign-off. It never guesses a date. Send the column list and what you know about each source, not the file."
          ],
          "items": []
        }
      ],
      "incoming": [
        "platform-microsoft-excel"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/examples/date-ambiguity-matrix/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/examples/date-ambiguity-matrix/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fexamples%2Fdate-ambiguity-matrix%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fexamples%2Fdate-ambiguity-matrix%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "platform-pdf-documents",
      "type": "platform",
      "title": "PDF documents: getting data, forms and searchable text out of office files",
      "description": "For office managers and administrators with PDF price lists, filled forms and scans: how to tell which kind of PDF you have, how to check what is extracted and where a paid, checked job fits.",
      "url": "/platforms/pdf-documents/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "platforms": [
        "pdf-documents"
      ],
      "buyer_role": "Office manager, administrator or small-business owner who works from PDF documents",
      "purchase_trigger": "Someone is retyping or searching PDFs by hand, or has been told a PDF can be converted to a spreadsheet",
      "problem": "Three different kinds of PDF need three different approaches, and from the outside they look the same.",
      "related": [
        "guide-pdf-text-layer-or-scan-check",
        "guide-extract-reconciliation-method",
        "guide-pdf-form-field-data-export",
        "guide-pdf-scan-ocr-search-check",
        "collection-pdf-to-spreadsheet-diagnosis-order",
        "example-pdf-price-list-reconciliation",
        "buyer-doc-office-manager-paper-and-pdf-backlog",
        "extract-pdf-price-lists-to-spreadsheet",
        "extract-pdf-form-fields-to-spreadsheet",
        "pdf-scanned-batch-to-searchable-text",
        "extract-pdf-batches-every-month"
      ],
      "provenance": [
        {
          "label": "Power Query PDF connector (Microsoft Learn)",
          "url": "https://learn.microsoft.com/en-us/power-query/connectors/pdf",
          "checked": "2026-10-11",
          "claims": [
            "Pdf.Tables returns tables found in a PDF; where multi-line rows are not identified properly the data may need cleaning, and similar tables on consecutive pages are combined by default."
          ]
        },
        {
          "label": "pdfplumber README",
          "url": "https://github.com/jsvine/pdfplumber",
          "checked": "2026-10-11",
          "claims": [
            "Table extraction works best on machine-generated PDFs and the project offers no text recognition."
          ]
        },
        {
          "label": "pypdf documentation: interactions with PDF forms",
          "url": "https://pypdf.readthedocs.io/en/stable/user/forms.html",
          "checked": "2026-10-11",
          "claims": [
            "Form field values are read by field name; flattening turns field contents into regular page content; an XFA entry can override the page content."
          ]
        },
        {
          "label": "OCRmyPDF introduction",
          "url": "https://ocrmypdf.readthedocs.io/en/latest/introduction.html",
          "checked": "2026-10-11",
          "claims": [
            "It adds text layers to scanned image PDFs, depends on input quality and cannot recognise handwriting."
          ]
        }
      ],
      "sections": [
        {
          "heading": "Start with what kind of PDF you have",
          "body": [
            "A PDF is a container for pages. Some hold text positioned on the page, some hold fields that people filled in and some hold only pictures of paper. The right method, the right checks and the right promises differ for each, so the first job is to find out which you have. A two-minute test with a text search and a text selection is described in the first guide below."
          ],
          "items": [
            "Text-based table or list: the rows can be read from the positions of the text.",
            "Fillable form returned with answers: the answers are stored as named fields.",
            "Scanned pages: only pictures, so nothing can be searched until text recognition adds a hidden layer.",
            "A mix of the above in one file."
          ]
        },
        {
          "heading": "The questions to ask in order",
          "body": [
            "The collection linked here puts the questions in the order that saves most effort: does the file have text, is it a table or a form, does it have one layout, what should unusual entries become, how will you know it is complete, and who decides the exceptions. The worked example shows a row count that exposes mistakes a matching total hides."
          ],
          "items": [
            "Guide: can this PDF be read as data? Check for a text layer first.",
            "Guide: how to check an extraction is right.",
            "Guide: where filled-in form answers live and when they are gone.",
            "Guide: what text recognition can fix on scans and how to test it."
          ]
        },
        {
          "heading": "What documentation says, and what we do with it",
          "body": [
            "Microsoft documents a PDF connector for Excel that returns tables found in a PDF, and notes that rows spanning several lines may need cleaning. The pdfplumber project says its table extraction works best on machine-generated PDFs and offers no text recognition. The pypdf documentation describes reading form values by field name, and notes that flattening removes the field structure. The OCRmyPDF documentation says text recognition output depends on input quality and cannot read handwriting. We cite these only because they explain how PDFs behave. What a buyer receives is a checked spreadsheet or a searchable copy, not a tool."
          ],
          "items": []
        },
        {
          "heading": "The paid routes, and what none of them promise",
          "body": [
            "A text-based list of up to 60 pages in one layout becomes a checked spreadsheet from £295. Up to 200 returned fillable forms from one template become one sheet from £245. Up to 500 already-scanned pages can be made searchable from £195. Each month's batch of same-layout documents can be extracted as a standing service from £395 a month. All prices are untested proposals, and payment follows agreed checks and your sign-off.",
            "None of these promise accuracy. Results are reported as counts and sampled comparisons, with every row that could not be read with confidence listed for you to decide. None gives legal, medical, financial or tax advice. The first enquiry never includes confidential or personal documents: send counts, descriptions and an invented or redacted sample, and secure handling is agreed after scoping."
          ],
          "items": [
            "This page describes new offers; no delivery history is claimed.",
            "Documents with personal, payment or health information are not suitable for these fixed jobs."
          ]
        }
      ],
      "incoming": [
        "example-pdf-price-list-reconciliation",
        "buyer-doc-office-manager-paper-and-pdf-backlog",
        "collection-pdf-to-spreadsheet-diagnosis-order",
        "guide-pdf-text-layer-or-scan-check",
        "guide-extract-reconciliation-method",
        "guide-pdf-form-field-data-export",
        "guide-pdf-scan-ocr-search-check"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/platforms/pdf-documents/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/platforms/pdf-documents/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fplatforms%2Fpdf-documents%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fplatforms%2Fpdf-documents%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "platform-microsoft-excel",
      "type": "platform",
      "title": "Microsoft Excel workbooks: repair, tidy and make them reliable",
      "description": "For administrators and small businesses who rely on Excel: where workbooks go wrong, the order to diagnose them in, and the checked, fixed-scope jobs that repair formulas, flatten layouts and clean dates and duplicates.",
      "url": "/platforms/microsoft-excel/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "platforms": [
        "microsoft-excel"
      ],
      "buyer_role": "Office manager, finance administrator or small-business owner who runs on spreadsheets",
      "purchase_trigger": "A workbook shows errors, sorts wrongly, will not import or produces totals nobody trusts",
      "problem": "Different kinds of damage in the same workbook look alike from the outside, and fixing them in the wrong order makes the next fix harder.",
      "related": [
        "guide-excel-error-values-trace",
        "guide-excel-stale-or-text-numbers",
        "guide-excel-merged-cells-and-tidy-tables",
        "guide-excel-date-serials-and-regional-order",
        "guide-spreadsheet-contact-duplicate-match-rules",
        "guide-spreadsheet-import-readiness",
        "guide-mailmerge-fields-and-number-formats",
        "guide-report-pack-repeatable-export",
        "collection-spreadsheet-messy-workbook-diagnosis-order",
        "spreadsheet-repair-broken-formulas",
        "spreadsheet-flatten-merged-cell-report",
        "spreadsheet-normalise-mixed-dates-and-numbers",
        "spreadsheet-remove-duplicate-contacts",
        "quote-pack-from-customer-brief",
        "report-pack-every-period",
        "spreadsheet-make-workbook-set-import-ready",
        "example-merged-report-flattened",
        "example-date-ambiguity-matrix",
        "example-quote-line-rounding",
        "buyer-report-operations-lead-weekly-pack"
      ],
      "provenance": [
        {
          "label": "Create a PivotTable to analyze worksheet data (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/office/create-a-pivottable-to-analyze-worksheet-data-a9a84538-bfe9-40a9-a8e9-f99134456576",
          "checked": "2026-10-11",
          "claims": [
            "Source data should have one header row, no merged cells, no blank rows or columns and one type of data per column."
          ]
        },
        {
          "label": "Find merged cells (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/office/find-merged-cells-d02b2a5a-a08d-4641-8d4d-b3f233daca2c",
          "checked": "2026-10-11",
          "claims": [
            "Excel does not sort data in a column that contains merged cells."
          ]
        },
        {
          "label": "Date systems in Excel (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/excel/date-systems-in-excel",
          "checked": "2026-10-11",
          "claims": [
            "The 1900 and 1904 systems differ by 1,462 days; July 5, 2011 is 40729 and 39267."
          ]
        },
        {
          "label": "Floating-point arithmetic may give inaccurate result in Excel (Microsoft Learn)",
          "url": "https://learn.microsoft.com/en-us/troubleshoot/microsoft-365-apps/excel/floating-point-arithmetic-inaccurate-result",
          "checked": "2026-10-11",
          "claims": [
            "Excel stores 15 digits of precision and offers the ROUND function to compensate for rounding errors."
          ]
        }
      ],
      "sections": [
        {
          "heading": "Why the order of repair matters",
          "body": [
            "Most troubled workbooks have more than one problem, and fixing them in the wrong order makes the next fix harder. The collection linked here sets out the order and the reason for it: stale calculation and formula errors first, then layout, then numbers and dates, then duplicates, then import readiness."
          ],
          "items": []
        },
        {
          "heading": "What Excel's own documentation settles",
          "body": [
            "Microsoft documents that Excel does not sort a column that contains merged cells, that a PivotTable source needs one header row and one kind of data per column, that dates are stored as serial numbers in one of two systems 1,462 days apart and that Excel stores 15 digits of precision, which is why the ROUND function exists. These are reasons to check, not claims about any particular workbook, and the guides cite each page."
          ],
          "items": []
        },
        {
          "heading": "The fixed-scope jobs",
          "body": [
            "One workbook's formulas can be repaired against check cases you calculate yourself, as a fixed £195 job. One merged-cell report can be flattened with a reconciliation, from £145. Mixed dates and numbers in one file can be normalised with every ambiguous row listed, from £125. One product, parts, asset or company list with no personal data can be de-duplicated with a merge log and review file, from £195; lists of people are not covered. Quotation batches from your price list start from £495, and a standing report pack from your export starts from £295 a month, by proposal. A set of up to eight workbooks can be made import-ready as a project from £1,500. All prices are untested proposals, one-off payment follows agreed checks and your sign-off, and the standing service is billed monthly under terms you agree first."
          ],
          "items": [
            "Not covered: macros, add-ins, live data connections, tax or accounting advice, deciding which figures are right, and workbooks that hold personal data.",
            "The first enquiry never includes workbooks; send a description, counts and invented examples. No upload portal exists yet, and a secure way to hand the files over is agreed in writing before any file moves."
          ]
        }
      ],
      "incoming": [
        "example-merged-report-flattened",
        "example-quote-line-rounding",
        "example-date-ambiguity-matrix",
        "buyer-report-operations-lead-weekly-pack",
        "collection-spreadsheet-messy-workbook-diagnosis-order",
        "guide-excel-error-values-trace",
        "guide-excel-stale-or-text-numbers",
        "guide-excel-merged-cells-and-tidy-tables",
        "guide-excel-date-serials-and-regional-order",
        "guide-spreadsheet-contact-duplicate-match-rules",
        "guide-convert-legacy-office-fidelity",
        "guide-mailmerge-fields-and-number-formats",
        "guide-report-pack-repeatable-export",
        "guide-spreadsheet-import-readiness"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/platforms/microsoft-excel/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/platforms/microsoft-excel/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fplatforms%2Fmicrosoft-excel%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fplatforms%2Fmicrosoft-excel%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "buyer-doc-office-manager-paper-and-pdf-backlog",
      "type": "buyer",
      "title": "For an office manager: sort your PDF, scan and old-file jobs into do it yourself, buy, or leave",
      "description": "List the jobs by what the file actually is, find the ones your own software already handles, and ask for outside help only where volume, repetition or the need for a checked record justifies it.",
      "url": "/buyers/doc-office-manager-paper-and-pdf-backlog/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "platforms": [
        "pdf-documents",
        "file-archives"
      ],
      "buyer_role": "Office manager, administrator or secretary responsible for documents",
      "purchase_trigger": "A pile of PDFs, scans, old Office files and badly named folders is growing and nobody owns it",
      "problem": "Several different jobs are described as one big tidy-up, so nobody can tell what is quick, what is risky and what is worth paying for.",
      "related": [
        "platform-pdf-documents",
        "collection-pdf-to-spreadsheet-diagnosis-order",
        "guide-pdf-text-layer-or-scan-check",
        "guide-convert-legacy-office-fidelity",
        "convert-legacy-office-files-batch",
        "archive-rename-organise-with-manifest",
        "archive-digitise-and-normalise-one-archive"
      ],
      "provenance": [
        {
          "label": "Power Query PDF connector (Microsoft Learn)",
          "url": "https://learn.microsoft.com/en-us/power-query/connectors/pdf",
          "checked": "2026-10-11",
          "claims": [
            "Pdf.Tables returns tables found in a PDF; where multi-line rows are not identified properly the data may need cleaning, and similar tables on consecutive pages are combined by default."
          ]
        },
        {
          "label": "Use Excel with earlier versions of Excel (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/office/use-excel-with-earlier-versions-of-excel-2fd9ffcb-6fce-485b-85af-fecfd651a5ac",
          "checked": "2026-10-11",
          "claims": [
            "Compatibility Mode opens old workbooks; File, Info, Convert replaces the original and Save As keeps it."
          ]
        },
        {
          "label": "Converting documents to a newer format (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/office/converting-documents-to-a-newer-format-34ec742e-f0f9-4d95-bbe3-3ee8e30a86fa",
          "checked": "2026-10-11",
          "claims": [
            "File, Info, Convert converts a document without saving a copy; Save As makes a separate copy."
          ]
        }
      ],
      "sections": [
        {
          "heading": "List the jobs by what the file is",
          "body": [
            "Do not start with \"the archive\". Start with what each pile is. A folder of PDFs exported from software is a different problem from a box of scans, which is different from a drive of old Word and Excel files, which is different from a folder whose names nobody can decode. Write a line for each: what it is, roughly how many, who needs what from it and what happens if nothing is done."
          ],
          "items": [
            "Text-based PDFs you need data from: extraction.",
            "Filled-in fillable forms: reading the form fields.",
            "Scans nobody can search: adding searchable text.",
            "Old .doc and .xls files: conversion.",
            "Confusing names and folders: renaming with a record."
          ]
        },
        {
          "heading": "Do it yourself when the software already does it",
          "body": [
            "For a handful of files, the built-in routes are often enough. Excel's Get Data from PDF can import tables from a text-based PDF, as Microsoft documents. Word and Excel can convert an old file you open: File, Info, Convert changes it in place without a copy, while Save As keeps the original, so use Save As and keep a backup. Check the result against the original for layout changes, which Microsoft tells you to do.",
            "The cost of doing it yourself is time and no record. Nothing shows afterwards which files were done or whether anything changed."
          ],
          "items": []
        },
        {
          "heading": "Consider buying when volume, repetition or evidence matters",
          "body": [
            "Outside help starts to make sense when the number is large enough that the time is a problem, when the same job recurs every month, or when you need to show that everything was handled. The fixed-scope jobs each end in a reconciliation: counts that match, originals unchanged, an exceptions list. Prices start at £195 for making up to 500 scanned pages searchable, £245 for renaming and organising up to 5,000 files with a manifest and £295 for converting up to 300 old files. They are untested proposals, and payment follows agreed checks and your sign-off. A whole archive with scans, old files and names to fix is a project from £2,450."
          ],
          "items": []
        },
        {
          "heading": "Leave it alone when",
          "body": [
            "Some piles should not be touched yet. If nobody uses them, tidying them is effort without a result. If you are unsure whether you may copy or share them, find out first. If a question is whether documents must be kept or may be destroyed, that is a records and legal question for someone qualified, and we do not advise on it. Documents holding personal, payment or health information are not suitable for these fixed jobs."
          ],
          "items": []
        },
        {
          "heading": "Start with a low-trust enquiry",
          "body": [
            "Send counts, types, a rough size and what you want to be able to do afterwards, plus an invented or redacted sample if you have one. Never send the documents in the first message. If we agree a scope, we agree a secure route, who may see the files, how long we keep them and how we delete them in writing before any file moves. We work on copies and never on your only original, and we do not contact anyone on your behalf."
          ],
          "items": [
            "This page is an offer of new services, not evidence of past delivery or of demand.",
            "No accuracy is promised for scanned text."
          ]
        }
      ],
      "incoming": [
        "platform-pdf-documents"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/buyers/doc-office-manager-paper-and-pdf-backlog/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/buyers/doc-office-manager-paper-and-pdf-backlog/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fbuyers%2Fdoc-office-manager-paper-and-pdf-backlog%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fbuyers%2Fdoc-office-manager-paper-and-pdf-backlog%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "buyer-report-operations-lead-weekly-pack",
      "type": "buyer",
      "title": "For an operations lead: stop rebuilding the weekly report by hand, or decide to hand it over",
      "description": "Work out what the report actually costs you in steps, put the method in writing, decide whether to template it yourself or hand it over, and choose checks that show each pack matches its export.",
      "url": "/buyers/report-operations-lead-weekly-pack/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "platforms": [
        "microsoft-excel"
      ],
      "buyer_role": "Operations lead, office manager or finance administrator who produces a recurring report",
      "purchase_trigger": "The weekly or monthly pack takes hours, depends on one person and has gone out with a wrong figure",
      "problem": "The report's method is unwritten, so no one can tell whether it is worth automating, who could do it instead, or whether this period is right.",
      "related": [
        "report-pack-every-period",
        "guide-report-pack-repeatable-export",
        "platform-microsoft-excel",
        "quote-pack-from-customer-brief",
        "spreadsheet-make-workbook-set-import-ready"
      ],
      "provenance": [
        {
          "label": "Create a PivotTable to analyze worksheet data (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/office/create-a-pivottable-to-analyze-worksheet-data-a9a84538-bfe9-40a9-a8e9-f99134456576",
          "checked": "2026-10-11",
          "claims": [
            "Source data should have one header row, no merged cells, no blank rows or columns and one type of data per column."
          ]
        },
        {
          "label": "Combine files overview (Power Query, Microsoft Learn)",
          "url": "https://learn.microsoft.com/en-us/power-query/combine-files-overview",
          "checked": "2026-10-11",
          "claims": [
            "Files with the same schema, file type and columns can be combined into one table."
          ]
        }
      ],
      "sections": [
        {
          "heading": "Write down what you do",
          "body": [
            "Do the report once more and write every step as you go: where the export comes from, which filters you apply, what you copy and where, how you check it and who receives it. Time each step. This is the report's method, and today it exists only in your head. It is also the thing any person or service would need.",
            "Note every figure that has ever been wrong, and what caused it. Those are the checks worth building first."
          ],
          "items": []
        },
        {
          "heading": "Make the export a contract",
          "body": [
            "Decide what the export must look like every period: columns, order, types, date format, period boundaries, expected row count. Anything that is a business definition, such as what counts as a completed order, is written down with its owner. Without this, any automation is built on guesses."
          ],
          "items": []
        },
        {
          "heading": "Three ways forward",
          "body": [
            "You can template it yourself. Microsoft documents that an Excel table as a PivotTable source includes added rows on refresh, and that Power Query can combine files from a folder if they share the same file type and columns. That works if someone on your team will own it and the export stays stable.",
            "You can keep doing it by hand with the written steps, which at least lets someone else cover. Or you can hand it over: the standing report-pack service builds the pack from your export each period by your written rules, checks every control total against the export and notes anything unusual, from £295 a month for one monthly pack (an untested proposal, sold by proposal, set up in the first month)."
          ],
          "items": [
            "Own it: best when the export is stable and someone has the skills and time.",
            "Keep it manual but written: lowest cost, still error-prone.",
            "Hand it over: best when the report must happen every period whoever is away."
          ]
        },
        {
          "heading": "What the service does not do",
          "body": [
            "It does not connect to your live systems, send the pack to anyone, change a definition without your approval or promise a delivery time. It does not suit exports containing personal data about individuals. Each pack is checked by a reviewer separate from the work that produced it, and at launch much of the work is automated. You can end it at the end of any month."
          ],
          "items": []
        },
        {
          "heading": "What to put in the first enquiry",
          "body": [
            "Describe the report: who reads it, how often, its tables and charts and how long it takes. List the export's column headings with three invented rows. Say which totals you check by eye today. Do not send an export or a finished pack. If we agree to proceed, we agree a secure route in writing before any data moves."
          ],
          "items": [
            "This is a new service and nothing here claims past delivery or savings.",
            "Any time you save is yours to measure; we do not promise a figure."
          ]
        }
      ],
      "incoming": [
        "platform-microsoft-excel",
        "guide-report-pack-repeatable-export"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/buyers/report-operations-lead-weekly-pack/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/buyers/report-operations-lead-weekly-pack/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fbuyers%2Freport-operations-lead-weekly-pack%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fbuyers%2Freport-operations-lead-weekly-pack%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "collection-spreadsheet-messy-workbook-diagnosis-order",
      "type": "category",
      "title": "A messy workbook: the order to diagnose it in, and where each fix leads",
      "description": "Seven checks in a fixed order, from stale calculation to import readiness, each pointing to the guide that explains it and the checked job that covers it if you would rather not do it yourself.",
      "url": "/collections/spreadsheet-messy-workbook-diagnosis-order/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "platforms": [
        "microsoft-excel"
      ],
      "buyer_role": "Administrator or owner trying to rescue an inherited spreadsheet",
      "purchase_trigger": "A workbook has several visible problems and you do not know where to start",
      "problem": "Problems in a workbook interact, so fixing them in a random order wastes effort and can hide the real cause.",
      "related": [
        "guide-excel-stale-or-text-numbers",
        "guide-excel-error-values-trace",
        "guide-excel-date-serials-and-regional-order",
        "guide-excel-merged-cells-and-tidy-tables",
        "guide-spreadsheet-contact-duplicate-match-rules",
        "guide-spreadsheet-import-readiness",
        "platform-microsoft-excel",
        "spreadsheet-repair-broken-formulas",
        "spreadsheet-flatten-merged-cell-report",
        "spreadsheet-normalise-mixed-dates-and-numbers",
        "spreadsheet-remove-duplicate-contacts",
        "spreadsheet-make-workbook-set-import-ready"
      ],
      "provenance": [
        {
          "label": "Create a PivotTable to analyze worksheet data (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/office/create-a-pivottable-to-analyze-worksheet-data-a9a84538-bfe9-40a9-a8e9-f99134456576",
          "checked": "2026-10-11",
          "claims": [
            "Source data should have one header row, no merged cells, no blank rows or columns and one type of data per column."
          ]
        },
        {
          "label": "Find merged cells (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/office/find-merged-cells-d02b2a5a-a08d-4641-8d4d-b3f233daca2c",
          "checked": "2026-10-11",
          "claims": [
            "Excel does not sort data in a column that contains merged cells."
          ]
        },
        {
          "label": "Date systems in Excel (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/excel/date-systems-in-excel",
          "checked": "2026-10-11",
          "claims": [
            "The 1900 and 1904 systems differ by 1,462 days; July 5, 2011 is 40729 and 39267."
          ]
        },
        {
          "label": "Floating-point arithmetic may give inaccurate result in Excel (Microsoft Learn)",
          "url": "https://learn.microsoft.com/en-us/troubleshoot/microsoft-365-apps/excel/floating-point-arithmetic-inaccurate-result",
          "checked": "2026-10-11",
          "claims": [
            "Excel stores 15 digits of precision and offers the ROUND function to compensate for rounding errors."
          ]
        }
      ],
      "sections": [
        {
          "heading": "1. Is it recalculating?",
          "body": [
            "Check the calculation mode before anything else. A workbook set to recalculate only on request shows old results, and every other check is meaningless on stale numbers. Force a full recalculation and see whether any figure moves. The guide on wrong totals without error messages explains manual calculation, numbers stored as text and displayed versus stored values."
          ],
          "items": [
            "Next: if figures move, you have found one cause; recheck everything after recalculating."
          ]
        },
        {
          "heading": "2. Which errors show, and which are hidden?",
          "body": [
            "List the error values by type: #REF!, #NAME?, #VALUE!. Each points to a different break. Then look for silent damage: values typed over formulas and ranges that stop short. The error-values guide shows how to trace a formula to its inputs and why hiding an error is not repairing it. If the workbook's outputs cannot be trusted, the fixed formula repair, from £195 for one workbook, is accepted by check cases you work out independently."
          ],
          "items": []
        },
        {
          "heading": "3. Is the layout a table?",
          "body": [
            "Merged cells, spacer rows, repeated headings and subtotal rows must be flattened before sorting, filtering or a PivotTable. Do this once the workbook is recalculating and its formulas are sound, but before you test numbers and dates: a print layout puts subtotal and heading text inside the number and date columns, so those columns cannot be typed correctly until the data is a flat table. The merged-cells guide and the worked example show the reconciliation. The flattening job is from £145 for one sheet."
          ],
          "items": []
        },
        {
          "heading": "4. Are the numbers real numbers?",
          "body": [
            "Numbers stored as text align left and are skipped or mis-sorted. Codes that need leading zeros must be text from the start. This is checked once the layout is flat, so that heading and subtotal text is not mistaken for bad numbers, and before dates and duplicates, because both depend on values being the type you think they are."
          ],
          "items": []
        },
        {
          "heading": "5. Are the dates real, and unambiguous?",
          "body": [
            "Dates can be text, shifted by 1,462 days between Excel's two date systems, or typed day-first and month-first in the same column. The dates guide and the worked ambiguity example show which rows a written rule can settle and which must stay on a list. The clean-up job, from £125 for one file, handles steps 4 and 5 together and never guesses."
          ],
          "items": []
        },
        {
          "heading": "6. Are there duplicates, and by what rule?",
          "body": [
            "Deduplication comes after dates and layout, because duplicates cannot be reliably matched while the fields are still inconsistent. Write the match rules first, keep a merge log and treat uncertain pairs as review items. The duplicates guide explains why Excel's Remove Duplicates compares displayed values and deletes permanently. A list of products, parts, assets or companies with no personal data can be de-duplicated as a job from £195; lists of people are not covered."
          ],
          "items": []
        },
        {
          "heading": "7. Is it ready for the next system?",
          "body": [
            "Last, check readiness: one header row, one type per column, blanks decided, keys unique and a column list that matches the target. The readiness guide sets out the sheet. If you have several workbooks with several kinds of damage, a project from £1,500 runs these steps in order across the set. Prices are untested proposals; payment follows agreed checks and your sign-off. Files are handed over only by a secure route agreed in writing first, and no upload portal exists yet. Nothing here loads data into a live system, and nothing is accounting advice."
          ],
          "items": []
        }
      ],
      "incoming": [
        "platform-microsoft-excel",
        "guide-excel-error-values-trace",
        "guide-excel-stale-or-text-numbers",
        "guide-excel-merged-cells-and-tidy-tables",
        "guide-excel-date-serials-and-regional-order",
        "guide-spreadsheet-contact-duplicate-match-rules",
        "guide-mailmerge-fields-and-number-formats",
        "guide-spreadsheet-import-readiness"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/collections/spreadsheet-messy-workbook-diagnosis-order/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/collections/spreadsheet-messy-workbook-diagnosis-order/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fcollections%2Fspreadsheet-messy-workbook-diagnosis-order%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fcollections%2Fspreadsheet-messy-workbook-diagnosis-order%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "collection-pdf-to-spreadsheet-diagnosis-order",
      "type": "category",
      "title": "From a PDF to a checked spreadsheet: the order of questions that saves the most effort",
      "description": "Seven steps from \"does it have text?\" to \"who signs off the exceptions?\", linked to the guides, the worked example and the checked jobs, including what to do when the same document arrives every month.",
      "url": "/collections/pdf-to-spreadsheet-diagnosis-order/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "platforms": [
        "pdf-documents",
        "microsoft-excel"
      ],
      "buyer_role": "Administrator who needs data from PDFs and wants to know what is realistic",
      "purchase_trigger": "Someone has asked for a PDF to be turned into a spreadsheet and you do not know where to begin",
      "problem": "Starting extraction before knowing whether the file has text, a form or only pictures wastes effort and produces results nobody can trust.",
      "related": [
        "guide-pdf-text-layer-or-scan-check",
        "guide-extract-reconciliation-method",
        "guide-pdf-form-field-data-export",
        "guide-pdf-scan-ocr-search-check",
        "example-pdf-price-list-reconciliation",
        "platform-pdf-documents",
        "extract-pdf-price-lists-to-spreadsheet",
        "extract-pdf-form-fields-to-spreadsheet",
        "pdf-scanned-batch-to-searchable-text",
        "extract-pdf-batches-every-month"
      ],
      "provenance": [
        {
          "label": "Power Query PDF connector (Microsoft Learn)",
          "url": "https://learn.microsoft.com/en-us/power-query/connectors/pdf",
          "checked": "2026-10-11",
          "claims": [
            "Pdf.Tables returns tables found in a PDF; where multi-line rows are not identified properly the data may need cleaning, and similar tables on consecutive pages are combined by default."
          ]
        },
        {
          "label": "pdfplumber README",
          "url": "https://github.com/jsvine/pdfplumber",
          "checked": "2026-10-11",
          "claims": [
            "Table extraction works best on machine-generated PDFs and the project offers no text recognition."
          ]
        },
        {
          "label": "pypdf documentation: interactions with PDF forms",
          "url": "https://pypdf.readthedocs.io/en/stable/user/forms.html",
          "checked": "2026-10-11",
          "claims": [
            "Form field values are read by field name; flattening turns field contents into regular page content; an XFA entry can override the page content."
          ]
        },
        {
          "label": "OCRmyPDF introduction",
          "url": "https://ocrmypdf.readthedocs.io/en/latest/introduction.html",
          "checked": "2026-10-11",
          "claims": [
            "It adds text layers to scanned image PDFs, depends on input quality and cannot recognise handwriting."
          ]
        }
      ],
      "sections": [
        {
          "heading": "1. Does the PDF have text?",
          "body": [
            "Search for a word you can see and try to select a line. If neither works, the pages are pictures, and everything below waits for a text layer. The text-layer guide gives the test. A scanned batch can be made searchable by a separate job, from £195 for up to 500 pages, with no accuracy promised."
          ],
          "items": [
            "Next if there is text: go to step 2. If not: the scanned-PDF guide, then return here."
          ]
        },
        {
          "heading": "2. Is it a table or a filled form?",
          "body": [
            "A table or list is read from positions of text or ruled lines. A returned fillable form is read from its form fields. The two have different failure modes and different checks. Microsoft's PDF connector and the pdfplumber project describe the first, and the pypdf documentation describes the second."
          ],
          "items": []
        },
        {
          "heading": "3. One layout or several?",
          "body": [
            "One set of rules covers one layout. A list whose sections differ, or forms from several template versions, needs rules for each, and the price changes. Note the page ranges or versions before asking anyone for a quote."
          ],
          "items": []
        },
        {
          "heading": "4. Decide the columns and the rules for unusual entries",
          "body": [
            "Write the output columns, then say what happens to \"price on request\", wrapped lines, checkboxes, blanks and repeated headings. These decisions are the owner's. An extraction without them will make them silently."
          ],
          "items": []
        },
        {
          "heading": "5. Reconcile, then sample",
          "body": [
            "Count rows per page or files against rows plus exceptions, then compare a sample you chose first, field by field. The reconciliation guide explains the method and the worked example shows a total that matched while two pages did not. Report counts, never a percentage accuracy."
          ],
          "items": []
        },
        {
          "heading": "6. List what could not be read, and decide it",
          "body": [
            "Rows or files that could not be read with confidence go on an exceptions list with their page and reason, not into the data. Agree beforehand how many exceptions would make you stop and re-scope. A named person decides each one."
          ],
          "items": []
        },
        {
          "heading": "7. If it arrives every month",
          "body": [
            "Write the rules down once and reuse them. The one-off jobs are from £295 for one list of up to 60 pages and from £245 for up to 200 forms. A standing monthly service from £395 a month extracts each batch by the same rules, reconciles it and reports any layout change or image-only page instead of guessing. Prices are untested proposals and payment follows agreed checks and your sign-off. No job gives legal, medical, financial or tax advice, and the first enquiry never includes confidential or personal documents."
          ],
          "items": []
        }
      ],
      "incoming": [
        "platform-pdf-documents",
        "buyer-doc-office-manager-paper-and-pdf-backlog",
        "guide-convert-legacy-office-fidelity",
        "guide-archive-rename-manifest-path-limits",
        "guide-pdf-scan-ocr-search-check"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/collections/pdf-to-spreadsheet-diagnosis-order/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/collections/pdf-to-spreadsheet-diagnosis-order/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fcollections%2Fpdf-to-spreadsheet-diagnosis-order%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fcollections%2Fpdf-to-spreadsheet-diagnosis-order%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "guide-excel-error-values-trace",
      "type": "guide",
      "title": "Excel shows #REF! or #NAME?: work out which kind of broken formula you have",
      "description": "Each Excel error value points to a different kind of break. Learn what they mean, how to trace a formula back to its inputs, and why hiding the error is not a repair.",
      "url": "/guides/excel-error-values-trace/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "platforms": [
        "microsoft-excel"
      ],
      "buyer_role": "Office manager or finance administrator who depends on one Excel workbook",
      "purchase_trigger": "Cells show #REF!, #NAME? or #VALUE!, or a total no longer matches a hand calculation",
      "problem": "A workbook edited by several people accumulates different kinds of formula damage, and an error message alone does not say which.",
      "related": [
        "platform-microsoft-excel",
        "spreadsheet-repair-broken-formulas",
        "guide-excel-stale-or-text-numbers",
        "spreadsheet-make-workbook-set-import-ready",
        "collection-spreadsheet-messy-workbook-diagnosis-order"
      ],
      "provenance": [
        {
          "label": "How to correct a #REF! error (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/excel/how-to-correct-a-ref-error",
          "checked": "2026-10-11",
          "claims": [
            "A formula that lists cells one by one, such as =SUM(B2,C2,D2), returns #REF! when one of those columns is deleted; a range such as =SUM(B2:D2) adjusts automatically.",
            "A VLOOKUP asking for a column beyond its range, an INDEX outside its range and an INDIRECT pointing at a closed workbook also return #REF!."
          ]
        },
        {
          "label": "How to correct a #NAME? error (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/office/how-to-correct-a-name-error-b6d54e31-a743-4d7d-9b61-40002a7b4286",
          "checked": "2026-10-11",
          "claims": [
            "The most common cause is a misspelt function name; others are an undefined or misspelt defined name, text without quotation marks, a missing colon in a range and an add-in that is not enabled.",
            "It says not to use error-handling functions such as IFERROR to mask the error."
          ]
        },
        {
          "label": "How to correct a #VALUE! error (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/excel/how-to-correct-a-value-error",
          "checked": "2026-10-11",
          "claims": [
            "Causes include dates stored as text, hidden spaces, text or special characters in numeric cells and a list separator set in the Windows region settings.",
            "Evaluate Formula steps through a formula; IFERROR hides all errors, not just #VALUE!, and hides the problem rather than fixing it."
          ]
        },
        {
          "label": "Remove or allow a circular reference in Excel (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/excel/remove-or-allow-a-circular-reference-in-excel",
          "checked": "2026-10-11",
          "claims": [
            "A circular reference happens when a formula refers to itself, directly or indirectly; Formulas, Error Checking, Circular References lists the cells and Trace Precedents or Dependents follows the links.",
            "After the warning, the cell might show 0 or the last calculated value; iterative calculation suits some deliberate models and the page gives defaults of 100 iterations and 0.001."
          ]
        },
        {
          "label": "Detect formula errors in Excel (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/excel/detect-formula-errors-in-excel",
          "checked": "2026-10-11",
          "claims": [
            "Excel's error checking rules include formulas inconsistent with other formulas in the region, numbers stored as text and formulas that omit cells in a region.",
            "The page says the rules do not guarantee that a worksheet is error free."
          ]
        },
        {
          "label": "How to avoid broken formulas in Excel (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/excel/how-to-avoid-broken-formulas-in-excel",
          "checked": "2026-10-11",
          "claims": [
            "It advises against putting constants inside formulas, because they are hard to find when updating and more prone to typing errors.",
            "A deleted worksheet cannot be recovered, so formulas that referred to it cannot be fixed."
          ]
        }
      ],
      "sections": [
        {
          "heading": "An error value is a symptom, not a diagnosis",
          "body": [
            "Excel uses a small set of error values, and each one points at a different kind of break. #REF! means a formula refers to a cell that is no longer valid. Microsoft's page gives the classic case: a formula that lists cells one by one, such as adding B2, C2 and D2, breaks when one of those columns is deleted, whereas a range such as B2 to D2 adjusts itself. The same page lists a VLOOKUP that asks for a column beyond its range, an INDEX outside its range and a reference to a closed workbook as other causes.",
            "#NAME? is usually a typing problem: a misspelt function, a name that was never defined or was misspelt, text without quotation marks, a missing colon in a range, or an add-in that is not enabled. #VALUE! is the general complaint that a formula is being given the wrong kind of thing, such as text where a number is needed."
          ],
          "items": [
            "#REF!: deleted or overwritten cells, or a lookup or index outside its range.",
            "#NAME?: a name Excel does not recognise.",
            "#VALUE!: wrong kind of value, often text that looks like a number or a date, hidden spaces or a regional separator setting."
          ]
        },
        {
          "heading": "Trace before you change anything",
          "body": [
            "Make a copy of the workbook first. Then use Excel's own tools. Evaluate Formula steps through a formula one part at a time, which in Microsoft's example exposed a hidden space where a number was expected. Trace Precedents and Trace Dependents follow the links to the cells a formula uses and the cells that use it. For a suspected loop, the Error Checking menu lists circular references.",
            "Do not delete rows, retype values or paste over formulas while investigating. Each of those can destroy the evidence, and a deleted worksheet cannot be recovered, so formulas that pointed at it cannot be repaired from the file alone."
          ],
          "items": []
        },
        {
          "heading": "Errors that show no error",
          "body": [
            "The worst damage is silent. Excel can mark a formula whose pattern differs from its neighbours, numbers stored as text, and formulas that leave out cells next to their range. Microsoft says plainly that these rules do not guarantee a worksheet is error free. A number typed over a formula looks like any other number. A circular reference, after its first warning, may display 0 or the last calculated value without any visible error.",
            "Two habits help. Click into a few cells in each total column and read the formula bar. Then compare a total with one you work out another way. Neither takes long, and either can show a problem that error markers never will."
          ],
          "items": [
            "A cell in a formula column whose formula bar shows a bare number was overwritten.",
            "A total that ignores new rows may sum a range that stops short.",
            "A figure that does not move when its inputs change may be a pasted value or a stale calculation."
          ]
        },
        {
          "heading": "Why hiding the error is not fixing it",
          "body": [
            "Wrapping a formula in IFERROR makes the message disappear and leaves the fault in place. Microsoft's page on #NAME? says not to use error-handling functions such as IFERROR to mask the error, and its #VALUE! page says IFERROR hides every error, not just that one. Constants typed inside formulas are another trap: they are hard to find when something changes and easier to mistype.",
            "A real repair changes the formula or the input that caused the error, then shows that known cases return the right answers."
          ],
          "items": []
        },
        {
          "heading": "How a repair is checked, and where the paid job fits",
          "body": [
            "The check is a set of cases whose answers you worked out independently, by hand or from a printed source. Enter their inputs, compare outputs, then force a full recalculation and confirm nothing moves. Compare the original with the repaired copy so only the logged cells differ.",
            "One workbook of up to five sheets and eight named outputs can be repaired as a fixed £195 job (an untested proposal), accepted by those checks and a change log, with payment after your sign-off. It does not cover macros, links to files we cannot see, redesigning a model, or any accounting or tax advice. If the problem is a whole set of workbooks with several kinds of damage, a project scope fits better. The first enquiry needs the error types and your check cases, never the workbook."
          ],
          "items": []
        }
      ],
      "incoming": [
        "platform-microsoft-excel",
        "collection-spreadsheet-messy-workbook-diagnosis-order",
        "guide-excel-stale-or-text-numbers"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/guides/excel-error-values-trace/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/guides/excel-error-values-trace/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fexcel-error-values-trace%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fguides%2Fexcel-error-values-trace%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "guide-excel-stale-or-text-numbers",
      "type": "guide",
      "title": "Totals look wrong but Excel shows no error: stale calculation, text numbers and displayed versus stored values",
      "description": "When no error appears, three quiet causes explain most wrong totals: manual calculation, numbers stored as text and rounding that is displayed but not stored. Here is how to tell which.",
      "url": "/guides/excel-stale-or-text-numbers/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "platforms": [
        "microsoft-excel"
      ],
      "buyer_role": "Administrator or small-business owner whose spreadsheet totals disagree with a calculator",
      "purchase_trigger": "A sum is a few pounds out, ignores some rows or changes when the file is opened on another computer",
      "problem": "Numbers can look right on screen while being stored as text, left uncalculated or held at a different precision from the one displayed.",
      "related": [
        "platform-microsoft-excel",
        "spreadsheet-repair-broken-formulas",
        "guide-excel-error-values-trace",
        "example-quote-line-rounding",
        "collection-spreadsheet-messy-workbook-diagnosis-order"
      ],
      "provenance": [
        {
          "label": "Change formula recalculation, iteration, or precision in Excel (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/office/change-formula-recalculation-iteration-or-precision-in-excel-73fc7dac-91cf-4d36-86e8-67124f6bcce4",
          "checked": "2026-10-11",
          "claims": [
            "Automatic recalculation is the default; in Manual mode formulas update only when you recalculate, for example with F9, and Ctrl+Alt+F9 recalculates every formula in all open workbooks whether or not it changed.",
            "Excel stores and calculates with 15 significant digits, and Set precision as displayed permanently trims stored values so that originals cannot be restored."
          ]
        },
        {
          "label": "Fix text-formatted numbers by applying a number format (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/excel/fix-text-formatted-numbers-by-applying-a-number-format",
          "checked": "2026-10-11",
          "claims": [
            "Numbers stored as text align left and often carry a green triangle; they can cause problems with calculations or confusing sort orders and often arrive in imported or copied data.",
            "Fixes include Convert to Number from the error button and Paste Special with Multiply by 1; Ignore Error only removes the marker; TRIM and CLEAN remove spaces and nonprintable characters."
          ]
        },
        {
          "label": "Keeping leading zeros and large numbers (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/office/keeping-leading-zeros-and-large-numbers-1bf7b935-36e1-4985-842f-5dfa51f85fe7",
          "checked": "2026-10-11",
          "claims": [
            "Excel automatically removes leading zeros and converts large numbers to scientific notation, and has a maximum precision of 15 significant digits.",
            "Setting the column to Text format, or the data type to Text when importing with Power Query, keeps leading zeros."
          ]
        },
        {
          "label": "Floating-point arithmetic may give inaccurate result in Excel (Microsoft Learn)",
          "url": "https://learn.microsoft.com/en-us/troubleshoot/microsoft-365-apps/excel/floating-point-arithmetic-inaccurate-result",
          "checked": "2026-10-11",
          "claims": [
            "Excel follows the IEEE 754 specification, stores numbers with 15 digits of precision and cannot represent 0.1 exactly in binary.",
            "The ROUND function and Set precision as displayed are the two ways to compensate; the second cannot be undone.",
            "The formula =(43.1-43.2)+1 displays 0.899999999999999 when shown with 15 decimal places."
          ]
        },
        {
          "label": "Set rounding precision (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/office/set-rounding-precision-e5d707e3-07a8-4df2-810c-218c531eb06a",
          "checked": "2026-10-11",
          "claims": [
            "Set precision as displayed forces stored values to the displayed precision and can have cumulative effects that make data increasingly inaccurate; the ROUND function is offered as an alternative."
          ]
        }
      ],
      "sections": [
        {
          "heading": "Three quiet causes of a wrong total",
          "body": [
            "A total can be wrong without any message because the workbook is not recalculating, because some entries are text that looks like numbers, or because what is displayed is not what is stored. Each has a quick test, and doing them in this order costs a few minutes."
          ],
          "items": [
            "Calculation set to manual, so formulas show old results.",
            "Numbers stored as text, so sums skip them and sorting is odd.",
            "Display formatting that hides more decimals than the sum uses."
          ]
        },
        {
          "heading": "Check the calculation mode first",
          "body": [
            "Excel recalculates automatically by default. In Manual mode, Microsoft's page explains, formulas update only when you recalculate, for example with F9, and Ctrl+Alt+F9 recalculates every formula in all open workbooks whether or not it changed. Write down a total, force a full recalculation, and look again. If the number moves, the workbook was stale and you have found at least one cause.",
            "Check this before anything else, because every later check is meaningless on stale results."
          ],
          "items": []
        },
        {
          "heading": "Numbers stored as text",
          "body": [
            "Microsoft describes numbers stored as text: they align left, often carry a small green triangle and cause calculation problems and confusing sort orders. They often arrive from imports, copies from other systems or cells that were formatted as text before a number was typed. A count of the column that is lower than the number of filled cells is a quick test.",
            "The page lists the fixes: Convert to Number from the error button, or Paste Special with Multiply by 1 for cells without a marker. Ignore Error only hides the marker and leaves the data unchanged. Extra spaces and nonprintable characters need TRIM and CLEAN. Some systems export a negative number with the minus sign after the value, which also arrives as text.",
            "Codes are different from amounts. Excel removes leading zeros from numbers and keeps 15 significant digits, so a postcode, account code or long reference number must be text from the start. Setting the column to Text, or the data type to Text when importing, keeps it."
          ],
          "items": []
        },
        {
          "heading": "Displayed is not stored",
          "body": [
            "A number format changes what you see, not the value underneath. Three amounts that each display as 1.30 can hold more decimals, and their sum can differ from the sum of the displayed figures. Excel also follows the IEEE 754 standard, so some decimals such as 0.1 cannot be stored exactly. Microsoft's own example, =(43.1-43.2)+1, displays 0.899999999999999 when shown to fifteen decimal places.",
            "The sensible remedy is the ROUND function, applied where the business rule says rounding happens. The workbook-wide option \"Set precision as displayed\" is risky: Microsoft says it permanently trims stored values, cannot be undone and can have cumulative effects that make data increasingly inaccurate. A penny difference between two quotes is usually a rounding-rule question, and the accompanying worked example shows one."
          ],
          "items": []
        },
        {
          "heading": "When it is a repair job, and when it is not",
          "body": [
            "If a workbook's formulas, text numbers or calculation setting are making outputs wrong, the fixed £195 formula repair covers one workbook of up to five sheets and eight outputs, accepted by check cases you calculated independently and a full recalculation that moves nothing. The price is an untested proposal and payment follows your sign-off.",
            "It does not decide your rounding policy, correct figures typed in by people, or give accounting advice. Say in the enquiry how many outputs you do not trust and whether macros are involved, and send no workbook at first."
          ],
          "items": []
        }
      ],
      "incoming": [
        "example-quote-line-rounding",
        "platform-microsoft-excel",
        "collection-spreadsheet-messy-workbook-diagnosis-order",
        "guide-excel-error-values-trace",
        "guide-mailmerge-fields-and-number-formats"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/guides/excel-stale-or-text-numbers/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/guides/excel-stale-or-text-numbers/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fexcel-stale-or-text-numbers%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fguides%2Fexcel-stale-or-text-numbers%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "guide-excel-merged-cells-and-tidy-tables",
      "type": "guide",
      "title": "Merged cells stop Excel sorting and pivoting: how to flatten a printed-style report safely",
      "description": "Merged group labels, spacer rows and subtotal lines make a report readable on paper and unusable as data. See what merging does, what a flat table needs and how to prove nothing was lost.",
      "url": "/guides/excel-merged-cells-and-tidy-tables/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "platforms": [
        "microsoft-excel"
      ],
      "buyer_role": "Office manager or administrator who inherited a report built for printing",
      "purchase_trigger": "Sorting fails because of merged cells, or a PivotTable will not build from the report",
      "problem": "A report designed to be read is not a table that can be filtered, sorted or summarised, and flattening it by hand risks assigning labels to the wrong rows.",
      "related": [
        "platform-microsoft-excel",
        "spreadsheet-flatten-merged-cell-report",
        "example-merged-report-flattened",
        "spreadsheet-make-workbook-set-import-ready",
        "collection-spreadsheet-messy-workbook-diagnosis-order"
      ],
      "provenance": [
        {
          "label": "Merge and unmerge cells (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/office/merge-and-unmerge-cells-5cbd15d5-9375-4540-907f-c673a93fcedf",
          "checked": "2026-10-11",
          "claims": [
            "When cells are merged only the upper-left cell's contents are kept and the contents of the others are deleted; unmerging moves the data to the left cell.",
            "Merge is unavailable when cells are formatted as an Excel table."
          ]
        },
        {
          "label": "Find merged cells (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/office/find-merged-cells-d02b2a5a-a08d-4641-8d4d-b3f233daca2c",
          "checked": "2026-10-11",
          "claims": [
            "Excel does not sort data in a column that contains merged cells.",
            "Find & Select, Find, Format, Alignment, Merge cells, Find All lists every merged cell."
          ]
        },
        {
          "label": "Create a PivotTable to analyze worksheet data (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/office/create-a-pivottable-to-analyze-worksheet-data-a9a84538-bfe9-40a9-a8e9-f99134456576",
          "checked": "2026-10-11",
          "claims": [
            "Source data should be tabular with no blank rows or columns, one header row of distinct labels, no merged cells and one type of data per column.",
            "An Excel table as the source includes added rows when the PivotTable is refreshed; a PivotTable works from a snapshot and needs refreshing when the source changes."
          ]
        }
      ],
      "sections": [
        {
          "heading": "What merging actually does to your data",
          "body": [
            "Merging cells keeps only the upper-left cell's contents. Microsoft's page states that the contents of the other cells are deleted, and advises copying anything you need first. Unmerging reverses the shape, not the loss: the page says the data in the merged cell moves to the left cell, so a region name that appeared to sit above three rows now sits in one cell with two empty cells below it.",
            "This matters in two ways. A report where a label covers several rows has that label stored once. And if someone merged cells that each held different data some time ago, the discarded values are gone from the file."
          ],
          "items": []
        },
        {
          "heading": "What a flat table needs",
          "body": [
            "Microsoft's guidance for PivotTable source data describes what any analysis wants: tabular layout, no blank rows or columns, a single header row of distinct labels, no merged cells and one kind of data in each column. It also says an Excel table as the source includes rows added later when the PivotTable is refreshed.",
            "The practical consequence is that every record carries its own group label, so each row can be sorted or filtered alone. Spacer rows, repeated header blocks and subtotal lines are layout, not records. Left in, they get counted, double-counted or sorted into the middle of the data."
          ],
          "items": [
            "One header row.",
            "One record per row, with every label repeated on every row it applies to.",
            "No subtotal rows inside the data; totals are recomputed beside it.",
            "One data type per column."
          ]
        },
        {
          "heading": "Find the merges before you touch them",
          "body": [
            "Make a copy of the file. In Excel, choose Find & Select, then Find, then Format, then the Alignment tab, tick Merge cells and select Find All. Microsoft documents this route; it lists every merged cell. Count them and note which are title blocks, which are group labels and which are column headings. Excel does not sort a column that contains merged cells, so any merge inside the data area must go before sorting is possible."
          ],
          "items": []
        },
        {
          "heading": "Flatten without losing meaning",
          "body": [
            "Unmerge, then fill each label down onto the rows it covered, but only where you can say what it covered. Then list the spacer, repeated heading and subtotal rows by type before removing them. Prove that nothing else was lost: the number of original rows must equal the number of records plus the number of removed rows, each numeric column's total over the records must match the total in the original records, and each original subtotal should equal a recomputed one.",
            "Finish with a sample. Take twenty records at random and compare each one's group label with the label that covered it in the original. This is the check that catches a label filled onto the wrong rows, which no total will reveal."
          ],
          "items": []
        },
        {
          "heading": "Cases that do not fit, and the paid job",
          "body": [
            "A label that could belong to the rows above or the rows below cannot be flattened safely until someone who knows decides. Layouts that change from block to block need a rule for each. Data already lost to earlier merging cannot be recovered. The numbers in the original may also be wrong; flattening does not make them right.",
            "One sheet of up to 5,000 rows in one repeating layout can be flattened as a job from £145 (an untested proposal, with the final price confirmed after we see the layout description), accepted by the single header row, a merged-cell search that finds nothing, the row and total reconciliation and the label sample, with payment after your sign-off. It does not build a PivotTable or dashboard. The first enquiry needs a description of the layout and the row count, never the report."
          ],
          "items": []
        }
      ],
      "incoming": [
        "example-merged-report-flattened",
        "platform-microsoft-excel",
        "collection-spreadsheet-messy-workbook-diagnosis-order",
        "guide-spreadsheet-import-readiness"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/guides/excel-merged-cells-and-tidy-tables/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/guides/excel-merged-cells-and-tidy-tables/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fexcel-merged-cells-and-tidy-tables%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fguides%2Fexcel-merged-cells-and-tidy-tables%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "guide-excel-date-serials-and-regional-order",
      "type": "guide",
      "title": "Dates sort wrongly or change between computers: serial numbers, text dates and day-month order",
      "description": "Excel stores dates as numbers and reads typed dates through regional settings. Learn how text dates, a four-year offset and day-first entries produce wrong sorting, and what to do with rows that cannot be settled.",
      "url": "/guides/excel-date-serials-and-regional-order/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "platforms": [
        "microsoft-excel"
      ],
      "buyer_role": "Administrator who combines lists from several people or offices",
      "purchase_trigger": "A date column sorts out of order, or dates in the same file mean different things to different people",
      "problem": "A date column can mix real dates, text and day-first and month-first entries, and some of those cannot be told apart from the data alone.",
      "related": [
        "platform-microsoft-excel",
        "spreadsheet-normalise-mixed-dates-and-numbers",
        "spreadsheet-make-workbook-set-import-ready",
        "guide-spreadsheet-import-readiness",
        "collection-spreadsheet-messy-workbook-diagnosis-order"
      ],
      "provenance": [
        {
          "label": "Date systems in Excel (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/excel/date-systems-in-excel",
          "checked": "2026-10-11",
          "claims": [
            "Excel stores a date as a serial number counted from a start date; the 1900 and 1904 systems differ by 1,462 days (four years and one day).",
            "July 5, 2011 is 40729 in the 1900 system and 39267 in the 1904 system, and dates pasted between workbooks that use different systems can be shifted unless converted."
          ]
        },
        {
          "label": "Change the date system, format, or two-digit year interpretation (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/office/change-the-date-system-format-or-two-digit-year-interpretation-aaa2159b-4ae8-4651-8bce-d4707bc9fb9f",
          "checked": "2026-10-11",
          "claims": [
            "Two-digit years 00 to 29 are interpreted as 2000 to 2029 and 30 to 99 as 1930 to 1999; the page recommends four-digit years.",
            "A mismatch of dates between workbooks can be corrected by adding or subtracting 1462 with Paste Special."
          ]
        },
        {
          "label": "Convert dates stored as text to dates (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/excel/convert-dates-stored-as-text-to-dates",
          "checked": "2026-10-11",
          "claims": [
            "Text dates are left-aligned; DATEVALUE returns a serial number that needs a date format applied, and January 1, 1900 is serial number 1.",
            "Error checking can flag text dates with two-digit years and offer to convert them to 20XX or 19XX."
          ]
        },
        {
          "label": "DATEVALUE function (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/excel/functions/datevalue-function",
          "checked": "2026-10-11",
          "claims": [
            "DATEVALUE turns text into a serial number; a missing year uses the current year from the computer's clock, time information is ignored, and text outside January 1, 1900 to December 31, 9999 returns #VALUE!.",
            "The page warns that the system date setting may change the results shown."
          ]
        },
        {
          "label": "Stop automatically changing numbers to dates (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/excel/stop-automatically-changing-numbers-to-dates",
          "checked": "2026-10-11",
          "claims": [
            "Excel changes entries such as 12/2 to 2-Dec, and the page says there is no way to turn this off.",
            "Preformatting cells as Text, or typing an apostrophe first, prevents the change."
          ]
        },
        {
          "label": "W3C Note: Date and Time Formats",
          "url": "https://www.w3.org/TR/NOTE-datetime",
          "checked": "2026-10-11",
          "claims": [
            "The profile gives YYYY-MM-DD as the complete date format and is meant for standards that need an unambiguous representation of dates and times."
          ]
        },
        {
          "label": "Format a date the way you want (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/office/format-a-date-the-way-you-want-8e10019e-d5d8-47a1-ba95-db95123d273e",
          "checked": "2026-10-11",
          "claims": [
            "When you type something Excel reads as a date, it formats it according to the default date setting in Control Panel.",
            "Date formats that begin with an asterisk change when the regional configuration changes; formats without an asterisk do not."
          ]
        },
        {
          "label": "How to correct a #VALUE! error (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/excel/how-to-correct-a-value-error",
          "checked": "2026-10-11",
          "claims": [
            "For dates stored as text that do not match the system date format, a real date can be built with a formula such as =DATE(RIGHT(A1,4),MID(A1,4,2),LEFT(A1,2)), adjusted to the layout."
          ]
        }
      ],
      "sections": [
        {
          "heading": "A real date is a number",
          "body": [
            "Excel stores a date as a serial number: the count of days from a start date. Microsoft documents two systems. The 1900 system counts from January 1, 1900, and the 1904 system from January 1, 1904. They differ by 1,462 days, which is four years and one day. Microsoft's example: July 5, 2011 is 40729 in the 1900 system and 39267 in the 1904 system.",
            "When dates are pasted between workbooks that use different systems, they can arrive shifted by those 1,462 days. A tell-tale sign is a whole column of dates that is almost exactly four years out. Microsoft describes correcting this by adding or subtracting 1462 with Paste Special."
          ],
          "items": []
        },
        {
          "heading": "A text date is not a date",
          "body": [
            "Entries that look like dates but are text align to the left, will not sort chronologically and cannot be used in date arithmetic. DATEVALUE converts text to a serial number, which then needs a date format applied. Its documentation notes that a missing year takes the current year from the computer's clock, that time information is ignored and that text outside the supported range returns an error.",
            "When the text does not match what your system expects, Microsoft's #VALUE! page suggests building a real date from its parts, for example a DATE formula that picks the year, month and day out of a day-first text entry. Such a formula embeds a decision about order, so it is only safe for a column whose order you know."
          ],
          "items": [
            "Left-aligned dates are text.",
            "A COUNT of the column lower than the number of filled cells means some entries are text.",
            "Convert on a copy, keep the original column and look at a sample afterwards."
          ]
        },
        {
          "heading": "Day-month order is interpreted, not stored in the text",
          "body": [
            "The text 03/04/2026 does not say which number is the day. Microsoft's documentation shows Excel turning typed entries into dates automatically, such as 12/2 into 2-Dec, and says there is no way to turn this off; its workaround is to format cells as Text first or to type an apostrophe. Microsoft also says that when you type something Excel reads as a date, it formats it according to the default date setting in Control Panel, and that date formats beginning with an asterisk change when the regional configuration changes. The DATEVALUE page warns that the system date setting may change what it shows. The upshot is that a typed date depends on the computer it was typed on.",
            "The result is that a column built from several people's typing can hold some entries read as day-first and some as month-first, both valid and both wrong for someone. When both numbers are 12 or less and differ, nothing in the cell can settle it."
          ],
          "items": []
        },
        {
          "heading": "Two-digit years and the cutoff",
          "body": [
            "With two-digit years, Microsoft says Excel reads 00 to 29 as 2000 to 2029 and 30 to 99 as 1930 to 1999, and recommends four-digit years. A date typed as 31 is read as 1931, which is wrong for a list of this year's invoices. The cutoff is a rule that must be agreed for the file, not assumed."
          ],
          "items": []
        },
        {
          "heading": "Settling ambiguity, and the paid job",
          "body": [
            "The honest approach is a written rule per source. For example: dates typed by the Leeds office are day-first, dates from the system export are year-month-day. Where a source is known, convert by its rule. Where it is not, list the row and let the owner decide. Output in the year-month-day form, which the W3C date-and-time note describes as an unambiguous representation, so the problem is not recreated.",
            "The clean-up job, from £125 with the final price confirmed after we see the column list, covers one file of up to 20,000 rows with up to three date columns and two number columns (an untested proposal). It is accepted by the conversion counts, a reference set of at least thirty dates you confirm from source documents and a list of every ambiguous row, with payment after your sign-off. It does not guess dates, handle time zones or decide which dates are right for your business. Send the column list and what you know about each source, not the file."
          ],
          "items": []
        }
      ],
      "incoming": [
        "example-date-ambiguity-matrix",
        "platform-microsoft-excel",
        "collection-spreadsheet-messy-workbook-diagnosis-order",
        "guide-report-pack-repeatable-export",
        "guide-spreadsheet-import-readiness"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/guides/excel-date-serials-and-regional-order/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/guides/excel-date-serials-and-regional-order/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fexcel-date-serials-and-regional-order%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fguides%2Fexcel-date-serials-and-regional-order%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "guide-spreadsheet-contact-duplicate-match-rules",
      "type": "guide",
      "title": "Cleaning duplicates in a contact list: write the match rules before you delete anything",
      "description": "Removing duplicates is a set of decisions, not a button. Compare exact and near matches, avoid merging people who only share a field, and keep a log so every merge can be undone.",
      "url": "/guides/spreadsheet-contact-duplicate-match-rules/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "platforms": [
        "microsoft-excel"
      ],
      "buyer_role": "Office manager or owner responsible for a mailing, membership or customer list",
      "purchase_trigger": "The same organisation appears several times, or a quick clean-up removed rows that were different people",
      "problem": "A list can hold the same contact more than once and also hold different contacts who share an address, and one tool cannot tell the two apart without rules.",
      "related": [
        "platform-microsoft-excel",
        "spreadsheet-remove-duplicate-contacts",
        "spreadsheet-make-workbook-set-import-ready",
        "guide-spreadsheet-import-readiness",
        "collection-spreadsheet-messy-workbook-diagnosis-order"
      ],
      "provenance": [
        {
          "label": "Filter for unique values or remove duplicate values (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/office/filter-for-unique-values-or-remove-duplicate-values-ccf664b0-81d6-449b-bbe1-8daaec1e83c2",
          "checked": "2026-10-11",
          "claims": [
            "Remove Duplicates compares what appears in the cell, not the stored value: a date shown as 3/8/2006 and the same date shown as Mar 8, 2006 count as different.",
            "You choose the columns that form the key; a match removes the whole row, the first occurrence is kept and removal is permanent, so the page recommends copying the original data first."
          ]
        },
        {
          "label": "Keep or remove duplicate rows (Power Query) (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/office/keep-or-remove-duplicate-rows-power-query-d9cffc69-dc5d-4d94-8b66-72779688874d",
          "checked": "2026-10-11",
          "claims": [
            "Power Query removes duplicates based on the columns you select, which can be contiguous or discontiguous."
          ]
        }
      ],
      "sections": [
        {
          "heading": "A duplicate is defined by a rule, not by the sheet",
          "body": [
            "Two rows are the same contact because of something you decide counts: the same email address, the same organisation name and postcode, the same person at the same organisation. Any rule makes two kinds of mistake. It can miss a real duplicate, which leaves the list untidy. Or it can merge two different contacts, which loses information about a real person or organisation. The second is usually worse, so a cautious rule leaves uncertain pairs alone."
          ],
          "items": []
        },
        {
          "heading": "What Excel's Remove Duplicates actually does",
          "body": [
            "Microsoft's page describes it precisely. You choose the columns that form the key. If every ticked column matches, the whole row is removed, including the columns you did not tick, and the first occurrence is kept. The comparison uses what is displayed in the cell, not the stored value, so the same date shown as 3/8/2006 and as Mar 8, 2006 counts as different. The removal is permanent apart from Undo, and the page recommends copying the original data first. Power Query's Remove Duplicates likewise works on the columns you select.",
            "These are sound tools for exact repeats. They are not designed for near-matches such as \"Brook & Sons Ltd\" and \"Brook and Sons Limited\", and they have no memory of what was removed."
          ],
          "items": [
            "Exact repeat, same displayed values: safe to merge by rule.",
            "Near match with different spelling: a rule or a review is needed.",
            "Same value, different people: the tools cannot tell, so you must."
          ]
        },
        {
          "heading": "Normalise a copy for comparing, and keep the original columns",
          "body": [
            "Build separate comparison columns: trim spaces, ignore letter case, standardise company suffixes such as Ltd and Limited, remove punctuation and standardise postcode spacing. Compare on those, but never overwrite the original values. If a merge is wrong, you want the original text back.",
            "Watch for chains. If A matches B and B matches C, but A and C differ in important ways, merging all three on the strength of the chain may be wrong."
          ],
          "items": []
        },
        {
          "heading": "Shared fields are not proof",
          "body": [
            "Two people can share an address, a phone number or a role mailbox such as an information address. Two organisations can share a building. A surname is not an identity. Write down, with examples, the cases where a shared field must not cause a merge, and test the rule against a handful of look-alike pairs that you know are different."
          ],
          "items": [
            "Same email, different names: could be a shared mailbox; review.",
            "Same name and postcode, different email: possibly the same person; review or merge by an explicit rule.",
            "Same organisation, different contacts: keep both; they may be different people."
          ]
        },
        {
          "heading": "Make every merge reversible, and know the limits",
          "body": [
            "A merge log records each surviving row, each row merged into it and the rule that matched. The row counts must reconcile: original rows equal cleaned rows plus merged-away rows. Uncertain pairs go to a review file with both rows left in the list. The original file is never altered.",
            "The fixed-scope job from £195 (an untested proposal) works on one list of up to 10,000 rows of products, parts, assets or companies that holds no personal data, with rules you write. It is accepted by the row reconciliation, a test set of at least 20 true duplicate pairs and 20 look-alike pairs with half of them kept back from us until the rules are fixed, the review file and an unchanged original. Payment follows your sign-off.",
            "Lists of people, with names, email addresses or phone numbers, are not covered. They are out of scope until a secure handover route exists, and none has been set up yet. We do not contact anyone named on a list, check whether addresses exist or advise whether you may use a list for marketing or whether you comply with data-protection law; that is a legal question for you. Work starts only after a secure way to hand the file over has been agreed in writing. The first enquiry contains only column headings, counts and invented examples, never the list."
          ],
          "items": []
        }
      ],
      "incoming": [
        "platform-microsoft-excel",
        "collection-spreadsheet-messy-workbook-diagnosis-order",
        "guide-spreadsheet-import-readiness"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/guides/spreadsheet-contact-duplicate-match-rules/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/guides/spreadsheet-contact-duplicate-match-rules/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fspreadsheet-contact-duplicate-match-rules%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fguides%2Fspreadsheet-contact-duplicate-match-rules%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "guide-convert-legacy-office-fidelity",
      "type": "guide",
      "title": "Old .doc and .xls files: what converting really changes and how to check a whole batch",
      "description": "Converting one old Office file is easy. Converting a folder needs an inventory, copies instead of overwrites, a decision about macros and a check that the new files match the old.",
      "url": "/guides/convert-legacy-office-fidelity/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "platforms": [
        "microsoft-excel",
        "microsoft-word"
      ],
      "buyer_role": "Administrator responsible for a shared drive of old Word and Excel files",
      "purchase_trigger": "Compatibility Mode keeps appearing, or a software change means old formats must go",
      "problem": "A batch conversion run without an inventory and a check leaves nobody able to say which files converted, which failed and which changed.",
      "related": [
        "platform-microsoft-excel",
        "convert-legacy-office-files-batch",
        "archive-digitise-and-normalise-one-archive",
        "guide-archive-rename-manifest-path-limits",
        "collection-pdf-to-spreadsheet-diagnosis-order"
      ],
      "provenance": [
        {
          "label": "Converting documents to a newer format (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/office/converting-documents-to-a-newer-format-34ec742e-f0f9-4d95-bbe3-3ee8e30a86fa",
          "checked": "2026-10-11",
          "claims": [
            "Compatibility Mode appears in the title bar when a document was made in an earlier version of Word; File, Info, Convert converts the document without saving a copy, and Save As makes a separate copy.",
            "The page gives no itemised list of layout changes; Convert clears the compatibility options so layout follows current Word behaviour."
          ]
        },
        {
          "label": "Saving .doc to .docx (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/word/saving-doc-to-docx-or-dorm",
          "checked": "2026-10-11",
          "claims": [
            "It advises having a copy or backup of the original files and verifying the content or layout for any changes in the converted file.",
            "Documents with macros can be converted to the macro-enabled .docm format instead, and the Developer tab lists any macros."
          ]
        },
        {
          "label": "Use Excel with earlier versions of Excel (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/office/use-excel-with-earlier-versions-of-excel-2fd9ffcb-6fce-485b-85af-fecfd651a5ac",
          "checked": "2026-10-11",
          "claims": [
            "Excel opens Excel 97-2003 workbooks in Compatibility Mode, and File, Info, Convert replaces the original with a copy in a current format, while Save As keeps the old file.",
            "The Compatibility Checker lists features that do not carry over to earlier formats, including data beyond 65,536 rows by 256 columns; the page is marked as retired because the versions it covers are out of support."
          ]
        },
        {
          "label": "Saving .xls to .xlsx or .xlsm (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/excel/saving-xls-to-xlsx-xlsm",
          "checked": "2026-10-11",
          "claims": [
            "Workbooks that contain macros can be converted to the macro-enabled .xlsm format; the Developer tab lists macros.",
            "It advises keeping a backup and verifying the content or layout for any changes in the converted file."
          ]
        },
        {
          "label": "Excel specifications and limits (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/excel/excel-specifications-and-limits",
          "checked": "2026-10-11",
          "claims": [
            "The worksheet size limit is 1,048,576 rows by 16,384 columns."
          ]
        }
      ],
      "sections": [
        {
          "heading": "What Compatibility Mode is telling you",
          "body": [
            "When Word or Excel opens a file made in an older version, the title bar says Compatibility Mode. Microsoft explains that it temporarily disables newer features so people on the earlier version can still work on the file, and keeps the existing layout. Converting removes that restriction. For Word, File, Info, Convert converts the document without saving a copy, and Save As makes a separate one. Excel works the same way: convert replaces the original with a current-format copy, while Save As keeps the old file.",
            "The practical rule for a batch follows directly: never use the in-place convert on originals. Always produce a copy."
          ],
          "items": []
        },
        {
          "heading": "What can change, and what Microsoft says about it",
          "body": [
            "Microsoft's pages are cautious. They do not list every layout change; the Word page says only that converting clears the compatibility options so the layout follows current behaviour. Both the Word and Excel pages tell you to keep a backup of the original and to verify the content or layout of the converted file for changes. On size, Excel's documentation says data beyond 65,536 rows by 256 columns is lost when a workbook is saved in the old format, while its specifications page gives the current worksheet limit as 1,048,576 rows by 16,384 columns.",
            "Macros need a decision. Both pages say files with macros can be saved in the macro-enabled formats, .docm and .xlsm, and that the Developer tab lists macros. Because Microsoft directs macro files to those formats, macro files must be identified first and handled separately, not converted along with everything else."
          ],
          "items": [
            "No itemised list of layout differences is published; the checks below are what we propose, not a vendor guarantee.",
            "The Excel documentation referred to here is marked as retired because the versions it covered are out of support."
          ]
        },
        {
          "heading": "Build the inventory before converting anything",
          "body": [
            "Count the files by type, size and folder depth. Identify which contain macros, which are password-protected and which cannot be opened at all. Record each file's checksum so you can show later that no original changed. Decide the target format for each type and what happens to macro files. This list is the contract: at the end, every file on it must be converted or listed as an exception with a reason."
          ],
          "items": []
        },
        {
          "heading": "Check the result in a way that finds differences",
          "body": [
            "For a sample of converted files, compare with the originals. For a Word file, compare the page count, measuring the original and the converted file in the same application, version and settings so that a difference in the application is not mistaken for a difference in the file, and look at pages with tables, images and headers. For an Excel file, compare the number of sheets, the number of formulas and a few key totals. List every difference found rather than judging it acceptable on the spot.",
            "Then compare the checksums of the originals before and after the job. A conversion that touched an original is a failure however good the new files look."
          ],
          "items": [
            "Inventory count = converted files + files listed as exceptions.",
            "Every original has the same checksum before and after.",
            "Page counts for an original and its converted file are measured in the same application, version and settings.",
            "The sample report lists each difference, not just a pass or fail mark."
          ]
        },
        {
          "heading": "Where the paid job fits, and where it does not",
          "body": [
            "Up to 300 old .doc and .xls files in one folder tree can be converted as a one-off job from £295 (an untested proposal). Converted copies go in a parallel folder structure, and files with macros become .docm or .xlsm only if you agree. The job is accepted by the inventory reconciliation, a sample that opens in the named application without a repair prompt or compatibility label, the page, sheet and formula comparisons measured in that same application, and unchanged originals. The conversion tool and the checking application are named, with versions, in the written scope. Payment follows your sign-off. It does not edit content, repair formulas, rewrite macros or advise on whether originals may be deleted.",
            "A whole archive that also contains scans and needs renaming is a larger scope, covered by the archive project. The first enquiry needs counts and types, never the files. Files with personal data are not covered, and work starts only after a secure way to hand the files over has been agreed in writing; no upload portal exists yet."
          ],
          "items": []
        }
      ],
      "incoming": [
        "example-archive-rename-manifest",
        "buyer-doc-office-manager-paper-and-pdf-backlog",
        "guide-archive-rename-manifest-path-limits"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/guides/convert-legacy-office-fidelity/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/guides/convert-legacy-office-fidelity/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fconvert-legacy-office-fidelity%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fguides%2Fconvert-legacy-office-fidelity%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "guide-archive-rename-manifest-path-limits",
      "type": "guide",
      "title": "Renaming thousands of files: rules, collisions, path limits and a manifest that proves nothing changed",
      "description": "A bulk rename can overwrite files, break on reserved names or exceed path limits. A dry run, a rule check and a checksum manifest make it safe and reversible.",
      "url": "/guides/archive-rename-manifest-path-limits/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "platforms": [
        "file-archives"
      ],
      "buyer_role": "Office manager or administrator tidying a shared drive or archive",
      "purchase_trigger": "Nobody can find anything, or files will not copy to the new storage because of their names",
      "problem": "Bulk renames fail in ways that are hard to see afterwards: collisions, rejected names, paths that are too long and no record of what each file used to be called.",
      "related": [
        "archive-rename-organise-with-manifest",
        "archive-digitise-and-normalise-one-archive",
        "example-archive-rename-manifest",
        "guide-convert-legacy-office-fidelity",
        "collection-pdf-to-spreadsheet-diagnosis-order"
      ],
      "provenance": [
        {
          "label": "Naming Files, Paths, and Namespaces (Microsoft Learn)",
          "url": "https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file",
          "checked": "2026-10-11",
          "claims": [
            "Windows file names cannot contain < > : \" / \\ | ? * or control characters, cannot be the reserved names CON, PRN, AUX, NUL, COM1 to COM9 or LPT1 to LPT9 (with or without an extension), and should not end with a space or a period.",
            "Case sensitivity should not be assumed: OSCAR, Oscar and oscar should be treated as the same name."
          ]
        },
        {
          "label": "Maximum Path Length Limitation (Microsoft Learn)",
          "url": "https://learn.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation",
          "checked": "2026-10-11",
          "claims": [
            "In the Windows API the maximum path length is MAX_PATH, defined as 260 characters; from Windows 10 version 1607 long paths are possible only if a registry setting is enabled and the application declares it is long-path aware.",
            "The page says you may hit the limit when cloning a repository with long file names into a folder that itself has a long name."
          ]
        },
        {
          "label": "RFC 8493: The BagIt File Packaging Format",
          "url": "https://www.rfc-editor.org/rfc/rfc8493",
          "checked": "2026-10-11",
          "claims": [
            "A payload manifest lists each payload file exactly once with a checksum and a relative path, so a set of files can be checked for completeness and fixity.",
            "Its portability notes warn about Windows reserved names, restricted characters, files that differ only in case and names that differ only in Unicode normalisation form.",
            "The checksums protect against corruption and are not designed to be secure against active attacks."
          ]
        }
      ],
      "sections": [
        {
          "heading": "Write the naming rule as a sentence first",
          "body": [
            "A rule you can say in one sentence can be applied, checked and explained to the next person. For example: year and month, then the subject, then a three-digit number, with no spaces. If you cannot write the rule down, a program cannot apply it. Decide what the rule is built from: the file's current name, its folder, a date in the name, its file metadata or a list you supply. Reading document contents to choose names is a different and larger job.",
            "Decide the folder structure at the same time. A structure that mixes subjects and years under the same level will cause as many problems as the names."
          ],
          "items": []
        },
        {
          "heading": "Check names against the rules of where the files are going",
          "body": [
            "Names that work on one system can fail on another. Microsoft lists characters Windows does not allow in file names, namely < > : \" / \\ | ? * and control characters, and reserved names such as CON, PRN, AUX, NUL, COM1 to COM9 and LPT1 to LPT9, with or without an extension. Names should not end in a space or a period. Windows should not be assumed to be case-sensitive, so OSCAR, Oscar and oscar are the same name there, which makes two files that differ only in case a collision.",
            "Path length is a separate limit. In the Windows API the maximum path is 260 characters, and longer paths work only where a setting is enabled and the application supports it. Microsoft notes you may hit the limit when files with long names go into a folder that itself has a long name. Deeply nested folders add up."
          ],
          "items": [
            "Reserved names and disallowed characters: flag them in the dry run.",
            "Case-only differences: treat as collisions.",
            "Path length: agree a limit below the system maximum so the files still fit when moved."
          ]
        },
        {
          "heading": "Run a dry run and approve it before anything changes",
          "body": [
            "A dry run produces a table of old path and proposed new path, with problems flagged, and changes nothing. A named person reads it and approves it. Collisions get a decision: add a number, merge as duplicates after comparison or leave for a person to name. The approval is what makes the later changes yours."
          ],
          "items": []
        },
        {
          "heading": "A manifest shows that nothing was lost or altered",
          "body": [
            "A manifest lists every file once, with its old path, new path, size and a checksum. A file that cannot be named safely still gets its row, marked held, so the counts always add up. The BagIt specification describes the same idea for packaging files: a manifest line pairs a checksum with a relative path, so you can check that the set is complete and unchanged. It protects against corruption and mistakes; it is not designed to defeat someone deliberately tampering.",
            "Compare checksums of each source file with the file at its new path. Counts must match across the source, the copy and the manifest. Test the reversal on a sample: restoring the original names from the manifest should work for every file in the sample."
          ],
          "items": []
        },
        {
          "heading": "Where the paid job fits, and where it does not",
          "body": [
            "One folder tree of up to 5,000 files can be copied and reorganised as a one-off job from £245 (an untested proposal), accepted by a manifest with a row for every file, matching counts and checksums, a rule check with held files listed, an approved dry run and a tested reversal. Payment follows your sign-off. The files must be handed over as a copy through a secure route agreed in writing first, because the checks compare the contents of every file; no upload portal exists yet, and we do not supply a program for you to run on your own copy. File and folder names can themselves hold a person's name, so folders whose names or contents hold personal data are not covered.",
            "It does not delete originals, remove duplicates by content, choose names by reading documents or advise on retention or legal holds. The first enquiry needs counts and a few example names, never files."
          ],
          "items": []
        }
      ],
      "incoming": [
        "example-archive-rename-manifest",
        "guide-convert-legacy-office-fidelity"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/guides/archive-rename-manifest-path-limits/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/guides/archive-rename-manifest-path-limits/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Farchive-rename-manifest-path-limits%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fguides%2Farchive-rename-manifest-path-limits%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "guide-mailmerge-fields-and-number-formats",
      "type": "guide",
      "title": "Mail merge and quotation templates: why numbers arrive wrong and how to test a batch",
      "description": "A merge copies cell values into a template. Currency symbols, percentages and codes come through differently from how they look, so calculations and formats must be settled before the merge.",
      "url": "/guides/mailmerge-fields-and-number-formats/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "platforms": [
        "microsoft-excel",
        "microsoft-word"
      ],
      "buyer_role": "Owner or office manager who produces many similar quotations, letters or documents from a spreadsheet",
      "purchase_trigger": "A merged document shows a number without its currency symbol, a postcode without its zero, or a total that differs from the spreadsheet",
      "problem": "The merge copies values rather than appearance, and a template built without testing quietly sends out wrong or unfilled fields.",
      "related": [
        "platform-microsoft-excel",
        "quote-pack-from-customer-brief",
        "example-quote-line-rounding",
        "guide-excel-stale-or-text-numbers",
        "collection-spreadsheet-messy-workbook-diagnosis-order"
      ],
      "provenance": [
        {
          "label": "Prepare your Excel data source for a Word mail merge (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/word/prepare-your-excel-data-source-for-a-word-mail-merge",
          "checked": "2026-10-11",
          "claims": [
            "Postal codes need text format or leading zeros are lost; a percentage format multiplies the cell value by 100, so storing such a column as text is suggested.",
            "Merged numbers come through without currency or percent symbols, so symbols are added before or after the merge field in the Word document."
          ]
        },
        {
          "label": "Mail merge using an Excel spreadsheet (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/word/mail-merge-using-an-excel-spreadsheet",
          "checked": "2026-10-11",
          "claims": [
            "Column names in the spreadsheet should match the field names; all data to be merged should be on the first sheet.",
            "Preview Results steps through the records so you can see how each looks, and Finish & Merge offers Print Documents or Send E-mail Messages."
          ]
        },
        {
          "label": "ROUND function (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/excel/functions/round-function",
          "checked": "2026-10-11",
          "claims": [
            "ROUND(number, num_digits) rounds to the given number of digits; examples include =ROUND(2.15, 1) returning 2.2 and =ROUND(-1.475, 2) returning -1.48."
          ]
        },
        {
          "label": "Floating-point arithmetic may give inaccurate result in Excel (Microsoft Learn)",
          "url": "https://learn.microsoft.com/en-us/troubleshoot/microsoft-365-apps/excel/floating-point-arithmetic-inaccurate-result",
          "checked": "2026-10-11",
          "claims": [
            "Excel stores 15 digits of precision, cannot represent 0.1 exactly in binary, and offers the ROUND function to compensate for rounding errors."
          ]
        }
      ],
      "sections": [
        {
          "heading": "What a merge does",
          "body": [
            "A mail merge connects a Word template to a spreadsheet. Each column name becomes a merge field, and for every row Word produces a document with the fields replaced by that row's cell contents. Microsoft says column names in the spreadsheet should match the field names, that all the data to be merged should be on the first sheet and that Preview Results lets you step through records to see how each looks. Finishing the merge offers printing or sending as email messages; for quotations that go to customers, you will want to read each one first."
          ],
          "items": []
        },
        {
          "heading": "Numbers and codes arrive differently from how they look",
          "body": [
            "Microsoft documents three traps. Merged numbers come through without currency or percent symbols, so a price shows as 50.00 and a rate as 20 unless you add the symbol before or after the merge field in the Word document. A percentage format in Excel multiplies the stored value by 100 on display, so a percentage column is safer stored as text if you want it to appear as written. Postal codes need text format, or leading zeros are lost.",
            "The same care applies to dates and to long reference numbers. Decide how each should print, and make the spreadsheet hold it in that form."
          ],
          "items": [
            "Add currency and percent symbols in the template, outside the field.",
            "Hold postcodes and codes as text.",
            "Check one record of each kind in Preview Results."
          ]
        },
        {
          "heading": "Do the arithmetic in the workbook, and decide the rounding rule",
          "body": [
            "The template should show results, not calculate them. Work out line totals and the grand total in the workbook, where they can be checked, and merge the finished figures. Decide the rounding rule in words: round each line, then add, or add, then round? The two can differ by a penny, as the worked example shows with invented figures.",
            "Excel stores 15 digits of precision and cannot hold some decimals such as 0.1 exactly, so apply the ROUND function at the point your rule says rounding happens, rather than relying on number formatting. Microsoft's ROUND page shows its behaviour with examples such as 2.15 to one decimal place giving 2.2."
          ],
          "items": []
        },
        {
          "heading": "Test with a proof set before the batch",
          "body": [
            "Pick about ten records on purpose: a normal one, a zero quantity, a quantity at a price break, an item missing from the price list, a very long description, a name with an accent or an apostrophe, a blank optional field. Calculate their totals by hand under the written rules. Merge them and compare. Look for unfilled fields, wrong symbols and any price that is not on the price list.",
            "Then merge the batch and check that the sum of the document totals equals the sum in the workbook. A proof sheet that lists each brief, each lookup and each calculation makes later checking possible."
          ],
          "items": []
        },
        {
          "heading": "Where the paid job fits, and where it does not",
          "body": [
            "One approved template, one price list with unique codes and up to 40 briefs can be turned into a batch of quotation documents with a proof sheet as a one-off job from £495 (an untested proposal). It is accepted by ten hand-calculated test briefs, a scan for unfilled fields and non-list prices, template layout checks and a total reconciliation. Payment follows your sign-off. You keep the template and workbook.",
            "It does not set prices or discounts, decide how tax applies, advise whether a quotation is binding, send anything to customers or connect to other systems. The first enquiry needs your rules in words and the counts, never the price list or customer details."
          ],
          "items": []
        }
      ],
      "incoming": [
        "example-quote-line-rounding",
        "platform-microsoft-excel"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/guides/mailmerge-fields-and-number-formats/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/guides/mailmerge-fields-and-number-formats/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fmailmerge-fields-and-number-formats%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fguides%2Fmailmerge-fields-and-number-formats%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "guide-report-pack-repeatable-export",
      "type": "guide",
      "title": "Rebuilding the same report every week or month: how to make it repeatable and checkable",
      "description": "A recurring report drifts when it is rebuilt by hand. Fix the export contract, make refreshing change only the data, and add control totals so each period can be checked against its source.",
      "url": "/guides/report-pack-repeatable-export/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "platforms": [
        "microsoft-excel"
      ],
      "buyer_role": "Operations lead, office manager or finance administrator who builds the same report each period",
      "purchase_trigger": "The report takes hours each time and has gone out with a wrong total before",
      "problem": "The method lives in one person's habits, so each period differs slightly, and nothing shows whether this period's pack matches its data.",
      "related": [
        "platform-microsoft-excel",
        "report-pack-every-period",
        "buyer-report-operations-lead-weekly-pack",
        "guide-spreadsheet-import-readiness",
        "guide-excel-date-serials-and-regional-order"
      ],
      "provenance": [
        {
          "label": "Create a PivotTable to analyze worksheet data (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/office/create-a-pivottable-to-analyze-worksheet-data-a9a84538-bfe9-40a9-a8e9-f99134456576",
          "checked": "2026-10-11",
          "claims": [
            "An Excel table as the source includes added rows when the PivotTable is refreshed; a PivotTable works from a snapshot and needs refreshing when the source changes.",
            "Source data should be tabular with one header row, no merged cells, no blank rows or columns and one type of data per column."
          ]
        },
        {
          "label": "Combine files overview (Power Query, Microsoft Learn)",
          "url": "https://learn.microsoft.com/en-us/power-query/combine-files-overview",
          "checked": "2026-10-11",
          "claims": [
            "Files with the same schema can be combined into one table; they must have the same file type and structure, including the same columns.",
            "Power Query analyses an example file, by default the first in the list, and builds an example query and a function query that are applied to every file."
          ]
        },
        {
          "label": "Refresh an external data connection in Excel (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/excel/refresh-an-external-data-connection-in-excel",
          "checked": "2026-10-11",
          "claims": [
            "Connections can be refreshed manually or on open; Power Query keeps a local cache that is not refreshed automatically, and a yellow bar warns when a preview may be up to a number of days old.",
            "External data may be blocked until connections are enabled, and stored passwords are not encrypted and not recommended."
          ]
        },
        {
          "label": "Change formula recalculation, iteration, or precision in Excel (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/office/change-formula-recalculation-iteration-or-precision-in-excel-73fc7dac-91cf-4d36-86e8-67124f6bcce4",
          "checked": "2026-10-11",
          "claims": [
            "Automatic recalculation is the default; in Manual mode formulas update only when you recalculate."
          ]
        }
      ],
      "sections": [
        {
          "heading": "Why hand-built reports drift",
          "body": [
            "Each period someone opens the export, filters, copies, pastes and adjusts. A filter is missed, a range stops one row short, a date boundary moves a day or a pasted value replaces a formula. Only the finished pack is looked at, so the errors reach readers. When the one person who knows the steps is away, the report either stops or changes."
          ],
          "items": []
        },
        {
          "heading": "Write the export contract and the period rule",
          "body": [
            "A contract says what the export must look like every period: the column names and their order, the type of each column, the date format and how the period is defined. For example: all records dated from the first to the last day of the month, inclusive, by the order date. Add the first and last record dates and the row count you expect, so a short or duplicated export is noticed before it is used.",
            "Anything that is a business definition, such as what counts as a completed order, belongs in the contract and is changed only by the person who owns the definition."
          ],
          "items": [
            "Column names, order and types.",
            "Date format and period boundaries.",
            "Definitions of each reported figure.",
            "Expected row count and first and last record dates."
          ]
        },
        {
          "heading": "Build so that refreshing changes only the data",
          "body": [
            "Keep the data and the report on separate sheets. Microsoft says an Excel table as a PivotTable source includes rows added later when the PivotTable is refreshed, that a PivotTable works from a snapshot and that it must be refreshed when the source changes. Without a table, you must change the source range yourself, which is exactly the step people forget.",
            "If each period arrives as a separate file in a folder, Power Query can combine files that have the same file type and structure, including the same columns. It analyses an example file and applies the same steps to every file. That is the reason the export contract matters: the combination assumes every file has the same columns, so a changed column should be caught by a check and not absorbed into the report.",
            "Refreshing has its own cautions. Microsoft notes that Power Query keeps a local cache which is not refreshed automatically, and a yellow bar can warn that a preview may be days old. Check that the report really used this period's data."
          ],
          "items": []
        },
        {
          "heading": "Control totals and a note for every pack",
          "body": [
            "For each period, compute a few totals directly from the export, not from the report, and compare them with the same totals in the pack: row count, sum of the main amount, count of distinct categories and the first and last record dates. Record the result in a short note, together with anything unusual, such as a new category or a missing day. The note is what lets a reader trust the pack without redoing it."
          ],
          "items": []
        },
        {
          "heading": "What to do when the export changes, and where the paid job fits",
          "body": [
            "When columns are renamed, a new category appears or the date format changes, stop. Report what changed and decide the rule; do not let the report absorb it. The rules and the rule version used should be on the note.",
            "The standing service builds the pack from your export each period by your written rules and checks it with control totals, from £295 a month for one monthly pack from one export (an untested proposal, quoted by proposal), with the first month used to set up the layout and rules. Weekly packs are quoted separately, and the service starts only after a secure way to send each period's export has been agreed in writing; no upload portal exists yet. It does not connect to live systems, send the pack, change your definitions or give financial advice, and it is not a guarantee of delivery time. The first enquiry needs a description of the report and the export's column headings, never the data."
          ],
          "items": []
        }
      ],
      "incoming": [
        "platform-microsoft-excel",
        "buyer-report-operations-lead-weekly-pack"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/guides/report-pack-repeatable-export/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/guides/report-pack-repeatable-export/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Freport-pack-repeatable-export%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fguides%2Freport-pack-repeatable-export%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "guide-spreadsheet-import-readiness",
      "type": "guide",
      "title": "Before you import a spreadsheet into another system: the checks that stop a failed load",
      "description": "Loads fail on blanks, types, dates, codes and keys. A column-by-column readiness sheet, the right CSV handling and a test on a copy catch most problems before they reach a live system.",
      "url": "/guides/spreadsheet-import-readiness/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "platforms": [
        "microsoft-excel",
        "csv"
      ],
      "buyer_role": "Administrator or owner preparing spreadsheet data for new software or a database",
      "purchase_trigger": "An earlier import failed on its first bad row, or a migration is waiting on messy spreadsheets",
      "problem": "Import tools are strict about layout, types, blanks and keys, and a spreadsheet that looks fine to a person can break them.",
      "related": [
        "platform-microsoft-excel",
        "spreadsheet-make-workbook-set-import-ready",
        "guide-excel-merged-cells-and-tidy-tables",
        "guide-excel-date-serials-and-regional-order",
        "guide-spreadsheet-contact-duplicate-match-rules",
        "collection-spreadsheet-messy-workbook-diagnosis-order"
      ],
      "provenance": [
        {
          "label": "Create a PivotTable to analyze worksheet data (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/office/create-a-pivottable-to-analyze-worksheet-data-a9a84538-bfe9-40a9-a8e9-f99134456576",
          "checked": "2026-10-11",
          "claims": [
            "An Excel table as the source includes added rows when the PivotTable is refreshed; a PivotTable works from a snapshot and needs refreshing when the source changes.",
            "Source data should be tabular with one header row, no merged cells, no blank rows or columns and one type of data per column."
          ]
        },
        {
          "label": "PostgreSQL 18 documentation: COPY",
          "url": "https://www.postgresql.org/docs/current/sql-copy.html",
          "checked": "2026-10-11",
          "claims": [
            "In CSV format the default null string is an unquoted empty string, while an empty string value is written and read with double quotes; FORCE_NOT_NULL makes empty values read as zero-length strings.",
            "The default delimiter is a comma in CSV format and must be a single one-byte character, and COPY fails by default on an error such as a value that cannot be converted to its column type."
          ]
        },
        {
          "label": "PostgreSQL 17 release notes",
          "url": "https://www.postgresql.org/docs/17/release-17.html",
          "checked": "2026-10-11",
          "claims": [
            "PostgreSQL 17 added the COPY option ON_ERROR ignore, which discards rows that cannot be converted and lets the copy continue; the default behaviour is ON_ERROR stop."
          ]
        },
        {
          "label": "PostgreSQL 16 documentation: COPY",
          "url": "https://www.postgresql.org/docs/16/sql-copy.html",
          "checked": "2026-10-11",
          "claims": [
            "The PostgreSQL 16 COPY page lists no ON_ERROR option, and says COPY stops operation at the first error."
          ]
        },
        {
          "label": "RFC 4180: Common Format and MIME Type for CSV Files",
          "url": "https://www.rfc-editor.org/rfc/rfc4180",
          "checked": "2026-10-11",
          "claims": [
            "Fields containing line breaks, double quotes or commas should be enclosed in double quotes, a double quote inside a field is written as two, and each line should contain the same number of fields.",
            "The memo does not specify an Internet standard and notes that implementations differ considerably."
          ]
        },
        {
          "label": "Import or export text (.txt or .csv) files (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/excel/get-started/import-or-export-text-txt-or-csv-files",
          "checked": "2026-10-11",
          "claims": [
            "Opening a .csv directly makes Excel apply its default data format settings to each column, while the import wizard gives more control, for example to keep leading zeros.",
            "The list separator is a Windows setting and changing it affects the whole computer; a limit of 1,048,576 rows and 16,384 columns applies to import and export."
          ]
        },
        {
          "label": "Excel formatting and features that are not transferred to other file formats (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/office/excel-formatting-and-features-that-are-not-transferred-to-other-file-formats-8fdd91a3-792e-4aef-a5bb-46f603d0e585",
          "checked": "2026-10-11",
          "claims": [
            "Saving as CSV or tab-delimited text keeps only the text and values as displayed in the active sheet; formatting, graphics, objects and other worksheet content are lost."
          ]
        },
        {
          "label": "Keeping leading zeros and large numbers (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/office/keeping-leading-zeros-and-large-numbers-1bf7b935-36e1-4985-842f-5dfa51f85fe7",
          "checked": "2026-10-11",
          "claims": [
            "Excel automatically removes leading zeros and has a maximum precision of 15 significant digits; the Text data type in Power Query keeps leading zeros."
          ]
        },
        {
          "label": "W3C Note: Date and Time Formats",
          "url": "https://www.w3.org/TR/NOTE-datetime",
          "checked": "2026-10-11",
          "claims": [
            "YYYY-MM-DD is the profile's complete date format, meant for an unambiguous representation of dates."
          ]
        }
      ],
      "sections": [
        {
          "heading": "Why imports fail on row 4,000",
          "body": [
            "A person reads a spreadsheet by eye and forgives a lot. A loader does not. It expects every column to hold one kind of value, every row to have the same number of fields and every key to be unique. The first row that breaks any rule stops the load or, worse, loads wrongly. Fixing the data in the order of the load's rules is faster than fixing errors one at a time as they appear."
          ],
          "items": []
        },
        {
          "heading": "Build a readiness sheet, one line per column",
          "body": [
            "For every column, record the type it should hold, the number of blank values, the number of distinct values and, for numbers and dates, the smallest and largest. For the column that identifies a record, record whether every value is unique. Microsoft's guidance on PivotTable source data gives the shape a clean table has: one header row of distinct labels, no merged cells, no blank rows or columns and one kind of data in each column. A readiness sheet shows where a table departs from that.",
            "Mixed types in one column are the most common finding: numbers and text together, or dates and text. Resolve those before anything else."
          ],
          "items": [
            "Type, blank count, distinct count, smallest and largest.",
            "Is the key column unique?",
            "Do the header names match the target's column list?"
          ]
        },
        {
          "heading": "Blanks are not all the same",
          "body": [
            "An empty cell can mean not applicable, not known or zero. The target system may treat them differently. PostgreSQL's COPY documentation shows one example: in CSV format the default null string is an unquoted empty string, while an empty string value must be quoted, and an option exists to read empty values as zero-length strings instead. Whatever system you use, decide what each blank means and make it explicit before loading."
          ],
          "items": []
        },
        {
          "heading": "Dates, codes and the CSV file itself",
          "body": [
            "Hold dates in the year-month-day form, which the W3C date note describes as unambiguous. Keep identifiers that look like numbers as text: Excel removes leading zeros and keeps only 15 significant digits. Microsoft says that opening a .csv directly applies Excel's default format to each column, while its import route allows more control, such as keeping leading zeros.",
            "Microsoft says saving as CSV keeps only the text and values as they are displayed, and that formatting, graphics and other content are lost, so the file carries what a cell shows, which is not always the stored value. The CSV format itself is looser than it looks. RFC 4180 says fields containing commas, double quotes or line breaks should be enclosed in double quotes, that each line should have the same number of fields, and that implementations differ considerably. Check the target's own rules for delimiter and quoting."
          ],
          "items": []
        },
        {
          "heading": "Test on a copy, load under your own checks, and where the paid job fits",
          "body": [
            "PostgreSQL's documentation says COPY fails by default if it meets an error such as a value that cannot be converted to its column type. From PostgreSQL 17 an option, ON_ERROR ignore, skips such rows; earlier versions, such as 16, have no such option and stop at the first error. Neither behaviour is a plan. Load a copy into a test system first, count rows loaded against rows sent and keep the rejected rows.",
            "A defined set of up to eight workbooks can be repaired, flattened, date-fixed and, for product, parts, asset or company lists with no personal data, de-duplicated into consistent tables, each with a readiness sheet, as a project from £1,500 (an untested proposal, quoted after we read the list). The steps run in one fixed order: formulas, then layout, then dates and numbers, then duplicates. The project is accepted by per-step reconciliations, the readiness sheets and your written acceptance of each table. It does not load data into any live system, decide what the data means or give accounting advice, and a passing readiness sheet does not prove a target will accept the data. Workbooks of people's details are not covered, and work starts only after a secure way to hand the files over has been agreed in writing; no upload portal exists yet. The first enquiry needs a list of the workbooks and what they must feed, never the data."
          ],
          "items": []
        }
      ],
      "incoming": [
        "example-merged-report-flattened",
        "example-date-ambiguity-matrix",
        "platform-microsoft-excel",
        "collection-spreadsheet-messy-workbook-diagnosis-order",
        "guide-excel-date-serials-and-regional-order",
        "guide-spreadsheet-contact-duplicate-match-rules",
        "guide-report-pack-repeatable-export"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/guides/spreadsheet-import-readiness/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/guides/spreadsheet-import-readiness/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fspreadsheet-import-readiness%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fguides%2Fspreadsheet-import-readiness%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "guide-pdf-text-layer-or-scan-check",
      "type": "guide",
      "title": "Can this PDF be read as data? Check for a text layer before you plan an extraction",
      "description": "A PDF can hold selectable text or only a picture of each page. A two-minute test tells you which, and that decides the method, the checks and what anyone can honestly promise.",
      "url": "/guides/pdf-text-layer-or-scan-check/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "platforms": [
        "pdf-documents"
      ],
      "buyer_role": "Office manager or administrator who has to get data out of a PDF",
      "purchase_trigger": "Someone says the PDF can be converted to a spreadsheet and you do not know whether that is true for your file",
      "problem": "Two PDFs that look identical on screen can need completely different work, and the difference is only visible with a quick test.",
      "related": [
        "platform-pdf-documents",
        "extract-pdf-price-lists-to-spreadsheet",
        "pdf-scanned-batch-to-searchable-text",
        "guide-extract-reconciliation-method",
        "guide-pdf-scan-ocr-search-check"
      ],
      "provenance": [
        {
          "label": "pdfplumber README: table extraction and its limits",
          "url": "https://github.com/jsvine/pdfplumber",
          "checked": "2026-10-11",
          "claims": [
            "The project says it works best on machine-generated rather than scanned PDFs.",
            "Its table finder looks for explicit or implied lines, finds their intersections and builds cells from them; line detection can use lines, text or explicit strategies.",
            "It offers no text recognition and lists weak support for tables from OCR'd documents as a missing feature."
          ]
        },
        {
          "label": "Power Query PDF connector (Microsoft Learn)",
          "url": "https://learn.microsoft.com/en-us/power-query/connectors/pdf",
          "checked": "2026-10-11",
          "claims": [
            "Pdf.Tables returns any tables found in a PDF; options include a start and end page, combining similar tables on consecutive pages and enforcing border lines as cell boundaries.",
            "Where multi-line rows are not identified properly, the page says the data may need cleaning with further steps in Power Query.",
            "To import several PDF files at once, it points to a multi-file connector such as the Folder connector."
          ]
        },
        {
          "label": "pdftotext manual page (Poppler utilities)",
          "url": "https://manpages.debian.org/bookworm/poppler-utils/pdftotext.1.en.html",
          "checked": "2026-10-11",
          "claims": [
            "The -layout option tries to maintain the original physical layout of the text; -f and -l set the first and last page.",
            "Its bugs section says text in PDFs with badly corrupted font encodings cannot be extracted short of text recognition."
          ]
        },
        {
          "label": "Tesseract documentation: improving the quality of the output",
          "url": "https://tesseract-ocr.github.io/tessdoc/ImproveQuality.html",
          "checked": "2026-10-11",
          "claims": [
            "Tesseract works best on images with a resolution of at least 300 dpi.",
            "Line segmentation quality falls significantly when a page is too skewed; noise and dark scanner borders can also reduce accuracy."
          ]
        }
      ],
      "sections": [
        {
          "heading": "Two kinds of PDF that look the same",
          "body": [
            "A PDF exported from a word processor, accounting package or spreadsheet usually stores each character as text placed at a position on the page. A PDF made by scanning paper or photographing it usually stores one picture per page. Both look the same when you open them. Only the first can be searched, selected and read by a program as text. Some files mix the two, such as a digital cover page followed by scanned appendices.",
            "A PDF does not store a table as a table. It stores pieces of text at positions, sometimes with ruled lines drawn around them. Tools that extract tables have to infer rows and columns from those positions or lines. The pdfplumber project describes exactly this: it looks for explicit or implied lines, finds where they cross, and builds cells from the intersections."
          ],
          "items": [
            "Text-based PDF: you can select a line, search for a word, and paste readable text elsewhere.",
            "Scanned PDF: selecting drags a box around the whole page, and searching finds nothing.",
            "Mixed PDF: test the first, middle and last pages separately and write down which page numbers are images."
          ]
        },
        {
          "heading": "A two-minute test that sends nothing anywhere",
          "body": [
            "Open the file in your usual PDF reader. Search for a word you can plainly see on the page. Then drag across a line of text, copy it and paste it into a plain text editor. Try this on at least three pages, including the last one.",
            "Do this locally. Free online converters ask you to upload the file, which means sharing the document with a third party. If the document is not yours to share, that is a problem before any extraction has started."
          ],
          "items": [
            "Readable pasted text with numbers as digits means a text layer exists.",
            "A blank paste, or characters that are nonsense, means there is no usable text layer on that page.",
            "Note the page numbers that fail. A mixed file needs two methods, and the failed pages are a separate job."
          ]
        },
        {
          "heading": "What each result means for the method",
          "body": [
            "With a text layer, a table can usually be read from the positions of its text. Microsoft documents a PDF connector for Excel that returns the tables it finds, with options for page ranges and for whether similar tables on consecutive pages are combined. The same page says rows that spread over several lines may not be identified properly and may need cleaning afterwards. The pdftotext manual page describes a layout option that tries to keep the original physical arrangement of text.",
            "Without a text layer there is nothing to extract yet. A text-recognition step must first create text from the page images, and its quality depends on the scan. Tesseract's documentation says it works best on images of at least 300 dpi and that heavy skew, noise and dark scanner borders reduce quality. That is why a scanned document cannot honestly be given a promised accuracy before anyone has tried it.",
            "These tools are named only because their documentation explains how PDFs behave. What a buyer receives is a checked spreadsheet, not a tool."
          ],
          "items": []
        },
        {
          "heading": "Look-alike problems that are not a missing text layer",
          "body": [
            "Sometimes text can be selected but pastes as nonsense. The pdftotext manual page says text in PDFs with badly corrupted font encodings cannot be extracted short of text recognition. Sometimes the text is real but pastes in a scrambled order, because reading order differs from the visual layout. And sometimes a digital PDF contains a table that was inserted as a picture, so the page has text but the table does not.",
            "Password protection and restricted copying are separate problems. If a file refuses to open or copy, ask the person who issued it before trying to get around it."
          ],
          "items": [
            "Nonsense characters: the font encoding is the problem; treat the page like a scan.",
            "Scrambled order: the text exists but the layout needs rules; extraction can still work.",
            "A table pasted as a picture: no table text exists for that table, even though the page has other text."
          ]
        },
        {
          "heading": "Where the paid jobs fit, and what to send first",
          "body": [
            "One text-based price list or table of up to 60 pages in a single layout can be turned into a spreadsheet by the one-off extraction job, from £295 after we have seen a redacted sample page and agreed the columns. It is accepted by page-by-page row counts, a sample compared field by field and an exceptions list, not by a promised accuracy. A scanned batch of up to 500 pages can be made searchable by a separate job from £195, accepted by a search test of terms you choose. Both prices are untested proposals, and payment follows the agreed checks and your sign-off.",
            "For a first enquiry, send the page count, whether the text could be selected, how many different layouts the document has and your wanted column headings. Do not send the document, and never one with personal or confidential data. Secure handling is agreed after scoping."
          ],
          "items": [
            "This guide does not establish that anyone has requested or paid for these jobs; they are new offers.",
            "Neither job is legal, financial or tax advice, and neither promises that every row or word is read correctly."
          ]
        }
      ],
      "incoming": [
        "example-pdf-price-list-reconciliation",
        "platform-pdf-documents",
        "buyer-doc-office-manager-paper-and-pdf-backlog",
        "collection-pdf-to-spreadsheet-diagnosis-order",
        "guide-extract-reconciliation-method",
        "guide-pdf-form-field-data-export",
        "guide-pdf-scan-ocr-search-check"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/guides/pdf-text-layer-or-scan-check/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/guides/pdf-text-layer-or-scan-check/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fpdf-text-layer-or-scan-check%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fguides%2Fpdf-text-layer-or-scan-check%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "guide-extract-reconciliation-method",
      "type": "guide",
      "title": "How to check a PDF extraction is right: count, compare, and list what could not be read",
      "description": "Extraction mistakes are silent. Counting rows page by page, comparing a pre-chosen sample and keeping an exceptions list shows where a spreadsheet differs from its document.",
      "url": "/guides/extract-reconciliation-method/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "platforms": [
        "pdf-documents",
        "microsoft-excel"
      ],
      "buyer_role": "Office or operations manager who has to rely on data taken from PDFs",
      "purchase_trigger": "A spreadsheet built from a document looks right but nobody can show that it is complete",
      "problem": "Data copied or extracted from a document goes wrong quietly, and a total that matches can hide two mistakes that cancel each other out.",
      "related": [
        "platform-pdf-documents",
        "extract-pdf-price-lists-to-spreadsheet",
        "extract-pdf-form-fields-to-spreadsheet",
        "extract-pdf-batches-every-month",
        "example-pdf-price-list-reconciliation",
        "guide-pdf-text-layer-or-scan-check"
      ],
      "provenance": [
        {
          "label": "Power Query PDF connector (Microsoft Learn)",
          "url": "https://learn.microsoft.com/en-us/power-query/connectors/pdf",
          "checked": "2026-10-11",
          "claims": [
            "Pdf.Tables returns any tables found in a PDF; options include a start and end page, combining similar tables on consecutive pages and enforcing border lines as cell boundaries.",
            "Where multi-line rows are not identified properly, the page says the data may need cleaning with further steps in Power Query.",
            "To import several PDF files at once, it points to a multi-file connector such as the Folder connector."
          ]
        },
        {
          "label": "pdfplumber README: table extraction and its limits",
          "url": "https://github.com/jsvine/pdfplumber",
          "checked": "2026-10-11",
          "claims": [
            "The project says it works best on machine-generated rather than scanned PDFs.",
            "Its table finder looks for explicit or implied lines, finds their intersections and builds cells from them; line detection can use lines, text or explicit strategies.",
            "It offers no text recognition and lists weak support for tables from OCR'd documents as a missing feature."
          ]
        },
        {
          "label": "Keeping leading zeros and large numbers (Microsoft Support)",
          "url": "https://support.microsoft.com/en-us/office/keeping-leading-zeros-and-large-numbers-1bf7b935-36e1-4985-842f-5dfa51f85fe7",
          "checked": "2026-10-11",
          "claims": [
            "Excel automatically removes leading zeros and converts large numbers to scientific notation, and has a maximum precision of 15 significant digits.",
            "Setting the column to Text format, or setting its data type to Text when importing with Power Query, keeps leading zeros."
          ]
        }
      ],
      "sections": [
        {
          "heading": "Why \"it looks right\" is not a check",
          "body": [
            "A PDF stores text at positions, so any extraction rebuilds rows from layout. Rebuilding goes wrong in ordinary ways. A description that wraps onto a second line becomes an extra row with an empty code. Two tight rows are joined into one. A heading repeated at the top of each page is read as data. Columns shift when one cell is empty. The result still looks like a clean table, so a quick scroll finds nothing.",
            "Microsoft's documentation for Excel's PDF connector says rows that spread over several lines may not be identified properly and may need cleaning, and its options combine similar tables on consecutive pages by default. Both facts are reminders that the tool's guess about table structure is something to check, not something to trust."
          ],
          "items": []
        },
        {
          "heading": "Check one: count the rows on every page",
          "body": [
            "Count the data rows on each source page, by eye or from item numbers, and write the number down before looking at the extraction. Then count the extracted rows that came from each page. A difference on a page points straight to where to look.",
            "Count per page, not only in total. One missing row on page 2 and one extra row on page 9 give a correct total and two errors. The accompanying worked example shows exactly this case with invented data."
          ],
          "items": [
            "Keep the source page number on every extracted row so counts can be done by filter.",
            "Do not count header lines repeated at the top of each page as records.",
            "A page with no difference has passed this check only; it has not been shown correct."
          ]
        },
        {
          "heading": "Check two: compare a sample you chose first",
          "body": [
            "Decide the sample before looking at the results: its size, how rows are picked and which rows must be included, such as the first and last row of each page and rows with long or unusual descriptions. Then compare every field of every sampled row with the document, not just the one that looks risky.",
            "Report the result as counts: for example, rows compared, fields compared, mismatches found and how each was corrected. Do not turn that into a percentage accuracy for the whole file. A sample shows the method works on those rows; it does not certify the rows nobody compared."
          ],
          "items": [
            "Write the sample size and selection method into the agreement before extraction starts.",
            "Have the comparison done by someone who did not run the extraction.",
            "If the sample finds a pattern, such as every wrapped description is wrong, fix the pattern and sample again."
          ]
        },
        {
          "heading": "Check three: use any totals the document carries, and test the types",
          "body": [
            "If the document itself has item counts, page totals or a grand total, compare them with the spreadsheet. Check that numeric columns really are numbers, that units and currency symbols stayed in their own columns and that codes with leading zeros kept them. Excel removes leading zeros from numbers it reads as numeric, so a code column should be handled as text from the start.",
            "A column that mixes numbers and text usually means a row was misread. Filter the column for the entries that fail and look at them against the page."
          ],
          "items": []
        },
        {
          "heading": "Keep an exceptions list instead of guessing",
          "body": [
            "When a row cannot be read with confidence, do not put a best guess in the data. Move it to a separate exceptions sheet with its page, its position and the raw text, and say why. The person who owns the document then decides each one. Agree beforehand how many exceptions would make the whole job worth stopping and re-scoping.",
            "The one-off extraction jobs for price lists and filled forms use these checks as their acceptance tests, from £295 and £245 respectively, and the monthly service repeats them for each batch. Those prices are untested proposals, payment follows your sign-off, and no job promises accuracy beyond the counts reported. The first enquiry needs only the page count and column headings, never the document."
          ],
          "items": [
            "The checks cannot tell you whether the source document itself is correct.",
            "They are not a substitute for your own review of the exceptions."
          ]
        }
      ],
      "incoming": [
        "example-pdf-price-list-reconciliation",
        "platform-pdf-documents",
        "collection-pdf-to-spreadsheet-diagnosis-order",
        "guide-pdf-text-layer-or-scan-check",
        "guide-pdf-form-field-data-export"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/guides/extract-reconciliation-method/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/guides/extract-reconciliation-method/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fextract-reconciliation-method%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fguides%2Fextract-reconciliation-method%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "guide-pdf-form-field-data-export",
      "type": "guide",
      "title": "Filled-in PDF forms: where the answers live and when they are really gone",
      "description": "Answers typed into a fillable PDF are stored as named fields inside each file. Learn how to tell whether a returned form still has them, and how to decide what checkboxes and blanks become in a spreadsheet.",
      "url": "/guides/pdf-form-field-data-export/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "platforms": [
        "pdf-documents"
      ],
      "buyer_role": "Office or site manager who collects the same PDF form from many people",
      "purchase_trigger": "A batch of returned forms is waiting to be copied into a spreadsheet by hand",
      "problem": "Some returned forms still contain their answers as readable data and some contain only a picture of them, and the two are easily confused.",
      "related": [
        "platform-pdf-documents",
        "extract-pdf-form-fields-to-spreadsheet",
        "extract-pdf-batches-every-month",
        "guide-extract-reconciliation-method",
        "guide-pdf-text-layer-or-scan-check"
      ],
      "provenance": [
        {
          "label": "pypdf documentation: interactions with PDF forms",
          "url": "https://pypdf.readthedocs.io/en/stable/user/forms.html",
          "checked": "2026-10-11",
          "claims": [
            "Form field values can be read by name with get_fields or get_form_text_fields; the field type property is Button, Text, Choice or Signature and the value is held in /V, whose format depends on the field type.",
            "Radio buttons: get_fields returns the parent group while page annotations return the individual child buttons.",
            "Flattening turns field contents into regular page content and the leftover widgets can then be removed.",
            "A form may carry an XFA entry, and the page says the XFA form overrides the page content."
          ]
        }
      ],
      "sections": [
        {
          "heading": "Where a form's answers are stored",
          "body": [
            "A fillable PDF form holds its questions as named fields. When someone types an answer, the value is stored with the field inside the file. The pypdf documentation describes reading these values by field name, and lists the field types as button, text, choice and signature, with the value held in a property whose format depends on the field type. Fields can be nested, so a field may have a full name made of parts, and a radio button group is stored as a parent with child buttons.",
            "This is why a form can be read directly from its stored field values, without any text recognition: the answer is data, not a picture. What is stored and what a reader displays can still differ, as the XFA note below explains. It also means a form is only as readable as its fields. If the field structure is missing, the answers may be on the page and nowhere else."
          ],
          "items": []
        },
        {
          "heading": "Three ways a returned form stops holding data",
          "body": [
            "First, the form may have been printed and scanned, or photographed. The file then holds page images only. Second, it may have been flattened, for example by printing to a new PDF or by a program that merges the answers into the page. The pypdf documentation describes flattening as turning field contents into regular page content, after which the leftover form widgets can be removed. Third, some forms use a different dynamic form format called XFA; the same documentation notes that an XFA entry can override the page content, so what you see and what the standard fields hold may differ."
          ],
          "items": [
            "Printed and rescanned: no fields at all; text recognition would be needed, with no promised accuracy.",
            "Flattened: the answers look present, but no field holds them.",
            "Dynamic-form variant: test a sample before promising anything about the batch."
          ]
        },
        {
          "heading": "Decide what a checkbox or a blank becomes",
          "body": [
            "A spreadsheet needs one rule per field type, written down before anyone extracts. For a checkbox: what does ticked become, what does unticked become, and what does never touched become? For a choice list: do you want the stored value or the label people saw? For a text field: is an empty answer blank, or a \"no answer\" marker? For a radio group: one column with the chosen option, or one column per option?",
            "Test one form of each kind. A form where someone ticked one option, left one blank and typed a multi-line comment shows quickly whether the rules hold together."
          ],
          "items": [
            "Write the rules in a short table beside the blank form.",
            "Keep dates exactly as typed and clean them in a separate step if they are mixed formats.",
            "Keep the original file name on every row so any answer can be traced back."
          ]
        },
        {
          "heading": "A safe first check, and the count that proves completeness",
          "body": [
            "Open two returned files, one from a person using a desktop reader and one from a phone or a printer-to-PDF route, and click into an answer. If you can change it, the answer is a field. Keep the blank template so the field list can be compared with what comes back.",
            "The completeness check is a count. Files received must equal rows written plus files listed as exceptions, with every file name appearing once. A file that arrived but produced neither a row nor an exception is a bug in the process."
          ],
          "items": []
        },
        {
          "heading": "Where the paid job fits, and where it does not",
          "body": [
            "The one-off form extraction reads up to 200 returned files from one fillable template into one spreadsheet, from £245, and is accepted by the file-count reconciliation, a sample compared with what a PDF reader displays and a field list matching the blank template. The monthly version, from £395 a month, repeats it for each month's batch and is sold by proposal. Both prices are untested proposals. The one-off job is paid after your sign-off, and the monthly service is billed monthly under written terms you agree first. Neither starts until a secure way to hand over the files has been agreed in writing; no upload portal exists yet.",
            "It does not fit forms that ask about health, money, legal matters or other personal subjects. For those, do not send anything; whether and how they could be handled would need a separate conversation. It also does not fit scanned forms. The first enquiry needs the blank form or its field list and the number of returned files, never completed forms."
          ],
          "items": []
        }
      ],
      "incoming": [
        "platform-pdf-documents",
        "collection-pdf-to-spreadsheet-diagnosis-order"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/guides/pdf-form-field-data-export/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/guides/pdf-form-field-data-export/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fpdf-form-field-data-export%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fguides%2Fpdf-form-field-data-export%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "guide-pdf-scan-ocr-search-check",
      "type": "guide",
      "title": "A scanned PDF cannot be searched: what text recognition can fix and how to test it",
      "description": "Scanning produces pictures of pages. Text recognition can add a hidden text layer, but quality depends on the scan. Test it with words you know are on known pages rather than trusting a percentage.",
      "url": "/guides/pdf-scan-ocr-search-check/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "platforms": [
        "pdf-documents"
      ],
      "buyer_role": "Archive or records administrator with scanned documents that cannot be searched",
      "purchase_trigger": "Searching a folder of scans finds nothing, and people open files one at a time to look for a word",
      "problem": "A scanned PDF holds page images. Without a text layer nothing in it can be searched, and a text layer made by recognition can be incomplete without looking incomplete.",
      "related": [
        "platform-pdf-documents",
        "pdf-scanned-batch-to-searchable-text",
        "archive-digitise-and-normalise-one-archive",
        "guide-pdf-text-layer-or-scan-check",
        "collection-pdf-to-spreadsheet-diagnosis-order"
      ],
      "provenance": [
        {
          "label": "OCRmyPDF introduction",
          "url": "https://ocrmypdf.readthedocs.io/en/latest/introduction.html",
          "checked": "2026-10-11",
          "claims": [
            "It adds text layers to images in PDFs, making scanned image PDFs searchable, and can produce a minimally altered PDF.",
            "Its image-processing options, such as deskew, integrate the OCR layer into the processed image; it defaults to PDF/A-2b output; its limitations section says that when Ghostscript is used it may transcode grayscale and colour images, potentially lossily.",
            "It says its accuracy may not match commercial solutions, says output quality depends on input quality and says it cannot recognise handwriting."
          ]
        },
        {
          "label": "Tesseract documentation: improving the quality of the output",
          "url": "https://tesseract-ocr.github.io/tessdoc/ImproveQuality.html",
          "checked": "2026-10-11",
          "claims": [
            "Tesseract works best on images with a resolution of at least 300 dpi.",
            "Line segmentation quality falls significantly when a page is too skewed; noise and dark scanner borders can also reduce accuracy."
          ]
        },
        {
          "label": "Library of Congress: PDF/A, PDF for Long-term Preservation",
          "url": "https://www.loc.gov/preservation/digital/formats/fdd/fdd000318.shtml",
          "checked": "2026-10-11",
          "claims": [
            "PDF/A is intended for long-term preservation of page-oriented documents and preserves their static visual appearance.",
            "Level B files made from scanned page images do not necessarily support indexing of the document text."
          ]
        }
      ],
      "sections": [
        {
          "heading": "What scanning produced, and what recognition adds",
          "body": [
            "A scanner or a phone camera produces an image of each page. The PDF wraps the images, so it looks like the paper but holds no text. Text recognition reads the images and creates characters that are stored in an invisible layer behind the picture. The OCRmyPDF documentation describes this: it adds text layers to images in PDFs, making scanned image PDFs searchable, and can produce a minimally altered PDF.",
            "A minimally altered PDF is not the same as an untouched one. The same documentation says that its image-processing options, such as deskew, integrate the text layer into the processed image, that it generates PDF/A-2b output by default, and, in its limitations section, that when Ghostscript is used it may transcode some images, potentially lossily. So the aim is a hidden text layer behind the page pictures, but the pictures in the new file can differ from the originals. That is one reason the originals are kept untouched and the searchable files are separate copies."
          ],
          "items": []
        },
        {
          "heading": "What decides how good the text is",
          "body": [
            "Recognition quality depends on the input. The Tesseract documentation says it works best on images with a resolution of at least 300 dpi, that line segmentation falls significantly when a page is too skewed, and that noise and dark borders from the scanner can make it read extra characters. OCRmyPDF adds that its output quality depends on the quality of the input, that its accuracy may not match commercial solutions and that it cannot recognise handwriting.",
            "In practice a faint photocopy, a crooked page, a small font or a stained page will recognise worse than a clean, straight, high-resolution scan. If you can still rescan, the cheapest improvement is usually a better scan, not a smarter program."
          ],
          "items": [
            "Resolution: very low resolution scans lose small characters.",
            "Skew: a crooked page upsets the program's idea of where the lines are.",
            "Noise and borders: specks and scanner edges can turn into false characters.",
            "Handwriting: not recognised reliably, so a handwritten page is outside what this can honestly promise."
          ]
        },
        {
          "heading": "Test it with words you already know",
          "body": [
            "Do not ask for, or accept, a single accuracy percentage for a mixed folder. Instead pick 15 to 20 words or numbers that you know appear on particular pages: a surname, a reference code, a place name, a hyphenated word, a figure. Vary them on purpose: some in headings, some in small print, some on the worst scans. After processing, search for each one and record whether it was found on the page where you know it appears.",
            "Report the result as counts: found, not found. Also list pages where the recognised text is empty or very sparse. This tells you what a search can and cannot be trusted to find, which is the thing you actually need to know."
          ],
          "items": []
        },
        {
          "heading": "Archival format is not the same as searchable",
          "body": [
            "People often ask for PDF/A to make an archive searchable. PDF/A is a format for long-term preservation: the Library of Congress description says it aims to preserve a document's static visual appearance over time. It also says that level B files made from scanned page images do not necessarily support indexing of the document text. A PDF/A file of scans can therefore be a perfect archive of pictures and still be unsearchable.",
            "Ask for an archival format if your archive policy needs one, but still run the search test, whatever the format."
          ],
          "items": []
        },
        {
          "heading": "Where the paid job fits, and where it does not",
          "body": [
            "Making up to 500 already-scanned pages with no personal or confidential content searchable is a one-off job from £195 (an untested proposal). It is accepted by a count of every file with a searchable copy or a stated reason, a search test on your terms held to a pass floor agreed in writing before processing (every term on a page classed clean in advance must be found, and every miss is shown on the page image), a list of poor pages, matching page counts and originals that are unchanged by checksum. Payment follows your sign-off. No accuracy is promised for the batch as a whole.",
            "It does not scan paper, read handwriting, correct the recognised text or handle documents containing personal or confidential information. If the real goal is a spreadsheet of values from the scanned pages, that is a different job with different checks. The first enquiry needs a page count, the language and a few words you would search for, never the documents. Work starts only after a secure way to hand the files over has been agreed in writing; no upload portal exists yet."
          ],
          "items": []
        }
      ],
      "incoming": [
        "platform-pdf-documents",
        "collection-pdf-to-spreadsheet-diagnosis-order",
        "guide-pdf-text-layer-or-scan-check"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/guides/pdf-scan-ocr-search-check/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/guides/pdf-scan-ocr-search-check/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fpdf-scan-ocr-search-check%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fguides%2Fpdf-scan-ocr-search-check%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "platform-xero",
      "type": "platform",
      "title": "Xero integrations: identity, limits, accounts and currency decide whether a sync can be trusted",
      "description": "What Xero documents for integration builders (contacts, invoice numbers, idempotency, paging, limits, accounts, lock dates, demo company) and which failures map to which guide or outcome.",
      "url": "/platforms/xero/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "platforms": [
        "xero"
      ],
      "related": [
        "zapier-sheets-to-xero-missing-columns"
      ],
      "provenance": [
        {
          "label": "Xero Accounting API: contacts",
          "url": "https://developer.xero.com/documentation/api/accounting/contacts",
          "checked": "2026-10-11",
          "claims": [
            "ContactID is the identifier Xero recommends for referencing a contact, and Xero warns contact name may stop being unique in future.",
            "ContactNumber (up to 50 characters) can be set through the API and is shown in the Xero interface as Contact Code; AccountNumber is user-defined and is not stated to be unique.",
            "A PUT only creates and returns an error if an existing contact matches the name or contact number, while a POST can create or update.",
            "Archived contacts are left out of contact lists unless includeArchived is requested."
          ]
        },
        {
          "label": "Xero: limits FAQ",
          "url": "https://developer.xero.com/faq/limits",
          "checked": "2026-10-11",
          "claims": [
            "At the time checked the FAQ states per-connected-organisation limits of 60 calls per minute, 5 concurrent calls and a daily limit (5,000 per 24 hours), plus 10,000 calls per minute across all organisations for an app.",
            "Going over a limit returns HTTP 429 with a Retry-After header giving seconds to wait; responses carry headers showing the remaining daily, minute and app-minute allowance.",
            "Xero suggests combining creates or updates in one request (about 50 items is practical under the 3.5MB size cap), paging (100 records at a time) and the If-Modified-Since header."
          ]
        },
        {
          "label": "Xero: OAuth 2.0 FAQ",
          "url": "https://developer.xero.com/faq/oauth2",
          "checked": "2026-10-11",
          "claims": [
            "Access tokens last 30 minutes and unused refresh tokens expire after 60 days, after which the user must authorise the app again.",
            "Each successful refresh returns a new refresh token that must be stored in place of the old one.",
            "If a refresh request gets no response, the previous refresh token can be retried for 30 minutes before the user must re-authorise."
          ]
        },
        {
          "label": "Xero: idempotent requests",
          "url": "https://developer.xero.com/documentation/guides/idempotent-requests/idempotency/",
          "checked": "2026-10-11",
          "claims": [
            "Xero accepts an Idempotency-Key header on POST, PUT and PATCH requests and ignores it on other methods.",
            "A key is kept for six minutes from its first use, may be at most 128 characters, is checked per app, and re-using it with a different request returns a 400.",
            "An error cached against a key is returned again on re-run, and idempotency is checked after rate limits so repeated calls still count toward them.",
            "Xero advises checking with a GET whether a resource was already created before retrying with a new key."
          ]
        },
        {
          "label": "Xero: account and payment mapping",
          "url": "https://developer.xero.com/documentation/best-practices/categorising-transactions/account-mapping/",
          "checked": "2026-10-11",
          "claims": [
            "Integrations should let users choose accounts from a filtered list, exclude accounts with status ARCHIVED, and not hard-code an account such as the sales account.",
            "Users can change their chart of accounts after set-up, so Xero advises validating stored mappings, before each call for infrequent integrations, and sending the user back to fix a missing or archived account.",
            "Payment accounts are filtered by account type BANK or by EnablePaymentsToAccount."
          ]
        },
        {
          "label": "Xero: the demo company",
          "url": "https://central.xero.com/s/article/Use-the-demo-company",
          "checked": "2026-10-11",
          "claims": [
            "Data added to the demo company is deleted when it resets automatically after 28 days, and it can be reset manually.",
            "Invoices cannot be sent from the demo company, and only the person who adds data can see it."
          ]
        }
      ],
      "sections": [
        {
          "heading": "What Xero gives an integration builder",
          "body": [
            "Xero documents stable identifiers (a contact's ContactID and a ContactNumber you can set through the API), a unique invoice number for sales invoices, an Idempotency-Key header that is kept for six minutes, paging with a pagination object, an If-Modified-Since header for incremental reads, per-organisation limits with a Retry-After response, a chart of accounts with active and archived accounts, lock dates, and a demo company that resets itself after 28 days. A trustworthy sync uses these deliberately; most failures come from using text that changes or limits that nobody read."
          ],
          "items": [
            "Identity: store ContactID or your own number in ContactNumber; do not match on names alone.",
            "Limits: 60 calls a minute and 5 concurrent calls per organisation at the time checked, with a daily limit.",
            "Connection: refresh tokens lapse after 60 days of non-use."
          ]
        },
        {
          "heading": "Failure families and where to go next",
          "body": [
            "Customers split across contacts, orders missing after a busy run, lines posting to the wrong account, foreign invoices with the wrong rate, expense bills without receipts, duplicate invoices after a retry and a sync that has quietly stopped are different failures with different fixes. Each has a guide that explains the mechanism, a safe first investigation and the point at which a paid, bounded job fits."
          ],
          "items": [
            "Duplicate contacts: the contact identity guide and the contact job.",
            "Missing orders: the rate-limit guide and its pacing and checkpoint job.",
            "Wrong accounts: the mapping-table guide and its fixed-price job.",
            "Wrong currency or rate: the currency direction guide and job.",
            "Duplicate invoices: the request-key guide and the retry-safety job.",
            "A sync that stopped: the refresh-token guide and the standing health service."
          ]
        },
        {
          "heading": "A safe test looks like this",
          "body": [
            "Test against the Xero demo company, never live records. Use invented customers, orders and amounts; do not send invoices; expect the demo data to disappear when it resets. Keep counts and identifiers from each step so you can show what changed. Lock dates and bank-reconciled transactions are decisions for the organisation's administrator and accountant."
          ],
          "items": []
        },
        {
          "heading": "Choose the actual outcome",
          "body": [
            "Fixing one known failure is a bounded job. Several failures at once, in an order that matters, is a project. Watching a sync month after month is a standing service. None of them includes bookkeeping, tax or audit advice, changes to posted or locked records or live changes under our control; your authorised account holder applies changes. Prices on the linked pages are untested published prices, and nothing starts without a written agreement."
          ],
          "items": [
            "The first enquiry uses invented examples, not credentials, invoices or customer records.",
            "Real records are shared only after agreement, through a secure handoff."
          ]
        }
      ],
      "incoming": [],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/platforms/xero/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/platforms/xero/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fplatforms%2Fxero%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fplatforms%2Fxero%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "tool-invoice-rounding-bench",
      "type": "tool",
      "tool_kind": "invoice-rounding-bench",
      "title": "Invoice rounding bench: compare per-line and total rounding, half-up and half-even",
      "description": "Enter invoice lines and see net, tax and gross under four rounding rules side by side, in exact whole-number minor units, with the difference between summing lines and rounding the total. Not tax or accounting advice.",
      "slug": "invoice-rounding-bench",
      "url": "/tools/invoice-rounding-bench/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "platforms": [
        "accounting-sync",
        "google-sheets",
        "xero"
      ],
      "provenance": [
        {
          "label": "Rounding bench implementation",
          "url": "https://syntheticindustry.ai/tools/assets/invoice-rounding-bench.js",
          "checked": "2026-10-11",
          "claims": [
            "Quantity, unit price and tax rate are read as decimal text and scaled to whole-number integers; no floating-point value is used in any money calculation.",
            "Four rules are computed: round each line or round once on the total, each with half-up or half-even rounding of exact ties.",
            "Results are checked in the tool's test suite against an independent exact-fraction implementation over 400 seeded random invoices."
          ]
        },
        {
          "label": "Python decimal module: rounding modes",
          "url": "https://docs.python.org/3/library/decimal.html",
          "checked": "2026-10-11",
          "claims": [
            "ROUND_HALF_UP rounds to nearest with ties going away from zero.",
            "ROUND_HALF_EVEN rounds to nearest with ties going to the nearest even integer."
          ]
        }
      ],
      "related": [
        "zapier-sheets-to-xero-missing-columns",
        "guide-invoice-tax-amount-basis",
        "example-invoice-tax-rounding-reconciliation",
        "guide-sheets-invoice-value-rendering",
        "buyer-finance-manager-invoice-integration"
      ],
      "sections": [
        {
          "heading": "What it computes",
          "body": [
            "Enter one or more invoice lines (quantity, unit price and tax rate in percent), pick the number of minor-unit digits your currency has, and choose the rounding rule you want to compare against. The tool calculates net, tax and gross under four rules and shows them side by side, flags every figure that differs from your chosen rule, and reports 'line sum minus total': how far apart summing rounded lines and rounding once on the total are, in minor units (pence, cents). It also shows the exact, unrounded figures and which lines land on an exact half.",
            "Example values are loaded when the page opens so the difference is visible straight away. Replace them with your own. Nothing you enter is sent or stored."
          ],
          "items": [
            "Round each line: the line net (quantity times unit price) is rounded to a whole minor unit, tax is calculated on that rounded net and rounded again, and the invoice totals are the sums of the rounded lines.",
            "Round once on the total: exact line amounts are added up unrounded, then the invoice net and the invoice tax are each rounded once; gross is rounded net plus rounded tax.",
            "Half-up rounds an exact half away from zero (0.5 to 1, -0.5 to -1). Half-even rounds an exact half to the even neighbour (0.5 to 0, 1.5 to 2, 2.5 to 2); the two differ only on exact halves.",
            "Negative quantities or prices are treated as credit lines and round symmetrically."
          ]
        },
        {
          "heading": "A worked example you can check by hand",
          "body": [
            "Three invented lines, each quantity 1, unit price 0.03 and tax rate 20%, in a currency whose minor unit is 0.01. Each line's exact tax is 0.006, which is 0.6 of a minor unit. Rounding each line gives 1 minor unit of tax per line, so 3 in total. Adding the exact tax first gives 1.8 minor units, which rounds to 2. The two rules disagree by one minor unit of tax and so of gross. A second example: one line at 0.50 with 5% tax has exact tax of 2.5 minor units, an exact half, so half-up gives 3 and half-even gives 2.",
            "Both figures are arithmetic on invented numbers. They are not a recommendation to apply that rate or that rounding rule to any real supply."
          ],
          "items": [
            "With 500 identical copies of the first line, summing rounded lines gives 5.00 of tax and rounding the total once gives 3.00, a gap of 2.00: the difference grows with the number of lines.",
            "Which rule is right depends on your accounting system, your invoice format and the tax rules that apply to you; this tool does not decide that."
          ],
          "code": "Net  0.09 (3 x 0.03) at 20%: exact tax 0.018, exact gross 0.108\n\nRule                                Net    Tax    Gross\nRound each line, half-up            0.09   0.03   0.12\nRound each line, half-even          0.09   0.03   0.12\nRound once on the total, half-up    0.09   0.02   0.11\nRound once on the total, half-even  0.09   0.02   0.11\n\nLine sum minus total: tax +1 minor unit, gross +1 minor unit"
        },
        {
          "heading": "Assumptions and the arithmetic",
          "body": [
            "Every value is read as decimal text and scaled to a whole number: quantity, unit price and tax rate may each have up to four decimal places, up to fifteen digits before the decimal point, and the tool uses exact integer arithmetic throughout, so there is no floating-point drift. Sub-minor-unit prices such as 0.0125 are exact. Use a full stop as the decimal separator and no thousands separators: a comma is refused rather than guessed. Tax rates must be from 0 to 100 percent."
          ],
          "items": [
            "One tax rate per line; no discounts, shipping, tax-inclusive prices or currency conversion.",
            "Some systems round tax per rate group, per line on the gross amount, or only at the invoice level; check which one yours uses before relying on any column.",
            "Up to 500 lines can be calculated; the page offers 100."
          ]
        },
        {
          "heading": "What it cannot tell you",
          "body": [
            "It is not tax or accounting advice and does not know which jurisdiction, invoice type or accounting system you use. Accounting systems differ in where they round, and it cannot reproduce a specific product's behaviour. If your destination total differs from your source total, this tool can show whether a rounding rule alone could explain the gap, but a gap larger than the spread it shows has another cause, such as an amount entered as tax-inclusive that was treated as tax-exclusive. For that, see the invoice tax amount basis guide and the synthetic reconciliation example linked on this page.",
            "If an agreed column is missing from a Sheets-to-Xero mapping, the related outcome is to send every mapped Google Sheets invoice field to Xero using one disposable test row. That outcome does not include fixing tax configuration or historical invoices."
          ],
          "items": [
            "A one-unit tolerance can hide a real policy mismatch; agree the policy first.",
            "Nothing here is a quote or an offer to fix an invoice integration."
          ]
        }
      ],
      "incoming": [],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/tools/invoice-rounding-bench/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/tools/invoice-rounding-bench/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Ftools%2Finvoice-rounding-bench%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Ftools%2Finvoice-rounding-bench%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "example-invoice-tax-rounding-reconciliation",
      "type": "example",
      "title": "Synthetic invoice reconciliation: identical net lines, two different tax totals",
      "description": "Three invented small-value lines show how line-level and invoice-level tax rounding can disagree even when net values and line counts match.",
      "url": "/examples/invoice-tax-rounding-reconciliation/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "platforms": [
        "accounting-sync",
        "google-sheets",
        "xero"
      ],
      "buyer_role": "Finance owner approving source-to-destination invoice reconciliation",
      "purchase_trigger": "Every line arrives but the destination's tax and gross totals disagree with the source",
      "problem": "The integration compares grand totals without reconciling the two systems' declared tax rounding boundaries.",
      "related": [
        "guide-invoice-tax-amount-basis",
        "guide-sheets-xero-line-item-shape",
        "zapier-sheets-to-xero-missing-columns"
      ],
      "provenance": [
        {
          "label": "HMRC VAT Notice 700, invoice and retailer rounding distinctions",
          "url": "https://www.gov.uk/guidance/vat-guide-notice-700",
          "checked": "2026-10-11",
          "claims": [
            "Sections 17.5 and 17.6 distinguish invoice-trader and retailer treatments. Neither hypothetical policy below is declared applicable to the reader."
          ]
        },
        {
          "label": "Existing mapping scope excludes tax configuration",
          "url": "https://syntheticindustry.ai/services/zapier-sheets-to-xero-missing-columns/",
          "checked": "2026-10-11"
        }
      ],
      "sections": [
        {
          "heading": "Invented inputs, not an invoice or tax recommendation",
          "body": [
            "Use three distinct synthetic lines A, B and C, each quantity one and net amount 0.03 in an invented GBP calculation. Assume 20% solely for arithmetic and nonnegative half-up rounding to two decimals. Compare two hypothetical policies: round tax per line before summing, or sum unrounded tax and then round once. This is a worked specification, not a tested accounting connector, customer result or determination of lawful tax treatment."
          ],
          "items": [],
          "code": "line | net  | unrounded tax | half-up line tax\nA    | 0.03 | 0.006         | 0.01\nB    | 0.03 | 0.006         | 0.01\nC    | 0.03 | 0.006         | 0.01\n\nnet total                           = 0.09\npolicy L: sum rounded line tax       = 0.03; gross = 0.12\npolicy I: round total tax 0.018 once = 0.02; gross = 0.11\ndifference                          = 0.01"
        },
        {
          "heading": "Reconcile components before accepting the total",
          "body": [
            "Both hypothetical outputs retain three lines and 0.09 net. They disagree on tax and gross because their declared boundaries differ. Label each comparison with the policy, line identity and net/tax/gross components. A one-cent tolerance can hide a real policy mismatch; agreeing a tolerance does not choose the lawful policy or justify changing stored values."
          ],
          "items": [
            "The finance owner or adviser confirms the applicable policy and rates before implementation.",
            "A source formula and destination calculation must be compared under that same approved policy.",
            "Do not infer line tax from a rounded grand total or add a balancing line without agreement."
          ]
        },
        {
          "heading": "What was actually exercised",
          "body": [
            "The draft's mechanical evidence independently recomputes this arithmetic with integer rational values. That verifies the numbers only. No Sheet formula, tax engine, API, database, connector or posted invoice was exercised, and neither rounding policy is self-approved as accounting advice. HMRC guidance is UK-specific and distinguishes businesses and calculation methods; do not import this hypothetical half-up choice into a live setup."
          ],
          "items": [
            "Negative adjustments, discounts, mixed rates, exchange rates and legal invoice requirements are outside this example."
          ]
        },
        {
          "heading": "Use the existing offer only for its eligible mapping job",
          "body": [
            "If an approved net or tax field is simply missing, the existing £145 Sheets-to-Xero mapping service may fit its working trigger, five-field ceiling and authorised disposable draft. Resolving tax-policy disagreement, configuring tax, adding a calculation engine or correcting past invoices is not included. Free official guidance, your existing integrator and finance adviser are alternatives. Send invented component expectations and the missing field, never actual invoices, tax records or credentials. The price is untested; payment follows agreed checks and sign-off."
          ],
          "items": []
        }
      ],
      "incoming": [
        "tool-invoice-rounding-bench",
        "collection-finance-invoice-integrity-checks",
        "guide-invoice-tax-amount-basis"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/examples/invoice-tax-rounding-reconciliation/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/examples/invoice-tax-rounding-reconciliation/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fexamples%2Finvoice-tax-rounding-reconciliation%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fexamples%2Finvoice-tax-rounding-reconciliation%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "example-invoice-retry-identity-matrix",
      "type": "example",
      "title": "Synthetic invoice retry matrix: source operation, attempt and target draft are different IDs",
      "description": "Concrete made-up references specify when a retry retains one target draft and when changed contents, a second organisation or multiple matches need a separate decision.",
      "url": "/examples/invoice-retry-identity-matrix/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "platforms": [
        "accounting-sync",
        "zapier",
        "xero"
      ],
      "buyer_role": "Finance owner reviewing an integration's duplicate-prevention acceptance cases",
      "purchase_trigger": "Replaying one source row creates another unsent invoice or matches the wrong draft",
      "problem": "Transport-attempt identity is mistaken for immutable business-operation identity or the target lookup ignores organisation and content.",
      "related": [
        "guide-invoice-create-unknown-outcome",
        "buyer-finance-manager-invoice-integration",
        "zapier-sheets-to-xero-missing-columns"
      ],
      "provenance": [
        {
          "label": "IETF RFC 9110 section 9.2.2",
          "url": "https://www.rfc-editor.org/rfc/rfc9110.html",
          "checked": "2026-10-11",
          "claims": [
            "Safe automatic repetition requires known request semantics or evidence the original request was not applied; vendor-specific duplicate protection is not established."
          ]
        },
        {
          "label": "Existing mapping offer's disposable repeated-input check",
          "url": "https://syntheticindustry.ai/services/zapier-sheets-to-xero-missing-columns/",
          "checked": "2026-10-11"
        }
      ],
      "sections": [
        {
          "heading": "An authored identity policy",
          "body": [
            "All labels are invented. Organisation O-A and source operation S-17 identify one immutable intended invoice creation. Attempt A-1 times out after target draft D-81 may have been created. A-2 is another transport attempt, not another invoice. Content token P means equality of the agreed business fields, not an actual checksum or vendor idempotency key. The operator must separately verify supported vendor mechanisms and safe concurrency."
          ],
          "items": [],
          "code": "organisation / operation | observed target state      | expected authored disposition\nO-A / S-17, content P     | one D-81, content P        | retain D-81; no new create\nO-A / S-17, content P     | D-81 and D-82, both P      | hold duplicate; no deletion\nO-A / S-17, content Q     | one D-81, content P        | hold content conflict\nO-A / S-17, content P     | lookup unavailable         | hold unknown\nO-A / S-17, content P     | no visible match           | unresolved until retry safety established\nO-B / S-17, content P     | D-81 exists only in O-A     | never reuse O-A's draft"
        },
        {
          "heading": "A changed source is not silently a retry",
          "body": [
            "Under this example's immutable-operation rule, editing S-17 from P to Q needs a separately authorised correction decision; generating a fresh attempt ID must not bypass that rule. Two source operations with equal amounts are not necessarily duplicates. A row number that changes after sorting is not a proven stable operation identity. A real integration needs a durable documented identity contract, not these made-up strings alone."
          ],
          "items": [
            "Test changed contents and cross-organisation matching separately from repeating an identical input.",
            "No draft may be deleted, sent or posted merely to make the matrix pass."
          ]
        },
        {
          "heading": "Specification, not a tested connector",
          "body": [
            "The matrix is an authored acceptance specification. No provider lookup, idempotency key, concurrency mechanism or recovery process has been executed. The HTTP source supports the caution about repeating uncertain writes; it does not validate this policy or establish a particular vendor's response. A real test would retain target identities, counts and dispositions on an authorised isolated route."
          ],
          "items": [
            "An eventual zero-match lookup is not automatically authoritative evidence that no write occurred.",
            "No invented event here is a customer enquiry, invoice or payment."
          ]
        },
        {
          "heading": "A narrow contextual priced route",
          "body": [
            "Use this matrix to ask the existing operator how their duplicate rule works. The £145 Sheets-to-Xero offer is still a five-field repair with one disposable row and agreed repeated-input checks, not a reconciliation or idempotency subsystem. Request it only if that mapping scope fits; recovery, historical cleanup and new architecture require separate agreement. Send invented identities and expected dispositions, not customer references, invoices or keys. The price is untested and payment follows the agreed passing checks and sign-off."
          ],
          "items": []
        }
      ],
      "incoming": [
        "collection-finance-invoice-integrity-checks",
        "guide-invoice-create-unknown-outcome"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/examples/invoice-retry-identity-matrix/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/examples/invoice-retry-identity-matrix/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fexamples%2Finvoice-retry-identity-matrix%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fexamples%2Finvoice-retry-identity-matrix%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "collection-finance-invoice-integrity-checks",
      "type": "category",
      "title": "Invoice integration review: verify shape, representation, tax basis and repeat safety",
      "description": "An ordered review worksheet helps a finance owner stop at the first broken contract before requesting a bounded existing mapping repair.",
      "url": "/collections/finance-invoice-integrity-checks/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "platforms": [
        "accounting-sync",
        "google-sheets",
        "zapier",
        "xero"
      ],
      "buyer_role": "Finance owner preparing a low-trust source-to-draft acceptance request",
      "purchase_trigger": "An automation runs but its invoice cannot be accepted without manual reconstruction",
      "problem": "One successful workflow or matching grand total substitutes for separate checks of invoice identity, fields and side effects.",
      "related": [
        "guide-sheets-xero-line-item-shape",
        "guide-sheets-invoice-value-rendering",
        "guide-invoice-tax-amount-basis",
        "example-invoice-tax-rounding-reconciliation",
        "guide-invoice-create-unknown-outcome",
        "example-invoice-retry-identity-matrix",
        "buyer-finance-manager-invoice-integration",
        "zapier-sheets-to-xero-missing-columns"
      ],
      "provenance": [
        {
          "label": "Google Sheets value representations",
          "url": "https://developers.google.com/sheets/api/reference/rest/v4/ValueRenderOption",
          "checked": "2026-10-11",
          "claims": [
            "Formatted and unformatted outputs can represent the same cell differently."
          ]
        },
        {
          "label": "IETF RFC 9110 retry boundaries",
          "url": "https://www.rfc-editor.org/rfc/rfc9110.html",
          "checked": "2026-10-11",
          "claims": [
            "A lost response does not itself justify automatically repeating a non-idempotent request."
          ]
        },
        {
          "label": "Existing bounded mapping price and exclusions",
          "url": "https://syntheticindustry.ai/services/zapier-sheets-to-xero-missing-columns/",
          "checked": "2026-10-11"
        }
      ],
      "sections": [
        {
          "heading": "Use the worksheet with invented data",
          "body": [
            "This sequence is authored review advice, not a vendor integration recipe or evidence of demand. Name one intended organisation and unsent synthetic draft, with the expected invoice and line counts. Stop at the first disagreement; fixing a later total cannot correct a wrongly grouped or assigned invoice."
          ],
          "items": [
            "1. Shape: compare invoice count and each line's description, quantity and own amount; reuse the existing line-shape guide.",
            "2. Representation: compare the connector's captured date and amount types with destination requirements.",
            "3. Basis: finance approves currency, net/gross meaning and tax treatment before any mapping change.",
            "4. Components: reconcile net, tax and gross under one approved rounding policy.",
            "5. Identity: distinguish source operation, attempt and target draft; specify unknown and repeated-input outcomes."
          ]
        },
        {
          "heading": "Keep a result for each boundary",
          "body": [
            "For each worksheet row retain an invented input, expected result, observed result when actually tested, and the responsible approver. Until a test is executed, observed stays unverified. A missing mandatory field must produce the agreed exception; a timeout must not silently become another creation. The worked examples supply specifications, not passing integration evidence."
          ],
          "items": [
            "Do not require private invoices or customer data to prepare first-contact cases.",
            "Inspect an authorised disposable draft; a test button may write connected records.",
            "The organisation holder controls live posting and sending."
          ]
        },
        {
          "heading": "Choose a correction rather than a new accounting package",
          "body": [
            "If the issue is a stale mapping within an already-working five-field route, the existing £145 Sheets-to-Xero offer is relevant after fit confirmation. Variable grouping, a failed trigger, tax setup, historical corrections, new retry architecture and live sending are not included. Ask the existing maintainer or vendor support first when their documented configuration resolves the problem. Ask a qualified finance adviser for undecided tax policy."
          ],
          "items": [
            "This collection is not a new paid bundle and does not make the six linked checks six purchasable repairs.",
            "QuickBooks users may reuse the business questions, but the Xero offer does not become a QuickBooks package."
          ]
        },
        {
          "heading": "A scope-bearing enquiry",
          "body": [
            "Send invented headers and expected/actual results for the first failing boundary, confirm the working trigger and disposable test route, and identify the finance approver and budget holder. State your response to £145 only if that existing scope fits. No source code, financial exports, credentials or invitations initially. The price is an untested proposal; an enquiry creates no booking, account access or financial authority and payment follows agreed checks and sign-off."
          ],
          "items": []
        }
      ],
      "incoming": [],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/collections/finance-invoice-integrity-checks/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/collections/finance-invoice-integrity-checks/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fcollections%2Ffinance-invoice-integrity-checks%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fcollections%2Ffinance-invoice-integrity-checks%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "guide-sheets-invoice-value-rendering",
      "type": "guide",
      "title": "Invoice values look right in Sheets but arrive as currency text or a date number",
      "description": "Separate a spreadsheet's displayed currency and date from the values a connector reads, then agree the destination types before repairing a mapping.",
      "url": "/guides/sheets-invoice-value-rendering/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "platforms": [
        "google-sheets",
        "zapier",
        "xero"
      ],
      "buyer_role": "Finance owner approving the types of mapped invoice fields",
      "purchase_trigger": "A populated source cell reaches an invoice action in an unexpected numeric or textual representation",
      "problem": "Display formatting, formula text and evaluated values are mistaken for the same connector input.",
      "related": [
        "guide-zapier-field-mapping",
        "guide-sheets-xero-line-item-shape",
        "guide-invoice-tax-amount-basis",
        "zapier-sheets-to-xero-missing-columns"
      ],
      "provenance": [
        {
          "label": "Google Sheets API value render options",
          "url": "https://developers.google.com/sheets/api/reference/rest/v4/ValueRenderOption",
          "checked": "2026-10-11",
          "claims": [
            "Formatted values apply spreadsheet locale and cell formatting; unformatted values evaluate formulas without formatting; FORMULA returns formula text."
          ]
        },
        {
          "label": "Google Sheets values.get defaults",
          "url": "https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/get",
          "checked": "2026-10-11",
          "claims": [
            "valueRenderOption defaults to FORMATTED_VALUE; dateTimeRenderOption is ignored with FORMATTED_VALUE."
          ]
        },
        {
          "label": "Google Sheets number and date formats",
          "url": "https://developers.google.com/sheets/api/guides/formats",
          "checked": "2026-10-11",
          "claims": [
            "Dates and times have serial-number representations; locale influences rendering. A currency format is presentation, not currency conversion."
          ]
        },
        {
          "label": "Existing five-field Sheets-to-Xero mapping offer",
          "url": "https://syntheticindustry.ai/services/zapier-sheets-to-xero-missing-columns/",
          "checked": "2026-10-11"
        }
      ],
      "sections": [
        {
          "heading": "A visible cell is only one representation",
          "body": [
            "With invented data, a numeric 1234.50 may display with a currency symbol and grouping characters. A date can be displayed as calendar text while the underlying value is a serial number. Record the visible cell, the connector's captured value and type, and the action's required type separately. This is not the missing-header problem: the value exists but its representation may not fit the destination."
          ],
          "items": [
            "Record spreadsheet locale, cell format and the intended invoice currency separately.",
            "Distinguish a formula such as =A1 from its evaluated result.",
            "Do not parse an ambiguous date such as 03/04/2026 by guessing its locale."
          ]
        },
        {
          "heading": "The API explains the distinction, not your Zap's controls",
          "body": [
            "Google's API offers formatted, unformatted and formula representations. Its values.get method defaults to formatted output, and the date-time option has no effect in that mode. Sheets date serials count from December 30, 1899 and can contain a fractional day. These are documented API behaviours, not a claim that the current Zapier trigger exposes an option with the same name or uses a particular mode. Inspect the actual captured sample through the authorised operator; do not change a live connector based on an API recipe."
          ],
          "items": [
            "The connector version and selected action must be verified separately.",
            "A currency symbol does not establish the currency code or an exchange rate.",
            "If conversion is necessary, agree the exact date and monetary input contract first."
          ]
        },
        {
          "heading": "A useful acceptance case changes the display, not the business meaning",
          "body": [
            "Use invented amounts and an unambiguous invoice date on an authorised disposable route. Declare whether changing only cell presentation should leave the destination amount and date unchanged. Compare the mapped amount, date and currency after each agreed presentation variant. If a serial or formatted string is unsupported, require a visible exception rather than silent zero, today's date or a guessed conversion. These are proposed checks; no Sheet, connector or invoice was exercised for this draft."
          ],
          "items": [
            "Inspect destination types and values, not just a screenshot that looks similar.",
            "Keep a missing-value case distinct from a wrong-type case."
          ]
        },
        {
          "heading": "DIY first, and preserve the £145 boundary",
          "body": [
            "An authorised maintainer may resolve the issue by inspecting the trigger sample and correcting an existing mapping; Google documentation is free to read. The existing £145 Sheets-to-Xero offer concerns an already-working trigger, up to five named fields and one disposable draft. It is a contextual route, not a promise to build a new date parser, currency converter or variable line-item transformation at that price. Tax setup, historical corrections and sending invoices are excluded. Send invented cell values, displayed forms and expected destination types initially, not financial exports, code, credentials or invitations. The price is untested; work requires agreed scope and payment follows passing checks and sign-off."
          ],
          "items": []
        }
      ],
      "incoming": [
        "tool-invoice-rounding-bench",
        "collection-finance-invoice-integrity-checks",
        "guide-invoice-tax-amount-basis"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/guides/sheets-invoice-value-rendering/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/guides/sheets-invoice-value-rendering/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fsheets-invoice-value-rendering%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fguides%2Fsheets-invoice-value-rendering%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "guide-invoice-tax-amount-basis",
      "type": "guide",
      "title": "An invoice integration adds tax twice: agree whether each amount is net or gross",
      "description": "Name the tax basis of each mapped line and the approved tax treatment before mistaking a populated amount field for a correct invoice.",
      "url": "/guides/invoice-tax-amount-basis/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "platforms": [
        "google-sheets",
        "xero",
        "accounting-sync"
      ],
      "buyer_role": "Finance owner responsible for invoice amount and tax-policy sign-off",
      "purchase_trigger": "The destination total differs even though all source amounts were populated",
      "problem": "A tax-inclusive amount is treated as tax-exclusive, or tax calculation policy is silently changed at a mapping boundary.",
      "related": [
        "example-invoice-tax-rounding-reconciliation",
        "guide-sheets-invoice-value-rendering",
        "buyer-finance-manager-invoice-integration",
        "zapier-sheets-to-xero-missing-columns"
      ],
      "provenance": [
        {
          "label": "HMRC VAT Notice 700, sections 17.5 and 17.6",
          "url": "https://www.gov.uk/guidance/vat-guide-notice-700",
          "checked": "2026-10-11",
          "claims": [
            "Invoice-trader rounding concessions and retailer treatment differ; line-calculation methods require consistency. This is UK-specific guidance, not a universal rounding rule or a determination of a reader's tax treatment."
          ]
        },
        {
          "label": "Google Sheets formatting is presentation",
          "url": "https://developers.google.com/sheets/api/guides/formats",
          "checked": "2026-10-11",
          "claims": [
            "Number patterns and spreadsheet locale affect rendered values; they do not choose business tax policy."
          ]
        },
        {
          "label": "Existing mapping repair excludes Xero tax configuration",
          "url": "https://syntheticindustry.ai/services/zapier-sheets-to-xero-missing-columns/",
          "checked": "2026-10-11"
        }
      ],
      "sections": [
        {
          "heading": "Put a basis beside the amount",
          "body": [
            "For each invented line, name currency, quantity, unit amount, whether the unit amount includes tax, the approved tax treatment and any permitted discount. A field labelled amount is insufficient. Formatting it to two decimals does not tell the destination whether tax is included. The finance owner or their qualified adviser supplies the applicable treatment; this guide does not decide rates, exemptions or tax liability."
          ],
          "items": [
            "Separate monetary basis from which account or tax identifier is mapped.",
            "Do not assume a blank tax field means exempt or zero-rated.",
            "The actual connector's supported fields must be verified; no Xero or QuickBooks action configuration is prescribed here."
          ]
        },
        {
          "heading": "A synthetic double-tax counterexample",
          "body": [
            "Assume solely for invented arithmetic a net amount of 20.00 and a 20% rate. The declared result is 4.00 tax and 24.00 gross. If 24.00 is passed as a net amount and another 20% is added, the result becomes 28.80. The 4.80 difference is a basis mistake, not merely a penny-rounding issue. These numbers are not a recommendation to apply that rate to any real supply."
          ],
          "items": [
            "Assert the net, tax and gross components, not only the grand total.",
            "If the approved basis is unknown, hold the proposed draft instead of trying both settings on real invoices."
          ]
        },
        {
          "heading": "Rounding and tax setup belong to an explicit policy",
          "body": [
            "HMRC's UK guidance distinguishes invoice traders from retailers and describes different rounding treatments. It cannot safely be reduced to always round down or always round each line. Agree the policy that applies to the business, then record where rounding occurs and how the destination applies it. The related synthetic example exposes a line-versus-invoice difference without choosing a legally applicable policy."
          ],
          "items": [
            "Do not adjust a final total merely to hide disagreeing component amounts.",
            "No live invoice, tax configuration or financial correction has been performed."
          ]
        },
        {
          "heading": "Mapping repair is not tax advice",
          "body": [
            "Use the existing maintainer, vendor help or your finance adviser when the policy or account setup is unresolved. A missing field under an already approved treatment may be discussed through the existing £145 five-field Sheets-to-Xero mapping offer, only with its working trigger and authorised disposable-draft route. Fixing tax configuration, deciding tax policy, custom arithmetic, historical invoices and live sending are outside that offer. Send invented net/tax/gross expectations and the missing mapping, not tax returns, customer details or credentials. Scope must be confirmed; the price is untested and payment follows agreed checks and sign-off."
          ],
          "items": []
        }
      ],
      "incoming": [
        "tool-invoice-rounding-bench",
        "example-invoice-tax-rounding-reconciliation",
        "collection-finance-invoice-integrity-checks",
        "guide-sheets-invoice-value-rendering"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/guides/invoice-tax-amount-basis/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/guides/invoice-tax-amount-basis/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Finvoice-tax-amount-basis%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fguides%2Finvoice-tax-amount-basis%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    },
    {
      "id": "guide-invoice-create-unknown-outcome",
      "type": "guide",
      "title": "Invoice creation timed out: reconcile the unknown result before retrying",
      "description": "Distinguish a confirmed rejected creation from a lost response after a possible write, and define zero, one and conflicting-match dispositions before a replay.",
      "url": "/guides/invoice-create-unknown-outcome/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-11",
      "platforms": [
        "accounting-sync",
        "zapier",
        "xero"
      ],
      "buyer_role": "Finance owner deciding whether an accounting automation may retry",
      "purchase_trigger": "An action reports a timeout and nobody knows whether the unsent invoice already exists",
      "problem": "A failed transport response is treated as proof that invoice creation had no effect.",
      "related": [
        "example-invoice-retry-identity-matrix",
        "buyer-finance-manager-invoice-integration",
        "guide-zapier-field-mapping",
        "zapier-sheets-to-xero-missing-columns"
      ],
      "provenance": [
        {
          "label": "IETF RFC 9110 section 9.2.2: retry semantics",
          "url": "https://www.rfc-editor.org/rfc/rfc9110.html",
          "checked": "2026-10-11",
          "claims": [
            "A client should not automatically retry a non-idempotent method without knowing its semantics are idempotent or detecting that the original request was never applied. This does not establish any accounting vendor's idempotency support."
          ]
        },
        {
          "label": "Existing mapping offer and repeated-input acceptance",
          "url": "https://syntheticindustry.ai/services/zapier-sheets-to-xero-missing-columns/",
          "checked": "2026-10-11"
        }
      ],
      "sections": [
        {
          "heading": "Unknown is a separate outcome",
          "body": [
            "A timeout can occur before a write or after a write whose response was lost. Preserve the minimal synthetic source reference, target organisation, attempted operation and result state. Do not replace unknown with failed-and-empty merely because the workflow is red. RFC 9110 explains why automatic retries of non-idempotent requests need more evidence; it does not promise a safe replay facility in Xero, QuickBooks or Zapier."
          ],
          "items": [
            "A new attempt identifier is not a new business invoice.",
            "A human-readable invoice number alone is not proven globally unique.",
            "Do not infer that switching a creation request to PUT makes the business operation safe."
          ]
        },
        {
          "heading": "Specify reconciliation before another create",
          "body": [
            "Under an explicitly authored test policy, one matching target draft with the agreed source reference and expected contents means retain that target, not create another. More than one match, or one match with different contents, is an exception for the authorised finance owner. Zero visible matches is not automatically permission to retry: delayed visibility or another in-flight attempt can still exist. The implementer must establish the actual vendor's lookup, duplicate-prevention and concurrency semantics separately."
          ],
          "items": [
            "Keep organisation and immutable source-operation identity together.",
            "Record confirmed rejected, confirmed created and unknown separately.",
            "A read-then-create sequence alone is not concurrency protection."
          ]
        },
        {
          "heading": "Acceptance includes the lost-response branch",
          "body": [
            "An isolated synthetic specification simulates creation followed by loss of the response. Its repeated operation must retain one draft or enter the approved unresolved state, never silently create a second draft. Also specify a confirmed rejection and conflicting-target case. The related matrix provides concrete identities and expected dispositions. No API, replay, target lookup, concurrent worker or invoice has been run for this draft."
          ],
          "items": [
            "Inspect target count and identity beside the workflow result.",
            "Never bulk replay historical invoices as diagnosis.",
            "Deleting a duplicate or changing a posted document is a separate financial action."
          ]
        },
        {
          "heading": "The £145 offer is a mapping route, not an idempotency redesign",
          "body": [
            "An authorised operator may investigate existing run and draft state using vendor support, with no new paid integration required. The existing £145 mapping repair includes an agreed repeated-input check on one disposable row, not a new reconciliation store, queue, retry architecture or historical cleanup. Enquire there only for the eligible five-field mapping problem with a working trigger and a safe draft test; unknown-state recovery or missing duplicate safeguards need separately agreed scope. Send an invented operation identity and expected result initially, not real invoice exports, source code or keys. The price remains untested; agreement precedes access and payment follows checks and sign-off."
          ],
          "items": []
        }
      ],
      "incoming": [
        "example-invoice-retry-identity-matrix",
        "collection-finance-invoice-integrity-checks"
      ],
      "request": {
        "method": "POST",
        "endpoint": "https://backoffice.syntheticindustry.ai/api/enquiries",
        "media_type": "application/json",
        "required": [
          "contact",
          "need",
          "idempotency_key",
          "website"
        ],
        "fields": {
          "outcome": "custom-outcome",
          "source": "/guides/invoice-create-unknown-outcome/",
          "website": ""
        },
        "idempotency_key": "UUID v4; reuse unchanged answers on retry",
        "receipt": "Durable receipt; server email delivery may be pending. Not an order.",
        "fallback": "Email with SI-* headers",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "general",
          "SI-Page": "https://backoffice.syntheticindustry.ai/guides/invoice-create-unknown-outcome/",
          "SI-Ref": "unknown"
        },
        "url": "https://backoffice.syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Finvoice-create-unknown-outcome%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20general%0ASI-Page%3A%20https%3A%2F%2Fbackoffice.syntheticindustry.ai%2Fguides%2Finvoice-create-unknown-outcome%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Website POST saves a durable first-party receipt; the host records it in the ledger and sends email. Success means saved, not delivery or acceptance."
      }
    }
  ]
}
