Python for Small Business: Automate Your Invoicing
Manual invoicing wastes hours every month. Here is how to automate it with Python.
Generate PDF Invoices
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
from datetime import date
def generate_invoice(client, items, invoice_num):
filename = "invoice_" + str(invoice_num) + ".pdf"
c = canvas.Canvas(filename, pagesize=letter)
c.setFont("Helvetica-Bold", 20)
c.drawString(50, 750, "INVOICE")
c.setFont("Helvetica", 12)
c.drawString(50, 730, "Invoice #: " + str(invoice_num))
c.drawString(50, 715, "Date: " + str(date.today()))
c.drawString(50, 670, "Bill To: " + client['name'])
c.drawString(50, 655, client['email'])
y = 600
total = 0
for item in items:
amount = item['qty'] * item['rate']
total += amount
c.drawString(50, y, item['description'])
c.drawString(400, y, "$" + str(amount))
y -= 20
c.setFont("Helvetica-Bold", 14)
c.drawString(350, y - 20, "TOTAL: $" + str(total))
c.save()
return filename
Send Invoice by Email
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email import encoders
def send_invoice(client_email, invoice_path, invoice_num):
msg = MIMEMultipart()
msg["Subject"] = "Invoice #" + str(invoice_num) + " - Payment Due in 30 Days"
msg["From"] = "billing@yourcompany.com"
msg["To"] = client_email
msg.attach(MIMEText("Please find your invoice attached."))
with open(invoice_path, "rb") as f:
pdf = MIMEBase("application", "pdf")
pdf.set_payload(f.read())
encoders.encode_base64(pdf)
pdf.add_header("Content-Disposition", "attachment; filename=invoice.pdf")
msg.attach(pdf)
with smtplib.SMTP("smtp.gmail.com", 587) as s:
s.starttls()
s.login("billing@yourcompany.com", "your-app-password")
s.send_message(msg)
Track Overdue Invoices
import sqlite3
from datetime import date
def get_outstanding():
conn = sqlite3.connect("invoices.db")
conn.execute("CREATE TABLE IF NOT EXISTS invoices (id TEXT, client TEXT, amount REAL, due TEXT, paid INTEGER DEFAULT 0)")
return conn.execute("SELECT * FROM invoices WHERE paid=0 ORDER BY due").fetchall()
def send_reminders():
today = date.today()
for invoice in get_outstanding():
due = date.fromisoformat(invoice[3])
days = (today - due).days
if days > 0:
print("Overdue by " + str(days) + " days: " + invoice[0])
This handles the entire invoicing workflow automatically.
Want 50+ ready-to-use Python automation scripts? Get the complete toolkit for just $9: https://lukassbrad.gumroad.com/l/ugeka
Top comments (0)