# Hospitality Procurement

> When the user wants to optimize hospitality purchasing, manage hotel/restaurant suppliers, or improve procurement processes. Also use when the user mentions "hotel procurement," "restaurant purchasing," "hospitality sourcing," "F&B procurement," "hotel supplier management," "group purchasing organization," "contract negotiation," or "hospitality spend management." For hotel operations, see hotel-…

- **Type:** Skill
- **Install:** `agentstack add skill-kishorkukreja-awesome-supply-chain-hospitality-procurement`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [kishorkukreja](https://agentstack.voostack.com/s/kishorkukreja)
- **Installs:** 0
- **Category:** [Agent Skills](https://agentstack.voostack.com/c/agent-skills)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [kishorkukreja](https://github.com/kishorkukreja)
- **Source:** https://github.com/kishorkukreja/awesome-supply-chain/tree/main/skills/hospitality-procurement

## Install

```sh
agentstack add skill-kishorkukreja-awesome-supply-chain-hospitality-procurement
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# Hospitality Procurement

You are an expert in hospitality procurement and purchasing management. Your goal is to help optimize purchasing strategies, supplier relationships, and cost management for hotels, restaurants, and hospitality operations while maintaining quality standards and operational efficiency.

## Initial Assessment

Before optimizing hospitality procurement, understand:

1. **Property Profile**
   - Property type? (hotel, resort, restaurant, cruise, multi-unit)
   - Size and scale? (rooms, covers, locations)
   - Service level? (luxury, midscale, economy, QSR, fine dining)
   - Ownership structure? (independent, branded, franchise)

2. **Current Procurement Approach**
   - Procurement structure? (centralized, decentralized, hybrid)
   - Spend volume and categories?
   - Supplier base? (number of suppliers, concentration)
   - Contract structures? (fixed price, cost-plus, GPO)

3. **Category Breakdown**
   - F&B spend? (food, beverage, percentage of total)
   - Operating supplies? (cleaning, amenities, linens)
   - Capital purchases? (FF&E - furniture, fixtures, equipment)
   - Services? (maintenance, outsourced services)

4. **Objectives & Challenges**
   - Primary goals? (cost reduction, quality, sustainability)
   - Current pain points? (costs, supplier issues, processes)
   - Technology systems? (procurement platform, ERP)
   - Sustainability targets?

---

## Hospitality Procurement Framework

### Spend Categories

**Food & Beverage (35-45% of procurement spend):**
- Proteins (meat, poultry, seafood)
- Produce (fruits, vegetables)
- Dairy products
- Dry goods and staples
- Beverages (alcoholic, non-alcoholic)
- Specialty ingredients

**Operating Supplies (15-25%):**
- Guest amenities (toiletries, slippers, robes)
- Cleaning supplies and chemicals
- Paper products (toilet paper, napkins, etc.)
- Kitchen disposables
- Office supplies

**Linens & Uniforms (8-12%):**
- Bed linens and towels
- Table linens
- Staff uniforms
- Laundry supplies

**FF&E (Furniture, Fixtures, Equipment) (10-15%):**
- Furniture (beds, chairs, tables)
- Kitchen equipment
- Technology (TVs, phones, Wi-Fi)
- Fixtures and décor

**Services (10-15%):**
- Maintenance and repairs
- Waste management
- Pest control
- Landscaping

---

## Strategic Sourcing & Category Management

### Spend Analysis & Opportunity Identification

```python
import numpy as np
import pandas as pd

class HospitalitySpendAnalyzer:
    """
    Analyze procurement spend to identify savings opportunities
    """

    def __init__(self, spend_data):
        self.spend_data = spend_data  # DataFrame with transactions

    def perform_spend_analysis(self):
        """
        Comprehensive spend analysis

        Key outputs:
        - Spend by category
        - Supplier concentration
        - Maverick spend
        - Price variance analysis
        """

        # Spend by category
        category_spend = self.spend_data.groupby('category').agg({
            'amount': 'sum',
            'supplier': 'nunique',
            'transaction_id': 'count'
        }).reset_index()

        category_spend.columns = ['category', 'total_spend', 'num_suppliers',
                                  'num_transactions']
        category_spend['pct_of_total'] = (
            category_spend['total_spend'] / category_spend['total_spend'].sum() * 100
        )

        # Supplier concentration (80/20 rule)
        supplier_spend = self.spend_data.groupby('supplier')['amount'].sum().sort_values(
            ascending=False
        )

        cumulative_pct = supplier_spend.cumsum() / supplier_spend.sum() * 100
        top_suppliers = cumulative_pct[cumulative_pct  0)
        ].copy()

        items_with_prices['unit_price'] = (
            items_with_prices['amount'] / items_with_prices['quantity']
        )

        # Variance by item
        variance_analysis = items_with_prices.groupby('item_description').agg({
            'unit_price': ['mean', 'std', 'min', 'max', 'count']
        }).reset_index()

        variance_analysis.columns = ['item', 'avg_price', 'std_price',
                                     'min_price', 'max_price', 'transactions']

        # Calculate coefficient of variation
        variance_analysis['cv'] = (
            variance_analysis['std_price'] / variance_analysis['avg_price']
        )

        # Price variance opportunity (difference between min and max)
        variance_analysis['variance_pct'] = (
            (variance_analysis['max_price'] - variance_analysis['min_price']) /
            variance_analysis['avg_price'] * 100
        )

        # High variance items = negotiation opportunities
        high_variance = variance_analysis[
            (variance_analysis['variance_pct'] > 20) &
            (variance_analysis['transactions'] >= 10)
        ].sort_values('variance_pct', ascending=False)

        return high_variance

    def identify_savings_opportunities(self):
        """
        Identify and quantify savings opportunities

        Levers:
        - Consolidation
        - Standardization
        - Negotiation
        - Specification changes
        """

        analysis = self.perform_spend_analysis()

        opportunities = []

        # Supplier consolidation
        category_spend = analysis['category_spend']

        for _, cat in category_spend.iterrows():
            if cat['num_suppliers'] > 5 and cat['total_spend'] > 50000:
                # Opportunity to consolidate
                potential_savings = cat['total_spend'] * 0.08  # 8% savings estimate

                opportunities.append({
                    'category': cat['category'],
                    'opportunity_type': 'Supplier Consolidation',
                    'current_suppliers': cat['num_suppliers'],
                    'target_suppliers': 2,
                    'potential_savings': potential_savings,
                    'confidence': 'Medium'
                })

        # Price standardization
        price_variance = analysis['price_variance']

        for _, item in price_variance.head(20).iterrows():
            if item['variance_pct'] > 30:
                # Calculate savings from standardization to average price
                # (Simplified - would need transaction volumes)
                estimated_savings = item['avg_price'] * 0.15 * item['transactions']

                opportunities.append({
                    'category': 'Price Standardization',
                    'opportunity_type': 'Price Harmonization',
                    'item': item['item'],
                    'current_variance': f"{item['variance_pct']:.1f}%",
                    'potential_savings': estimated_savings,
                    'confidence': 'High'
                })

        return pd.DataFrame(opportunities)

# Example usage
# spend_data would be a DataFrame with columns:
# ['transaction_id', 'date', 'category', 'supplier', 'item_description',
#  'quantity', 'amount', 'location']

spend_data = pd.DataFrame({
    'transaction_id': range(1000),
    'category': np.random.choice(['F&B-Proteins', 'F&B-Produce', 'Supplies',
                                 'Linens', 'Equipment'], 1000),
    'supplier': np.random.choice([f'Supplier_{i}' for i in range(50)], 1000),
    'amount': np.random.uniform(100, 5000, 1000)
})

analyzer = HospitalitySpendAnalyzer(spend_data)
analysis = analyzer.perform_spend_analysis()
opportunities = analyzer.identify_savings_opportunities()

print(f"Total annual spend: ${analysis['total_spend']:,.0f}")
print(f"\nTop opportunities:\n{opportunities.head()}")
```

---

## Supplier Management & Negotiation

### Supplier Scorecard & Performance Management

```python
class SupplierPerformanceManager:
    """
    Track and manage supplier performance across key metrics
    """

    def __init__(self, suppliers):
        self.suppliers = suppliers

    def calculate_supplier_scorecard(self, supplier_id, performance_data):
        """
        Calculate comprehensive supplier scorecard

        KPIs:
        - On-time delivery
        - Quality (acceptance rate)
        - Invoice accuracy
        - Responsiveness
        - Pricing competitiveness
        """

        metrics = {}

        # On-time delivery
        deliveries = performance_data['deliveries']
        on_time = sum([1 for d in deliveries if d['on_time']])
        metrics['on_time_delivery_pct'] = on_time / len(deliveries) * 100

        # Quality - acceptance rate
        receipts = performance_data['receipts']
        accepted = sum([r['quantity_accepted'] for r in receipts])
        delivered = sum([r['quantity_delivered'] for r in receipts])
        metrics['quality_acceptance_pct'] = accepted / delivered * 100 if delivered > 0 else 0

        # Invoice accuracy
        invoices = performance_data['invoices']
        accurate = sum([1 for i in invoices if i['accurate']])
        metrics['invoice_accuracy_pct'] = accurate / len(invoices) * 100 if len(invoices) > 0 else 100

        # Responsiveness (response time to inquiries)
        inquiries = performance_data.get('inquiries', [])
        if inquiries:
            avg_response_hours = np.mean([i['response_time_hours'] for i in inquiries])
            metrics['avg_response_hours'] = avg_response_hours
            # Score:  24 = 50
            if avg_response_hours = 90:
            tier = 'Preferred'
        elif overall_score >= 75:
            tier = 'Approved'
        elif overall_score >= 60:
            tier = 'Conditional'
        else:
            tier = 'Review Required'

        metrics['performance_tier'] = tier

        return metrics

    def supplier_segmentation(self, spend_data, performance_data):
        """
        Segment suppliers using Kraljic matrix

        Dimensions:
        - Spend/value (high/low)
        - Supply risk (high/low)

        Segments:
        - Strategic: High spend, high risk → Partnership
        - Leverage: High spend, low risk → Competitive bidding
        - Bottleneck: Low spend, high risk → Secure supply
        - Routine: Low spend, low risk → Simplify/automate
        """

        supplier_segments = {}

        for supplier_id, spend in spend_data.items():
            risk_score = performance_data.get(supplier_id, {}).get('supply_risk', 50)

            # Determine segment
            high_spend = spend > 100000
            high_risk = risk_score > 60

            if high_spend and high_risk:
                segment = 'Strategic'
                strategy = 'Develop partnership, long-term contracts'
            elif high_spend and not high_risk:
                segment = 'Leverage'
                strategy = 'Competitive bidding, volume discounts'
            elif not high_spend and high_risk:
                segment = 'Bottleneck'
                strategy = 'Secure supply, find alternatives'
            else:
                segment = 'Routine'
                strategy = 'Automate, consolidate, e-procurement'

            supplier_segments[supplier_id] = {
                'segment': segment,
                'spend': spend,
                'risk_score': risk_score,
                'strategy': strategy
            }

        return supplier_segments

# Example
manager = SupplierPerformanceManager([])

performance_data = {
    'deliveries': [
        {'on_time': True},
        {'on_time': True},
        {'on_time': False},
        {'on_time': True},
    ],
    'receipts': [
        {'quantity_delivered': 100, 'quantity_accepted': 98},
        {'quantity_delivered': 200, 'quantity_accepted': 200},
    ],
    'invoices': [
        {'accurate': True},
        {'accurate': True},
        {'accurate': False},
    ],
    'inquiries': [
        {'response_time_hours': 2},
        {'response_time_hours': 3},
    ],
    'price_vs_market': 0.98
}

scorecard = manager.calculate_supplier_scorecard('SUP001', performance_data)
print(f"Overall score: {scorecard['overall_score']:.1f}")
print(f"Performance tier: {scorecard['performance_tier']}")
```

---

## Group Purchasing & Consortia

### GPO (Group Purchasing Organization) Optimization

```python
def evaluate_gpo_membership(current_spend, gpo_contracts, admin_fee_pct=0.03):
    """
    Evaluate value of GPO membership vs. direct negotiation

    Parameters:
    - current_spend: current spending by category
    - gpo_contracts: available GPO contracts and pricing
    - admin_fee_pct: GPO administrative fee (typically 2-5%)
    """

    results = []

    for category, spend in current_spend.items():
        # Current situation
        current_price_index = 1.0  # baseline

        # GPO option
        if category in gpo_contracts:
            gpo_price_index = gpo_contracts[category]['price_index']
            gpo_spend = spend * gpo_price_index
            gpo_fee = gpo_spend * admin_fee_pct
            total_gpo_cost = gpo_spend + gpo_fee

            savings = spend - total_gpo_cost
            savings_pct = savings / spend * 100

            results.append({
                'category': category,
                'current_spend': spend,
                'gpo_spend': gpo_spend,
                'gpo_fee': gpo_fee,
                'total_gpo_cost': total_gpo_cost,
                'savings': savings,
                'savings_pct': savings_pct,
                'recommendation': 'Use GPO' if savings > 0 else 'Direct negotiation'
            })

    results_df = pd.DataFrame(results)

    return {
        'total_current_spend': sum(current_spend.values()),
        'total_gpo_spend': results_df['total_gpo_cost'].sum(),
        'total_savings': results_df['savings'].sum(),
        'savings_pct': results_df['savings'].sum() / sum(current_spend.values()) * 100,
        'category_analysis': results_df
    }

# Example
current_spend = {
    'F&B-Proteins': 500000,
    'F&B-Produce': 300000,
    'Supplies-Cleaning': 150000,
    'Linens': 100000
}

gpo_contracts = {
    'F&B-Proteins': {'price_index': 0.92},  # 8% discount
    'F&B-Produce': {'price_index': 0.95},   # 5% discount
    'Supplies-Cleaning': {'price_index': 0.88},  # 12% discount
    'Linens': {'price_index': 0.90}  # 10% discount
}

gpo_analysis = evaluate_gpo_membership(current_spend, gpo_contracts)
print(f"Total savings with GPO: ${gpo_analysis['total_savings']:,.0f} "
     f"({gpo_analysis['savings_pct']:.1f}%)")
```

---

## Sustainability & Responsible Sourcing

### Sustainable Procurement Scorecard

```python
class SustainableProcurementManager:
    """
    Manage sustainability in procurement decisions
    """

    def __init__(self, sustainability_goals):
        self.goals = sustainability_goals

    def evaluate_supplier_sustainability(self, supplier, certifications,
                                        environmental_data):
        """
        Score supplier on sustainability metrics

        Criteria:
        - Certifications (organic, Fair Trade, sustainable seafood, etc.)
        - Carbon footprint
        - Waste reduction
        - Local sourcing
        - Social responsibility
        """

        score = {}

        # Certifications
        cert_score = 0
        cert_weights = {
            'organic': 20,
            'fair_trade': 15,
            'msc_certified': 15,  # Marine Stewardship Council
            'rainforest_alliance': 10,
            'b_corp': 20,
            'iso_14001': 15
        }

        for cert, points in cert_weights.items():
            if cert in certifications:
                cert_score += points

        score['certification_score'] = min(cert_score, 100)

        # Carbon footprint
        carbon_emissions = environmental_data.get('carbon_kg_per_unit', 0)
        industry_avg = environmental_data.get('industry_avg_carbon', 10)

        if carbon_emissions = 80:
            tier = 'Sustainability Leader'
        elif overall >= 65:
            tier = 'Sustainable'
        elif overall >= 50:
            tier = 'Developing'
        else:
            tier = 'Needs Improvement'

        score['sustainability_tier'] = tier

        return score

    def ca

…

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [kishorkukreja](https://github.com/kishorkukreja)
- **Source:** [kishorkukreja/awesome-supply-chain](https://github.com/kishorkukreja/awesome-supply-chain)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-kishorkukreja-awesome-supply-chain-hospitality-procurement
- Seller: https://agentstack.voostack.com/s/kishorkukreja
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
