Daily report by emailDevelopment & Customization

A Python script that builds a short report from your Excel files and emails it from your own mailbox

Usually ready in 15 minutesRevisions includedQuality check
Packages
Payment 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.

A Python script that builds a short report from your Excel files and emails it from your own mailbox

Example result

Example for the Standard package

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

If someone in the office opens the same Excel file every morning, copies the totals and writes them into an email, this Python script can do that part. It reads the files you name, such as yesterday's sales export or a stock sheet in a shared folder, counts what you ask (totals, counts, averages by shop or product, the rows over a limit) and sends a short email with a neat table to the people you list, from your own mail account, with the file attached from Standard. You put the mail account's sending password into the settings yourself; it never goes into the code. The recipients are your own colleagues or clients, well within your mail service's sending limits. It reports the figures in your files; it does not check or explain them.

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 files, recipients and mail settings; the code is also shown on the order page.
  • Your figuresTotals, counts and averages you choose
  • A readable emailA short table that opens on a phone
  • From your mailboxYour own mail account, password kept out of the code
  • File attachedFrom Standard, the Excel file or a summary of it
  • Readable codeWith comments, easy to add a figure later

How it works

  1. 1
    TaskYou send a sample file and an example of the email you want
  2. 2
    CodeWe write the script and the guide to running it
  3. 3
    Try itYou run it with only your own address on the list
  4. 4
    ChangesYou ask for changes within your package and send any error message

What we need from you

One of the Excel files the report is made from, cut to a few rows or with figures changed, where the files appear (a folder, a shared drive) and how they are named, what the email should show (write it out as you would by hand), who gets it and from which mail account (naming the mail service is enough; the password you enter yourself). When it should go out, and the computer it will run on: Windows, macOS or Linux.

We will ask you:

  • Which files is the report made from?
  • What should the email show?
  • Who gets it, and when?
  • Where will it run?

Compare packages

PackagesBasicOne report$16StandardReport with settings$33PremiumReport tool$67
Deadline1 day2 days3 days
Revisions123
Codeup to 150 linesup to 400 linesup to 1,000 lines
Files of code1up to 3up to 8
Settings fileNoYesYes
Clear error messages and a logNoYesYes
Run options and a guide to running it on a scheduleNoNoYes
Guide to installing and running it (README)YesYesYes
LanguagePythonPythonPython
Order BasicOrder StandardOrder 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.
How it works →

Questions and answers

Will it send the report every day by itself?

It sends a report each time it runs. Premium includes a guide to running it every morning with Task Scheduler, cron or launchd; with Basic or Standard you run it yourself or set that up on your own. The computer has to be on at that time.

Which mail accounts does it work with?

Most services that allow sending through SMTP, which includes common business and personal mail. Some ask you to create an app password for this; the README shows where.

My files are in Google Sheets, not Excel. Does that work?

For that a Google Apps Script inside the sheet suits better, and sends from your Gmail; say so in the brief and we will write it in Apps Script instead.

Can it send the report to my customers?

Yes, to people who expect it, such as clients who asked for a daily stock list. It is not meant for mass mailing or for lists you did not collect yourself.

Did not find your answer?

Packages