From flexport-pack
Guides Flexport API migrations from legacy freight forwarders, spreadsheets, and ERPs using strangler fig patterns, dual-write, and product catalog imports.
How this skill is triggered — by the user, by Claude, or both
Slash command
/flexport-pack:flexport-migration-deep-diveThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Guide for migrating to Flexport from legacy freight forwarders, manual spreadsheet workflows, or other logistics platforms. Uses a strangler fig pattern to gradually move operations to the Flexport API while maintaining existing systems.
Guide for migrating to Flexport from legacy freight forwarders, manual spreadsheet workflows, or other logistics platforms. Uses a strangler fig pattern to gradually move operations to the Flexport API while maintaining existing systems.
| From | To | Complexity | Timeline |
|---|---|---|---|
| Spreadsheet/email | Flexport API | Low | 2-4 weeks |
| Legacy freight forwarder API | Flexport API | Medium | 4-8 weeks |
| ERP (SAP, Oracle) | ERP + Flexport | High | 8-16 weeks |
| Multiple forwarders | Flexport consolidated | High | 6-12 weeks |
// Migrate product catalog from legacy system to Flexport Product Library
async function migrateProducts(legacyProducts: LegacyProduct[]) {
const results = { success: 0, failed: 0, errors: [] as string[] };
for (const legacy of legacyProducts) {
try {
await fetch('https://api.flexport.com/products', {
method: 'POST',
headers,
body: JSON.stringify({
name: legacy.description,
sku: legacy.partNumber,
hs_code: legacy.tariffCode,
country_of_origin: legacy.originCountry,
unit_cost: { amount: legacy.unitCost, currency: legacy.currency },
weight: { value: legacy.weightKg, unit: 'kg' },
}),
});
results.success++;
} catch (err) {
results.failed++;
results.errors.push(`${legacy.partNumber}: ${err}`);
}
}
console.log(`Products migrated: ${results.success}/${legacyProducts.length}`);
return results;
}
// During migration, write to both systems
class DualWriteShipmentService {
constructor(
private legacy: LegacyForwarderClient,
private flexport: FlexportClient,
private featureFlags: FeatureFlags,
) {}
async createBooking(params: BookingParams) {
// Always write to legacy during migration
const legacyResult = await this.legacy.createBooking(params);
// Write to Flexport if enabled for this route
if (this.featureFlags.isEnabled('flexport_booking', { route: params.route })) {
try {
const fpResult = await this.flexport.createBooking(params);
// Compare results for validation
this.compareResults(legacyResult, fpResult);
} catch (err) {
// Log but don't fail — legacy is still primary
logger.warn({ err, route: params.route }, 'Flexport dual-write failed');
}
}
return legacyResult; // Legacy is source of truth during migration
}
}
// Migrate routes one at a time, validate, then cut over
const MIGRATION_PHASES = [
{ routes: ['CNSHA-USLAX'], startDate: '2025-04-01', description: 'Shanghai-LA (highest volume)' },
{ routes: ['CNSHA-DEHAM', 'CNSHA-NLRTM'], startDate: '2025-05-01', description: 'Asia-Europe' },
{ routes: ['*'], startDate: '2025-06-01', description: 'All remaining routes' },
];
// Validate migration readiness per route
async function validateRoute(route: string): Promise<{
productsCovered: boolean;
webhooksWorking: boolean;
dataParity: boolean;
}> {
// Check all products on this route exist in Flexport
const products = await db.products.findMany({ where: { routes: { has: route } } });
const fpProducts = await flexport('/products?per=100');
const fpSkus = new Set(fpProducts.data.records.map((p: any) => p.sku));
const productsCovered = products.every(p => fpSkus.has(p.sku));
return { productsCovered, webhooksWorking: true, dataParity: true };
}
// After all routes migrated and validated
async function decommissionLegacy() {
// Final data sync — export all historical data
const allShipments = await legacy.exportAllShipments();
await archiveToS3(allShipments, 'legacy-forwarder-archive');
// Disable legacy API keys
// Remove dual-write code paths
// Update monitoring to Flexport-only alerts
logger.info('Legacy forwarder decommissioned');
}
This completes the Flexport skill pack. Start with flexport-install-auth for new integrations.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin flexport-packProvides Flexport reference architecture for supply chain integrations: Ingest (webhooks/polling), Core (business logic), Expose (API/dashboard) with TypeScript layout, Postgres/Redis infra.
Guides Klaviyo migrations from v1/v2 APIs, Mailchimp/SendGrid, or full re-platforming via strangler fig pattern. Includes complexity tables, API mappings, and TypeScript SDK examples.
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.