Systems Library / Operations & Admin / How to Automate Change Request Management
Operations & Admin process workflow

How to Automate Change Request Management

Process change requests with automated routing, approval, and tracking.

Jay Banlasan

Jay Banlasan

The AI Systems Guy

Change requests get lost in email threads and Slack messages. I built a system to automate change request management that captures every request, classifies its impact, routes it to the right approver, and tracks implementation. Every change is documented and traceable.

No more "who approved this?" questions.

What You Need Before Starting

Step 1: Define Change Categories and Routing

CHANGE_CATEGORIES = {
    "low_impact": {
        "examples": ["copy changes", "minor UI tweaks", "config updates"],
        "approval": "team_lead",
        "sla_hours": 24
    },
    "medium_impact": {
        "examples": ["new feature addition", "workflow changes", "integration updates"],
        "approval": "department_head",
        "sla_hours": 72
    },
    "high_impact": {
        "examples": ["database changes", "security changes", "pricing changes"],
        "approval": "director",
        "sla_hours": 120
    }
}

Step 2: Create the Change Request Tracker

import sqlite3
from datetime import datetime

def init_change_db(db_path="changes.db"):
    conn = sqlite3.connect(db_path)
    conn.execute("""
        CREATE TABLE IF NOT EXISTS change_requests (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            title TEXT,
            description TEXT,
            requester TEXT,
            category TEXT,
            impact_level TEXT,
            status TEXT DEFAULT 'submitted',
            approver TEXT,
            submitted_at TEXT,
            approved_at TEXT,
            implemented_at TEXT,
            rollback_plan TEXT
        )
    """)
    conn.commit()
    return conn

Step 3: Classify Impact with AI

import anthropic

client = anthropic.Anthropic()

def classify_change(title, description):
    prompt = f"""Classify this change request by impact level.

Title: {title}
Description: {description}

Categories:
- low_impact: cosmetic changes, copy edits, minor configs
- medium_impact: new features, workflow changes, integrations
- high_impact: database schema, security, pricing, data migrations

Return only: low_impact, medium_impact, or high_impact"""

    message = client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=50,
        messages=[{"role": "user", "content": prompt}]
    )
    return message.content[0].text.strip().lower()

Step 4: Submit and Route

def submit_change_request(conn, title, description, requester, rollback_plan=""):
    impact = classify_change(title, description)
    category_config = CHANGE_CATEGORIES.get(impact, CHANGE_CATEGORIES["medium_impact"])

    conn.execute(
        """INSERT INTO change_requests
        (title, description, requester, impact_level, approver, submitted_at, rollback_plan)
        VALUES (?,?,?,?,?,?,?)""",
        (title, description, requester, impact,
         category_config["approval"], datetime.now().isoformat(), rollback_plan)
    )
    conn.commit()

    request_id = conn.execute("SELECT last_insert_rowid()").fetchone()[0]
    print(f"Change #{request_id} submitted. Impact: {impact}. Routing to: {category_config['approval']}")
    return request_id

def approve_change(conn, request_id, approver):
    conn.execute(
        "UPDATE change_requests SET status='approved', approved_at=? WHERE id=?",
        (datetime.now().isoformat(), request_id)
    )
    conn.commit()

def mark_implemented(conn, request_id):
    conn.execute(
        "UPDATE change_requests SET status='implemented', implemented_at=? WHERE id=?",
        (datetime.now().isoformat(), request_id)
    )
    conn.commit()

Step 5: Generate Change Audit Log

def change_audit_report(conn, days=30):
    cutoff = (datetime.now() - __import__('datetime').timedelta(days=days)).isoformat()

    rows = conn.execute("""
        SELECT title, impact_level, status, requester, submitted_at, approved_at
        FROM change_requests WHERE submitted_at > ?
        ORDER BY submitted_at DESC
    """, (cutoff,)).fetchall()

    report = f"# Change Request Audit ({days} days)\n\n"
    report += f"Total: {len(rows)}\n\n"
    report += "| Title | Impact | Status | Requester | Submitted |\n|---|---|---|---|---|\n"
    for r in rows:
        report += f"| {r[0]} | {r[1]} | {r[2]} | {r[3]} | {r[4][:10]} |\n"

    return report

What to Build Next

Add a change calendar that shows all approved changes scheduled for implementation. When multiple changes affect the same system, the calendar flags potential conflicts. Coordinated change management prevents the "two changes broke the same thing" problem.

Related Reading

Want this system built for your business?

Get a free assessment. We will map every system your business needs and show you the ROI.

Get Your Free Assessment

Related Systems