Why Python Scripts Don't Work for Customer File Imports

Michael Zittermann
Michael Zittermann
Co-Founder & CEO
Last updated on
October 11, 2026
Why Python Scripts Fail for Customer File Imports

Most teams arrive here the same way:

  • Your implementation team is onboarding clients who each send data in their own format. Forty clients, forty layouts.
  • Someone spends a week reformatting spreadsheets by hand, gets tired of it, and asks engineering for help.
  • An engineer writes a Python script – pandas, openpyxl, a few hundred lines. It reads the file, renames the columns, fixes the dates, checks the required fields, and writes something your system can accept.

It works. It’s a good piece of engineering.

Six months later, the same team is still reformatting spreadsheets by hand.

Nothing broke. The script does exactly what it was written to do. What changed is everything around it – and the reason it stopped helping has little to do with code quality.

Simplify data imports with AI-powered automation

Integrate a self-service data importer into your software to effortlessly clean and import data from any source and format. Your users will thank you for having their data ready in no time.

Explore solutions

The problem isn’t the script – it’s who’s allowed to change it

That’s the structural flaw, and better code doesn’t fix it:

The people who own the problem can’t change the logic. The people who can change the logic don’t own the problem.

To see how that plays out, take a realistic example. Your implementation consultant holds a lot of knowledge about her customers:

  • One logistics customer calls it “Staff No.” while everyone else calls it “Employee ID.”
  • The Nordics office sends dates as DD.MM.YYYY.
  • The file from the Denver team has two header rows, because someone added a title bar in 2019.

She holds all of this because she talks to these customers every week. Yet she can’t express any of it in the script. She can only describe it in a ticket.

So every new client, every renamed column, and every customer who upgrades their own system and starts exporting slightly differently becomes a request to a team measured on shipping product. The incentives split cleanly:

Team How a broken file looks
Implementation Urgent. A client is waiting, a go-live date is at risk, and someone is on a call apologizing.
Engineering A small maintenance task with no customer-facing upside, competing with the roadmap.

Both teams are behaving correctly. The queue is the predictable result of that split, not a symptom of a bad team.

What happens when a file fails

The script hits a file it doesn’t expect and stops. It writes something like:

KeyError: ‘Employee ID’

That message was written for the person who wrote the code. Your implementation manager isn’t that person, so she opens the client’s Excel file and starts scrolling.

That’s the trap: she’s trying to work out which rule was broken using two things that don’t contain the rules:

  • an error message aimed at a developer
  • a spreadsheet with 4,000 rows and 22 columns

The table below sets what she has in front of her against what she’d need to answer the question:

What she has in front of her What she’d need to answer the question
KeyError: ‘Employee ID’ The list of column names the script accepts for that field
The client’s file, 4,000 rows Which row caused the stop
Last month’s file, which worked What differs between the two that the script cares about
A required-field error Which fields are required, and whether a blank counts as missing
A date that “didn’t parse” Which date formats the script was built to accept
No error at all, just fewer rows than expected Which rows were dropped, and under which condition

None of the right-hand column is visible to her. All of it exists: someone decided it, in code, months ago, and it sits in a repository she has no reason to access and couldn’t read if she did.

So diagnosing a data problem becomes detective work. She compares this month’s file against last month’s and guesses at what the script wants.

Often she can’t even test the guess, because the script may run on a schedule, run on a server, or need a developer to execute it at all. Her loop becomes “ask engineering to run it again and tell me what happened,” which is measured in hours per attempt.

Then comes the workaround, which is worse than it looks

Eventually she stops diagnosing and starts editing. She opens the file, changes things until it goes through, and the client gets onboarded.

Consider what just happened. The script existed to enforce rules about incoming data. She has adjusted the data, by trial and error, until it satisfied rules nobody can see. The file passed, but the reason for that passed is now unknown to everyone, including her.

The validation didn’t hold. It was negotiated around.

Do that for a year across 40 clients, and you no longer have a controlled intake process. You have:

  • a script
  • a folder of hand-corrected files
  • no record of what was changed or why

The customer doesn’t get a straight answer either

The person who most needs to know what was wrong with the file is your client, and what they need is a sentence:

“Row 42: the value in column D (‘Start Date’) is 31/02/2026, which isn’t a valid date. Rows 51 and 88 have the same problem.”

Producing that – per file, per row, per rule, in language you can forward without embarrassment – is an entire error-reporting system. It’s typically a larger build than the parsing itself, and it never appears in the original estimate.

Until that system exists, your implementation manager stays in the loop as a human translator between an error message and a customer.

When a script is the right answer

None of this is an argument that scripts are bad. In some cases, writing one is the correct call:

Situation Why a script wins
One-time migration There’s no next month, so there’s nothing to maintain
Formats you control If the file comes from your own product, or a partner you can hand a spec to, the schema is stable, which is what scripts are good at
Real algorithmic complexity Domain-specific reconciliation or business rules that no configuration screen would express
A technical team owns the whole process If the people receiving the files can read and edit the code themselves, the ownership gap may not exist, and much of this may not apply
Low volume Twenty similar files a month. Automating this can be a hobby project

If you’re in one of those five situations, write the script. Outside them, the picture changes.

Where it stops scaling

A script becomes a trap when several of these conditions are true at once:

Condition Why the script struggles
The format arrives from outside, and you can’t dictate it Every sender is a separate code path, and senders can change formats without telling you
The volume is recurring, not one-off Maintenance grows with every client you win
The people who own the process are non-technical Every change is a ticket, and every ticket is a delay
Failures have to be diagnosed by non-developers The rules aren’t visible anywhere they can look
Your customer needs to know what was wrong with their file Error messages aren’t customer-facing, so the reporting system becomes a second project
Someone has to sign off on what changed Scripts log the result, rarely the rule that produced it
One person wrote it The process depends on that one person, the same exposure as an undocumented Excel macro, in a different language

That last row deserves a moment. A folder of per-client Python scripts written by an engineer who has since moved teams is not meaningfully safer than a workbook full of VBA written by someone who left. Both lock knowledge in a format most of the company can’t read.

What to ask instead

If you’re looking at alternatives, these are the questions that matter. They’re worth asking any vendor, including us:

  • When a file fails, can the person who owns the client see why? That means the rule, the row, and the value, on one screen.
  • Can they fix it and re-run it themselves? They shouldn’t have to ask anyone to execute anything.
  • Can a non-technical person add a new sender or change a mapping? It shouldn’t take a deploy or a ticket.
  • Is there a per-file report you can forward to the customer who sent it? It should be in language they’ll understand.
  • Is there a record of which rows changed and under which rule?

The first two questions get asked least and matter most. A solution that can’t answer them recreates the same gap behind a nicer interface.

The test

Ask the person who receives the files one question: “When a client’s file fails, can you find out why and fix it yourself today?”

If the answer is yes, your current setup is fine, whatever it’s built on.

If the answer is “no, I open the spreadsheet, guess, raise a ticket, and edit the file by hand until it goes through,” then the problem was never the parsing.

The rules live somewhere the problem owner can’t see, and no amount of additional scripting brings them into view.

‍

AI data workflows with enterprise-grade controls
Build file-based data workflows with full visibility and control from onboarding to ongoing delivery.
Explore solutions

See how easily you can turn your customer files into ready-to-use data with Ingestro’s AI agents.

Keep exploring

icon