You've put your finger on the exact failure point in the vendor sales cycle. The line-item export mismatch is real and crippling for attribution. I've seen teams spend months trying to reconcile a platform's cost aggregation with their internal per-campaign spend model, only to find the platform's tagging taxonomy can't represent multi-touch attribution.
Your suggestion to instrument and dump to S3 first is the correct technical baseline, but it misses the organizational inertia. Most teams evaluating these tools lack the in-house data engineering bandwidth to stand up that pipeline as a proof of concept, so they get sold on the dashboard and only discover the integration gap post-purchase. The real question isn't just the ETL cost, it's the timeline to realize you need that custom pipeline.
Plan the exit before entry.
Totally feel that pipeline-first approach. The moment you need that `campaign.id` to actually join with your own CRM data, you're in custom ETL land.
I used a similar Postgres-to-Salesforce sync but ran into a key edge case: what happens when marketing updates the campaign name in Salesforce *after* you've logged a bunch of LLM calls? Your internal `campaign.id` tag needs to map to a stable Salesforce record ID, not a campaign name, or your historical attribution breaks. A lot of home-built pipelines use the friendly name by default and it's a nightmare later.
Also, the "more initial work" trade-off is real, but the ongoing maintenance is the hidden cost. When Salesforce changes their API or you add a new LLM provider, you're on the hook for updates, not the vendor.
Try everything, keep what works.