Skip to main content
Exports land in a bucket as Parquet, CSV or JSONL, usually partitioned by date. Eventarc turns a finalized object into a trigger, and the blob prefix doubles as a resumable watermark.

What you need

  • Read access to the export prefix
  • An Octave workspace API key, from Settings → Integrations
  • A Google Cloud project to deploy into

Where this runs

A Cloud Run function on an Eventarc trigger covers the incremental run. For the backfill, a Cloud Run job is the better fit — same container, but it runs for up to 24 hours instead of being bounded by a request.

The prompt

Copy this into Claude Code, Cursor or any coding agent. It carries the whole flow — reading your warehouse, mapping the columns, posting to Octave, and deploying the result. Fill in section 1 with your real schema and a few sample rows (read the Parquet schema off one blob with pyarrow.parquet.read_schema(), or head -5 a CSV or JSONL object). The more of your actual data it can see, the less it has to guess.
The instruction to show the mapping as a table and wait for confirmation is the part worth keeping. Without it an agent guesses at your column names and buries the guess inside a handler, where a wrong eventType looks exactly like a right one until the data is in.

Hints worth adding

These are the things that go wrong with Google Cloud Storage specifically. Paste whichever apply into section 1 of the prompt — an agent cannot infer them from a schema. Parquet timestamps are not milliseconds. The format stores an explicit unit, and us and ns are both common — neither is what Octave reads a large integer as. Ask for conversion to ISO 8601 at the mapping step. Credentials resolve differently in each environment. Application Default Credentials mean your account locally and the attached service account in production. Say which identity the deployed function runs as, or you get something that works in testing and 403s on the first real trigger. Eventarc can deliver twice. Delivery is at-least-once, so the function must be idempotent. A stable eventId already handles it — worth stating so the AI does not invent a second dedupe layer.