Group compliance, construction chemicals
10,872 EU declarations of conformity, not copy-paste
New EU packaging regulation required declarations of conformity in 12 languages for around 900 packaging materials. Instead of filling them in one by one, a pipeline generates and files them in a single run.
- Year
- 2026
- Services
- Automation
- Area
- Construction chemicals
- Role
- In-house, employed
Delivered in an employed role for an internal department, not under an external consulting contract. The organisation is not named.
The situation
The EU Packaging and Packaging Waste Regulation (PPWR, Regulation 2025/40) requires a declaration of conformity for packaging, phasing in from 12 August 2026. What existed: one legally approved text, as a Word document. What faced it: roughly 1,200 packaging materials, produced at 11 European sites, sold under 9 brands, needed in 12 languages.
The interim state is still in the project folder — a large Excel workbook, visibly maintained by hand, each material row manually joined to plant, legal entity, address and signatory, with helper sheets tracing packaging components back to product families. The task was never complicated. It was just impossibly repetitive.
The approach
Four stages, all plain Python scripts:
- Template once per language. The approved Word document is converted programmatically into a tagged template. Wording and formatting are preserved exactly; only the variable positions and the signature image become placeholders.
- Generate. A generator reads the master-data export, fills one document per material and language, injects the correct signatory’s signature, and converts docx → PDF by remotely driving a local Word instance. A data-quality gate refuses to generate from incomplete rows and writes them to an exception report instead.
- Distribute. Each master PDF is copied into the target structure: one library per brand, then document type, product family, language. Every placement is logged as a CSV row — 65,388 files, each individually evidenced.
- Upload. Upload runs through the Microsoft Graph API with delegated sign-in, so the script can never hold more permission than the signed-in person. Executed in stages: a read-only check, a single-file test, then the full run.
Where it could have gone the other way
Generate few, copy many.
The same packaging material is used by dozens of product families across several brands, and the target structure requires the document to appear in every relevant folder. The obvious route is to generate per destination. Instead the system generates exactly one document per material and language, and achieves folder coverage by copying.
The expensive, failure-prone step — PDF conversion through Word — therefore runs once per unique document rather than 65,388 times. A change to the folder logic afterwards is a redistribution measured in seconds, not a regeneration measured in hours.
What makes this notable is that it reverses the project’s own plan. The original design called for one declaration per product family with an annex listing covered materials — far fewer documents. That decision was overturned for the delivered version, and the split between generation and distribution is the visible consequence.
The result
10,872 unique PDFs generated, 65,388 placements in the target structure, 5,288 files of the English set uploaded — with zero failures. The rest waits on legal review of the translations, and that is not a formality: one delivered “Dutch” template actually contained Spanish text, complete with an AI chat preamble. The pipeline’s validation step caught it before a single document was produced.
Deliberately not automated: 292 materials without a product-family assignment are not guessed at, they are reported. And because no material-to-market mapping existed, every material is generated in every language — full coverage rather than an assumption nobody could evidence.
Stack
- Python
- docxtpl / Jinja2
- Microsoft Word COM
- Microsoft Graph API
- SharePoint Online
More projects
Group customer service, construction chemicals
2026One contact centre for eleven countries — one platform, not eleven islands
Customer service across eleven countries over voice and SMS, with data from SAP, Salesforce and the product system surfaced directly in the agent workspace. Country differences are configuration, not separate installations.
- Twilio Flex
- Twilio TaskRouter
- Twilio Studio
- SAP
Sales & inside sales, construction chemicals
2026One orchestrator, three specialist agents for product questions
Instead of one agent with three knowledge sources, a parent agent routes to three specialists — one each for ERP article data, product content and SharePoint documents.
- Microsoft Copilot Studio
- Azure AI Search
- Azure Functions
- SharePoint
Supply chain, construction chemicals
2026Stock, replenishment and documents per article on one page
Around 334,000 article documents from the data warehouse and the product information system, rebuilt daily. Stock is derived from the movement log rather than the ready-made inventory view — which never reports a zero balance.
- Python
- Azure AI Search
- Azure Functions
- Databricks SQL
A similar process at your company?
30 minutes, free, no sales pitch. You describe what is costing you time — I tell you honestly whether automation is worth it.