Price list markupDevelopment & Customization

A Python script that applies your markup and rounding rules to a supplier's price list and saves your own

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 applies your markup and rounding rules to a supplier's price list and saves your own

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

When a supplier sends a new price list every week, recalculating your own prices by hand means hours in Excel and mistakes in the formulas. This Python script reads the supplier's file and applies your rules: a markup in percent or a fixed amount, from Standard different markups by category, brand or price band, a minimum margin, a currency rate you enter, and rounding such as up to .99 or to the nearest 10. It saves a new price list with the columns you need, ready for your shop or for customers, and lists rows it could not price. The rules are yours; the script does the arithmetic and gives no pricing advice. You run it yourself on your computer, so check the first lists against a few prices you work out by hand.

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 your markups and rounding; the code is also shown on the order page.
  • Your markup rulesPercent or fixed, by category, brand or price band
  • Rounding you chooseUp to .99, to the nearest 10, or as you set
  • Your columnsOnly the columns you need, in your order
  • Problem rows listedRows with no price or an unknown category are reported
  • Readable codeWith comments, easy to change a rule later

How it works

  1. 1
    RulesYou send a sample of the supplier's file and your markup rules
  2. 2
    CodeWe write the script and the guide to running it
  3. 3
    Try itYou run it on the latest list and check a few prices by hand
  4. 4
    ChangesYou ask for changes within your package and send any error message

What we need from you

20-30 rows of the supplier's price list as it comes (Excel or CSV), your markup rules written plainly (for example 35% on everything under 50, 25% above, at least 5 in margin), the rounding you want, the currency rate if prices must be converted and where it comes from, and the columns your price list should have. If you have several suppliers (Premium), a sample from each. Your system: Windows, macOS or Linux.

We will ask you:

  • What does the supplier send?
  • What are your markup rules?
  • How should prices be rounded?
  • What should your price list contain?

Compare packages

PackagesBasicOne markup rule$16StandardMarkup with settings$33PremiumPricing 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

Can it take the exchange rate from the internet?

In Premium it can read the rate from a public source you choose, such as your central bank's published rates. Otherwise you type the rate into the settings before each run.

Can it upload the prices to my shop?

This offer makes the price list file. Many shop platforms import prices from such a file; tell us yours and we will make the columns fit its import.

What if the supplier changes the file?

From Standard the column names sit in the settings file, so a renamed column is a one-line change. A completely new layout may need the script adjusted.

Will you tell me what markup to use?

No. We do not give pricing or financial advice: the script applies the rules you set, and the numbers are your decision.

Did not find your answer?

Packages