Manage Projects, Time, and Invoices with Python: A Freelancer’s Guide
Discover how Python helps you organize freelance projects, track your time accurately, and automatically generate professional PDF invoices to send to clients at the click of a button.
Word Count: 1000 · Reading Time: 5 minutes
Project Management with Python
How to organize time and financial matters using lightweight and powerful Python scripts
Note to the Reader: This article is completely independent and offers practical solutions you can apply immediately. However, if you wish to link your programmatic management tools to an automated communication system with your clients, we highly recommend checking out our previous article:
Building a Simple Telegram or WhatsApp Bot to Manage Your Clients Using Python.
The biggest trap a beginner freelancer falls into is thinking that the quality of their technical work is the sole factor for success. The shocking reality that everyone realizes later is that “management” consumes nearly half of your time. Tracking hours spent developing each feature, monitoring deadlines for different projects, and drafting, sending, and chasing invoices are all necessary administrative tasks, but they do not generate money directly if done manually.
In 2026, you can transform your computer into a highly accurate personal financial and administrative manager using Python. Instead of relying on paid apps with monthly subscriptions or wasting time modifying Excel and Photoshop files to issue an invoice for each client, you can build your own tools to track your time and issue professional PDF invoices within seconds.
In this article from the Zy Yazan Platform, we will build two practical tools together using Python: the first is a smart script to track time spent on your tasks, and the second is an automated tool to generate custom PDF invoices for your clients.
Tool One: A Python Script for Tracking Task Time (Time Tracker)
If you charge your clients by the hour, or simply want to know exactly where your day goes to price your upcoming projects accurately, this simple tool will replace complex software. We will use Python’s standard time and datetime libraries to record start and end times, calculate net working time, and save the data into a clean CSV file.
Create a new file named tracker.py and write the following code:
import time
from datetime import datetime
import csv
import os
def track_time():
project_name = input("Enter project or client name: ").strip()
task_name = input("Enter current task name (e.g., UI Design): ").strip()
input("Press Enter when you start working to start the timer... ⏳")
start_time = time.time()
start_readable = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(f" Timer started at: {start_readable}")
input("\nPress Enter when finished working to stop the timer... 🛑")
end_time = time.time()
end_readable = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# Calculate duration in minutes and hours
duration_seconds = end_time - start_time
duration_minutes = round(duration_seconds / 60, 2)
duration_hours = round(duration_minutes / 60, 2)
print(f"\n Timer stopped at: {end_readable}")
print(f"⏱️ Total work time: {duration_minutes} minutes ({duration_hours} hours).")
# Save log to a CSV file
file_exists = os.path.isfile("time_log.csv")
with open("time_log.csv", mode="a", newline="", encoding="utf-8") as file:
writer = csv.writer(file)
if not file_exists:
# Write headers if the file is new
writer.writerow(["Project", "Task", "Start Time", "End Time", "Duration (Min)", "Duration (Hours)"])
writer.writerow([project_name, task_name, start_readable, end_readable, duration_minutes, duration_hours])
print(" Succeeded! Log successfully saved to time_log.csv")
if __name__ == "__main__":
track_time()
When you run this script at the end of every workday, you will build a precise financial and administrative record of all your projects inside a time_log.csv file, which you can open with Excel or Pandas at any time to analyze your productivity.

Tool Two: Automatic Invoice Generation in PDF Format
Instead of manually filling Word or Photoshop templates to prepare a client invoice, we will build a tool that takes project details and financial values and outputs a professionally formatted PDF document bearing your business name and visual identity.
To achieve this, we will use a very popular Python library for generating PDF documents called reportlab. Install it first via your terminal:
pip install reportlabSince it is preferable for invoices directed to your local or international clients to be written in professional, direct English to avoid complex Arabic font support issues found in some default PDF libraries, we will build the invoice generator natively in English.
Create a file named invoice_generator.py and write the following code:
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib import colors
from datetime import datetime
def create_invoice(client_name, invoice_id, items, tax_rate=0.05):
filename = f"Invoice_{invoice_id}.pdf"
doc = SimpleDocTemplate(filename, pagesize=letter, rightMargin=40, leftMargin=40, topMargin=40, bottomMargin=40)
story = []
styles = getSampleStyleSheet()
# Matching colors and formatting with the site identity
title_style = ParagraphStyle(
'InvoiceTitle',
parent=styles['Heading1'],
fontSize=24,
textColor=colors.HexColor("#c0392b"),
spaceAfter=15
)
normal_style = styles['Normal']
# 1. Invoice Header
story.append(Paragraph("INVOICE", title_style))
story.append(Paragraph(f"Platform: Zy Yazan Platform (zyyazan.sy)", normal_style))
story.append(Paragraph(f"Date: {datetime.now().strftime('%Y-%m-%d')}", normal_style))
story.append(Paragraph(f"Invoice ID: #{invoice_id}", normal_style))
story.append(Paragraph(f"Billed To: {client_name}", normal_style))
story.append(Spacer(1, 20))
# 2. Preparing the Data Table
# Table Header
table_data = [["Service Description", "Hours / Qty", "Unit Price ($)", "Total ($)"]]
subtotal = 0
for item in items:
name, qty, price = item
total = qty * price
subtotal += total
table_data.append([name, str(qty), f"${price:.2f}", f"${total:.2f}"])
# Calculate Tax and Grand Total
tax = subtotal * tax_rate
grand_total = subtotal + tax
table_data.append(["", "", "Subtotal:", f"${subtotal:.2f}"])
table_data.append(["", "", f"Tax ({int(tax_rate*100)}%):", f"${tax:.2f}"])
table_data.append(["", "", "Grand Total:", f"${grand_total:.2f}"])
# 3. Formatter Table Visually to Fit Mobile and Desktop as a Static Document
invoice_table = Table(table_data, colWidths=[280, 70, 90, 90])
invoice_table.setStyle(TableStyle([
('BACKGROUND', (0, 0), (-1, 0), colors.HexColor("#1a3a5c")),
('TEXTCOLOR', (0, 0), (-1, 0), colors.white),
('ALIGN', (0, 0), (-1, -1), 'LEFT'),
('BOTTOMPADDING', (0, 0), (-1, 0), 8),
('BACKGROUND', (0, 1), (-1, -4), colors.HexColor("#f9f9f9")),
('GRID', (0, 0), (-1, -4), 0.5, colors.HexColor("#ddd")),
('LINEBELOW', (2, -3), (-1, -1), 1, colors.HexColor("#c0392b")), # Highlighting the total line
('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'),
('FONTSIZE', (0, 0), (-1, -1), 10),
]))
story.append(invoice_table)
story.append(Spacer(1, 40))
# 4. Invoice Footer and Payment Notes
story.append(Paragraph("Payment Terms: Please remit payment within 14 days of invoice date.", normal_style))
story.append(Paragraph("Thank you for your business! If you have any questions, contact us via zyyazan.sy", normal_style))
# Build Document
doc.build(story)
print(f"✔️ Done! Generated: {filename}")
if __name__ == "__main__":
# Testing the tool with default data for a real project
client = "Global Marketing Corp"
inv_num = "2026_087"
project_items = [
["Custom Python Web Scraper Development", 10, 35], # 10 hours at $35/hour
["Telegram Bot Deployment & API Integration", 1, 150], # Fixed price service
["Database Optimization (PostgreSQL)", 4, 40]
]
create_invoice(client, inv_num, project_items)
How to Integrate Both Tools to Save Half Your Time?
The true power of Python becomes clear when you make your scripts talk to each other. Consider this professional workflow that you can implement on your own:
Python can read the logged hours stored in the time_log.csv file produced by the first tool, automatically aggregate hours for a specific client, and pass this data directly to the create_invoice function in the second tool. As a result, you will find your monthly invoice generated in PDF format and ready to be sent without opening a calculator or writing a single line in Word!
A Comparison Between Out-of-the-Box Software Solutions and Custom Python Solutions
Some may ask: Why not use ready-made platforms like FreshBooks or an Excel sheet? The following table clarifies the strategic difference for a smart freelancer:
| Comparison Factor | Commercial Out-of-the-Box Platforms | Custom Python Tools (Private Script) |
|---|---|---|
| Annual Cost | Ranges between $120 to $300 annually as recurring subscriptions. | Completely free of charge with no hidden fees. |
| Data Privacy | Your clients’ data and your earnings are stored on other companies’ servers. | Complete security; data is stored locally on your device or your private server. |
| Flexibility and Automation | Limited strictly to features available within their packages. | Infinite; you can program the script to automatically email the invoice to the client. |
Investing in building your own tools does not just save your money; it raises your technical efficiency and enables you to sell these exact tools as automation services to other clients!

Conclusion and the Next Step
Today we learned how to organize the backend of our freelance operations (time tracking and financial affairs) using lightweight and robust Python scripts. Always remember that automation is not a luxury; it is your only way to increase your operational capacity and accept more projects without burnout.
Recommended Next Step:
So far, all the tools and scripts we have built run via a command-line interface (Terminal) or as silent background processes. It is time to break this barrier and move out into the wider world of the web! In the next article, we will learn how to take our Python skills and turn a static webpage designed with HTML into a dynamic, interactive website that receives and processes data.
Join us for the ninth article: Converting Your Static HTML Website into a Dynamic Website Using Python (Flask).
References and Sources:
- Official documentation of the ReportLab library for PDF generation: ReportLab Official Documentation
- Guide to handling CSV files in Python: Python CSV Library Guide
Freelancer Skill Development Series 2026
Python for Freelancers — 16 Articles
Series Python for Freelancers — 16 Articles | Zy Yazan Platform © 2026



















