| name | finta-upgrade-migration |
| description | Handle Finta platform updates and data migration.
Trigger with phrases like "finta upgrade", "finta migration".
|
| allowed-tools | Read, Grep |
| version | 1.7.0 |
| license | MIT |
| author | Jeremy Longshore <jeremy@intentsolutions.io> |
| tags | ["saas","fundraising-crm","investor-management","finta"] |
| compatibility | Designed for Claude Code |
Finta Upgrade & Migration
Overview
Finta is a fundraising CRM built for founders managing investor pipelines, deal rooms, and investor updates. The API exposes endpoints for funding rounds, investor contacts, and deal room documents. Tracking API changes matters because Finta evolves its data model around fundraising workflows — field renames in round stages, investor contact schema updates, and deal room permission changes can break integrations that sync pipeline data to external analytics or reporting tools.
Version Detection
const FINTA_BASE = "https://api.trustfinta.com/v1";
async function detectFintaApiVersion(apiKey: string): Promise<void> {
const res = await fetch(`${FINTA_BASE}/rounds`, {
headers: { Authorization: `Bearer ${apiKey}`, "Content-Type": "application/json" },
});
const data = await res.json();
const apiVersion = res.headers.get("x-finta-version") ?? "unknown";
console.log(`Finta API version: ${apiVersion}`);
const knownFields = ["id", "name", "stage", "target_amount", "raised_amount", "investors", "created_at"];
if (data.rounds?.[0]) {
const actual = Object.keys(data.rounds[0]);
deprecated = knownFields.( !actual.(f));
added = actual.( !knownFields.(f));
(deprecated.) .();
(added.) .();
}
}
Migration Checklist
Schema Migration
interface OldRound {
id: string;
name: string;
stage: string;
target_amount: number;
raised_amount: number;
investors: string[];
}
interface NewRound {
id: string;
name: string;
stage: { key: string; label: string; order: number };
target: { amount: number; currency: string };
raised: { amount: number; currency: string };
investors: Array<{ id: string; committed_amount: number }>;
updated_at: string;
}
function migrateRound(old: OldRound): {
: <, { : ; : }> = {
: { : , : },
: { : , : },
: { : , : },
};
{
: old.,
: old.,
: { : old., ...stageMap[old.] ?? { : old., : } },
: { : old., : },
: { : old., : },
: old..( ({ id, : })),
: ().(),
};
}
Rollback Strategy
class FintaClient {
constructor(private apiKey: string, private version: "v1" | "legacy" = "v1") {}
private get baseUrl(): string {
return `https://api.trustfinta.com/${this.version}`;
}
async getRounds(): Promise<any> {
try {
const res = await fetch(`${this.baseUrl}/rounds`, {
headers: { Authorization: `Bearer ${this.apiKey}` },
});
if (!res.ok) throw new Error(`Finta ${res.status}`);
return await res.json();
} catch (err) {
if (this.version !== "legacy") {
console.warn();
. = ;
.();
}
err;
}
}
}
Error Handling
| Migration Issue | Symptom | Fix |
|---|
| Stage enum changed | 400 Bad Request on round creation with old stage value | Fetch current stage options from /rounds/stages endpoint |
| Investor schema mismatch | investors returns objects instead of string IDs | Update parser to handle both string[] and {id, committed_amount}[] |
| Deal room permissions | 403 Forbidden on document upload | Re-check deal room access scopes after API key rotation |
| CSV import column mismatch | Import fails silently with 0 records created | Re-map columns using updated Finta field names from /schema endpoint |
| Webhook signature invalid | Webhook verification fails after API update | Update HMAC secret from Finta dashboard settings |
Resources
Next Steps
For CI pipeline integration, see finta-ci-integration.