# Pipelines Gotchas ## Critical Issues ### Events Silently Dropped **Most common issue.** Events accepted (HTTP 200) but never appear in sink. **Causes:** 1. Schema validation fails - structured streams drop invalid events silently 2. Waiting for roll interval (10-300s) - expected behavior **Solution:** Validate client-side with Zod: ```typescript const EventSchema = z.object({ user_id: z.string(), amount: z.number() }); try { const validated = EventSchema.parse(rawEvent); await env.STREAM.send([validated]); } catch (e) { /* get immediate feedback */ } ``` ### Pipelines Are Immutable Cannot modify SQL after creation. Must delete and recreate. ```bash npx wrangler pipelines delete old-pipeline npx wrangler pipelines create new-pipeline --sql "..." ``` **Tip:** Use version naming (`events-pipeline-v1`) and keep SQL in version control. ### Worker Binding Not Found **`env.STREAM is undefined`** 1. Use **stream ID** (not pipeline ID) in `wrangler.jsonc` 2. Redeploy after adding binding ```bash npx wrangler pipelines streams list # Get stream ID npx wrangler deploy ``` ## Common Errors | Error | Cause | Fix | |-------|-------|-----| | Events not in R2 | Roll interval not elapsed | Wait 10-300s, check `roll_interval` | | Schema validation failures | Type mismatch, missing fields | Validate client-side | | Rate limit (429) | >5 MB/s per stream | Batch events, request increase | | Payload too large (413) | >1 MB request | Split into smaller batches | | Cannot delete stream | Pipeline references it | Delete pipelines first | | Sink credential errors | Token expired | Recreate sink with new credentials | ## Limits (Open Beta) | Resource | Limit | |----------|-------| | Streams/Sinks/Pipelines per account | 20 each | | Payload size | 1 MB | | Ingest rate per stream | 5 MB/s | | Event retention | 24 hours | | Recommended batch size | 100 events | ## SQL Limitations - **No JOINs** - single stream per pipeline - **No window functions** - basic SQL only - **No subqueries** - must use `INSERT INTO ... SELECT ... FROM` - **No schema evolution** - cannot modify after creation ## Debug Checklist - [ ] Stream exists: `npx wrangler pipelines streams list` - [ ] Pipeline healthy: `npx wrangler pipelines get ` - [ ] SQL syntax matches schema - [ ] Worker redeployed after binding added - [ ] Waited for roll interval - [ ] Accepted vs processed count matches (no validation drops)