关于 contract-management
面向采购、法务和合同管理团队的合同管理技能,覆盖合同从启动、谈判到续约或退出的生命周期。它还提供义务与支出合规跟踪、续约分析及合同组合分析框架。
主要功能
- 01合同生命周期管理框架
- 02谈判条款与策略梳理
- 03合同义务跟踪
- 04支出合规分析
- 05续约与合同组合分析
适用场景
- 01规划合同续约和重新谈判
- 02跟踪合同义务与截止日期
- 03检查采购支出是否符合合同
- 04识别合同组合中的风险与机会
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ kishorkukreja/ awesome-supply-chain --skill contract-management安装后在 Claude Code 中输入/contract-management确认已加载。
详细介绍
合同管理
您是采购合同管理与谈判方面的专家。您的目标是帮助组织在合同整个生命周期内管理供应商合同、谈判有利条款、确保合规,并优化合同价值和绩效。
初步评估
在管理合同之前,请先了解:
-
合同组合背景
- 有多少份有效合同?
- 合同总价值(TCV)是多少?
- 合同类型有哪些?(MSA、SOW、采购协议)
- 当前有哪些痛点或问题?
-
管理成熟度
- 是否已有合同管理流程?
- 是否部署了 CLM(合同生命周期管理)系统?
- 是否监控合同合规情况?
- 是否有续约跟踪流程?
-
业务目标
- 主要目标是什么?(节省成本、降低风险、确保合规)
- 关键绩效指标有哪些?
- 合同标准化程度如何?
- 审批工作流如何设置?
-
资源与系统
- 法务团队参与程度如何?
- 采购团队的组织架构如何?
- 是否有文档管理系统?
- 是否与 ERP/P2P 集成?
合同生命周期管理框架
合同生命周期阶段
1. 合同前期(发起)
- 确认需求
- 审批业务案例
- 选择供应商
- 准备 RFP/谈判
2. 谈判
- 条款与条件
- 定价与付款条款
- SLA 和 KPI
- 风险分配
- 法务审查
3. 签署
- 签署合同
- 审批与流转
- 将合同存入合同库
- 通知利益相关方
4. 管理
- 跟踪义务
- 监控绩效
- 管理发票与付款
- 变更请求
- 关系管理
5. 续约/退出
- 绩效评估
- 续约决策
- 重新谈判
- 规划过渡
- 合同收尾
合同谈判策略
谈判准备
研究与分析:
- 市场基准与定价
- 供应商财务状况
- BATNA(谈判协议的最佳替代方案)
- 退出底线
- 利益相关方需求
谈判筹码:
- 采购量/支出水平
- 多年期承诺
- 优选供应商身份
- 付款条款(提前付款)
- 业务增长潜力
- 参考案例/客户推荐
需要谈判的关键条款
1. 定价条款
class PricingStructure:
"""Model different pricing structures for negotiation"""
@staticmethod
def fixed_price(unit_price, volume, discount_tiers=None):
"""
Fixed price with volume discounts
discount_tiers: list of (volume_threshold, discount_pct)
"""
total_cost = unit_price * volume
if discount_tiers:
applicable_discount = 0
for threshold, discount in sorted(discount_tiers, reverse=True):
if volume >= threshold:
applicable_discount = discount
break
total_cost = total_cost * (1 - applicable_discount)
return {
'pricing_model': 'Fixed Price',
'base_unit_price': unit_price,
'volume': volume,
'discount': applicable_discount if discount_tiers else 0,
'total_cost': round(total_cost, 2),
'effective_unit_price': round(total_cost / volume, 2)
}
@staticmethod
def cost_plus(cost, markup_pct, volume):
"""Cost-plus pricing model"""
unit_price = cost * (1 + markup_pct)
total_cost = unit_price * volume
return {
'pricing_model': 'Cost Plus',
'base_cost': cost,
'markup_pct': markup_pct * 100,
'unit_price': round(unit_price, 2),
'volume': volume,
'total_cost': round(total_cost, 2)
}
@staticmethod
def index_based(base_price, index_value, base_index, volume, cap=None):
"""
Index-linked pricing (e.g., commodity, inflation)
cap: maximum % increase/decrease
"""
index_adjustment = (index_value - base_index) / base_index
if cap and abs(index_adjustment) > cap:
index_adjustment = cap if index_adjustment > 0 else -cap
adjusted_price = base_price * (1 + index_adjustment)
total_cost = adjusted_price * volume
return {
'pricing_model': 'Index Based',
'base_price': base_price,
'base_index': base_index,
'current_index': index_value,
'adjustment_pct': round(index_adjustment * 100, 2),
'adjusted_unit_price': round(adjusted_price, 2),
'volume': volume,
'total_cost': round(total_cost, 2),
'cap_applied': cap is not None and abs(index_adjustment) > cap
}
@staticmethod
def gain_share(baseline_cost, actual_cost, sharing_ratio, volume):
"""
Gain-share pricing (savings split between parties)
sharing_ratio: % of savings to buyer (e.g., 0.6 = 60/40 split)
"""
savings = baseline_cost - actual_cost
buyer_savings = savings * sharing_ratio
supplier_savings = savings * (1 - sharing_ratio)
buyer_price = actual_cost + supplier_savings
total_cost = buyer_price * volume
return {
'pricing_model': 'Gain Share',
'baseline_cost': baseline_cost,
'actual_cost': actual_cost,
'total_savings': round(savings, 2),
'buyer_share': round(buyer_savings, 2),
'supplier_share': round(supplier_savings, 2),
'buyer_unit_price': round(buyer_price, 2),
'volume': volume,
'total_cost': round(total_cost, 2)
}
# Example: Compare pricing models
volume = 100000
fixed = PricingStructure.fixed_price(
unit_price=10.00,
volume=volume,
discount_tiers=[(50000, 0.05), (100000, 0.08)]
)
cost_plus = PricingStructure.cost_plus(
cost=8.50,
markup_pct=0.15,
volume=volume
)
index = PricingStructure.index_based(
base_price=10.00,
index_value=105,
base_index=100,
volume=volume,
cap=0.10 # 10% cap
)
print("Fixed Price:", fixed)
print("Cost Plus:", cost_plus)
print("Index Based:", index)
2. 付款条款
- 标准:Net 30、Net 60、Net 90
- 提前付款折扣:2/10 Net 30
- 付款里程碑(适用于服务)
- 预付款与后付
- 电子发票与自动付款
def evaluate_payment_terms(invoice_amount, terms_options):
"""
Evaluate different payment terms
terms_options: list of dicts with payment terms
"""
results = []
for option in terms_options:
term_type = option['type']
days = option.get('days', 30)
discount = option.get('discount_pct', 0)
if term_type == 'standard':
effective_cost = invoice_amount
cash_impact_days = days
elif term_type == 'early_discount':
discount_days = option.get('discount_days', 10)
if option.get('take_discount', True):
effective_cost = invoice_amount * (1 - discount)
cash_impact_days = discount_days
else:
effective_cost = invoice_amount
cash_impact_days = days
# Annualized cost of capital
cost_of_capital_annual = 0.08 # 8% annual
holding_cost = effective_cost * (cash_impact_days / 365) * cost_of_capital_annual
total_cost = effective_cost + holding_cost
results.append({
'terms': option['name'],
'payment_days': cash_impact_days,
'effective_amount': round(effective_cost, 2),
'holding_cost': round(holding_cost, 2),
'total_cost': round(total_cost, 2),
'savings_vs_baseline': 0 # Will calculate below
})
# Calculate savings vs. baseline (first option)
baseline_cost = results[0]['total_cost']
for result in results:
result['savings_vs_baseline'] = round(baseline_cost - result['total_cost'], 2)
return results
# Example
terms = [
{'name': 'Net 30', 'type': 'standard', 'days': 30},
{'name': 'Net 60', 'type': 'standard', 'days': 60},
{'name': '2/10 Net 30 (take discount)', 'type': 'early_discount',
'days': 30, 'discount_days': 10, 'discount_pct': 0.02, 'take_discount': True},
{'name': '2/10 Net 30 (no discount)', 'type': 'early_discount',
'days': 30, 'discount_days': 10, 'discount_pct': 0.02, 'take_discount': False},
]
payment_analysis = evaluate_payment_terms(invoice_amount=100000, terms_options=terms)
for result in payment_analysis:
print(f"\n{result['terms']}")
print(f" Effective Amount: ${result['effective_amount']:,.2f}")
print(f" Total Cost: ${result['total_cost']:,.2f}")
print(f" Savings: ${result['savings_vs_baseline']:,.2f}")
3. 服务级别协议(SLA)
class SLAManager:
"""Manage and track Service Level Agreements"""
def __init__(self, contract_id):
self.contract_id = contract_id
self.slas = []
def add_sla(self, metric, target, measurement_period,
penalty_structure=None):
"""
Add SLA metric
penalty_structure: list of (threshold, penalty_pct)
"""
sla = {
'metric': metric,
'target': target,
'measurement_period': measurement_period,
'penalty_structure': penalty_structure or []
}
self.slas.append(sla)
def calculate_performance(self, metric, actual_value):
"""Calculate performance vs. SLA target"""
sla = next((s for s in self.slas if s['metric'] == metric), None)
if not sla:
return None
target = sla['target']
# Determine if higher or lower is better based on metric name
higher_better = any(word in metric.lower()
for word in ['uptime', 'delivery', 'fill', 'accuracy'])
if higher_better:
performance_pct = (actual_value / target) * 100
meets_target = actual_value >= target
else: # Lower is better (e.g., defect rate, lead time)
performance_pct = (target / actual_value) * 100
meets_target = actual_value <= target
# Calculate penalty if applicable
penalty_pct = 0
if not meets_target and sla['penalty_structure']:
variance = abs(actual_value - target) / target
for threshold, penalty in sorted(sla['penalty_structure'], reverse=True):
if variance >= threshold:
penalty_pct = penalty
break
return {
'metric': metric,
'target': target,
'actual': actual_value,
'performance_%': round(performance_pct, 1),
'meets_target': meets_target,
'penalty_%': penalty_pct,
'status': 'Met' if meets_target else 'Missed'
}
def generate_scorecard(self, actual_values):
"""
Generate SLA performance scorecard
actual_values: dict {metric: actual_value}
"""
scorecard = []
for metric, actual in actual_values.items():
result = self.calculate_performance(metric, actual)
if result:
scorecard.append(result)
# Calculate overall compliance
total_slas = len(scorecard)
met_slas = sum(1 for s in scorecard if s['meets_target'])
compliance_rate = (met_slas / total_slas * 100) if total_slas > 0 else 0
return {
'contract_id': self.contract_id,
'sla_details': scorecard,
'total_slas': total_slas,
'met_slas': met_slas,
'compliance_rate_%': round(compliance_rate, 1)
}
# Example usage
sla_manager = SLAManager(contract_id='CNT-12345')
# Add SLAs with penalty structures
sla_manager.add_sla(
metric='On-Time Delivery %',
target=95.0,
measurement_period='monthly',
penalty_structure=[
(0.05, 0.02), # 5% miss = 2% penalty
(0.10, 0.05), # 10% miss = 5% penalty
(0.15, 0.10), # 15% miss = 10% penalty
]
)
sla_manager.add_sla(
metric='Defect Rate (PPM)',
target=1000,
measurement_period='monthly',
penalty_structure=[
(0.20, 0.03), # 20% over = 3% penalty
(0.50, 0.05), # 50% over = 5% penalty
]
)
sla_manager.add_sla(
metric='Lead Time (days)',
target=21,
measurement_period='monthly',
penalty_structure=[
(0.10, 0.01), # 10% over = 1% penalty
(0.25, 0.03), # 25% over = 3% penalty
]
)
# Evaluate actual performance
actual_performance = {
'On-Time Delivery %': 92.5, # Below target
'Defect Rate (PPM)': 1200, # Above target
'Lead Time (days)': 23 # Above target
}
scorecard = sla_manager.generate_scorecard(actual_performance)
print(f"\nSLA Scorecard for {scorecard['contract_id']}")
print(f"Compliance Rate: {scorecard['compliance_rate_%']}%")
print(f"Met {scorecard['met_slas']} of {scorecard['total_slas']} SLAs\n")
for sla in scorecard['sla_details']:
print(f"{sla['metric']}:")
print(f" Target: {sla['target']}")
print(f" Actual: {sla['actual']}")
print(f" Status: {sla['status']}")
if sla['penalty_%'] > 0:
print(f" Penalty: {sla['penalty_%']}%")
4. 风险分配与赔偿
- 责任上限
- 保险要求
- 质保条款
- 不可抗力
- 知识产权赔偿
- 数据安全与隐私
5. 变更管理
- 变更请求流程
- 范围变更的定价
- 时间安排调整
- 审批要求
6. 终止条款
- 无因终止
- 有因终止
- 通知期限
- 退出义务
- 过渡协助
合同合规监控
义务跟踪
import pandas as pd
from datetime import datetime, timedelta
class ContractObligationTracker:
"""Track contract obligations and deadlines"""
def __init__(self):
self.obligations = []
def add_obligation(self, contract_id, obligation_type, description,
responsible_party, due_date, status='Pending'):
"""Add contract obligation"""
self.obligations.append({
'contract_id': contract_id,
'type': obligation_type,
'description': description,
'responsible_party': responsible_party,
'due_date': pd.to_datetime(due_date),
'status': status,
'added_date': datetime.now()
})
def get_upcoming_obligations(self, days_ahead=30):
"""Get obligations due in next N days"""
df = pd.DataFrame(self.obligations)
if df.empty:
return df
# Filter pending obligations
df = df[df['status'] == 'Pending']
# Filter by date range
today = pd.Timestamp.now()
future_date = today + timedelta(days=days_ahead)
df = df[(df['due_date'] >= today) & (df['due_date'] <= future_date)]
# Sort by due date
df = df.sort_values('due_date')
# Add days until due
df['days_until_due'] = (df['due_date'] - today).dt.days
return df
def get_overdue_obligations(self):
"""Get overdue obligations"""
df = pd.DataFrame(self.obligations)
if df.empty:
return df
# Filter pending and overdue
df = df[df['status'] == 'Pending']
today = pd.Timestamp.now()
df = df[df['due_date'] < today]
# Sort by due date (oldest first)
df = df.sort_values('due_date')
# Add days overdue
df['days_overdue'] = (today - df['due_date']).dt.days
return df
def update_status(self, contract_id, description, new_status):
"""Update obligation status"""
for obligation in self.obligations:
if (obligation['contract_id'] == contract_id and
obligation['description'] == description):
obligation['status'] = new_status
obligation['completed_date'] = datetime.now()
break
# Example usage
tracker = ContractObligationTracker()
# Add various obligations
tracker.add_obligation(
contract_id='CNT-001',
obligation_type='Deliverable',
description='Submit quarterly business review',
responsible_party='Supplier',
due_date='2026-04-01'
)
tracker.add_obligation(
contract_id='CNT-001',
obligation_type='Payment',
description='Monthly payment due',
responsible_party='Buyer',
due_date='2026-02-15'
)
tracker.add_obligation(
contract_id='CNT-002',
obligation_type='Audit',
description='Annual security audit',
responsible_party='Supplier',
due_date='2026-03-15'
)
tracker.add_obligation(
contract_id='CNT-003',
obligation_type='Renewal Decision',
description='Notify renewal or termination',
responsible_party='Buyer',
due_date='2026-01-30' # Overdue
)
# Check upcoming obligations
upcoming = tracker.get_upcoming_obligations(days_ahead=60)
print("Upcoming Obligations:")
print(upcoming[['contract_id', 'description', 'due_date', 'days_until_due']])
# Check overdue
overdue = tracker.get_overdue_obligations()
print("\nOverdue Obligations:")
print(overdue[['contract_id', 'description', 'days_overdue']])
支出合规监控
def analyze_contract_compliance(actual_spend_df, contracts_df):
"""
Analyze spend compliance with contracts
actual_spend_df: DataFrame with actual purchases
contracts_df: DataFrame with contract details
"""
# Merge actual spend with contracts
spend_with_contract = actual_spend_df.merge(
contracts_df[['supplier_name', 'category', 'contract_id',
'contracted_price', 'volume_commitment']],
on=['supplier_name', 'category'],
how='left'
)
# Calculate compliance metrics
compliance_summary = []
for contract_id in contracts_df['contract_id'].unique():
contract_data = spend_with_contract[
spend_with_contract['contract_id'] == contract_id
]
if len(contract_data) == 0:
continue
contract = contracts_df[contracts_df['contract_id'] == contract_id].iloc[0]
total_spend = contract_data['spend_amount'].sum()
total_volume = contract_data['volume'].sum()
volume_commitment = contract['volume_commitment']
# Volume compliance
volume_achievement = total_volume / volume_commitment * 100
# Price compliance
contract_data['price_variance'] = (
contract_data['unit_price'] - contract_data['contracted_price']
) / contract_data['contracted_price']
avg_price_variance = contract_data['price_variance'].mean() * 100
price_compliant = (contract_data['price_variance'].abs() < 0.02).mean() * 100
compliance_summary.append({
'contract_id': contract_id,
'supplier': contract['supplier_name'],
'category': contract['category'],
'total_spend': total_spend,
'volume_commitment': volume_commitment,
'actual_volume': total_volume,
'volume_achievement_%': round(volume_achievement, 1),
'avg_price_variance_%': round(avg_price_variance, 1),
'price_compliance_%': round(price_compliant, 1),
'status': 'Compliant' if (volume_achievement >= 80 and
abs(avg_price_variance) < 5) else 'Non-Compliant'
})
return pd.DataFrame(compliance_summary)
合同续约管理
续约决策框架
class ContractRenewalAnalysis:
"""Analyze contract for renewal decision"""
def __init__(self, contract_id, current_terms):
self.contract_id = contract_id
self.current_terms = current_terms
self.performance_data = {}
self.market_data = {}
def add_performance_data(self, sla_compliance, quality_score,
delivery_score, relationship_score):
"""Add supplier performance data"""
self.performance_data = {
'sla_compliance_%': sla_compliance,
'quality_score': quality_score, # 0-10
'delivery_score': delivery_score, # 0-10
'relationship_score': relationship_score # 0-10
}
def add_market_data(self, market_price, inflation_rate,
competitive_alternatives):
"""Add market intelligence"""
self.market_data = {
'market_price': market_price,
'current_price': self.current_terms['price'],
'inflation_rate': inflation_rate,
'competitive_alternatives': competitive_alternatives
}
def calculate_renewal_score(self):
"""Calculate overall renewal recommendation score"""
score = 0
max_score = 100
factors = []
# Performance scoring (40 points)
if self.performance_data:
perf = self.performance_data
# SLA compliance (15 points)
sla_points = (perf['sla_compliance_%'] / 100) * 15
score += sla_points
if perf['sla_compliance_%'] >= 95:
factors.append("✓ Excellent SLA compliance")
elif perf['sla_compliance_%'] < 90:
factors.append("✗ Poor SLA compliance")
# Quality (10 points)
quality_points = (perf['quality_score'] / 10) * 10
score += quality_points
# Delivery (10 points)
delivery_points = (perf['delivery_score'] / 10) * 10
score += delivery_points
# Relationship (5 points)
relationship_points = (perf['relationship_score'] / 10) * 5
score += relationship_points
# Price competitiveness (30 points)
if self.market_data:
market = self.market_data
price_variance = (market['current_price'] - market['market_price']) / market['market_price']
if price_variance <= -0.05: # 5% below market
price_points = 30
factors.append("✓ Very competitive pricing")
elif price_variance <= 0:
price_points = 25
factors.append("✓ Competitive pricing")
elif price_variance <= 0.05:
price_points = 20
factors.append("~ At market price")
elif price_variance <= 0.10:
price_points = 10
factors.append("✗ Above market price")
else:
price_points = 0
factors.append("✗✗ Significantly above market")
score += price_points
# Competitive alternatives (10 points)
if market['competitive_alternatives'] == 0:
score += 0
factors.append("✗ No alternatives (locked in)")
elif market['competitive_alternatives'] <= 2:
score += 5
factors.append("~ Limited alternatives")
else:
score += 10
factors.append("✓ Multiple alternatives available")
# Switching cost consideration (20 points)
switching_cost = self.current_terms.get('switching_cost', 'medium')
if switching_cost == 'low':
score += 20
elif switching_cost == 'medium':
score += 12
else: # high
score += 5
factors.append("⚠ High switching cost")
# Normalize to 100
score = min(score, max_score)
# Recommendation
if score >= 80:
recommendation = "Renew - Strong Performance"
elif score >= 60:
recommendation = "Renew with Renegotiation"
elif score >= 40:
recommendation = "Competitive Bid"
else:
recommendation = "Replace - Poor Value"
return {
'contract_id': self.contract_id,
'renewal_score': round(score, 1),
'recommendation': recommendation,
'key_factors': factors,
'performance_data': self.performance_data,
'market_data': self.market_data
}
# Example usage
renewal = ContractRenewalAnalysis(
contract_id='CNT-12345',
current_terms={
'price': 105,
'volume': 10000,
'switching_cost': 'medium'
}
)
renewal.add_performance_data(
sla_compliance=94.5,
quality_score=8.5,
delivery_score=9.0,
relationship_score=8.0
)
renewal.add_market_data(
market_price=100,
inflation_rate=0.03,
competitive_alternatives=3
)
result = renewal.calculate_renewal_score()
print(f"\nRenewal Analysis: {result['contract_id']}")
print(f"Renewal Score: {result['renewal_score']}/100")
print(f"Recommendation: {result['recommendation']}")
print("\nKey Factors:")
for factor in result['key_factors']:
print(f" {factor}")
合同分析
合同组合分析
def contract_portfolio_analytics(contracts_df):
"""
Analyze contract portfolio
contracts_df: DataFrame with contract details
"""
analytics = {}
# Total contract value
analytics['total_contract_value'] = contracts_df['annual_value'].sum()
# Number of contracts
analytics['total_contracts'] = len(contracts_df)
# Contracts by status
analytics['by_status'] = contracts_df.groupby('status')['annual_value'].agg([
('count', 'count'),
('value', 'sum')
]).to_dict('index')
# Contracts expiring in next 90 days
today = pd.Timestamp.now()
expiry_threshold = today + timedelta(days=90)
expiring_soon = contracts_df[
(contracts_df['end_date'] >= today) &
(contracts_df['end_date'] <= expiry_threshold)
]
analytics['expiring_90_days'] = {
'count': len(expiring_soon),
'value': expiring_soon['annual_value'].sum(),
'contracts': expiring_soon['contract_id'].tolist()
}
# Average contract value
analytics['avg_contract_value'] = contracts_df['annual_value'].mean()
# Contract concentration (top 10 by value)
top_10_value = contracts_df.nlargest(10, 'annual_value')['annual_value'].sum()
analytics['top_10_concentration_%'] = (
top_10_value / analytics['total_contract_value'] * 100
)
# By category
analytics['by_category'] = contracts_df.groupby('category')['annual_value'].agg([
('count', 'count'),
('value', 'sum')
]).to_dict('index')
return analytics
工具与库
Python 库
文档管理:
python-docx:Microsoft Word 文档PyPDF2、pdfplumber:PDF 解析spacy、nltk:自然语言处理pandas:数据分析
合同分析:
numpy:数值分析matplotlib、seaborn:可视化sklearn:用于合同分析的机器学习
商业软件
合同生命周期管理(CLM):
- Coupa CLM:合同管理平台
- SAP Ariba Contracts:合同生命周期管理
- Icertis:企业合同管理
- Agiloft:采用 AI 的 CLM
- DocuSign CLM (SpringCM):数字化合同签订
- Ironclad:数字化合同签订平台
- Concord:合同管理
法律科技:
- Kira Systems:AI 合同审查
- LawGeex:AI 合同审查
- eBrevia:合同分析
文档管理:
- SharePoint:协作与存储
- Box、Dropbox:云存储
- M-Files:智能信息管理
常见挑战与解决方案
挑战:合同分散
问题:
- 合同存储在多个位置
- 没有中央存储库
- 版本控制问题
- 难以找到特定合同
解决方案:
- 实施 CLM 系统
- 建立集中式合同存储库
- 使用元数据进行标记和索引
- 提供搜索功能
- 设置访问控制和权限
- 定期审计和清理
挑战:续约跟踪
问题:
- 错过续约截止日期
- 未注意到自动续约
- 临近截止日期时手忙脚乱
- 丧失谈判筹码
解决方案:
- 自动发送续约提醒(提前 90/60/30 天)
- 使用合同日历/仪表板
- 建立续约工作流
- 要求续约前进行绩效评估
- 制定标准续约时间表
- 让高管了解合同到期情况
挑战:合规监控
问题:
- 无法跟踪合同条款
- 擅自采购
- 价格流失
- 未能及时发现 SLA 不合规
解决方案:
- 建立义务跟踪系统
- 自动发送合规提醒
- 与 P2P 系统集成
- 定期进行合规审计
- 供应商评分卡
- 建立处罚执行流程
挑战:合同谈判专业能力
问题:
- 采购部门缺乏法律专业知识
- 接受对己方不利的条款
- 合同条款不一致
- 面临风险
解决方案:
- 制定标准合同模板
- 与法务团队协作
- 开展谈判培训
- 为常见条款制定操作手册
- 聘请外部法律顾问(针对复杂交易)
- 制定预先批准的条款矩阵
挑战:价值实现
问题:
- 谈判达成的节省未能实现
- 未监控价格上涨
- 未跟踪采购量承诺
- 缺少合同签订后的管理
解决方案:
- 跟踪合同与实际支出的差异
- 定期开展业务评审
- 使用绩效仪表板
- 建立价值实现流程
- 明确利益相关方的责任
- 组建合同合规团队
输出格式
合同摘要报告
执行摘要:
- 合同组合总价值
- 活跃合同数量
- 主要风险与机遇
- 待办事项
合同组合概览:
| 指标 | 数值 |
|---|---|
| 合同总价值 | $45.2M |
| 合同数量 | 127 |
| 平均合同价值 | $356K |
| 90 天内到期 | 15 份合同($8.3M) |
| 合规率 | 87% |
| 前 10 名集中度 | 62% |
需要采取行动的合同:
| 合同 ID | 供应商 | 类别 | 价值 | 到期日 | 所需行动 |
|---|---|---|---|---|---|
| CNT-001 | Supplier A | IT Services | $3.2M | 2026-03-15 | 决定是否续约 |
| CNT-045 | Supplier B | Raw Materials | $2.8M | 2026-04-01 | 重新协商价格 |
| CNT-078 | Supplier C | Logistics | $1.5M | Ongoing | SLA 不合规 |
| CNT-092 | Supplier D | MRO | $0.8M | 2026-02-28 | 未达到约定数量 |
续约计划(未来 12 个月):
Q1 2026: 15 contracts, $8.3M
- 8 recommend renew
- 4 renegotiate
- 3 competitive bid
Q2 2026: 23 contracts, $12.1M
- 15 recommend renew
- 6 renegotiate
- 2 competitive bid
Q3 2026: 18 contracts, $6.8M
Q4 2026: 12 contracts, $4.5M
合规问题:
-
价格偏差:12 份合同的价格偏差超过 5%
- 预计损失:每年 $450K
- 行动:执行合同约定价格
-
数量承诺:8 份合同的履约量低于承诺量的 80%
- 风险:涨价或罚款
- 行动:整合需求或重新协商
-
SLA 未达标:5 家供应商持续未达到 SLA 要求
- 行动:执行罚则,制定改进计划
主要建议:
- 优先处理 Q1 到期的 15 份合同续约
- 重新协商 4 份价格高于市场水平的合同
- 处理 5 家供应商的 SLA 不合规问题
- 实施自动化合规监控
- 将支出集中于表现最佳的供应商
要提出的问题
如需更多背景信息:
- 有多少份活跃合同?总价值是多少?
- 是否已部署 CLM 系统?
- 合同类型有哪些?(MSA、SOW、采购订单)
- 主要关注点是什么?(节省成本、合规、风险、续约管理)
- 目前如何存储和跟踪合同?
- 是否有即将续约或到期的合同?
- 是否存在合规或绩效问题?
- 主要利益相关方有哪些?(采购、法务、财务)
- 跟踪哪些指标或 KPI?
- 是否有需要重点关注的具体合同?
相关技能
- supplier-selection:签约前选择供应商
- strategic-sourcing:品类寻源策略
- procurement-optimization:优化合同条款
- spend-analysis:分析合同支出合规情况
- supplier-risk-management:评估合同风险
- quality-management:监控 SLA 和绩效
评论
支持 Markdown