---
title: Pipelines Changelog
image: https://edgetunnel-b2h.pages.dev/cf-twitter-card.png
---

> Documentation Index  
> Fetch the complete documentation index at: https://edgetunnel-b2h.pages.dev/changelog/llms.txt  
> Use this file to discover all available pages before exploring further. 

[Skip to content](#%5Ftop) 

# Changelog

New updates and improvements at Cloudflare.

[ Subscribe to RSS ](https://edgetunnel-b2h.pages.dev/changelog/rss/index.xml) [ View RSS feeds ](https://edgetunnel-b2h.pages.dev/fundamentals/new-features/available-rss-feeds/) 

Pipelines

![hero image](https://edgetunnel-b2h.pages.dev/_astro/hero.CVYJHPAd_26AMqX.svg) 

Jun 04, 2026
1. ### [Pipeline binding configuration field renamed to stream](https://edgetunnel-b2h.pages.dev/changelog/post/2026-05-27-pipeline-binding-stream-field/)  
[ Pipelines ](https://edgetunnel-b2h.pages.dev/pipelines/)[ Workers ](https://edgetunnel-b2h.pages.dev/workers/)  
The `pipeline` field inside the `pipelines` binding configuration in your [Wrangler configuration file](https://edgetunnel-b2h.pages.dev/workers/wrangler/configuration/) has been renamed to `stream`. The old field is deprecated but still accepted.  
Update your configuration to use `stream` to avoid the deprecation warning.

**Before (deprecated):**

  * [  wrangler.jsonc ](#tab-panel-3324)
  * [  wrangler.toml ](#tab-panel-3325)

**JSONC**  
```jsonc  
{  
  "$schema": "./node_modules/wrangler/config-schema.json",  
  "pipelines": [  
    {  
      "binding": "MY_PIPELINE",  
      "pipeline": "<STREAM_ID>"  
    }  
  ]  
}  
```

**TOML**  
```toml  
[[pipelines]]  
binding = "MY_PIPELINE"  
pipeline = "<STREAM_ID>"  
```

**After:**

  * [  wrangler.jsonc ](#tab-panel-3326)
  * [  wrangler.toml ](#tab-panel-3327)

**JSONC**  
```jsonc  
{  
  "$schema": "./node_modules/wrangler/config-schema.json",  
  "pipelines": [  
    {  
      "binding": "MY_PIPELINE",  
      "stream": "<STREAM_ID>"  
    }  
  ]  
}  
```

**TOML**  
```toml  
[[pipelines]]  
binding = "MY_PIPELINE"  
stream = "<STREAM_ID>"  
```  
No other changes are required. The binding name, TypeScript types, and runtime API (`env.MY_PIPELINE.send(...)`) remain the same.  
For more information on configuring pipeline bindings, refer to [Writing to streams](https://edgetunnel-b2h.pages.dev/pipelines/streams/writing-to-streams/#configure-pipeline-binding).

May 28, 2026
1. ### [Pipelines pricing announced](https://edgetunnel-b2h.pages.dev/changelog/post/2026-05-11-pipelines-pricing-announced/)  
[ Pipelines ](https://edgetunnel-b2h.pages.dev/pipelines/)  
[Cloudflare Pipelines](https://edgetunnel-b2h.pages.dev/pipelines/) is a streaming data platform that ingests events, transforms them with SQL, and writes to [R2](https://edgetunnel-b2h.pages.dev/r2/) as JSON, Parquet, or [Apache Iceberg ↗](https://iceberg.apache.org/) tables. Pipelines now has published pricing based on two usage dimensions: the volume of data processed by SQL transforms and the volume of data delivered to sinks. Ingress into a Pipeline stream is free.

**Billing is not yet enabled. We will provide at least 30 days notice before we start charging for Pipelines usage.**  
Pipelines pricing model is designed to charge per GB based on what you use:

  * **Streams (ingress)**: Free, regardless of volume.
  * **SQL transforms**: $0.04 / GB for stateless transforms (filter, reshape, unnest, cast, compute).
  * **Sinks**: $0.03 / GB for JSON, $0.06 / GB for Parquet or Iceberg output.  
Workers Free plans include 1 GB / month for each dimension. Workers Paid plans include 50 GB / month.  
For full pricing details and billing examples, refer to [Pipelines pricing](https://edgetunnel-b2h.pages.dev/pipelines/platform/pricing/).

May 04, 2026
1. ### [Pipelines and R2 Data Catalog now supported in Terraform](https://edgetunnel-b2h.pages.dev/changelog/post/2026-04-27-terraform-support/)  
[ Pipelines ](https://edgetunnel-b2h.pages.dev/pipelines/)  
[Cloudflare Pipelines](https://edgetunnel-b2h.pages.dev/pipelines/) ingests streaming data via [Workers](https://edgetunnel-b2h.pages.dev/workers/) or HTTP endpoints, transforms it with SQL, and writes it to [R2](https://edgetunnel-b2h.pages.dev/r2/) as Apache Iceberg tables. [R2 Data Catalog](https://edgetunnel-b2h.pages.dev/r2/data-catalog/) manages those Iceberg tables, compaction, and compatibility with query engines like [R2 SQL](https://edgetunnel-b2h.pages.dev/r2-sql/), [Spark](https://edgetunnel-b2h.pages.dev/r2/data-catalog/config-examples/spark-scala/), and [DuckDB](https://edgetunnel-b2h.pages.dev/r2/data-catalog/config-examples/duckdb/).  
You can now create and manage both products using Terraform, supported in the [Cloudflare Terraform provider v5.19.0 ↗](https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs).  
This adds four new resources that let you define your entire data pipeline as infrastructure-as-code: a data catalog, a stream for ingestion, a sink that writes to R2 Data Catalog or R2, and a pipeline that connects them with SQL.  
The new Terraform resources are:

  * [cloudflare\_r2\_data\_catalog ↗](https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/r2%5Fdata%5Fcatalog) — enable the data catalog on an R2 bucket
  * [cloudflare\_pipeline\_stream ↗](https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/pipeline%5Fstream) — create a stream that receives events via HTTP or Worker bindings
  * [cloudflare\_pipeline\_sink ↗](https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/pipeline%5Fsink) — create a sink that writes to R2 Data Catalog or R2
  * [cloudflare\_pipeline ↗](https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/pipeline) — create a pipeline with SQL connecting a stream to a sink  
Here is a minimal example that creates a stream, an R2 Data Catalog sink, and a pipeline:  
```hcl  
resource "cloudflare_pipeline_stream" "my_stream" {  
  account_id = var.cloudflare_account_id  
  name       = "my_stream"  
  format     = { type = "json" }  
  schema = {  
    fields = [{  
      name     = "value"  
      type     = "json"  
      required = true  
    }]  
  }  
  http           = { enabled = true, authentication = false, cors = {} }  
  worker_binding = { enabled = false }  
}  
resource "cloudflare_pipeline_sink" "my_sink" {  
  account_id = var.cloudflare_account_id  
  name       = "my_sink"  
  type       = "r2_data_catalog"  
  format     = { type = "parquet" }  
  schema     = { fields = [] }  
  config = {  
    account_id = var.cloudflare_account_id  
    bucket     = "my-pipeline-bucket"  
    table_name = "my_table"  
    token      = var.catalog_token  
  }  
}  
resource "cloudflare_pipeline" "my_pipeline" {  
  account_id = var.cloudflare_account_id  
  name       = "my_pipeline"  
  sql        = "INSERT INTO ${cloudflare_pipeline_sink.my_sink.name} SELECT * FROM ${cloudflare_pipeline_stream.my_stream.name}"  
}  
```  
For a full end-to-end example that includes R2 bucket creation, data catalog setup, and scoped API token provisioning, refer to the [Pipelines Terraform documentation](https://edgetunnel-b2h.pages.dev/pipelines/reference/terraform/).

Apr 20, 2026
1. ### [Cloudflare Pipelines as a Logpush destination](https://edgetunnel-b2h.pages.dev/changelog/post/2026-04-20-pipelines-logpush-destination/)  
[ Logs ](https://edgetunnel-b2h.pages.dev/logs/)[ Pipelines ](https://edgetunnel-b2h.pages.dev/pipelines/)  
Logpush has traditionally been great at delivering Cloudflare logs to a variety of destinations in JSON format. While JSON is flexible and easily readable, it can be inefficient to store and query at scale.  
With this release, you can now send your logs directly to [Pipelines](https://edgetunnel-b2h.pages.dev/pipelines/) to ingest, transform, and store your logs in [R2](https://edgetunnel-b2h.pages.dev/r2/) as Parquet files or Apache Iceberg tables managed by [R2 Data Catalog](https://edgetunnel-b2h.pages.dev/r2/data-catalog/). This makes the data footprint more compact and more efficient at querying your logs instantly with [R2 SQL](https://edgetunnel-b2h.pages.dev/r2-sql/) or any other query engine that supports Apache Iceberg or Parquet.  
#### Transform logs before storage  
Pipelines SQL runs on each log record in-flight, so you can reshape your data before it is written. For example, you can drop noisy fields, redact sensitive values, or derive new columns:  
```sql  
INSERT INTO http_logs_sink  
SELECT  
  ClientIP,  
  EdgeResponseStatus,  
  to_timestamp_micros(EdgeStartTimestamp) AS event_time,  
  upper(ClientRequestMethod) AS method,  
  sha256(ClientIP) AS hashed_ip  
FROM http_logs_stream  
WHERE EdgeResponseStatus >= 400;  
```  
Pipelines SQL supports string functions, regex, hashing, JSON extraction, timestamp conversion, conditional expressions, and more. For the full list, refer to the [Pipelines SQL reference](https://edgetunnel-b2h.pages.dev/pipelines/sql-reference/).  
#### Get started  
To configure Pipelines as a Logpush destination, refer to [Enable Cloudflare Pipelines](https://edgetunnel-b2h.pages.dev/logs/logpush/logpush-job/enable-destinations/pipelines/).

Feb 24, 2026
1. ### [Dropped event metrics, typed Pipelines bindings, and improved setup](https://edgetunnel-b2h.pages.dev/changelog/post/2026-02-24-typed-bindings-setup-improvements-error-metrics/)  
[ Pipelines ](https://edgetunnel-b2h.pages.dev/pipelines/)[ Workers ](https://edgetunnel-b2h.pages.dev/workers/)  
[Cloudflare Pipelines](https://edgetunnel-b2h.pages.dev/pipelines/) ingests streaming data via [Workers](https://edgetunnel-b2h.pages.dev/workers/) or HTTP endpoints, transforms it with SQL, and writes it to [R2](https://edgetunnel-b2h.pages.dev/r2/) as Apache Iceberg tables. Today we're shipping three improvements to help you understand why streaming events get dropped, catch data quality issues early, and set up Pipelines faster.  
#### Dropped event metrics  
When [stream](https://edgetunnel-b2h.pages.dev/pipelines/streams/) events don't match the expected schema, Pipelines accepts them during ingestion but drops them when attempting to deliver them to the [sink](https://edgetunnel-b2h.pages.dev/pipelines/sinks/). To help you identify the root cause of these issues, we are introducing a new dashboard and metrics that surface dropped events with detailed error messages.  
![The Errors tab in the Cloudflare dashboard showing deserialization errors grouped by type with individual error details](https://edgetunnel-b2h.pages.dev/_astro/pipelines-error-log-dash.6JIa7r5d_Z1ILPxd.webp)  
Dropped events can also be queried programmatically via the new `pipelinesUserErrorsAdaptiveGroups` GraphQL dataset. The dataset breaks down failures by specific error type (`missing_field`, `type_mismatch`, `parse_failure`, or `null_value`) so you can trace issues back to the source.  
```graphql  
query GetPipelineUserErrors(  
  $accountTag: String!  
  $pipelineId: String!  
  $datetimeStart: Time!  
  $datetimeEnd: Time!  
) {  
  viewer {  
    accounts(filter: { accountTag: $accountTag }) {  
      pipelinesUserErrorsAdaptiveGroups(  
        limit: 100  
        filter: {  
          pipelineId: $pipelineId  
          datetime_geq: $datetimeStart  
          datetime_leq: $datetimeEnd  
        }  
        orderBy: [count_DESC]  
      ) {  
        count  
        dimensions {  
          errorFamily  
          errorType  
        }  
      }  
    }  
  }  
}  
```  
For the full list of dimensions, error types, and additional query examples, refer to [User error metrics](https://edgetunnel-b2h.pages.dev/pipelines/observability/metrics/#user-error-metrics).  
#### Typed Pipelines bindings  
Sending data to a Pipeline from a Worker previously used a generic `Pipeline<PipelineRecord>` type, which meant schema mismatches (wrong field names, incorrect types) were only caught at runtime as dropped events.  
Running `wrangler types` now generates schema-specific TypeScript types for your [Pipeline bindings](https://edgetunnel-b2h.pages.dev/pipelines/streams/writing-to-streams/#send-via-workers). TypeScript catches missing required fields and incorrect field types at compile time, before your code is deployed.

**TypeScript**  
```ts  
declare namespace Cloudflare {  
  type EcommerceStreamRecord = {  
    user_id: string;  
    event_type: string;  
    product_id?: string;  
    amount?: number;  
  };  
  interface Env {  
    STREAM: import("cloudflare:pipelines").Pipeline<Cloudflare.EcommerceStreamRecord>;  
  }  
}  
```  
For more information, refer to [Typed Pipeline bindings](https://edgetunnel-b2h.pages.dev/pipelines/streams/writing-to-streams/#typed-pipeline-bindings).  
#### Improved Pipelines setup  
Setting up a new Pipeline previously required multiple manual steps: creating an R2 bucket, enabling R2 Data Catalog, generating an API token, and configuring format, compression, and rolling policies individually.  
The `wrangler pipelines setup` command now offers a **Simple** setup mode that applies recommended defaults and automatically creates the [R2 bucket](https://edgetunnel-b2h.pages.dev/r2/buckets/) and enables [R2 Data Catalog](https://edgetunnel-b2h.pages.dev/r2/data-catalog/) if they do not already exist. Validation errors during setup prompt you to retry inline rather than restarting the entire process.  
For a full walkthrough, refer to the [Getting started guide](https://edgetunnel-b2h.pages.dev/pipelines/getting-started/).

Sep 25, 2025
1. ### [Pipelines now supports SQL transformations and Apache Iceberg](https://edgetunnel-b2h.pages.dev/changelog/post/2025-09-25-pipelines-sql/)  
[ Pipelines ](https://edgetunnel-b2h.pages.dev/pipelines/)  
Today, we're launching the new [Cloudflare Pipelines](https://edgetunnel-b2h.pages.dev/pipelines/): a streaming data platform that ingests events, transforms them with [SQL](https://edgetunnel-b2h.pages.dev/pipelines/sql-reference/select-statements/), and writes to [R2](https://edgetunnel-b2h.pages.dev/r2/) as [Apache Iceberg ↗](https://iceberg.apache.org/) tables or Parquet files.  
Pipelines can receive events via [HTTP endpoints](https://edgetunnel-b2h.pages.dev/pipelines/streams/writing-to-streams/#send-via-http) or [Worker bindings](https://edgetunnel-b2h.pages.dev/pipelines/streams/writing-to-streams/#send-via-workers), transform them with SQL, and deliver to R2 with exactly-once guarantees. This makes it easy to build analytics-ready warehouses for server logs, mobile application events, IoT telemetry, or clickstream data without managing streaming infrastructure.  
For example, here's a pipeline that ingests clickstream events and filters out bot traffic while extracting domain information:  
```sql  
INSERT into events_table  
SELECT  
  user_id,  
  lower(event) AS event_type,  
  to_timestamp_micros(ts_us) AS event_time,  
  regexp_match(url, '^https?://([^/]+)')[1]  AS domain,  
  url,  
  referrer,  
  user_agent  
FROM events_json  
WHERE event = 'page_view'  
  AND NOT regexp_like(user_agent, '(?i)bot|spider');  
```  
Get started by creating a pipeline in the dashboard or running a single command in [Wrangler](https://edgetunnel-b2h.pages.dev/workers/wrangler/):  
```bash  
npx wrangler pipelines setup  
```  
Check out our [getting started guide](https://edgetunnel-b2h.pages.dev/pipelines/getting-started/) to learn how to create a pipeline that delivers events to an [Iceberg table](https://edgetunnel-b2h.pages.dev/r2/data-catalog/) you can query with R2 SQL. Read more about today's announcement in our [blog post ↗](https://blog.cloudflare.com/cloudflare-data-platform).

Apr 10, 2025
1. ### [Cloudflare Pipelines now available in beta](https://edgetunnel-b2h.pages.dev/changelog/post/2025-04-10-launching-pipelines/)  
[ Pipelines ](https://edgetunnel-b2h.pages.dev/pipelines/)[ R2 ](https://edgetunnel-b2h.pages.dev/r2/)[ Workers ](https://edgetunnel-b2h.pages.dev/workers/)  
[Cloudflare Pipelines](https://edgetunnel-b2h.pages.dev/pipelines) is now available in beta, to all users with a [Workers Paid](https://edgetunnel-b2h.pages.dev/workers/platform/pricing) plan.  
Pipelines let you ingest high volumes of real time data, without managing the underlying infrastructure. A single pipeline can ingest up to 100 MB of data per second, via HTTP or from a [Worker](https://edgetunnel-b2h.pages.dev/workers). Ingested data is automatically batched, written to output files, and delivered to an [R2 bucket](https://edgetunnel-b2h.pages.dev/r2) in your account. You can use Pipelines to build a data lake of clickstream data, or to store events from a Worker.  
Create your first pipeline with a single command:

**Create a pipeline**  
```bash  
$ npx wrangler@latest pipelines create my-clickstream-pipeline --r2-bucket my-bucket  
🌀 Authorizing R2 bucket "my-bucket"  
🌀 Creating pipeline named "my-clickstream-pipeline"  
✅ Successfully created pipeline my-clickstream-pipeline  
Id:    0e00c5ff09b34d018152af98d06f5a1xvc  
Name:  my-clickstream-pipeline  
Sources:  
  HTTP:  
    Endpoint:        https://0e00c5ff09b34d018152af98d06f5a1xvc.pipelines.cloudflare.com/  
    Authentication:  off  
    Format:          JSON  
  Worker:  
    Format:  JSON  
Destination:  
  Type:         R2  
  Bucket:       my-bucket  
  Format:       newline-delimited JSON  
  Compression:  GZIP  
Batch hints:  
  Max bytes:     100 MB  
  Max duration:  300 seconds  
  Max records:   100,000  
🎉 You can now send data to your pipeline!  
Send data to your pipeline's HTTP endpoint:  
curl "https://0e00c5ff09b34d018152af98d06f5a1xvc.pipelines.cloudflare.com/" -d '[{ ...JSON_DATA... }]'  
To send data to your pipeline from a Worker, add the following configuration to your config file:  
{  
  "pipelines": [  
    {  
      "pipeline": "my-clickstream-pipeline",  
      "binding": "PIPELINE"  
    }  
  ]  
}  
```  
Head over to our [getting started guide](https://edgetunnel-b2h.pages.dev/pipelines/getting-started) for an in-depth tutorial to building with Pipelines.

```json
{"@context":"https://schema.org","@type":"BlogPosting","@id":"https://edgetunnel-b2h.pages.dev/changelog/product/pipelines/#page","headline":"Pipelines Changelog | Cloudflare Docs","url":"https://edgetunnel-b2h.pages.dev/changelog/product/pipelines/","inLanguage":"en","image":"https://edgetunnel-b2h.pages.dev/cf-twitter-card.png","publisher":{"@type":"Organization","name":"Cloudflare","url":"https://www.cloudflare.com/"},"isPartOf":{"@type":"WebSite","@id":"https://edgetunnel-b2h.pages.dev/#website","name":"Cloudflare Docs","url":"https://edgetunnel-b2h.pages.dev/"}}
```
