DevelopmentPayment protectionDetails
- Revisions within the package are free.
- If you do not respond within 3 days of delivery, the work is accepted automatically.
The money is reserved when you pay and released only once you accept the work.

Example result
Merging the monthly sales files of 9 shops into one Excel report
How it is run
python merge_sales.py --month 2026-10
2026-11-02 09:14:03 INFO Folder: sales/2026-10, 9 files found
2026-11-02 09:14:03 INFO shop-01.csv: 1,284 rows
2026-11-02 09:14:04 INFO shop-02.xlsx: 967 rows
2026-11-02 09:14:04 WARN shop-07.csv: 3 rows without a price skipped (lines 88, 412, 913)
2026-11-02 09:14:05 INFO Done: 10,412 rows -> report-2026-10.xlsx (sheets "Sales" and "Totals")
Settings, not code
The column names of each shop live in settings.ini, so a new shop or a renamed column is a line there:
[columns]
date = Date, Sale date, Day
product = Product, Item, Name
quantity = Qty, Quantity, Pcs
price = Price, Unit price
A part of the code
def read_shop_file(path: Path, columns: dict[str, list[str]]) -> pd.DataFrame:
"""Reads one shop's file and gives it the report's column names."""
table = pd.read_excel(path) if path.suffix == ".xlsx" else pd.read_csv(path, encoding="utf-8-sig")
renamed = {}
for name, variants in columns.items():
found = next((c for c in table.columns if c.strip() in variants), None)
if found is None:
raise ReportError(f"{path.name}: no column for '{name}' (looked for {', '.join(variants)})")
renamed[found] = name
table = table.rename(columns=renamed)[list(columns)]
table["shop"] = path.stem
return table
Files: a ZIP archive with merge_sales.py (310 lines), settings.ini, requirements.txt and a README with installing Python, running the script and what each message in the log means. The client runs it on their own computer.
Client: a small chain of 9 stationery shops; each shop sends its sales for the month as a CSV or Excel file, with slightly different column names. Task: one script that reads every file in a folder, brings the columns to one shape, and writes a single Excel report with all sales and a sheet of totals by shop.
The client and all details are made up.
About this service
Contacts exported from a shop, a CRM or event sign-ups rarely match what a mailing service wants to import: other column names, first and last name in one cell, tags in odd places, people who unsubscribed still on the list. This Python script reads your exports and writes one clean CSV in your service's import layout: names split if needed, fields and tags mapped, malformed emails and duplicates left out and, from Standard, only people with a consent mark kept and unsubscribed ones removed, with a file of dropped rows for you to check. It is for your own contacts who agreed to hear from you, never bought or scraped lists. It runs on your computer and does not connect to the service; you import the file yourself.
What is included
- What you getA ZIP archive with the Python script, a README with step-by-step instructions and, from Standard, a settings file with field and tag mapping; the code is also shown on the order page.
- Your service's layoutBy its import template or sample file
- Consent respectedFrom Standard, only people who agreed, no unsubscribed
- Duplicates and typos outMalformed addresses and repeats left out
- Dropped rows keptA separate file showing what was left out and why
- Readable codeWith comments, easy to add a field later
How it works
- 1SamplesYou send made-up rows from each export and your service's import format
- 2CodeWe write the script and the guide to running it
- 3Try itYou run it, look through the dropped rows and import a small test list
- 4ChangesYou ask for changes within your package and send any error message
What we need from you
The header and 10-20 rows of each export with made-up names and emails but the same layout, which column shows consent and which shows unsubscribing, the mailing service you use and its import template or a link to its import help page, and how tags or segments should be set. How the contacts were collected (your shop, sign-up form, events). Never send the real list.
We will ask you:
- Where do the contacts come from?
- Which mailing service will you import into?
- How is consent recorded?
- Do you need tags or segments?
Compare packages
| Packages | BasicOne export, one format$16 | StandardExport with settings$33 | PremiumContacts tool$67 |
|---|---|---|---|
| Deadline | 1 day | 2 days | 3 days |
| Revisions | 1 | 2 | 3 |
| Code | up to 150 lines | up to 400 lines | up to 1,000 lines |
| Files of code | 1 | up to 3 | up to 8 |
| Settings file | No | Yes | Yes |
| Clear error messages and a log | No | Yes | Yes |
| Run options and a guide to running it on a schedule | No | No | Yes |
| Guide to installing and running it (README) | Yes | Yes | Yes |
| Language | Python | Python | Python |
| Order Basic | Order Standard | Order Premium |
Payment protection
You pay when you order, but the money is released only for accepted work.
- Fixed priceThe package price does not change after you pay.
- The money is reservedWhen you pay, the amount is only reserved. It is released to the service once you accept the work.
- Checked before deliveryEvery result goes through a quality check before it reaches you, and you see it on the order page before accepting it.
- Free revisionsAsk for changes within your brief as many times as the package allows.
- Acceptance after 3 daysIf within 3 days of delivery you neither accept the work nor ask for changes, it is accepted automatically. If you write in the order chat after delivery, the order waits; once we answer, we may start the 3 days again and will say so in the chat.
- Redo or a full refundIf the result does not match your brief and the revisions did not fix it, or the work takes more than twice its deadline, write in the order chat: we will redo the work or refund the payment in full.
Questions and answers
Can I use it on a list I bought?
No. It is for your own contacts who agreed to get your emails. Bought or scraped lists break mailing services' rules and the law in many countries.
Does it upload the contacts to the service?
No. It makes the file; you import it in your mailing service's account, where it also asks you to confirm the contacts agreed.
Will it check that the emails exist?
It checks that each address is written correctly and flags common domain typos. Whether a mailbox exists only the mail service knows, and your mailing service reports bounces after sending.
Is my contact list safe?
It stays on your computer: you run the script yourself, and we see only the made-up rows you send.
Did not find your answer?


