--- name: bamboohr-prod-checklist description: 'Execute BambooHR production deployment checklist and rollback procedures. Use when deploying BambooHR integrations to production, preparing for launch, or implementing go-live procedures with BambooHR API. Trigger with phrases like "bamboohr production", "deploy bamboohr", "bamboohr go-live", "bamboohr launch checklist", "bamboohr prod ready". ' allowed-tools: Read, Bash(kubectl:*), Bash(curl:*), Grep version: 1.0.0 license: MIT author: Jeremy Longshore tags: - saas - hr - bamboohr - production compatibility: Designed for Claude Code --- # BambooHR Production Checklist ## Overview Complete pre-launch checklist for deploying BambooHR integrations to production, covering API configuration, data integrity, monitoring, and rollback procedures. ## Prerequisites - Staging environment tested and verified - Production BambooHR API key ready - Deployment pipeline configured - Monitoring and alerting infrastructure available ## Instructions ### Pre-Deployment Checklist #### Authentication & Secrets - [ ] Production API key created under a service account (not personal account) - [ ] API key stored in secrets manager (AWS Secrets Manager / GCP Secret Manager / Vault) - [ ] `BAMBOOHR_COMPANY_DOMAIN` set correctly for production - [ ] Webhook secret stored securely - [ ] Key rotation procedure documented and tested - [ ] Old staging/test keys will not be deployed to production #### API Integration Quality - [ ] All API calls use `Accept: application/json` header - [ ] Error handling covers all BambooHR HTTP statuses (400, 401, 403, 404, 503) - [ ] `X-BambooHR-Error-Message` header parsed for error details - [ ] `Retry-After` header honored on 503 responses - [ ] Exponential backoff with jitter implemented for retries - [ ] Request queue limits concurrent API calls (max 3-5 parallel) - [ ] No hardcoded employee IDs, company domains, or API keys #### Data Integrity - [ ] Custom reports validated against expected field schema - [ ] Employee directory sync handles new, updated, and terminated employees - [ ] Date fields parsed consistently (`YYYY-MM-DD` format) - [ ] Null/empty field handling tested (BambooHR returns `null` or `""`) - [ ] Unicode employee names handled correctly - [ ] Large directory tested (500+ employees) #### Security & Compliance - [ ] PII fields redacted from application logs - [ ] Webhook signatures verified with HMAC-SHA256 - [ ] Only necessary BambooHR fields requested (least data principle) - [ ] No SSN, salary, or restricted data stored without encryption at rest - [ ] API access audit trail enabled ### Health Check Endpoint ```typescript // api/health.ts import { BambooHRClient, BambooHRApiError } from '../bamboohr/client'; interface HealthStatus { status: 'healthy' | 'degraded' | 'down'; bamboohr: { connected: boolean; latencyMs: number; error?: string; employeeCount?: number; }; timestamp: string; } export async function healthCheck(client: BambooHRClient): Promise { const start = Date.now(); try { const dir = await client.getDirectory(); return { status: 'healthy', bamboohr: { connected: true, latencyMs: Date.now() - start, employeeCount: dir.employees.length, }, timestamp: new Date().toISOString(), }; } catch (err) { const latency = Date.now() - start; const errMsg = err instanceof BambooHRApiError ? err.message : 'Unknown error'; return { status: err instanceof BambooHRApiError && err.retryable ? 'degraded' : 'down', bamboohr: { connected: false, latencyMs: latency, error: errMsg }, timestamp: new Date().toISOString(), }; } } ``` ### Monitoring & Alerting ```typescript // Recommended alert thresholds for BambooHR integrations const ALERTS = { p1_critical: [ { name: 'Auth failure', condition: '401/403 errors > 0', action: 'Page on-call' }, { name: 'API down', condition: 'Health check fails 3x consecutive', action: 'Page on-call' }, ], p2_high: [ { name: 'Rate limited', condition: '503 errors > 3/min', action: 'Slack alert' }, { name: 'High latency', condition: 'p99 > 5000ms', action: 'Slack alert' }, { name: 'Sync failure', condition: 'Sync job fails', action: 'Slack + ticket' }, ], p3_medium: [ { name: 'Elevated errors', condition: '4xx errors > 10/hour', action: 'Log + daily review' }, { name: 'Data mismatch', condition: 'Schema validation failures', action: 'Log + ticket' }, ], }; ``` ### Gradual Rollout Strategy ```bash #!/bin/bash # deploy-bamboohr-integration.sh echo "=== Pre-flight checks ===" # 1. Verify BambooHR API is up curl -sf "https://status.bamboohr.com" > /dev/null || { echo "BambooHR may be down!"; exit 1; } # 2. Verify production credentials work STATUS=$(curl -s -o /dev/null -w "%{http_code}" \ -u "${BAMBOOHR_API_KEY}:x" \ -H "Accept: application/json" \ "https://api.bamboohr.com/api/gateway.php/${BAMBOOHR_COMPANY_DOMAIN}/v1/employees/directory") [ "$STATUS" -eq 200 ] || { echo "Auth check failed: $STATUS"; exit 1; } echo "API auth: OK" # 3. Deploy echo "=== Deploying ===" # Platform-specific deployment command here # kubectl apply -f k8s/production.yaml # fly deploy # gcloud run deploy ... # 4. Post-deploy health check echo "=== Post-deploy verification ===" sleep 10 curl -sf "https://your-app.com/api/health" | jq .bamboohr ``` ### Rollback Procedure ```bash # Immediate rollback # kubectl rollout undo deployment/bamboohr-integration # fly releases rollback # gcloud run services update-traffic --to-revisions=REVISION=100 # Verify rollback health curl -sf "https://your-app.com/api/health" | jq . ``` ## Output - Completed pre-deployment checklist - Health check endpoint deployed - Monitoring alerts configured - Gradual rollout with pre-flight checks - Documented rollback procedure ## Error Handling | Alert | Condition | Severity | Response | |-------|-----------|----------|----------| | Auth failure | 401/403 from BambooHR | P1 | Check API key; rotate if compromised | | Rate limit storm | Continuous 503s | P2 | Pause sync jobs; reduce request rate | | Sync data gap | Missing employees in sync | P2 | Run full resync; check changed-since | | Schema mismatch | New/removed BambooHR fields | P3 | Update field mappings; add defaults | ## Resources - [BambooHR Status Page](https://status.bamboohr.com) - [BambooHR API Changes](https://documentation.bamboohr.com/docs/past-changes-to-the-api) - [BambooHR Planned Changes](https://documentation.bamboohr.com/docs/planned-changes-to-the-api) ## Next Steps For version upgrades, see `bamboohr-upgrade-migration`.