Commit ce598de398 for woocommerce

commit ce598de398ef6b32d416021e7c0c40efb81029f7
Author: Brian Coords <bacoords@gmail.com>
Date:   Wed Dec 10 07:40:28 2025 -0800

    Migrate WooCommerce Extension Scaffolds to create-woo-extension (#62297)

    * remove fixed version for scripts package

    * moves default woo-extension-template to subfolder

    * adds initial admin extensions as create-woo-extension-scaffolds

    * fixes addtask example

    * moves dashboard-section scaffold to create-woo-extension

    * adds sql-modification scaffold

    * removes old sql modification example

    * updates documentation links to scaffolds

    * adds not to previous extension examples readme

    * adds changelog file

    * fallback for block-json removal

    * removes extra character

    * fixes filemtime false dir call

    * updates default plugin classname to pascal case

    * fixes mustache syntax mixup in jsx tmplate

    * ensure data isn't mutated in example

    * fixes incorrect textdomain

    * removes missing version property

    * slug and constant name consistency

    * shows proper sql escaping in tutorial

    * updates changelog to note major changes to scaffolds

    * fixes mustache syntax error in jsx

diff --git a/docs/extensions/extension-onboarding/handling-merchant-onboarding.md b/docs/extensions/extension-onboarding/handling-merchant-onboarding.md
index f3e4671c11..bcf8f14c47 100644
--- a/docs/extensions/extension-onboarding/handling-merchant-onboarding.md
+++ b/docs/extensions/extension-onboarding/handling-merchant-onboarding.md
@@ -1,7 +1,7 @@
 ---
 post_title: How to implement merchant onboarding
 sidebar_label: Implement merchant onboarding
-
+sidebar_position: 1
 ---

 # How to implement merchant onboarding
@@ -16,6 +16,34 @@ Onboarding is a critical part of the merchant's user experience. It helps set th

 ---

+## Getting started
+
+We'll be using `@woocommerce/create-woo-extension` to scaffold a modern WordPress JavaScript environment for plugins. This tool creates a fully functional development environment for integrating with WooCommerce.
+
+In this example, we'll be using the `add-task` variant to create a basic onboarding extension that we can build upon.
+
+In your `wp-content/plugins` directory, run the following command to create your extension:
+
+```sh
+npx @wordpress/create-block -t @woocommerce/create-woo-extension --variant=add-task my-extension-name
+```
+
+Navigate to the newly created folder and start development:
+
+```sh
+cd my-extension-name
+npm run start
+```
+
+Optionally, you can use `wp-env` for a local WordPress environment:
+
+```sh
+npm -g i @wordpress/env
+wp-env start
+```
+
+Don't forget to head over to `/wp-admin/plugins.php` and activate your plugin.
+
 ## Using setup tasks

 Setup tasks appear on the WooCommerce Admin home screen and prompt a merchant to complete certain steps in order to set up your extension. Adding tasks is a two-step process that requires:
diff --git a/docs/features/analytics/adding-columns-to-analytics-reports-and-csv-downloads.md b/docs/features/analytics/adding-columns-to-analytics-reports-and-csv-downloads.md
index 43334c235c..bf7d90821b 100644
--- a/docs/features/analytics/adding-columns-to-analytics-reports-and-csv-downloads.md
+++ b/docs/features/analytics/adding-columns-to-analytics-reports-and-csv-downloads.md
@@ -1,7 +1,7 @@
 ---
 post_title: How to add columns to analytics reports and CSV downloads
 sidebar_label: Add columns to analytics reports
-
+sidebar_position: 2
 ---

 # How to add columns to analytics reports and CSV downloads
diff --git a/docs/features/analytics/extending-woocommerce-admin-reports.md b/docs/features/analytics/extending-woocommerce-admin-reports.md
index b833406a7c..982910eee8 100644
--- a/docs/features/analytics/extending-woocommerce-admin-reports.md
+++ b/docs/features/analytics/extending-woocommerce-admin-reports.md
@@ -1,7 +1,7 @@
 ---
 post_title: How to extend WooCommerce analytics reports
 sidebar_label: Extend analytics reports
-
+sidebar_position: 1
 ---

 # How to extend WooCommerce analytics reports
@@ -10,33 +10,30 @@ sidebar_label: Extend analytics reports

 This document serves as a guide to extending WC-Admin Reports with a basic UI dropdown, added query parameters, and modification of SQL queries and resulting report data. This example will create a currency selector for viewing the Orders Report based on a specific currency.

-Code from this guide can be viewed in the [woocommerce code repository](https://github.com/woocommerce/woocommerce/tree/trunk/plugins/woocommerce/client/admin/docs/examples/extensions/sql-modification).
-
 ## Getting started

-We'll be using a local installation of WordPress with WooCommerce and the development version of WC-Admin to take advantage of `create-wc-extension` as a way to easily scaffold a modern WordPress JavaScript environment for plugins.
+We'll be using `@woocommerce/create-woo-extension` to scaffold a modern WordPress JavaScript environment for plugins. This tool creates a fully functional development environment for integrating with WooCommerce.

-In your local install, clone and start WC-Admin if you haven't already.
+In this example, we'll be using the `sql-modification` variant to create a basic report extension that we can build upon.
+
+In your `wp-content/plugins` directory, run the following command to create your extension:

 ```sh
-cd wp-content/plugins
-git clone git@github.com:woocommerce/woocommerce.git
-cd plugins/woocommerce/client/admin
-npm run build
+npx @wordpress/create-block -t @woocommerce/create-woo-extension --variant=sql-modification my-extension-name
 ```

-Once that's working, we can setup the extension folder ready for JavaScript development.
+Navigate to the newly created folder and start development:

 ```sh
-npm run create-wc-extension
+cd my-extension-name
+npm run start
 ```

-After choosing a name, move into that folder and start webpack to watch and build files.
+Optionally, you can use `wp-env` for a local WordPress environment:

 ```sh
-cd ../<my-plugin-name>
-npm install
-npm start
+npm -g i @wordpress/env
+wp-env start
 ```

 Don't forget to head over to `/wp-admin/plugins.php` and activate your plugin.
@@ -177,13 +174,22 @@ Next, add a WHERE clause

 ```php
 function add_where_subquery( $clauses ) {
+  global $wpdb;
+
 	$currency = 'USD';

 	if ( isset( $_GET['currency'] ) ) {
 		$currency = sanitize_text_field( wp_unslash( $_GET['currency'] ) );
 	}

-	$clauses[] = "AND currency_postmeta.meta_key = '_order_currency' AND currency_postmeta.meta_value = '{$currency}'";
+  // Use $wpdb->prepare to safely escape the currency value for SQL.
+  $prepared_clause = $wpdb->prepare(
+      'AND currency_postmeta.meta_key = %s AND currency_postmeta.meta_value = %s',
+      '_order_currency',
+      $currency
+  );
+
+  $clauses[] = $prepared_clause;

 	return $clauses;
 }
diff --git a/packages/js/create-woo-extension/README.md b/packages/js/create-woo-extension/README.md
index 9e27a4ed2c..c3f89da7d2 100644
--- a/packages/js/create-woo-extension/README.md
+++ b/packages/js/create-woo-extension/README.md
@@ -18,14 +18,38 @@ Navigate to the newly created folder and get started.

 ```bash
 cd my-extension-name
-npm install # Install dependencies
-npm run build # Build the javascript
+npm run start # Watch the javascript for changes
+
+# Local development with wp-env (optional)
 npm -g i @wordpress/env # If you don't already have wp-env
 wp-env start # Start Wordpress environment
 ```

 See the new plugin activated from the WordPress plugins page and navigate to `wp-admin/admin.php?page=wc-admin&path=%2Fmy-extension-name` to check it out.

+## Variants
+
+You can also create different types of WooCommerce extensions by specifying a variant.
+
+```bash
+npx @wordpress/create-block -t @woocommerce/create-woo-extension --variant=add-report my-extension-name
+```
+
+### Analytics Report Variants
+
+These variants create example extensions for modifying WooCommerce Analytics pages.
+
+- `add-report` - Creates a new example report page under the Analytics menu.
+- `dashboard-section` - Adds a custom section to the Analytics Overview area.
+- `sql-modification` - Adds a custom dropdown filter for SQL statements in the Products Analytics report. See the [Extending WooCommerce analytics Reports](https://developer.woocommerce.com/docs/features/analytics/extending-woocommerce-admin-reports/) tutorial for more information.
+- `table-column` - Adds new column(s) to the Products Analytics report.
+
+### Onboarding Variants
+
+These variants create example extensions for modifying the WooCommerce onboarding experience.
+
+- `add-task` - Creates a custom task for the onboarding task list. See the [Handling Merchant Onboarding](https://developer.woocommerce.com/docs/extensions/extension-onboarding/handling-merchant-onboarding/) tutorial for more information.
+
 ## Development

 For development on this tool itself, you can also install from a local directory.
diff --git a/packages/js/create-woo-extension/changelog/migrate-wc-extension-scaffolds b/packages/js/create-woo-extension/changelog/migrate-wc-extension-scaffolds
new file mode 100644
index 0000000000..41d0b04248
--- /dev/null
+++ b/packages/js/create-woo-extension/changelog/migrate-wc-extension-scaffolds
@@ -0,0 +1,4 @@
+Significance: major
+Type: enhancement
+
+**Breaking Change:**  Adds variants for multiple extension scaffolds, templatesPath moved to variants/default subdirectory, new variants API structure introduced, postinstall script modified, and @wordpress/scripts version unpinned
diff --git a/packages/js/create-woo-extension/index.js b/packages/js/create-woo-extension/index.js
index 088a483570..7bd2093ad3 100644
--- a/packages/js/create-woo-extension/index.js
+++ b/packages/js/create-woo-extension/index.js
@@ -1,21 +1,64 @@
+const { join } = require( 'path' );
+
+const defaultDependencies = [
+	'@wordpress/hooks',
+	'@wordpress/i18n',
+	'@woocommerce/components',
+];
+const defaultDevDependencies = [
+	'@woocommerce/dependency-extraction-webpack-plugin',
+	'@woocommerce/eslint-plugin',
+	'@wordpress/prettier-config',
+	'@wordpress/scripts',
+];
+
 module.exports = {
-	templatesPath: __dirname,
+	templatesPath: join( __dirname, 'variants/default' ),
 	defaultValues: {
-		npmDependencies: [
-			'@wordpress/hooks',
-			'@wordpress/i18n',
-			'@woocommerce/components',
-		],
-		npmDevDependencies: [
-			'@woocommerce/dependency-extraction-webpack-plugin',
-			'@woocommerce/eslint-plugin',
-			'@wordpress/prettier-config',
-			'@wordpress/scripts@24.6.0',
-		],
+		npmDependencies: defaultDependencies,
+		npmDevDependencies: defaultDevDependencies,
 		namespace: 'extension',
 		license: 'GPL-3.0+',
 		customScripts: {
-			postinstall: 'composer install',
+			postinstall: 'rm -f block.json && composer install',
+		},
+		transformer: ( view ) => {
+			return {
+				...view,
+				namespaceConstantCase: view.namespace
+					.toUpperCase()
+					.replace( /-/g, '_' ),
+				slugConstantCase: view.slug.toUpperCase().replace( /-/g, '_' ),
+			};
+		},
+	},
+	variants: {
+		'add-report': {
+			pluginTemplatesPath: join( __dirname, 'variants/add-report' ),
+			blockTemplatesPath: null,
+		},
+		'add-task': {
+			pluginTemplatesPath: join( __dirname, 'variants/add-task' ),
+			blockTemplatesPath: null,
+			npmDependencies: [
+				...defaultDependencies,
+				'@woocommerce/onboarding',
+			],
+		},
+		'dashboard-section': {
+			pluginTemplatesPath: join(
+				__dirname,
+				'variants/dashboard-section'
+			),
+			blockTemplatesPath: null,
+		},
+		'table-column': {
+			pluginTemplatesPath: join( __dirname, 'variants/table-column' ),
+			blockTemplatesPath: null,
+		},
+		'sql-modification': {
+			pluginTemplatesPath: join( __dirname, 'variants/sql-modification' ),
+			blockTemplatesPath: null,
 		},
 	},
 };
diff --git a/packages/js/create-woo-extension/variants/add-report/$slug.php.mustache b/packages/js/create-woo-extension/variants/add-report/$slug.php.mustache
new file mode 100644
index 0000000000..7f7166a700
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/add-report/$slug.php.mustache
@@ -0,0 +1,126 @@
+<?php
+/**
+ * Plugin Name: {{title}}
+{{#description}}
+ * Description: {{description}}
+{{/description}}
+ * Version: {{version}}
+{{#author}}
+ * Author: {{author}}
+{{/author}}
+ * Author URI: https://woocommerce.com
+ * Text Domain: {{textdomain}}
+ * Domain Path: /languages
+ *
+ * License: GNU General Public License v3.0
+ * License URI: http://www.gnu.org/licenses/gpl-3.0.html
+ *
+ * @package {{namespace}}
+ */
+
+defined( 'ABSPATH' ) || exit;
+
+if ( ! defined( '{{slugConstantCase}}_MAIN_PLUGIN_FILE' ) ) {
+	define( '{{slugConstantCase}}_MAIN_PLUGIN_FILE', __FILE__ );
+}
+
+require_once plugin_dir_path( __FILE__ ) . '/vendor/autoload_packages.php';
+
+use {{slugPascalCase}}\Admin\Setup;
+
+// phpcs:disable WordPress.Files.FileName
+
+/**
+ * WooCommerce fallback notice.
+ *
+ * @since {{version}}
+ */
+function {{slugSnakeCase}}_missing_wc_notice() {
+	/* translators: %s WC download URL link. */
+	echo '<div class="error"><p><strong>' . sprintf( esc_html__( '{{title}} requires WooCommerce to be installed and active. You can download %s here.', '{{textdomain}}' ), '<a href="https://woocommerce.com/" target="_blank">WooCommerce</a>' ) . '</strong></p></div>';
+}
+
+register_activation_hook( __FILE__, '{{slugSnakeCase}}_activate' );
+
+/**
+ * Activation hook.
+ *
+ * @since {{version}}
+ */
+function {{slugSnakeCase}}_activate() {
+	if ( ! class_exists( 'WooCommerce' ) ) {
+		add_action( 'admin_notices', '{{slugSnakeCase}}_missing_wc_notice' );
+		return;
+	}
+}
+
+if ( ! class_exists( '{{slugPascalCase}}' ) ) :
+	/**
+	 * The {{slugPascalCase}} class.
+	 */
+	class {{slugPascalCase}} {
+		/**
+		 * This class instance.
+		 *
+		 * @var \{{slugPascalCase}} single instance of this class.
+		 */
+		private static $instance;
+
+		/**
+		 * Constructor.
+		 */
+		public function __construct() {
+			if ( is_admin() ) {
+				new Setup();
+			}
+		}
+
+		/**
+		 * Cloning is forbidden.
+		 */
+		public function __clone() {
+			wc_doing_it_wrong( __FUNCTION__, __( 'Cloning is forbidden.', '{{textdomain}}' ), '{{version}}' );
+		}
+
+		/**
+		 * Unserializing instances of this class is forbidden.
+		 */
+		public function __wakeup() {
+			wc_doing_it_wrong( __FUNCTION__, __( 'Unserializing instances of this class is forbidden.', '{{textdomain}}' ), '{{version}}' );
+		}
+
+		/**
+		 * Gets the main instance.
+		 *
+		 * Ensures only one instance can be loaded.
+		 *
+		 * @return \{{slugPascalCase}}
+		 */
+		public static function instance() {
+
+			if ( null === self::$instance ) {
+				self::$instance = new self();
+			}
+
+			return self::$instance;
+		}
+	}
+endif;
+
+add_action( 'plugins_loaded', '{{slugSnakeCase}}_init', 10 );
+
+/**
+ * Initialize the plugin.
+ *
+ * @since {{version}}
+ */
+function {{slugSnakeCase}}_init() {
+	load_plugin_textdomain( '{{textdomain}}', false, plugin_basename( dirname( __FILE__ ) ) . '/languages' );
+
+	if ( ! class_exists( 'WooCommerce' ) ) {
+		add_action( 'admin_notices', '{{slugSnakeCase}}_missing_wc_notice' );
+		return;
+	}
+
+	{{slugPascalCase}}::instance();
+}
diff --git a/packages/js/create-woo-extension/.editorconfig.mustache b/packages/js/create-woo-extension/variants/add-report/.editorconfig.mustache
similarity index 100%
rename from packages/js/create-woo-extension/.editorconfig.mustache
rename to packages/js/create-woo-extension/variants/add-report/.editorconfig.mustache
diff --git a/packages/js/create-woo-extension/.eslintrc.js.mustache b/packages/js/create-woo-extension/variants/add-report/.eslintrc.js.mustache
similarity index 100%
rename from packages/js/create-woo-extension/.eslintrc.js.mustache
rename to packages/js/create-woo-extension/variants/add-report/.eslintrc.js.mustache
diff --git a/packages/js/create-woo-extension/.gitignore.mustache b/packages/js/create-woo-extension/variants/add-report/.gitignore.mustache
similarity index 100%
rename from packages/js/create-woo-extension/.gitignore.mustache
rename to packages/js/create-woo-extension/variants/add-report/.gitignore.mustache
diff --git a/packages/js/create-woo-extension/.prettierrc.json.mustache b/packages/js/create-woo-extension/variants/add-report/.prettierrc.json.mustache
similarity index 100%
rename from packages/js/create-woo-extension/.prettierrc.json.mustache
rename to packages/js/create-woo-extension/variants/add-report/.prettierrc.json.mustache
diff --git a/packages/js/create-woo-extension/.wp-env.json.mustache b/packages/js/create-woo-extension/variants/add-report/.wp-env.json.mustache
similarity index 100%
rename from packages/js/create-woo-extension/.wp-env.json.mustache
rename to packages/js/create-woo-extension/variants/add-report/.wp-env.json.mustache
diff --git a/packages/js/create-woo-extension/variants/add-report/README.md.mustache b/packages/js/create-woo-extension/variants/add-report/README.md.mustache
new file mode 100644
index 0000000000..d64ab7bf4b
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/add-report/README.md.mustache
@@ -0,0 +1,36 @@
+# {{title}}
+
+{{#description}}
+{{description}}
+{{/description}}
+
+This is a WooCommerce extension that adds a custom report to the Analytics section.
+
+## Development
+
+### Getting started
+
+1. `npm install` to install dependencies
+2. `npm start` to start the development server
+3. `npm run build` to build the production version
+
+### File Structure
+
+- `src/index.js` - Main JavaScript file that registers the custom report
+- `includes/Admin/Setup.php` - PHP class that handles script registration and menu item addition
+- `{{slug}}.php` - Main plugin file
+
+## Features
+
+- Adds a custom report page to WooCommerce Analytics
+- Demonstrates how to use the `woocommerce_admin_reports_list` filter
+- Shows example usage of `ReportFilters` and `TableCard` components
+
+## Customization
+
+To customize this report for your needs:
+
+1. Update the report data in `src/index.js`
+2. Modify the table headers and rows to display your data
+3. Connect to your own data source (REST API, database, etc.)
+4. Update the report title and path in `includes/Admin/Setup.php`
diff --git a/packages/js/create-woo-extension/composer.json.mustache b/packages/js/create-woo-extension/variants/add-report/composer.json.mustache
similarity index 100%
rename from packages/js/create-woo-extension/composer.json.mustache
rename to packages/js/create-woo-extension/variants/add-report/composer.json.mustache
diff --git a/packages/js/create-woo-extension/variants/add-report/includes/Admin/Setup.php.mustache b/packages/js/create-woo-extension/variants/add-report/includes/Admin/Setup.php.mustache
new file mode 100644
index 0000000000..f8a1359cd0
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/add-report/includes/Admin/Setup.php.mustache
@@ -0,0 +1,68 @@
+<?php
+
+namespace {{slugPascalCase}}\Admin;
+
+/**
+ * {{slugPascalCase}} Setup Class
+ */
+class Setup {
+	/**
+	 * Constructor.
+	 *
+	 * @since 1.0.0
+	 */
+	public function __construct() {
+		add_action( 'admin_enqueue_scripts', array( $this, 'register_scripts' ) );
+		add_filter( 'woocommerce_analytics_report_menu_items', array( $this, 'add_report_menu_item' ) );
+	}
+
+	/**
+	 * Load all necessary dependencies.
+	 *
+	 * @since 1.0.0
+	 */
+	public function register_scripts() {
+		if ( ! class_exists( 'Automattic\WooCommerce\Admin\PageController' ) ||
+			! \Automattic\WooCommerce\Admin\PageController::is_admin_page()
+		) {
+			return;
+		}
+
+		$script_path       = '/build/index.js';
+		$script_asset_path = dirname( {{slugConstantCase}}_MAIN_PLUGIN_FILE ) . '/build/index.asset.php';
+		$script_asset      = file_exists( $script_asset_path )
+			? require $script_asset_path
+			: array(
+				'dependencies' => array(),
+				'version'      => filemtime( dirname( {{slugConstantCase}}_MAIN_PLUGIN_FILE ) . $script_path ),
+			);
+		$script_url        = plugins_url( $script_path, {{slugConstantCase}}_MAIN_PLUGIN_FILE );
+
+		wp_register_script(
+			'{{slug}}',
+			$script_url,
+			$script_asset['dependencies'],
+			$script_asset['version'],
+			true
+		);
+
+		wp_enqueue_script( '{{slug}}' );
+	}
+
+	/**
+	 * Add report as an Analytics submenu item.
+	 *
+	 * @param array $report_pages Report page menu items.
+	 * @return array Updated report page menu items.
+	 */
+	public function add_report_menu_item( $report_pages ) {
+		$report_pages[] = array(
+			'id'     => '{{slugSnakeCase}}-analytics-report',
+			'title'  => __( '{{title}}', '{{textdomain}}' ),
+			'parent' => 'woocommerce-analytics',
+			'path'   => '/analytics/{{slug}}',
+		);
+
+		return $report_pages;
+	}
+}
diff --git a/packages/js/create-woo-extension/languages/woo-plugin-setup.pot.mustache b/packages/js/create-woo-extension/variants/add-report/languages/woo-plugin-setup.pot.mustache
similarity index 100%
rename from packages/js/create-woo-extension/languages/woo-plugin-setup.pot.mustache
rename to packages/js/create-woo-extension/variants/add-report/languages/woo-plugin-setup.pot.mustache
diff --git a/packages/js/create-woo-extension/variants/add-report/src/index.js.mustache b/packages/js/create-woo-extension/variants/add-report/src/index.js.mustache
new file mode 100644
index 0000000000..832959e86b
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/add-report/src/index.js.mustache
@@ -0,0 +1,71 @@
+/**
+ * External dependencies
+ */
+
+import { addFilter } from '@wordpress/hooks';
+import { Fragment } from '@wordpress/element';
+import { __ } from '@wordpress/i18n';
+
+/**
+ * WooCommerce dependencies
+ */
+import { ReportFilters, TableCard } from '@woocommerce/components';
+
+const Report = ( { path, query } ) => {
+	return (
+		<Fragment>
+			<ReportFilters
+				query={ query }
+				path={ path }
+				filters={ [] }
+				advancedFilters={ {} }
+			/>
+			<TableCard
+				title={ __( 'Example Data', '{{textdomain}}' ) }
+				headers={ [
+					{ label: __( 'Type', '{{textdomain}}' ), key: 'type', isLeftAligned: true, required: true },
+					{ label: __( 'Color', '{{textdomain}}' ), key: 'color' },
+					{ label: __( 'Taste', '{{textdomain}}' ), key: 'taste' },
+				] }
+				rows={ [
+					[
+						{ display: __( 'Granny Smith', '{{textdomain}}' ), value: 'type' },
+						{ display: __( 'Green', '{{textdomain}}' ), value: 'color' },
+						{ display: __( 'Tangy and sweet', '{{textdomain}}' ), value: 'taste' },
+					],
+					[
+						{ display: __( 'Golden Delicious', '{{textdomain}}' ), value: 'type' },
+						{ display: __( 'Gold', '{{textdomain}}' ), value: 'color' },
+						{ display: __( 'Sweet and cheery', '{{textdomain}}' ), value: 'taste' },
+					],
+					[
+						{ display: __( 'Gala', '{{textdomain}}' ), value: 'type' },
+						{ display: __( 'Red', '{{textdomain}}' ), value: 'color' },
+						{ display: __( 'Mild, sweet and crisp', '{{textdomain}}' ), value: 'taste' },
+					],
+					[
+						{ display: __( 'Braeburn', '{{textdomain}}' ), value: 'type' },
+						{ display: __( 'Red', '{{textdomain}}' ), value: 'color' },
+						{ display: __( 'Firm, crisp and pleasing', '{{textdomain}}' ), value: 'taste' },
+					],
+				] }
+				rowsPerPage={ 100 }
+				totalRows={ 1 }
+			/>
+		</Fragment>
+	);
+};
+
+/**
+ * Use the 'woocommerce_admin_reports_list' filter to add a report page.
+ */
+addFilter( 'woocommerce_admin_reports_list', '{{textdomain}}', ( reports ) => {
+	return [
+		...reports,
+		{
+			report: '{{slug}}',
+			title: __( '{{title}}', '{{textdomain}}' ),
+			component: Report,
+		},
+	];
+} );
diff --git a/packages/js/create-woo-extension/tests/Test.php.mustache b/packages/js/create-woo-extension/variants/add-report/tests/Test.php.mustache
similarity index 100%
rename from packages/js/create-woo-extension/tests/Test.php.mustache
rename to packages/js/create-woo-extension/variants/add-report/tests/Test.php.mustache
diff --git a/packages/js/create-woo-extension/webpack.config.js.mustache b/packages/js/create-woo-extension/variants/add-report/webpack.config.js.mustache
similarity index 100%
rename from packages/js/create-woo-extension/webpack.config.js.mustache
rename to packages/js/create-woo-extension/variants/add-report/webpack.config.js.mustache
diff --git a/packages/js/create-woo-extension/variants/add-task/$slug.php.mustache b/packages/js/create-woo-extension/variants/add-task/$slug.php.mustache
new file mode 100644
index 0000000000..910697ca2f
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/add-task/$slug.php.mustache
@@ -0,0 +1,150 @@
+<?php
+/**
+ * Plugin Name: {{title}}
+{{#description}}
+ * Description: {{description}}
+{{/description}}
+ * Version: {{version}}
+{{#author}}
+ * Author: {{author}}
+{{/author}}
+ * Author URI: https://woocommerce.com
+ * Text Domain: {{textdomain}}
+ * Domain Path: /languages
+ *
+ * License: GNU General Public License v3.0
+ * License URI: http://www.gnu.org/licenses/gpl-3.0.html
+ *
+ * @package {{namespace}}
+ */
+
+defined( 'ABSPATH' ) || exit;
+
+if ( ! defined( '{{slugConstantCase}}_MAIN_PLUGIN_FILE' ) ) {
+	define( '{{slugConstantCase}}_MAIN_PLUGIN_FILE', __FILE__ );
+}
+
+require_once plugin_dir_path( __FILE__ ) . '/vendor/autoload_packages.php';
+
+use {{slugPascalCase}}\Admin\Setup;
+use {{slugPascalCase}}\Task;
+
+/**
+ * Register the custom task.
+ *
+ * @since 1.0.0
+ */
+function {{slugSnakeCase}}_register_task() {
+	if ( ! class_exists( 'Automattic\WooCommerce\Admin\Features\OnboardingTasks\TaskLists' ) ) {
+		return;
+	}
+
+	$task_lists = \Automattic\WooCommerce\Admin\Features\OnboardingTasks\TaskLists::instance();
+
+	// Add the task to the extended list.
+	$task_lists::add_task(
+		'extended',
+		new Task(
+			$task_lists::get_list( 'extended' ),
+		)
+	);
+}
+
+add_action( 'init', '{{slugSnakeCase}}_register_task' );
+
+// phpcs:disable WordPress.Files.FileName
+
+/**
+ * WooCommerce fallback notice.
+ *
+ * @since {{version}}
+ */
+function {{slugSnakeCase}}_missing_wc_notice() {
+	/* translators: %s WC download URL link. */
+	echo '<div class="error"><p><strong>' . sprintf( esc_html__( '{{title}} requires WooCommerce to be installed and active. You can download %s here.', '{{textdomain}}' ), '<a href="https://woocommerce.com/" target="_blank">WooCommerce</a>' ) . '</strong></p></div>';
+}
+
+register_activation_hook( __FILE__, '{{slugSnakeCase}}_activate' );
+
+/**
+ * Activation hook.
+ *
+ * @since {{version}}
+ */
+function {{slugSnakeCase}}_activate() {
+	if ( ! class_exists( 'WooCommerce' ) ) {
+		add_action( 'admin_notices', '{{slugSnakeCase}}_missing_wc_notice' );
+		return;
+	}
+}
+
+if ( ! class_exists( '{{slugPascalCase}}' ) ) :
+	/**
+	 * The {{slugPascalCase}} class.
+	 */
+	class {{slugPascalCase}} {
+		/**
+		 * This class instance.
+		 *
+		 * @var \{{slugPascalCase}} single instance of this class.
+		 */
+		private static $instance;
+
+		/**
+		 * Constructor.
+		 */
+		public function __construct() {
+			if ( is_admin() ) {
+				new Setup();
+			}
+		}
+
+		/**
+		 * Cloning is forbidden.
+		 */
+		public function __clone() {
+			wc_doing_it_wrong( __FUNCTION__, __( 'Cloning is forbidden.', '{{textdomain}}' ), '{{version}}' );
+		}
+
+		/**
+		 * Unserializing instances of this class is forbidden.
+		 */
+		public function __wakeup() {
+			wc_doing_it_wrong( __FUNCTION__, __( 'Unserializing instances of this class is forbidden.', '{{textdomain}}' ), '{{version}}' );
+		}
+
+		/**
+		 * Gets the main instance.
+		 *
+		 * Ensures only one instance can be loaded.
+		 *
+		 * @return \{{slugPascalCase}}
+		 */
+		public static function instance() {
+
+			if ( null === self::$instance ) {
+				self::$instance = new self();
+			}
+
+			return self::$instance;
+		}
+	}
+endif;
+
+add_action( 'plugins_loaded', '{{slugSnakeCase}}_init', 10 );
+
+/**
+ * Initialize the plugin.
+ *
+ * @since {{version}}
+ */
+function {{slugSnakeCase}}_init() {
+	load_plugin_textdomain( '{{textdomain}}', false, plugin_basename( dirname( __FILE__ ) ) . '/languages' );
+
+	if ( ! class_exists( 'WooCommerce' ) ) {
+		add_action( 'admin_notices', '{{slugSnakeCase}}_missing_wc_notice' );
+		return;
+	}
+
+	{{slugPascalCase}}::instance();
+}
diff --git a/packages/js/create-woo-extension/variants/add-task/.editorconfig.mustache b/packages/js/create-woo-extension/variants/add-task/.editorconfig.mustache
new file mode 100644
index 0000000000..d7dbce738b
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/add-task/.editorconfig.mustache
@@ -0,0 +1,27 @@
+# This file is for unifying the coding style for different editors and IDEs
+# editorconfig.org
+
+# WordPress Coding Standards
+# https://make.wordpress.org/core/handbook/coding-standards/
+
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+indent_size = 4
+tab_width = 4
+indent_style = tab
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.txt]
+trim_trailing_whitespace = false
+
+[*.{md,json,yml}]
+trim_trailing_whitespace = false
+indent_style = space
+indent_size = 2
+
+[*.json]
+indent_style = tab
\ No newline at end of file
diff --git a/packages/js/create-woo-extension/variants/add-task/.eslintrc.js.mustache b/packages/js/create-woo-extension/variants/add-task/.eslintrc.js.mustache
new file mode 100644
index 0000000000..22ddc24c58
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/add-task/.eslintrc.js.mustache
@@ -0,0 +1,6 @@
+module.exports = {
+	extends: [ 'plugin:@woocommerce/eslint-plugin/recommended' ],
+	rules: {
+		'react/react-in-jsx-scope': 'off',
+	},
+};
diff --git a/packages/js/create-woo-extension/variants/add-task/.gitignore.mustache b/packages/js/create-woo-extension/variants/add-task/.gitignore.mustache
new file mode 100644
index 0000000000..14dfbf25c0
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/add-task/.gitignore.mustache
@@ -0,0 +1,62 @@
+
+# Operating System files
+.DS_Store
+Thumbs.db
+
+# IDE files
+.idea
+.vscode/*
+project.xml
+project.properties
+.project
+.settings*
+*.sublime-project
+*.sublime-workspace
+.sublimelinterrc
+
+# Sass
+.sass-cache/
+
+# Logs
+logs/
+
+# Environment files
+wp-cli.local.yml
+yarn-error.log
+npm-debug.log
+.pnpm-debug.log
+
+# Build files
+*.sql
+*.swp
+*.zip
+
+# Built packages
+build/
+build-module/
+build-style/
+build-types/
+dist/
+
+# Project files
+node_modules/
+vendor/
+
+# TypeScript files
+tsconfig.tsbuildinfo
+
+# Node Package Dependencies
+package-lock.json
+
+# wp-env config
+.wp-env.override.json
+
+# Unit tests
+tmp/
+
+# Composer
+vendor/
+bin/composer/**/vendor/
+lib/vendor/
+contributors.md
+contributors.html
diff --git a/packages/js/create-woo-extension/variants/add-task/.prettierrc.json.mustache b/packages/js/create-woo-extension/variants/add-task/.prettierrc.json.mustache
new file mode 100644
index 0000000000..235376574a
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/add-task/.prettierrc.json.mustache
@@ -0,0 +1 @@
+"@wordpress/prettier-config"
diff --git a/packages/js/create-woo-extension/variants/add-task/.wp-env.json.mustache b/packages/js/create-woo-extension/variants/add-task/.wp-env.json.mustache
new file mode 100644
index 0000000000..1368e9f5eb
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/add-task/.wp-env.json.mustache
@@ -0,0 +1,13 @@
+{
+	"phpVersion": null,
+	"core": null,
+	"plugins": [
+		"https://downloads.wordpress.org/plugin/woocommerce.zip",
+		"."
+	],
+	"config": {
+		"JETPACK_AUTOLOAD_DEV": true,
+		"WP_DEBUG": true,
+		"SCRIPT_DEBUG": true
+	}
+}
diff --git a/packages/js/create-woo-extension/variants/add-task/README.md.mustache b/packages/js/create-woo-extension/variants/add-task/README.md.mustache
new file mode 100644
index 0000000000..1b50d22b53
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/add-task/README.md.mustache
@@ -0,0 +1,42 @@
+# {{title}}
+
+{{#description}}
+{{description}}
+{{/description}}
+
+This is a WooCommerce extension that adds a custom task to the WooCommerce onboarding wizard.
+
+## Development
+
+### Getting started
+
+1. `npm install` to install dependencies
+2. `npm start` to start the development server
+3. `npm run build` to build the production version
+
+### File Structure
+
+- `src/index.js` - Main JavaScript file that registers the task content and list item customization
+- `includes/Admin/Setup.php` - PHP class that handles task registration and script enqueuing
+- `includes/Task.php` - Custom task class extending WooCommerce's base Task class
+- `{{slug}}.php` - Main plugin file
+
+## Features
+
+- Adds a custom task to the WooCommerce onboarding task list
+- Demonstrates how to extend the `Task` base class
+- Shows how to use `WooOnboardingTask` and `WooOnboardingTaskListItem` components
+- Includes example of task completion and action tracking
+
+## Customization
+
+To customize this task for your needs:
+
+1. Update the task properties in `includes/Task.php` (ID, title, content, time)
+2. Modify the task content UI in `src/index.js`
+3. Add custom logic for task completion and actions
+4. Customize the task list item styling and behavior
+
+## Learn More
+
+For more information about WooCommerce onboarding tasks, see the [WooCommerce documentation](https://woocommerce.com/document/woocommerce-onboarding-tasks/).
diff --git a/packages/js/create-woo-extension/variants/add-task/composer.json.mustache b/packages/js/create-woo-extension/variants/add-task/composer.json.mustache
new file mode 100644
index 0000000000..e1f0f00964
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/add-task/composer.json.mustache
@@ -0,0 +1,18 @@
+{
+	"name": "{{namespace}}/{{slug}}",
+	"description": "WooCommerce plugin",
+	"autoload": {
+		"psr-4": {
+			"{{slugPascalCase}}\\": "includes/"
+		}
+	},
+	"require-dev": {
+		"phpunit/phpunit": "^9.0",
+		"automattic/jetpack-autoloader": "^2"
+	},
+	"config": {
+		"allow-plugins": {
+			"automattic/jetpack-autoloader": true
+		}
+	}
+}
diff --git a/plugins/woocommerce/client/admin/docs/examples/extensions/add-task/images/task-example.png b/packages/js/create-woo-extension/variants/add-task/images/task-example.png
similarity index 100%
rename from plugins/woocommerce/client/admin/docs/examples/extensions/add-task/images/task-example.png
rename to packages/js/create-woo-extension/variants/add-task/images/task-example.png
diff --git a/packages/js/create-woo-extension/variants/add-task/includes/Admin/Setup.php.mustache b/packages/js/create-woo-extension/variants/add-task/includes/Admin/Setup.php.mustache
new file mode 100644
index 0000000000..42e4abe2ee
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/add-task/includes/Admin/Setup.php.mustache
@@ -0,0 +1,53 @@
+<?php
+
+namespace {{slugPascalCase}}\Admin;
+
+use {{slugPascalCase}}\Task;
+
+/**
+ * {{slugPascalCase}} Setup Class
+ */
+class Setup {
+	/**
+	 * Constructor.
+	 *
+	 * @since 1.0.0
+	 */
+	public function __construct() {
+		add_action( 'admin_enqueue_scripts', array( $this, 'register_scripts' ) );
+	}
+
+	/**
+	 * Register scripts to fill the task content on the frontend.
+	 *
+	 * @since 1.0.0
+	 */
+	public function register_scripts() {
+		if (
+			! class_exists( 'Automattic\WooCommerce\Internal\Admin\Loader' ) ||
+			! \Automattic\WooCommerce\Admin\PageController::is_admin_or_embed_page()
+		) {
+			return;
+		}
+
+		$script_path       = '/build/index.js';
+		$script_asset_path = dirname( {{slugConstantCase}}_MAIN_PLUGIN_FILE ) . '/build/index.asset.php';
+		$script_asset      = file_exists( $script_asset_path )
+			? require $script_asset_path
+			: array(
+				'dependencies' => array(),
+				'version'      => filemtime( dirname( {{slugConstantCase}}_MAIN_PLUGIN_FILE ) . $script_path ),
+			);
+		$script_url        = plugins_url( $script_path, {{slugConstantCase}}_MAIN_PLUGIN_FILE );
+
+		wp_register_script(
+			'{{slug}}',
+			$script_url,
+			$script_asset['dependencies'],
+			$script_asset['version'],
+			true
+		);
+
+		wp_enqueue_script( '{{slug}}' );
+	}
+}
diff --git a/plugins/woocommerce/client/admin/docs/examples/extensions/add-task/class-mytask.php b/packages/js/create-woo-extension/variants/add-task/includes/Task.php.mustache
similarity index 59%
rename from plugins/woocommerce/client/admin/docs/examples/extensions/add-task/class-mytask.php
rename to packages/js/create-woo-extension/variants/add-task/includes/Task.php.mustache
index 62555ce82c..1f119384d6 100644
--- a/plugins/woocommerce/client/admin/docs/examples/extensions/add-task/class-mytask.php
+++ b/packages/js/create-woo-extension/variants/add-task/includes/Task.php.mustache
@@ -1,23 +1,20 @@
 <?php
-/**
- * Custom task example.
- *
- * @package WooCommerce\Admin
- */

-use Automattic\WooCommerce\Admin\Features\OnboardingTasks\Task;
+namespace {{slugPascalCase}};
+
+use Automattic\WooCommerce\Admin\Features\OnboardingTasks\Task as BaseTask;

 /**
  * Custom task class.
  */
-class MyTask extends Task {
+class Task extends BaseTask {
 	/**
 	 * Get the task ID.
 	 *
 	 * @return string
 	 */
 	public function get_id() {
-		return 'my-task';
+		return '{{slugSnakeCase}}-task';
 	}

 	/**
@@ -26,7 +23,7 @@ class MyTask extends Task {
 	 * @return string
 	 */
 	public function get_title() {
-		return __( 'My task', 'woocommerce' );
+		return __( '{{title}}', '{{textdomain}}' );
 	}

 	/**
@@ -35,7 +32,7 @@ class MyTask extends Task {
 	 * @return string
 	 */
 	public function get_content() {
-		return __( 'Add your task description here for display in the task list.', 'woocommerce' );
+		return __( 'Add your task description here for display in the task list.', '{{textdomain}}' );
 	}

 	/**
@@ -44,6 +41,6 @@ class MyTask extends Task {
 	 * @return string
 	 */
 	public function get_time() {
-		return __( '2 minutes', 'woocommerce' );
+		return __( '2 minutes', '{{textdomain}}' );
 	}
 }
diff --git a/packages/js/create-woo-extension/variants/add-task/languages/woo-plugin-setup.pot.mustache b/packages/js/create-woo-extension/variants/add-task/languages/woo-plugin-setup.pot.mustache
new file mode 100644
index 0000000000..6b65dab943
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/add-task/languages/woo-plugin-setup.pot.mustache
@@ -0,0 +1,45 @@
+# Copyright (C) 2022 WooCommerce
+# This file is distributed under the GNU General Public License v3.0.
+msgid ""
+msgstr ""
+"Project-Id-Version: Woo Plugin Setup 1.0.0\n"
+"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/{{slug}}\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"POT-Creation-Date: 2022-11-27T21:35:18+00:00\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"X-Generator: WP-CLI 2.7.1\n"
+"X-Domain: {{slug}}\n"
+
+#. Plugin Name of the plugin
+msgid "Woo Plugin Setup"
+msgstr ""
+
+#. Plugin URI of the plugin
+msgid "https://github.com/psealock/woo-plugin-setup"
+msgstr ""
+
+#. Description of the plugin
+msgid "This is an example of an extension template to follow."
+msgstr ""
+
+#. Author of the plugin
+msgid "WooCommerce"
+msgstr ""
+
+#. Author URI of the plugin
+msgid "https://woocommerce.com"
+msgstr ""
+
+#: build/index.js:1
+#: src/index.js:13
+msgid "My Example Extension"
+msgstr ""
+
+#: build/index.js:1
+#: src/index.js:20
+msgid "My Example Page"
+msgstr ""
diff --git a/plugins/woocommerce/client/admin/docs/examples/extensions/add-task/js/index.js b/packages/js/create-woo-extension/variants/add-task/src/index.js.mustache
similarity index 64%
rename from plugins/woocommerce/client/admin/docs/examples/extensions/add-task/js/index.js
rename to packages/js/create-woo-extension/variants/add-task/src/index.js.mustache
index b39d69dc91..af89211e53 100644
--- a/plugins/woocommerce/client/admin/docs/examples/extensions/add-task/js/index.js
+++ b/packages/js/create-woo-extension/variants/add-task/src/index.js.mustache
@@ -4,7 +4,7 @@
  */
 import { createElement } from '@wordpress/element';
 import { __ } from '@wordpress/i18n';
-import { Card, CardBody } from '@wordpress/components';
+import { Card, CardBody, CardFooter, Button } from '@wordpress/components';
 import { onboardingStore } from '@woocommerce/data';
 import { registerPlugin } from '@wordpress/plugins';
 import { useDispatch } from '@wordpress/data';
@@ -13,7 +13,7 @@ import {
 	WooOnboardingTaskListItem,
 } from '@woocommerce/onboarding';

-const Task = ( { onComplete, task } ) => {
+const TaskContent = ( { onComplete, task } ) => {
 	const { actionTask } = useDispatch( onboardingStore );
 	const { isActioned } = task;

@@ -22,55 +22,56 @@ const Task = ( { onComplete, task } ) => {
 			<CardBody>
 				{ __(
 					"This task's completion status is dependent on being actioned. The action button below will action this task, while the complete button will optimistically complete the task in the task list and redirect back to the task list. Note that in this example, the task must be actioned for completion to persist.",
-					'plugin-domain'
+					'{{textdomain}}'
 				) }{ ' ' }
 				<br />
 				<br />
-				{ __( 'Task actioned status: ', 'plugin-domain' ) }{ ' ' }
+				{ __( 'Task actioned status: ', '{{textdomain}}' ) }{ ' ' }
 				{ isActioned ? 'actioned' : 'not actioned' }
 				<br />
 				<br />
-				<div>
-					<button
-						onClick={ () => {
-							actionTask( 'my-task' );
-						} }
-					>
-						{ __( 'Action task', 'plugin-domain' ) }
-					</button>
-					<button onClick={ onComplete }>
-						{ __( 'Complete', 'plugin-domain' ) }
-					</button>
-				</div>
 			</CardBody>
+			<CardFooter>
+				<Button
+					onClick={ () => {
+						actionTask( '{{slugSnakeCase}}-task' );
+					} }
+					variant='primary'
+				>
+					{ __( 'Action task', '{{textdomain}}' ) }
+				</Button>
+				<Button onClick={ onComplete } variant='secondary'>
+					{ __( 'Complete', '{{textdomain}}' ) }
+				</Button>
+			</CardFooter>
 		</Card>
 	);
 };

-registerPlugin( 'add-task-content', {
+registerPlugin( '{{textdomain}}-task-content', {
 	render: () => (
-		<WooOnboardingTask id="my-task">
+		<WooOnboardingTask id="{{slugSnakeCase}}-task">
 			{ ( {
 				onComplete,
 				// eslint-disable-next-line @typescript-eslint/no-unused-vars
 				query,
 				task,
-			} ) => <Task onComplete={ onComplete } task={ task } /> }
+			} ) => <TaskContent onComplete={ onComplete } task={ task } /> }
 		</WooOnboardingTask>
 	),
 	scope: 'woocommerce-tasks',
 } );

-registerPlugin( 'my-task-list-item-plugin', {
+registerPlugin( '{{textdomain}}-task-list-item', {
 	scope: 'woocommerce-tasks',
 	render: () => (
-		<WooOnboardingTaskListItem id="my-task">
+		<WooOnboardingTaskListItem id="{{slugSnakeCase}}-task">
 			{ ( { defaultTaskItem: DefaultTaskItem } ) => (
 				// Add a custom wrapper around the default task item.
 				<div
 					className="woocommerce-custom-tasklist-item"
 					style={ {
-						border: '1px solid red',
+						border: '1px solid #e0e0e0',
 					} }
 				>
 					<DefaultTaskItem />
diff --git a/packages/js/create-woo-extension/variants/add-task/tests/Test.php.mustache b/packages/js/create-woo-extension/variants/add-task/tests/Test.php.mustache
new file mode 100644
index 0000000000..2a23d93567
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/add-task/tests/Test.php.mustache
@@ -0,0 +1,15 @@
+<?php
+use PHPUnit\Framework\TestCase;
+
+/**
+ * Basic unit tests.
+ */
+final class Test extends TestCase {
+
+	/**
+	 * Test if 1 === 1.
+	 */
+	public function testEquality(): void {
+		$this->assertEquals( 1, 1 );
+	}
+}
diff --git a/packages/js/create-woo-extension/variants/add-task/webpack.config.js.mustache b/packages/js/create-woo-extension/variants/add-task/webpack.config.js.mustache
new file mode 100644
index 0000000000..7c211bc7ca
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/add-task/webpack.config.js.mustache
@@ -0,0 +1,13 @@
+const defaultConfig = require( '@wordpress/scripts/config/webpack.config' );
+const WooCommerceDependencyExtractionWebpackPlugin = require( '@woocommerce/dependency-extraction-webpack-plugin' );
+
+module.exports = {
+	...defaultConfig,
+	plugins: [
+		...defaultConfig.plugins.filter(
+			( plugin ) =>
+				plugin.constructor.name !== 'DependencyExtractionWebpackPlugin'
+		),
+		new WooCommerceDependencyExtractionWebpackPlugin(),
+	],
+};
diff --git a/packages/js/create-woo-extension/variants/dashboard-section/$slug.php.mustache b/packages/js/create-woo-extension/variants/dashboard-section/$slug.php.mustache
new file mode 100644
index 0000000000..7f7166a700
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/dashboard-section/$slug.php.mustache
@@ -0,0 +1,126 @@
+<?php
+/**
+ * Plugin Name: {{title}}
+{{#description}}
+ * Description: {{description}}
+{{/description}}
+ * Version: {{version}}
+{{#author}}
+ * Author: {{author}}
+{{/author}}
+ * Author URI: https://woocommerce.com
+ * Text Domain: {{textdomain}}
+ * Domain Path: /languages
+ *
+ * License: GNU General Public License v3.0
+ * License URI: http://www.gnu.org/licenses/gpl-3.0.html
+ *
+ * @package {{namespace}}
+ */
+
+defined( 'ABSPATH' ) || exit;
+
+if ( ! defined( '{{slugConstantCase}}_MAIN_PLUGIN_FILE' ) ) {
+	define( '{{slugConstantCase}}_MAIN_PLUGIN_FILE', __FILE__ );
+}
+
+require_once plugin_dir_path( __FILE__ ) . '/vendor/autoload_packages.php';
+
+use {{slugPascalCase}}\Admin\Setup;
+
+// phpcs:disable WordPress.Files.FileName
+
+/**
+ * WooCommerce fallback notice.
+ *
+ * @since {{version}}
+ */
+function {{slugSnakeCase}}_missing_wc_notice() {
+	/* translators: %s WC download URL link. */
+	echo '<div class="error"><p><strong>' . sprintf( esc_html__( '{{title}} requires WooCommerce to be installed and active. You can download %s here.', '{{textdomain}}' ), '<a href="https://woocommerce.com/" target="_blank">WooCommerce</a>' ) . '</strong></p></div>';
+}
+
+register_activation_hook( __FILE__, '{{slugSnakeCase}}_activate' );
+
+/**
+ * Activation hook.
+ *
+ * @since {{version}}
+ */
+function {{slugSnakeCase}}_activate() {
+	if ( ! class_exists( 'WooCommerce' ) ) {
+		add_action( 'admin_notices', '{{slugSnakeCase}}_missing_wc_notice' );
+		return;
+	}
+}
+
+if ( ! class_exists( '{{slugPascalCase}}' ) ) :
+	/**
+	 * The {{slugPascalCase}} class.
+	 */
+	class {{slugPascalCase}} {
+		/**
+		 * This class instance.
+		 *
+		 * @var \{{slugPascalCase}} single instance of this class.
+		 */
+		private static $instance;
+
+		/**
+		 * Constructor.
+		 */
+		public function __construct() {
+			if ( is_admin() ) {
+				new Setup();
+			}
+		}
+
+		/**
+		 * Cloning is forbidden.
+		 */
+		public function __clone() {
+			wc_doing_it_wrong( __FUNCTION__, __( 'Cloning is forbidden.', '{{textdomain}}' ), '{{version}}' );
+		}
+
+		/**
+		 * Unserializing instances of this class is forbidden.
+		 */
+		public function __wakeup() {
+			wc_doing_it_wrong( __FUNCTION__, __( 'Unserializing instances of this class is forbidden.', '{{textdomain}}' ), '{{version}}' );
+		}
+
+		/**
+		 * Gets the main instance.
+		 *
+		 * Ensures only one instance can be loaded.
+		 *
+		 * @return \{{slugPascalCase}}
+		 */
+		public static function instance() {
+
+			if ( null === self::$instance ) {
+				self::$instance = new self();
+			}
+
+			return self::$instance;
+		}
+	}
+endif;
+
+add_action( 'plugins_loaded', '{{slugSnakeCase}}_init', 10 );
+
+/**
+ * Initialize the plugin.
+ *
+ * @since {{version}}
+ */
+function {{slugSnakeCase}}_init() {
+	load_plugin_textdomain( '{{textdomain}}', false, plugin_basename( dirname( __FILE__ ) ) . '/languages' );
+
+	if ( ! class_exists( 'WooCommerce' ) ) {
+		add_action( 'admin_notices', '{{slugSnakeCase}}_missing_wc_notice' );
+		return;
+	}
+
+	{{slugPascalCase}}::instance();
+}
diff --git a/packages/js/create-woo-extension/variants/dashboard-section/.editorconfig.mustache b/packages/js/create-woo-extension/variants/dashboard-section/.editorconfig.mustache
new file mode 100644
index 0000000000..d7dbce738b
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/dashboard-section/.editorconfig.mustache
@@ -0,0 +1,27 @@
+# This file is for unifying the coding style for different editors and IDEs
+# editorconfig.org
+
+# WordPress Coding Standards
+# https://make.wordpress.org/core/handbook/coding-standards/
+
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+indent_size = 4
+tab_width = 4
+indent_style = tab
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.txt]
+trim_trailing_whitespace = false
+
+[*.{md,json,yml}]
+trim_trailing_whitespace = false
+indent_style = space
+indent_size = 2
+
+[*.json]
+indent_style = tab
\ No newline at end of file
diff --git a/packages/js/create-woo-extension/variants/dashboard-section/.eslintrc.js.mustache b/packages/js/create-woo-extension/variants/dashboard-section/.eslintrc.js.mustache
new file mode 100644
index 0000000000..22ddc24c58
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/dashboard-section/.eslintrc.js.mustache
@@ -0,0 +1,6 @@
+module.exports = {
+	extends: [ 'plugin:@woocommerce/eslint-plugin/recommended' ],
+	rules: {
+		'react/react-in-jsx-scope': 'off',
+	},
+};
diff --git a/packages/js/create-woo-extension/variants/dashboard-section/.gitignore.mustache b/packages/js/create-woo-extension/variants/dashboard-section/.gitignore.mustache
new file mode 100644
index 0000000000..14dfbf25c0
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/dashboard-section/.gitignore.mustache
@@ -0,0 +1,62 @@
+
+# Operating System files
+.DS_Store
+Thumbs.db
+
+# IDE files
+.idea
+.vscode/*
+project.xml
+project.properties
+.project
+.settings*
+*.sublime-project
+*.sublime-workspace
+.sublimelinterrc
+
+# Sass
+.sass-cache/
+
+# Logs
+logs/
+
+# Environment files
+wp-cli.local.yml
+yarn-error.log
+npm-debug.log
+.pnpm-debug.log
+
+# Build files
+*.sql
+*.swp
+*.zip
+
+# Built packages
+build/
+build-module/
+build-style/
+build-types/
+dist/
+
+# Project files
+node_modules/
+vendor/
+
+# TypeScript files
+tsconfig.tsbuildinfo
+
+# Node Package Dependencies
+package-lock.json
+
+# wp-env config
+.wp-env.override.json
+
+# Unit tests
+tmp/
+
+# Composer
+vendor/
+bin/composer/**/vendor/
+lib/vendor/
+contributors.md
+contributors.html
diff --git a/packages/js/create-woo-extension/variants/dashboard-section/.prettierrc.json.mustache b/packages/js/create-woo-extension/variants/dashboard-section/.prettierrc.json.mustache
new file mode 100644
index 0000000000..235376574a
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/dashboard-section/.prettierrc.json.mustache
@@ -0,0 +1 @@
+"@wordpress/prettier-config"
diff --git a/packages/js/create-woo-extension/variants/dashboard-section/.wp-env.json.mustache b/packages/js/create-woo-extension/variants/dashboard-section/.wp-env.json.mustache
new file mode 100644
index 0000000000..1368e9f5eb
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/dashboard-section/.wp-env.json.mustache
@@ -0,0 +1,13 @@
+{
+	"phpVersion": null,
+	"core": null,
+	"plugins": [
+		"https://downloads.wordpress.org/plugin/woocommerce.zip",
+		"."
+	],
+	"config": {
+		"JETPACK_AUTOLOAD_DEV": true,
+		"WP_DEBUG": true,
+		"SCRIPT_DEBUG": true
+	}
+}
diff --git a/packages/js/create-woo-extension/variants/dashboard-section/README.md.mustache b/packages/js/create-woo-extension/variants/dashboard-section/README.md.mustache
new file mode 100644
index 0000000000..ea368af7bb
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/dashboard-section/README.md.mustache
@@ -0,0 +1,58 @@
+# {{title}}
+
+{{#description}}
+{{description}}
+{{/description}}
+
+This is a WooCommerce extension that adds a custom section to the WooCommerce Analytics dashboard.
+
+## Development
+
+### Getting started
+
+1. `npm install` to install dependencies
+2. `npm start` to start the development server
+3. `npm run build` to build the production version
+
+### File Structure
+
+- `src/index.js` - Main JavaScript file that registers the dashboard section
+- `src/components/GlobalPrices.js` - Example chart component
+- `src/components/UpcomingEvents.js` - Example table component
+- `includes/Admin/Setup.php` - PHP class that handles script registration
+- `{{slug}}.php` - Main plugin file
+
+## Features
+
+- Adds a custom section to the WooCommerce dashboard
+- Demonstrates how to use the `woocommerce_dashboard_default_sections` filter
+- Shows example usage of WooCommerce components:
+  - `SectionHeader` with customizable menu
+  - `Chart` component for visualizations
+  - `TableCard` component for data tables
+- Includes section visibility controls and block toggling
+
+## Dashboard Section Structure
+
+A dashboard section consists of:
+- **Section header** with title and menu controls
+- **Dashboard items** - individual blocks that can be shown/hidden
+- **Components** - React components that render each dashboard item
+
+## Customization
+
+To customize this dashboard section for your needs:
+
+1. Update the dashboard items in `src/index.js`:
+   - Modify the `dashboardItems` array to add/remove blocks
+   - Update the `config` data to match your use case
+2. Create new components in `src/components/`:
+   - Use WooCommerce components like `Chart`, `TableCard`, `Card`
+   - Connect to your own data sources
+3. Customize the section appearance:
+   - Update the section title, icon, and key
+   - Modify visibility and block hiding behavior
+
+## Learn More
+
+For more information about WooCommerce dashboard customization, see the [WooCommerce documentation](https://woocommerce.com/document/woocommerce-analytics/).
diff --git a/packages/js/create-woo-extension/variants/dashboard-section/composer.json.mustache b/packages/js/create-woo-extension/variants/dashboard-section/composer.json.mustache
new file mode 100644
index 0000000000..e1f0f00964
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/dashboard-section/composer.json.mustache
@@ -0,0 +1,18 @@
+{
+	"name": "{{namespace}}/{{slug}}",
+	"description": "WooCommerce plugin",
+	"autoload": {
+		"psr-4": {
+			"{{slugPascalCase}}\\": "includes/"
+		}
+	},
+	"require-dev": {
+		"phpunit/phpunit": "^9.0",
+		"automattic/jetpack-autoloader": "^2"
+	},
+	"config": {
+		"allow-plugins": {
+			"automattic/jetpack-autoloader": true
+		}
+	}
+}
diff --git a/packages/js/create-woo-extension/variants/dashboard-section/includes/Admin/Setup.php.mustache b/packages/js/create-woo-extension/variants/dashboard-section/includes/Admin/Setup.php.mustache
new file mode 100644
index 0000000000..c2b547b53c
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/dashboard-section/includes/Admin/Setup.php.mustache
@@ -0,0 +1,50 @@
+<?php
+
+namespace {{slugPascalCase}}\Admin;
+
+/**
+ * {{slugPascalCase}} Setup Class
+ */
+class Setup {
+	/**
+	 * Constructor.
+	 *
+	 * @since 1.0.0
+	 */
+	public function __construct() {
+		add_action( 'admin_enqueue_scripts', array( $this, 'register_scripts' ) );
+	}
+
+	/**
+	 * Load all necessary dependencies.
+	 *
+	 * @since 1.0.0
+	 */
+	public function register_scripts() {
+		if ( ! class_exists( 'Automattic\WooCommerce\Admin\PageController' ) ||
+			! \Automattic\WooCommerce\Admin\PageController::is_admin_page()
+		) {
+			return;
+		}
+
+		$script_path       = '/build/index.js';
+		$script_asset_path = dirname( {{slugConstantCase}}_MAIN_PLUGIN_FILE ) . '/build/index.asset.php';
+		$script_asset      = file_exists( $script_asset_path )
+			? require $script_asset_path
+			: array(
+				'dependencies' => array(),
+				'version'      => filemtime( dirname( {{slugConstantCase}}_MAIN_PLUGIN_FILE ) . $script_path ),
+			);
+		$script_url        = plugins_url( $script_path, {{slugConstantCase}}_MAIN_PLUGIN_FILE );
+
+		wp_register_script(
+			'{{slug}}',
+			$script_url,
+			$script_asset['dependencies'],
+			$script_asset['version'],
+			true
+		);
+
+		wp_enqueue_script( '{{slug}}' );
+	}
+}
diff --git a/packages/js/create-woo-extension/variants/dashboard-section/languages/woo-plugin-setup.pot.mustache b/packages/js/create-woo-extension/variants/dashboard-section/languages/woo-plugin-setup.pot.mustache
new file mode 100644
index 0000000000..6b65dab943
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/dashboard-section/languages/woo-plugin-setup.pot.mustache
@@ -0,0 +1,45 @@
+# Copyright (C) 2022 WooCommerce
+# This file is distributed under the GNU General Public License v3.0.
+msgid ""
+msgstr ""
+"Project-Id-Version: Woo Plugin Setup 1.0.0\n"
+"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/{{slug}}\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"POT-Creation-Date: 2022-11-27T21:35:18+00:00\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"X-Generator: WP-CLI 2.7.1\n"
+"X-Domain: {{slug}}\n"
+
+#. Plugin Name of the plugin
+msgid "Woo Plugin Setup"
+msgstr ""
+
+#. Plugin URI of the plugin
+msgid "https://github.com/psealock/woo-plugin-setup"
+msgstr ""
+
+#. Description of the plugin
+msgid "This is an example of an extension template to follow."
+msgstr ""
+
+#. Author of the plugin
+msgid "WooCommerce"
+msgstr ""
+
+#. Author URI of the plugin
+msgid "https://woocommerce.com"
+msgstr ""
+
+#: build/index.js:1
+#: src/index.js:13
+msgid "My Example Extension"
+msgstr ""
+
+#: build/index.js:1
+#: src/index.js:20
+msgid "My Example Page"
+msgstr ""
diff --git a/packages/js/create-woo-extension/variants/dashboard-section/src/components/GlobalPrices.js.mustache b/packages/js/create-woo-extension/variants/dashboard-section/src/components/GlobalPrices.js.mustache
new file mode 100644
index 0000000000..d19f1d15e4
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/dashboard-section/src/components/GlobalPrices.js.mustache
@@ -0,0 +1,60 @@
+/**
+ * External dependencies
+ */
+import moment from 'moment';
+import { __ } from '@wordpress/i18n';
+
+/**
+ * WooCommerce dependencies
+ */
+import { Card, CardHeader, CardBody } from '@wordpress/components';
+import { Chart } from '@woocommerce/components';
+import Currency from '@woocommerce/currency';
+
+const storeCurrency = Currency();
+const data = [];
+
+for ( let i = 1; i <= 20; i++ ) {
+	const date = moment().subtract( i, 'days' );
+	data.push( {
+		date: date.format( 'YYYY-MM-DDT00:00:00' ),
+		primary: {
+			label: __( 'Global Apple Prices, last 20 days', '{{textdomain}}' ),
+			labelDate: date.format( 'YYYY-MM-DD 00:00:00' ),
+			value: Math.floor( Math.random() * 100 ),
+		},
+	} );
+}
+
+const GlobalPrices = () => {
+	const average =
+		data.reduce( ( total, item ) => total + item.primary.value, 0 ) /
+		data.length;
+	const legendTotals = { primary: average };
+	return (
+		<Card className="woocommerce-dashboard__chart-block woocommerce-analytics__card">
+			<CardHeader>
+				<h3>
+					{__('Global Apple Prices', '{{textdomain}}')}
+				</h3>
+			</CardHeader>
+			<CardBody>
+				<Chart
+					title={__(
+						'Global Apple Prices',
+						'{{textdomain}}'
+					)}
+					interval="day"
+					data={[...data].reverse()}
+					dateParser="%Y-%m-%dT%H:%M:%S"
+					legendTotals={legendTotals}
+					showHeaderControls={false}
+					valueType={'currency'}
+					tooltipValueFormat={storeCurrency.formatCurrency}
+				/>
+			</CardBody>
+		</Card>
+	);
+};
+
+export default GlobalPrices;
diff --git a/plugins/woocommerce/client/admin/docs/examples/extensions/dashboard-section/js/upcoming-events.js b/packages/js/create-woo-extension/variants/dashboard-section/src/components/UpcomingEvents.js.mustache
similarity index 68%
rename from plugins/woocommerce/client/admin/docs/examples/extensions/dashboard-section/js/upcoming-events.js
rename to packages/js/create-woo-extension/variants/dashboard-section/src/components/UpcomingEvents.js.mustache
index a3a7fdbf89..17a7b18865 100644
--- a/plugins/woocommerce/client/admin/docs/examples/extensions/dashboard-section/js/upcoming-events.js
+++ b/packages/js/create-woo-extension/variants/dashboard-section/src/components/UpcomingEvents.js.mustache
@@ -2,6 +2,7 @@
  * External dependencies
  */
 import { flatten } from 'lodash';
+import { __ } from '@wordpress/i18n';

 /**
  * WooCommerce dependencies
@@ -22,11 +23,11 @@ const UpcomingEvents = ( { config } ) => {
 	);
 	return (
 		<TableCard
-			title={ 'Upcoming Events' }
+			title={ __( 'Upcoming Events', '{{textdomain}}' ) }
 			headers={ [
-				{ label: 'Variety', key: 'variety' },
-				{ label: 'Event', key: 'event' },
-				{ label: 'Date', key: 'date' },
+				{ label: __( 'Variety', '{{textdomain}}' ), key: 'variety' },
+				{ label: __( 'Event', '{{textdomain}}' ), key: 'event' },
+				{ label: __( 'Date', '{{textdomain}}' ), key: 'date' },
 			] }
 			rows={ rows }
 			rowsPerPage={ 100 }
diff --git a/plugins/woocommerce/client/admin/docs/examples/extensions/dashboard-section/js/index.js b/packages/js/create-woo-extension/variants/dashboard-section/src/index.js.mustache
similarity index 67%
rename from plugins/woocommerce/client/admin/docs/examples/extensions/dashboard-section/js/index.js
rename to packages/js/create-woo-extension/variants/dashboard-section/src/index.js.mustache
index eea77641b2..443d45dad0 100644
--- a/plugins/woocommerce/client/admin/docs/examples/extensions/dashboard-section/js/index.js
+++ b/packages/js/create-woo-extension/variants/dashboard-section/src/index.js.mustache
@@ -20,39 +20,39 @@ import {
 /**
  * Internal dependencies
  */
-import UpcomingEvents from './upcoming-events';
-import GlobalPrices from './global-prices';
+import UpcomingEvents from './components/UpcomingEvents';
+import GlobalPrices from './components/GlobalPrices';

 const config = [
 	{
-		title: 'Granny Smith',
-		events: [ { date: '2020-01-02', title: 'The Granny Apple Fair' } ],
+		title: __( 'Granny Smith', '{{textdomain}}' ),
+		events: [ { date: '2020-01-02', title: __( 'The Granny Apple Fair', '{{textdomain}}' ) } ],
 	},
 	{
-		title: 'Golden Delicious',
+		title: __( 'Golden Delicious', '{{textdomain}}' ),
 		events: [
-			{ date: '2020-04-15', title: 'Madrid Manzana Dorada' },
-			{ date: '2020-05-07', title: 'Golden CO Golden Delicious Day' },
+			{ date: '2020-04-15', title: __( 'Madrid Manzana Dorada', '{{textdomain}}' ) },
+			{ date: '2020-05-07', title: __( 'Golden CO Golden Delicious Day', '{{textdomain}}' ) },
 		],
 	},
 	{
-		title: 'Gala',
-		events: [ { date: '2020-08-31', title: 'The Met Gala Pomme' } ],
+		title: __( 'Gala', '{{textdomain}}' ),
+		events: [ { date: '2020-08-31', title: __( 'The Met Gala Pomme', '{{textdomain}}' ) } ],
 	},
 	{
-		title: 'Braeburn',
-		events: [ { date: '2020-08-18', title: 'Mt. Aoraki Crisper' } ],
+		title: __( 'Braeburn', '{{textdomain}}' ),
+		events: [ { date: '2020-08-18', title: __( 'Mt. Aoraki Crisper', '{{textdomain}}' ) } ],
 	},
 ];

 const dashboardItems = [
 	{
-		title: 'Upcoming Events',
+		title: __( 'Upcoming Events', '{{textdomain}}' ),
 		component: UpcomingEvents,
 		key: 'upcoming-events',
 	},
 	{
-		title: 'Global Apple Prices',
+		title: __( 'Global Apple Prices', '{{textdomain}}' ),
 		component: GlobalPrices,
 		key: 'global-prices',
 	},
@@ -75,11 +75,11 @@ class Section extends Component {

 		return (
 			<EllipsisMenu
-				label={ __( 'Choose Apples', 'woocommerce-admin' ) }
+				label={ __( 'Choose Items', '{{textdomain}}' ) }
 				renderContent={ ( { onToggle } ) => (
 					<Fragment>
 						<MenuTitle>
-							{ __( 'My Apples', 'woocommerce-admin' ) }
+							{ __( 'Dashboard Items', '{{textdomain}}' ) }
 						</MenuTitle>
 						{ dashboardItems.map( ( item ) => (
 							<MenuItem
@@ -133,14 +133,14 @@ class Section extends Component {

 addFilter(
 	'woocommerce_dashboard_default_sections',
-	'plugin-domain',
+	'{{textdomain}}',
 	( sections ) => {
 		return [
 			...sections,
 			{
-				key: 'dashboard-apples',
+				key: '{{slugSnakeCase}}-dashboard',
 				component: Section,
-				title: __( 'Apples', 'woocommerce-admin' ),
+				title: __( '{{title}}', '{{textdomain}}' ),
 				isVisible: true,
 				icon: wordpress,
 				hiddenBlocks: [],
diff --git a/packages/js/create-woo-extension/variants/dashboard-section/tests/Test.php.mustache b/packages/js/create-woo-extension/variants/dashboard-section/tests/Test.php.mustache
new file mode 100644
index 0000000000..2a23d93567
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/dashboard-section/tests/Test.php.mustache
@@ -0,0 +1,15 @@
+<?php
+use PHPUnit\Framework\TestCase;
+
+/**
+ * Basic unit tests.
+ */
+final class Test extends TestCase {
+
+	/**
+	 * Test if 1 === 1.
+	 */
+	public function testEquality(): void {
+		$this->assertEquals( 1, 1 );
+	}
+}
diff --git a/packages/js/create-woo-extension/variants/dashboard-section/webpack.config.js.mustache b/packages/js/create-woo-extension/variants/dashboard-section/webpack.config.js.mustache
new file mode 100644
index 0000000000..7c211bc7ca
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/dashboard-section/webpack.config.js.mustache
@@ -0,0 +1,13 @@
+const defaultConfig = require( '@wordpress/scripts/config/webpack.config' );
+const WooCommerceDependencyExtractionWebpackPlugin = require( '@woocommerce/dependency-extraction-webpack-plugin' );
+
+module.exports = {
+	...defaultConfig,
+	plugins: [
+		...defaultConfig.plugins.filter(
+			( plugin ) =>
+				plugin.constructor.name !== 'DependencyExtractionWebpackPlugin'
+		),
+		new WooCommerceDependencyExtractionWebpackPlugin(),
+	],
+};
diff --git a/packages/js/create-woo-extension/$slug.php.mustache b/packages/js/create-woo-extension/variants/default/$slug.php.mustache
similarity index 88%
rename from packages/js/create-woo-extension/$slug.php.mustache
rename to packages/js/create-woo-extension/variants/default/$slug.php.mustache
index 8482f8e138..3200dc7da3 100644
--- a/packages/js/create-woo-extension/$slug.php.mustache
+++ b/packages/js/create-woo-extension/variants/default/$slug.php.mustache
@@ -20,8 +20,8 @@

 defined( 'ABSPATH' ) || exit;

-if ( ! defined( 'MAIN_PLUGIN_FILE' ) ) {
-	define( 'MAIN_PLUGIN_FILE', __FILE__ );
+if ( ! defined( '{{slugConstantCase}}_MAIN_PLUGIN_FILE' ) ) {
+	define( '{{slugConstantCase}}_MAIN_PLUGIN_FILE', __FILE__ );
 }

 require_once plugin_dir_path( __FILE__ ) . '/vendor/autoload_packages.php';
@@ -54,15 +54,15 @@ function {{slugSnakeCase}}_activate() {
 	}
 }

-if ( ! class_exists( '{{slugSnakeCase}}' ) ) :
+if ( ! class_exists( '{{slugPascalCase}}' ) ) :
 	/**
-	 * The {{slugSnakeCase}} class.
+	 * The {{slugPascalCase}} class.
 	 */
-	class {{slugSnakeCase}} {
+	class {{slugPascalCase}} {
 		/**
 		 * This class instance.
 		 *
-		 * @var \{{slugSnakeCase}} single instance of this class.
+		 * @var \{{slugPascalCase}} single instance of this class.
 		 */
 		private static $instance;

@@ -122,6 +122,5 @@ function {{slugSnakeCase}}_init() {
 		return;
 	}

-	{{slugSnakeCase}}::instance();
-
+	{{slugPascalCase}}::instance();
 }
diff --git a/packages/js/create-woo-extension/variants/default/.editorconfig.mustache b/packages/js/create-woo-extension/variants/default/.editorconfig.mustache
new file mode 100644
index 0000000000..d7dbce738b
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/default/.editorconfig.mustache
@@ -0,0 +1,27 @@
+# This file is for unifying the coding style for different editors and IDEs
+# editorconfig.org
+
+# WordPress Coding Standards
+# https://make.wordpress.org/core/handbook/coding-standards/
+
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+indent_size = 4
+tab_width = 4
+indent_style = tab
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.txt]
+trim_trailing_whitespace = false
+
+[*.{md,json,yml}]
+trim_trailing_whitespace = false
+indent_style = space
+indent_size = 2
+
+[*.json]
+indent_style = tab
\ No newline at end of file
diff --git a/packages/js/create-woo-extension/variants/default/.eslintrc.js.mustache b/packages/js/create-woo-extension/variants/default/.eslintrc.js.mustache
new file mode 100644
index 0000000000..22ddc24c58
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/default/.eslintrc.js.mustache
@@ -0,0 +1,6 @@
+module.exports = {
+	extends: [ 'plugin:@woocommerce/eslint-plugin/recommended' ],
+	rules: {
+		'react/react-in-jsx-scope': 'off',
+	},
+};
diff --git a/packages/js/create-woo-extension/variants/default/.gitignore.mustache b/packages/js/create-woo-extension/variants/default/.gitignore.mustache
new file mode 100644
index 0000000000..14dfbf25c0
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/default/.gitignore.mustache
@@ -0,0 +1,62 @@
+
+# Operating System files
+.DS_Store
+Thumbs.db
+
+# IDE files
+.idea
+.vscode/*
+project.xml
+project.properties
+.project
+.settings*
+*.sublime-project
+*.sublime-workspace
+.sublimelinterrc
+
+# Sass
+.sass-cache/
+
+# Logs
+logs/
+
+# Environment files
+wp-cli.local.yml
+yarn-error.log
+npm-debug.log
+.pnpm-debug.log
+
+# Build files
+*.sql
+*.swp
+*.zip
+
+# Built packages
+build/
+build-module/
+build-style/
+build-types/
+dist/
+
+# Project files
+node_modules/
+vendor/
+
+# TypeScript files
+tsconfig.tsbuildinfo
+
+# Node Package Dependencies
+package-lock.json
+
+# wp-env config
+.wp-env.override.json
+
+# Unit tests
+tmp/
+
+# Composer
+vendor/
+bin/composer/**/vendor/
+lib/vendor/
+contributors.md
+contributors.html
diff --git a/packages/js/create-woo-extension/variants/default/.prettierrc.json.mustache b/packages/js/create-woo-extension/variants/default/.prettierrc.json.mustache
new file mode 100644
index 0000000000..235376574a
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/default/.prettierrc.json.mustache
@@ -0,0 +1 @@
+"@wordpress/prettier-config"
diff --git a/packages/js/create-woo-extension/variants/default/.wp-env.json.mustache b/packages/js/create-woo-extension/variants/default/.wp-env.json.mustache
new file mode 100644
index 0000000000..1368e9f5eb
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/default/.wp-env.json.mustache
@@ -0,0 +1,13 @@
+{
+	"phpVersion": null,
+	"core": null,
+	"plugins": [
+		"https://downloads.wordpress.org/plugin/woocommerce.zip",
+		"."
+	],
+	"config": {
+		"JETPACK_AUTOLOAD_DEV": true,
+		"WP_DEBUG": true,
+		"SCRIPT_DEBUG": true
+	}
+}
diff --git a/packages/js/create-woo-extension/README.md.mustache b/packages/js/create-woo-extension/variants/default/README.md.mustache
similarity index 100%
rename from packages/js/create-woo-extension/README.md.mustache
rename to packages/js/create-woo-extension/variants/default/README.md.mustache
diff --git a/packages/js/create-woo-extension/variants/default/composer.json.mustache b/packages/js/create-woo-extension/variants/default/composer.json.mustache
new file mode 100644
index 0000000000..e1f0f00964
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/default/composer.json.mustache
@@ -0,0 +1,18 @@
+{
+	"name": "{{namespace}}/{{slug}}",
+	"description": "WooCommerce plugin",
+	"autoload": {
+		"psr-4": {
+			"{{slugPascalCase}}\\": "includes/"
+		}
+	},
+	"require-dev": {
+		"phpunit/phpunit": "^9.0",
+		"automattic/jetpack-autoloader": "^2"
+	},
+	"config": {
+		"allow-plugins": {
+			"automattic/jetpack-autoloader": true
+		}
+	}
+}
diff --git a/packages/js/create-woo-extension/includes/Admin/Setup.php.mustache b/packages/js/create-woo-extension/variants/default/includes/Admin/Setup.php.mustache
similarity index 77%
rename from packages/js/create-woo-extension/includes/Admin/Setup.php.mustache
rename to packages/js/create-woo-extension/variants/default/includes/Admin/Setup.php.mustache
index 43e5c6723e..acfa0effe6 100644
--- a/packages/js/create-woo-extension/includes/Admin/Setup.php.mustache
+++ b/packages/js/create-woo-extension/variants/default/includes/Admin/Setup.php.mustache
@@ -29,14 +29,14 @@ class Setup {
 		}

 		$script_path       = '/build/index.js';
-		$script_asset_path = dirname( MAIN_PLUGIN_FILE ) . '/build/index.asset.php';
+		$script_asset_path = dirname( {{slugConstantCase}}_MAIN_PLUGIN_FILE ) . '/build/index.asset.php';
 		$script_asset      = file_exists( $script_asset_path )
 		? require $script_asset_path
 		: array(
 			'dependencies' => array(),
-			'version'      => filemtime( $script_path ),
+			'version'      => filemtime( dirname( {{slugConstantCase}}_MAIN_PLUGIN_FILE ) . $script_path ),
 		);
-		$script_url        = plugins_url( $script_path, MAIN_PLUGIN_FILE );
+		$script_url        = plugins_url( $script_path, {{slugConstantCase}}_MAIN_PLUGIN_FILE );

 		wp_register_script(
 			'{{slug}}',
@@ -48,10 +48,10 @@ class Setup {

 		wp_register_style(
 			'{{slug}}',
-			plugins_url( '/build/index.css', MAIN_PLUGIN_FILE ),
+			plugins_url( '/build/index.css', {{slugConstantCase}}_MAIN_PLUGIN_FILE ),
 			// Add any dependencies styles may have, such as wp-components.
 			array(),
-			filemtime( dirname( MAIN_PLUGIN_FILE ) . '/build/index.css' )
+			filemtime( dirname( {{slugConstantCase}}_MAIN_PLUGIN_FILE ) . '/build/index.css' )
 		);

 		wp_enqueue_script( '{{slug}}' );
diff --git a/packages/js/create-woo-extension/variants/default/languages/woo-plugin-setup.pot.mustache b/packages/js/create-woo-extension/variants/default/languages/woo-plugin-setup.pot.mustache
new file mode 100644
index 0000000000..6b65dab943
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/default/languages/woo-plugin-setup.pot.mustache
@@ -0,0 +1,45 @@
+# Copyright (C) 2022 WooCommerce
+# This file is distributed under the GNU General Public License v3.0.
+msgid ""
+msgstr ""
+"Project-Id-Version: Woo Plugin Setup 1.0.0\n"
+"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/{{slug}}\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"POT-Creation-Date: 2022-11-27T21:35:18+00:00\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"X-Generator: WP-CLI 2.7.1\n"
+"X-Domain: {{slug}}\n"
+
+#. Plugin Name of the plugin
+msgid "Woo Plugin Setup"
+msgstr ""
+
+#. Plugin URI of the plugin
+msgid "https://github.com/psealock/woo-plugin-setup"
+msgstr ""
+
+#. Description of the plugin
+msgid "This is an example of an extension template to follow."
+msgstr ""
+
+#. Author of the plugin
+msgid "WooCommerce"
+msgstr ""
+
+#. Author URI of the plugin
+msgid "https://woocommerce.com"
+msgstr ""
+
+#: build/index.js:1
+#: src/index.js:13
+msgid "My Example Extension"
+msgstr ""
+
+#: build/index.js:1
+#: src/index.js:20
+msgid "My Example Page"
+msgstr ""
diff --git a/packages/js/create-woo-extension/src/index.js.mustache b/packages/js/create-woo-extension/variants/default/src/index.js.mustache
similarity index 100%
rename from packages/js/create-woo-extension/src/index.js.mustache
rename to packages/js/create-woo-extension/variants/default/src/index.js.mustache
diff --git a/packages/js/create-woo-extension/src/index.scss.mustache b/packages/js/create-woo-extension/variants/default/src/index.scss.mustache
similarity index 100%
rename from packages/js/create-woo-extension/src/index.scss.mustache
rename to packages/js/create-woo-extension/variants/default/src/index.scss.mustache
diff --git a/packages/js/create-woo-extension/variants/default/tests/Test.php.mustache b/packages/js/create-woo-extension/variants/default/tests/Test.php.mustache
new file mode 100644
index 0000000000..2a23d93567
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/default/tests/Test.php.mustache
@@ -0,0 +1,15 @@
+<?php
+use PHPUnit\Framework\TestCase;
+
+/**
+ * Basic unit tests.
+ */
+final class Test extends TestCase {
+
+	/**
+	 * Test if 1 === 1.
+	 */
+	public function testEquality(): void {
+		$this->assertEquals( 1, 1 );
+	}
+}
diff --git a/packages/js/create-woo-extension/variants/default/webpack.config.js.mustache b/packages/js/create-woo-extension/variants/default/webpack.config.js.mustache
new file mode 100644
index 0000000000..7c211bc7ca
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/default/webpack.config.js.mustache
@@ -0,0 +1,13 @@
+const defaultConfig = require( '@wordpress/scripts/config/webpack.config' );
+const WooCommerceDependencyExtractionWebpackPlugin = require( '@woocommerce/dependency-extraction-webpack-plugin' );
+
+module.exports = {
+	...defaultConfig,
+	plugins: [
+		...defaultConfig.plugins.filter(
+			( plugin ) =>
+				plugin.constructor.name !== 'DependencyExtractionWebpackPlugin'
+		),
+		new WooCommerceDependencyExtractionWebpackPlugin(),
+	],
+};
diff --git a/packages/js/create-woo-extension/variants/sql-modification/$slug.php.mustache b/packages/js/create-woo-extension/variants/sql-modification/$slug.php.mustache
new file mode 100644
index 0000000000..3431e7e598
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/sql-modification/$slug.php.mustache
@@ -0,0 +1,304 @@
+<?php
+/**
+ * Plugin Name: {{title}}
+{{#description}}
+ * Description: {{description}}
+{{/description}}
+ * Version: {{version}}
+{{#author}}
+ * Author: {{author}}
+{{/author}}
+ * Author URI: https://woocommerce.com
+ * Text Domain: {{textdomain}}
+ * Domain Path: /languages
+ *
+ * License: GNU General Public License v3.0
+ * License URI: http://www.gnu.org/licenses/gpl-3.0.html
+ *
+ * @package {{namespace}}
+ */
+
+defined( 'ABSPATH' ) || exit;
+
+if ( ! defined( '{{slugConstantCase}}_MAIN_PLUGIN_FILE' ) ) {
+	define( '{{slugConstantCase}}_MAIN_PLUGIN_FILE', __FILE__ );
+}
+
+require_once plugin_dir_path( __FILE__ ) . '/vendor/autoload_packages.php';
+
+use {{slugPascalCase}}\Admin\Setup;
+
+// phpcs:disable WordPress.Files.FileName
+
+/**
+ * WooCommerce fallback notice.
+ *
+ * @since {{version}}
+ */
+function {{slugSnakeCase}}_missing_wc_notice() {
+	/* translators: %s WC download URL link. */
+	echo '<div class="error"><p><strong>' . sprintf( esc_html__( '{{title}} requires WooCommerce to be installed and active. You can download %s here.', '{{textdomain}}' ), '<a href="https://woocommerce.com/" target="_blank">WooCommerce</a>' ) . '</strong></p></div>';
+}
+
+register_activation_hook( __FILE__, '{{slugSnakeCase}}_activate' );
+
+/**
+ * Activation hook.
+ *
+ * @since {{version}}
+ */
+function {{slugSnakeCase}}_activate() {
+	if ( ! class_exists( 'WooCommerce' ) ) {
+		add_action( 'admin_notices', '{{slugSnakeCase}}_missing_wc_notice' );
+		return;
+	}
+}
+
+if ( ! class_exists( '{{slugPascalCase}}' ) ) :
+	/**
+	 * The {{slugPascalCase}} class.
+	 */
+	class {{slugPascalCase}} {
+		/**
+		 * This class instance.
+		 *
+		 * @var \{{slugPascalCase}} single instance of this class.
+		 */
+		private static $instance;
+
+		/**
+		 * Constructor.
+		 */
+		public function __construct() {
+			if ( is_admin() ) {
+				new Setup();
+			}
+
+			// Register SQL modification hooks.
+			$this->register_query_arg_filters();
+			$this->register_join_filters();
+			$this->register_where_filters();
+			$this->register_select_filters();
+		}
+
+		/**
+		 * Register query argument filters for caching purposes.
+		 */
+		private function register_query_arg_filters() {
+			$query_arg_filters = array(
+				'woocommerce_analytics_revenue_query_args',
+				'woocommerce_analytics_orders_query_args',
+				'woocommerce_analytics_orders_stats_query_args',
+				'woocommerce_analytics_products_query_args',
+				'woocommerce_analytics_products_stats_query_args',
+				'woocommerce_analytics_categories_query_args',
+				'woocommerce_analytics_coupons_query_args',
+				'woocommerce_analytics_coupons_stats_query_args',
+				'woocommerce_analytics_taxes_query_args',
+				'woocommerce_analytics_taxes_stats_query_args',
+			);
+
+			foreach ( $query_arg_filters as $filter ) {
+				add_filter( $filter, array( $this, 'apply_currency_arg' ) );
+			}
+		}
+
+		/**
+		 * Register JOIN clause filters.
+		 */
+		private function register_join_filters() {
+			$join_filters = array(
+				'woocommerce_analytics_clauses_join_orders_subquery',
+				'woocommerce_analytics_clauses_join_orders_stats_total',
+				'woocommerce_analytics_clauses_join_orders_stats_interval',
+				'woocommerce_analytics_clauses_join_products_subquery',
+				'woocommerce_analytics_clauses_join_products_stats_total',
+				'woocommerce_analytics_clauses_join_products_stats_interval',
+				'woocommerce_analytics_clauses_join_categories_subquery',
+				'woocommerce_analytics_clauses_join_coupons_subquery',
+				'woocommerce_analytics_clauses_join_coupons_stats_total',
+				'woocommerce_analytics_clauses_join_coupons_stats_interval',
+				'woocommerce_analytics_clauses_join_taxes_subquery',
+				'woocommerce_analytics_clauses_join_taxes_stats_total',
+				'woocommerce_analytics_clauses_join_taxes_stats_interval',
+			);
+
+			foreach ( $join_filters as $filter ) {
+				add_filter( $filter, array( $this, 'add_join_subquery' ) );
+			}
+		}
+
+		/**
+		 * Register WHERE clause filters.
+		 */
+		private function register_where_filters() {
+			$where_filters = array(
+				'woocommerce_analytics_clauses_where_orders_subquery',
+				'woocommerce_analytics_clauses_where_orders_stats_total',
+				'woocommerce_analytics_clauses_where_orders_stats_interval',
+				'woocommerce_analytics_clauses_where_products_subquery',
+				'woocommerce_analytics_clauses_where_products_stats_total',
+				'woocommerce_analytics_clauses_where_products_stats_interval',
+				'woocommerce_analytics_clauses_where_categories_subquery',
+				'woocommerce_analytics_clauses_where_coupons_subquery',
+				'woocommerce_analytics_clauses_where_coupons_stats_total',
+				'woocommerce_analytics_clauses_where_coupons_stats_interval',
+				'woocommerce_analytics_clauses_where_taxes_subquery',
+				'woocommerce_analytics_clauses_where_taxes_stats_total',
+				'woocommerce_analytics_clauses_where_taxes_stats_interval',
+			);
+
+			foreach ( $where_filters as $filter ) {
+				add_filter( $filter, array( $this, 'add_where_subquery' ) );
+			}
+		}
+
+		/**
+		 * Register SELECT clause filters.
+		 */
+		private function register_select_filters() {
+			$select_filters = array(
+				'woocommerce_analytics_clauses_select_orders_subquery',
+				'woocommerce_analytics_clauses_select_orders_stats_total',
+				'woocommerce_analytics_clauses_select_orders_stats_interval',
+				'woocommerce_analytics_clauses_select_products_subquery',
+				'woocommerce_analytics_clauses_select_products_stats_total',
+				'woocommerce_analytics_clauses_select_products_stats_interval',
+				'woocommerce_analytics_clauses_select_categories_subquery',
+				'woocommerce_analytics_clauses_select_coupons_subquery',
+				'woocommerce_analytics_clauses_select_coupons_stats_total',
+				'woocommerce_analytics_clauses_select_coupons_stats_interval',
+				'woocommerce_analytics_clauses_select_taxes_subquery',
+				'woocommerce_analytics_clauses_select_taxes_stats_total',
+				'woocommerce_analytics_clauses_select_taxes_stats_interval',
+			);
+
+			foreach ( $select_filters as $filter ) {
+				add_filter( $filter, array( $this, 'add_select_subquery' ) );
+			}
+		}
+
+		/**
+		 * Add the query argument `currency` for caching purposes.
+		 *
+		 * @param array $args Query arguments.
+		 * @return array Augmented query arguments.
+		 */
+		public function apply_currency_arg( $args ) {
+			$currency = 'USD';
+
+			// phpcs:disable WordPress.Security.NonceVerification.Recommended
+			if ( isset( $_GET['currency'] ) ) {
+				$currency = sanitize_text_field( wp_unslash( $_GET['currency'] ) );
+			}
+			// phpcs:enable
+
+			$args['currency'] = $currency;
+
+			return $args;
+		}
+
+		/**
+		 * Add a JOIN clause.
+		 *
+		 * @param array $clauses An array of JOIN query strings.
+		 * @return array Augmented clauses.
+		 */
+		public function add_join_subquery( $clauses ) {
+			global $wpdb;
+
+			$clauses[] = "JOIN {$wpdb->postmeta} currency_postmeta ON {$wpdb->prefix}wc_order_stats.order_id = currency_postmeta.post_id";
+
+			return $clauses;
+		}
+
+		/**
+		 * Add a WHERE clause.
+		 *
+		 * @param array $clauses An array of WHERE query strings.
+		 * @return array Augmented clauses.
+		 */
+		public function add_where_subquery( $clauses ) {
+			global $wpdb;
+
+			$currency = 'USD';
+
+			// phpcs:disable WordPress.Security.NonceVerification.Recommended
+			if ( isset( $_GET['currency'] ) ) {
+				$currency = sanitize_text_field( wp_unslash( $_GET['currency'] ) );
+			}
+			// phpcs:enable
+
+			// Use $wpdb->prepare to safely escape the currency value for SQL.
+			$prepared_clause = $wpdb->prepare(
+				'AND currency_postmeta.meta_key = %s AND currency_postmeta.meta_value = %s',
+				'_order_currency',
+				$currency
+			);
+
+			$clauses[] = $prepared_clause;
+
+			return $clauses;
+		}
+
+		/**
+		 * Add a SELECT clause.
+		 *
+		 * @param array $clauses An array of SELECT query strings.
+		 * @return array Augmented clauses.
+		 */
+		public function add_select_subquery( $clauses ) {
+			$clauses[] = ', currency_postmeta.meta_value AS currency';
+
+			return $clauses;
+		}
+
+		/**
+		 * Cloning is forbidden.
+		 */
+		public function __clone() {
+			wc_doing_it_wrong( __FUNCTION__, __( 'Cloning is forbidden.', '{{textdomain}}' ), '{{version}}' );
+		}
+
+		/**
+		 * Unserializing instances of this class is forbidden.
+		 */
+		public function __wakeup() {
+			wc_doing_it_wrong( __FUNCTION__, __( 'Unserializing instances of this class is forbidden.', '{{textdomain}}' ), '{{version}}' );
+		}
+
+		/**
+		 * Gets the main instance.
+		 *
+		 * Ensures only one instance can be loaded.
+		 *
+		 * @return \{{slugPascalCase}}
+		 */
+		public static function instance() {
+
+			if ( null === self::$instance ) {
+				self::$instance = new self();
+			}
+
+			return self::$instance;
+		}
+	}
+endif;
+
+add_action( 'plugins_loaded', '{{slugSnakeCase}}_init', 10 );
+
+/**
+ * Initialize the plugin.
+ *
+ * @since {{version}}
+ */
+function {{slugSnakeCase}}_init() {
+	load_plugin_textdomain( '{{textdomain}}', false, plugin_basename( dirname( __FILE__ ) ) . '/languages' );
+
+	if ( ! class_exists( 'WooCommerce' ) ) {
+		add_action( 'admin_notices', '{{slugSnakeCase}}_missing_wc_notice' );
+		return;
+	}
+
+	{{slugPascalCase}}::instance();
+}
diff --git a/packages/js/create-woo-extension/variants/sql-modification/.editorconfig.mustache b/packages/js/create-woo-extension/variants/sql-modification/.editorconfig.mustache
new file mode 100644
index 0000000000..d7dbce738b
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/sql-modification/.editorconfig.mustache
@@ -0,0 +1,27 @@
+# This file is for unifying the coding style for different editors and IDEs
+# editorconfig.org
+
+# WordPress Coding Standards
+# https://make.wordpress.org/core/handbook/coding-standards/
+
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+indent_size = 4
+tab_width = 4
+indent_style = tab
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.txt]
+trim_trailing_whitespace = false
+
+[*.{md,json,yml}]
+trim_trailing_whitespace = false
+indent_style = space
+indent_size = 2
+
+[*.json]
+indent_style = tab
\ No newline at end of file
diff --git a/packages/js/create-woo-extension/variants/sql-modification/.eslintrc.js.mustache b/packages/js/create-woo-extension/variants/sql-modification/.eslintrc.js.mustache
new file mode 100644
index 0000000000..22ddc24c58
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/sql-modification/.eslintrc.js.mustache
@@ -0,0 +1,6 @@
+module.exports = {
+	extends: [ 'plugin:@woocommerce/eslint-plugin/recommended' ],
+	rules: {
+		'react/react-in-jsx-scope': 'off',
+	},
+};
diff --git a/packages/js/create-woo-extension/variants/sql-modification/.gitignore.mustache b/packages/js/create-woo-extension/variants/sql-modification/.gitignore.mustache
new file mode 100644
index 0000000000..14dfbf25c0
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/sql-modification/.gitignore.mustache
@@ -0,0 +1,62 @@
+
+# Operating System files
+.DS_Store
+Thumbs.db
+
+# IDE files
+.idea
+.vscode/*
+project.xml
+project.properties
+.project
+.settings*
+*.sublime-project
+*.sublime-workspace
+.sublimelinterrc
+
+# Sass
+.sass-cache/
+
+# Logs
+logs/
+
+# Environment files
+wp-cli.local.yml
+yarn-error.log
+npm-debug.log
+.pnpm-debug.log
+
+# Build files
+*.sql
+*.swp
+*.zip
+
+# Built packages
+build/
+build-module/
+build-style/
+build-types/
+dist/
+
+# Project files
+node_modules/
+vendor/
+
+# TypeScript files
+tsconfig.tsbuildinfo
+
+# Node Package Dependencies
+package-lock.json
+
+# wp-env config
+.wp-env.override.json
+
+# Unit tests
+tmp/
+
+# Composer
+vendor/
+bin/composer/**/vendor/
+lib/vendor/
+contributors.md
+contributors.html
diff --git a/packages/js/create-woo-extension/variants/sql-modification/.prettierrc.json.mustache b/packages/js/create-woo-extension/variants/sql-modification/.prettierrc.json.mustache
new file mode 100644
index 0000000000..235376574a
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/sql-modification/.prettierrc.json.mustache
@@ -0,0 +1 @@
+"@wordpress/prettier-config"
diff --git a/packages/js/create-woo-extension/variants/sql-modification/.wp-env.json.mustache b/packages/js/create-woo-extension/variants/sql-modification/.wp-env.json.mustache
new file mode 100644
index 0000000000..1368e9f5eb
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/sql-modification/.wp-env.json.mustache
@@ -0,0 +1,13 @@
+{
+	"phpVersion": null,
+	"core": null,
+	"plugins": [
+		"https://downloads.wordpress.org/plugin/woocommerce.zip",
+		"."
+	],
+	"config": {
+		"JETPACK_AUTOLOAD_DEV": true,
+		"WP_DEBUG": true,
+		"SCRIPT_DEBUG": true
+	}
+}
diff --git a/packages/js/create-woo-extension/variants/sql-modification/README.md.mustache b/packages/js/create-woo-extension/variants/sql-modification/README.md.mustache
new file mode 100644
index 0000000000..a361c68924
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/sql-modification/README.md.mustache
@@ -0,0 +1,96 @@
+# {{title}}
+
+{{#description}}
+{{description}}
+{{/description}}
+
+This is a WooCommerce extension that demonstrates how to modify SQL queries for WooCommerce Analytics reports. It adds multi-currency filtering support to reports.
+
+## Development
+
+### Getting started
+
+1. `npm install` to install dependencies
+2. `npm start` to start the development server
+3. `npm run build` to build the production version
+
+### File Structure
+
+- `src/index.js` - JavaScript filters for UI (dropdowns, table columns, currency formatting)
+- `includes/Admin/Setup.php` - PHP class for script registration and currency settings
+- `{{slug}}.php` - Main plugin file with SQL modification hooks
+
+## Features
+
+This extension demonstrates:
+
+- **Query Argument Filters** - Add custom parameters for caching
+- **JOIN Clause Filters** - Join additional tables to reports
+- **WHERE Clause Filters** - Filter report data by custom criteria
+- **SELECT Clause Filters** - Add custom columns to report data
+- **UI Dropdown Filters** - Add filter dropdowns to report pages
+- **Table Column Modification** - Add columns to report tables
+- **Currency Formatting** - Update currency display per selection
+- **Persisted Queries** - Maintain filter state across report navigation
+
+## How It Works
+
+### Backend (PHP)
+
+The main plugin file registers filters for:
+
+1. **Query Args** - Adds `currency` parameter for proper caching
+2. **JOIN** - Joins `postmeta` table to access order currency
+3. **WHERE** - Filters orders by selected currency
+4. **SELECT** - Adds currency field to query results
+
+### Frontend (JavaScript)
+
+1. Adds a Currency dropdown to all relevant reports
+2. Adds a Currency column to report tables
+3. Persists the currency parameter when navigating
+4. Updates currency formatting based on selection
+
+## Customization
+
+### Adding New Currencies
+
+1. Update the currency options in `includes/Admin/Setup.php`:
+
+```php
+$currencies = array(
+    array(
+        'label' => __( 'Euro', '{{textdomain}}' ),
+        'value' => 'EUR',
+    ),
+    // Add more currencies...
+);
+```
+
+2. Add currency formatting in `src/index.js`:
+
+```javascript
+const currencies = {
+    EUR: {
+        code: 'EUR',
+        symbol: '€',
+        symbolPosition: 'left',
+        thousandSeparator: '.',
+        decimalSeparator: ',',
+        precision: 2,
+    },
+};
+```
+
+### Modifying SQL Queries
+
+Use the filter registration methods in the main plugin class:
+
+- `register_query_arg_filters()` - For caching parameters
+- `register_join_filters()` - For additional table joins
+- `register_where_filters()` - For filtering conditions
+- `register_select_filters()` - For additional columns
+
+## Learn More
+
+For a detailed guide on extending WooCommerce Admin reports, see the [official documentation](https://woocommerce.com/document/extending-woocommerce-admin-reports/).
diff --git a/packages/js/create-woo-extension/variants/sql-modification/composer.json.mustache b/packages/js/create-woo-extension/variants/sql-modification/composer.json.mustache
new file mode 100644
index 0000000000..e1f0f00964
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/sql-modification/composer.json.mustache
@@ -0,0 +1,18 @@
+{
+	"name": "{{namespace}}/{{slug}}",
+	"description": "WooCommerce plugin",
+	"autoload": {
+		"psr-4": {
+			"{{slugPascalCase}}\\": "includes/"
+		}
+	},
+	"require-dev": {
+		"phpunit/phpunit": "^9.0",
+		"automattic/jetpack-autoloader": "^2"
+	},
+	"config": {
+		"allow-plugins": {
+			"automattic/jetpack-autoloader": true
+		}
+	}
+}
diff --git a/packages/js/create-woo-extension/variants/sql-modification/includes/Admin/Setup.php.mustache b/packages/js/create-woo-extension/variants/sql-modification/includes/Admin/Setup.php.mustache
new file mode 100644
index 0000000000..afbc1429e9
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/sql-modification/includes/Admin/Setup.php.mustache
@@ -0,0 +1,86 @@
+<?php
+
+namespace {{slugPascalCase}}\Admin;
+
+/**
+ * {{slugPascalCase}} Setup Class
+ */
+class Setup {
+	/**
+	 * Constructor.
+	 *
+	 * @since 1.0.0
+	 */
+	public function __construct() {
+		add_action( 'admin_enqueue_scripts', array( $this, 'register_scripts' ) );
+	}
+
+	/**
+	 * Load all necessary dependencies.
+	 *
+	 * @since 1.0.0
+	 */
+	public function register_scripts() {
+		if ( ! class_exists( 'Automattic\WooCommerce\Admin\PageController' ) ||
+			! \Automattic\WooCommerce\Admin\PageController::is_admin_page()
+		) {
+			return;
+		}
+
+		$this->add_currency_settings();
+
+		$script_path       = '/build/index.js';
+		$script_asset_path = dirname( {{slugConstantCase}}_MAIN_PLUGIN_FILE ) . '/build/index.asset.php';
+		$script_asset      = file_exists( $script_asset_path )
+			? require $script_asset_path
+			: array(
+				'dependencies' => array(),
+				'version'      => filemtime( dirname( {{slugConstantCase}}_MAIN_PLUGIN_FILE ) . $script_path ),
+			);
+		$script_url        = plugins_url( $script_path, {{slugConstantCase}}_MAIN_PLUGIN_FILE );
+
+		wp_register_script(
+			'{{slug}}',
+			$script_url,
+			$script_asset['dependencies'],
+			$script_asset['version'],
+			true
+		);
+
+		wp_enqueue_script( '{{slug}}' );
+	}
+
+	/**
+	 * Make the currency settings available to the JavaScript client.
+	 *
+	 * Uses AssetDataRegistry to pass data to the frontend.
+	 *
+	 * @since 1.0.0
+	 */
+	private function add_currency_settings() {
+		if ( ! class_exists( 'Automattic\WooCommerce\Blocks\Package' ) ) {
+			return;
+		}
+
+		$currencies = array(
+			array(
+				'label' => __( 'United States Dollar', '{{textdomain}}' ),
+				'value' => 'USD',
+			),
+			array(
+				'label' => __( 'New Zealand Dollar', '{{textdomain}}' ),
+				'value' => 'NZD',
+			),
+			array(
+				'label' => __( 'South African Rand', '{{textdomain}}' ),
+				'value' => 'ZAR',
+			),
+		);
+
+		$data_registry = \Automattic\WooCommerce\Blocks\Package::container()->get(
+			\Automattic\WooCommerce\Blocks\Assets\AssetDataRegistry::class
+		);
+
+		$data_registry->add( 'multiCurrency', $currencies );
+	}
+}
diff --git a/packages/js/create-woo-extension/variants/sql-modification/languages/woo-plugin-setup.pot.mustache b/packages/js/create-woo-extension/variants/sql-modification/languages/woo-plugin-setup.pot.mustache
new file mode 100644
index 0000000000..6b65dab943
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/sql-modification/languages/woo-plugin-setup.pot.mustache
@@ -0,0 +1,45 @@
+# Copyright (C) 2022 WooCommerce
+# This file is distributed under the GNU General Public License v3.0.
+msgid ""
+msgstr ""
+"Project-Id-Version: Woo Plugin Setup 1.0.0\n"
+"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/{{slug}}\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"POT-Creation-Date: 2022-11-27T21:35:18+00:00\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"X-Generator: WP-CLI 2.7.1\n"
+"X-Domain: {{slug}}\n"
+
+#. Plugin Name of the plugin
+msgid "Woo Plugin Setup"
+msgstr ""
+
+#. Plugin URI of the plugin
+msgid "https://github.com/psealock/woo-plugin-setup"
+msgstr ""
+
+#. Description of the plugin
+msgid "This is an example of an extension template to follow."
+msgstr ""
+
+#. Author of the plugin
+msgid "WooCommerce"
+msgstr ""
+
+#. Author URI of the plugin
+msgid "https://woocommerce.com"
+msgstr ""
+
+#: build/index.js:1
+#: src/index.js:13
+msgid "My Example Extension"
+msgstr ""
+
+#: build/index.js:1
+#: src/index.js:20
+msgid "My Example Page"
+msgstr ""
diff --git a/plugins/woocommerce/client/admin/docs/examples/extensions/sql-modification/js/index.js b/packages/js/create-woo-extension/variants/sql-modification/src/index.js.mustache
similarity index 67%
rename from plugins/woocommerce/client/admin/docs/examples/extensions/sql-modification/js/index.js
rename to packages/js/create-woo-extension/variants/sql-modification/src/index.js.mustache
index faf9d6d7a3..35100bb380 100644
--- a/plugins/woocommerce/client/admin/docs/examples/extensions/sql-modification/js/index.js
+++ b/packages/js/create-woo-extension/variants/sql-modification/src/index.js.mustache
@@ -6,15 +6,15 @@ import { addFilter } from '@wordpress/hooks';
 import { __ } from '@wordpress/i18n';

 /**
- * Add a dropdown to a report.
+ * Add a currency dropdown filter to reports.
  *
- * @param {Array} filters - set of filters in a report.
- * @return {Array} amended set of filters.
+ * @param {Array} filters - Set of filters in a report.
+ * @return {Array} Amended set of filters.
  */
 const addCurrencyFilters = ( filters ) => {
 	return [
 		{
-			label: __( 'Currency', 'plugin-domain' ),
+			label: __( 'Currency', '{{textdomain}}' ),
 			staticParams: [],
 			param: 'currency',
 			showFilters: () => true,
@@ -25,48 +25,48 @@ const addCurrencyFilters = ( filters ) => {
 	];
 };

+// Add currency filter to all relevant reports.
 addFilter(
 	'woocommerce_admin_revenue_report_filters',
-	'plugin-domain',
+	'{{textdomain}}',
 	addCurrencyFilters
 );
 addFilter(
 	'woocommerce_admin_orders_report_filters',
-	'plugin-domain',
+	'{{textdomain}}',
 	addCurrencyFilters
 );
 addFilter(
 	'woocommerce_admin_products_report_filters',
-	'plugin-domain',
+	'{{textdomain}}',
 	addCurrencyFilters
 );
 addFilter(
 	'woocommerce_admin_categories_report_filters',
-	'plugin-domain',
+	'{{textdomain}}',
 	addCurrencyFilters
 );
 addFilter(
 	'woocommerce_admin_coupons_report_filters',
-	'plugin-domain',
+	'{{textdomain}}',
 	addCurrencyFilters
 );
 addFilter(
 	'woocommerce_admin_taxes_report_filters',
-	'plugin-domain',
+	'{{textdomain}}',
 	addCurrencyFilters
 );
 addFilter(
 	'woocommerce_admin_dashboard_filters',
-	'plugin-domain',
+	'{{textdomain}}',
 	addCurrencyFilters
 );

 /**
- * Add a column to a report table. Include a header and
- * manipulate each row to handle the added parameter.
+ * Add a currency column to report tables.
  *
- * @param {Object} reportTableData - table data.
- * @return {Object} - table data.
+ * @param {Object} reportTableData - Table data.
+ * @return {Object} Modified table data.
  */
 const addTableColumn = ( reportTableData ) => {
 	const includedReports = [
@@ -77,17 +77,19 @@ const addTableColumn = ( reportTableData ) => {
 		'coupons',
 		'taxes',
 	];
+
 	if ( ! includedReports.includes( reportTableData.endpoint ) ) {
 		return reportTableData;
 	}

 	const newHeaders = [
 		{
-			label: 'Currency',
+			label: __( 'Currency', '{{textdomain}}' ),
 			key: 'currency',
 		},
 		...reportTableData.headers,
 	];
+
 	const newRows = reportTableData.rows.map( ( row, index ) => {
 		const item = reportTableData.items.data[ index ];
 		const currency =
@@ -110,14 +112,13 @@ const addTableColumn = ( reportTableData ) => {
 	return reportTableData;
 };

-addFilter( 'woocommerce_admin_report_table', 'plugin-domain', addTableColumn );
+addFilter( 'woocommerce_admin_report_table', '{{textdomain}}', addTableColumn );

 /**
- * Add 'currency' to the list of persisted queries so that the parameter remains
- * when navigating from report to report.
+ * Persist 'currency' query parameter when navigating between reports.
  *
- * @param {Array} params - array of report slugs.
- * @return {Array} - array of report slugs including 'currency'.
+ * @param {Array} params - Array of persisted query parameters.
+ * @return {Array} Array including 'currency'.
  */
 const persistQueries = ( params ) => {
 	params.push( 'currency' );
@@ -126,10 +127,13 @@ const persistQueries = ( params ) => {

 addFilter(
 	'woocommerce_admin_persisted_queries',
-	'plugin-domain',
+	'{{textdomain}}',
 	persistQueries
 );

+/**
+ * Currency configuration for different currencies.
+ */
 const currencies = {
 	ZAR: {
 		code: 'ZAR',
@@ -149,6 +153,13 @@ const currencies = {
 	},
 };

+/**
+ * Update report currency formatting based on selected currency.
+ *
+ * @param {Object} config - Default currency configuration.
+ * @param {Object} query - Query parameters including currency.
+ * @return {Object} Updated currency configuration.
+ */
 const updateReportCurrencies = ( config, { currency } ) => {
 	if ( currency && currencies[ currency ] ) {
 		return currencies[ currency ];
@@ -158,6 +169,6 @@ const updateReportCurrencies = ( config, { currency } ) => {

 addFilter(
 	'woocommerce_admin_report_currency',
-	'plugin-domain',
+	'{{textdomain}}',
 	updateReportCurrencies
 );
diff --git a/packages/js/create-woo-extension/variants/sql-modification/src/index.scss.mustache b/packages/js/create-woo-extension/variants/sql-modification/src/index.scss.mustache
new file mode 100644
index 0000000000..b0130a5635
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/sql-modification/src/index.scss.mustache
@@ -0,0 +1,3 @@
+h1 {
+	background-color: gold;
+}
diff --git a/packages/js/create-woo-extension/variants/sql-modification/tests/Test.php.mustache b/packages/js/create-woo-extension/variants/sql-modification/tests/Test.php.mustache
new file mode 100644
index 0000000000..2a23d93567
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/sql-modification/tests/Test.php.mustache
@@ -0,0 +1,15 @@
+<?php
+use PHPUnit\Framework\TestCase;
+
+/**
+ * Basic unit tests.
+ */
+final class Test extends TestCase {
+
+	/**
+	 * Test if 1 === 1.
+	 */
+	public function testEquality(): void {
+		$this->assertEquals( 1, 1 );
+	}
+}
diff --git a/packages/js/create-woo-extension/variants/sql-modification/webpack.config.js.mustache b/packages/js/create-woo-extension/variants/sql-modification/webpack.config.js.mustache
new file mode 100644
index 0000000000..7c211bc7ca
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/sql-modification/webpack.config.js.mustache
@@ -0,0 +1,13 @@
+const defaultConfig = require( '@wordpress/scripts/config/webpack.config' );
+const WooCommerceDependencyExtractionWebpackPlugin = require( '@woocommerce/dependency-extraction-webpack-plugin' );
+
+module.exports = {
+	...defaultConfig,
+	plugins: [
+		...defaultConfig.plugins.filter(
+			( plugin ) =>
+				plugin.constructor.name !== 'DependencyExtractionWebpackPlugin'
+		),
+		new WooCommerceDependencyExtractionWebpackPlugin(),
+	],
+};
diff --git a/packages/js/create-woo-extension/variants/table-column/$slug.php.mustache b/packages/js/create-woo-extension/variants/table-column/$slug.php.mustache
new file mode 100644
index 0000000000..7f7166a700
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/table-column/$slug.php.mustache
@@ -0,0 +1,126 @@
+<?php
+/**
+ * Plugin Name: {{title}}
+{{#description}}
+ * Description: {{description}}
+{{/description}}
+ * Version: {{version}}
+{{#author}}
+ * Author: {{author}}
+{{/author}}
+ * Author URI: https://woocommerce.com
+ * Text Domain: {{textdomain}}
+ * Domain Path: /languages
+ *
+ * License: GNU General Public License v3.0
+ * License URI: http://www.gnu.org/licenses/gpl-3.0.html
+ *
+ * @package {{namespace}}
+ */
+
+defined( 'ABSPATH' ) || exit;
+
+if ( ! defined( '{{slugConstantCase}}_MAIN_PLUGIN_FILE' ) ) {
+	define( '{{slugConstantCase}}_MAIN_PLUGIN_FILE', __FILE__ );
+}
+
+require_once plugin_dir_path( __FILE__ ) . '/vendor/autoload_packages.php';
+
+use {{slugPascalCase}}\Admin\Setup;
+
+// phpcs:disable WordPress.Files.FileName
+
+/**
+ * WooCommerce fallback notice.
+ *
+ * @since {{version}}
+ */
+function {{slugSnakeCase}}_missing_wc_notice() {
+	/* translators: %s WC download URL link. */
+	echo '<div class="error"><p><strong>' . sprintf( esc_html__( '{{title}} requires WooCommerce to be installed and active. You can download %s here.', '{{textdomain}}' ), '<a href="https://woocommerce.com/" target="_blank">WooCommerce</a>' ) . '</strong></p></div>';
+}
+
+register_activation_hook( __FILE__, '{{slugSnakeCase}}_activate' );
+
+/**
+ * Activation hook.
+ *
+ * @since {{version}}
+ */
+function {{slugSnakeCase}}_activate() {
+	if ( ! class_exists( 'WooCommerce' ) ) {
+		add_action( 'admin_notices', '{{slugSnakeCase}}_missing_wc_notice' );
+		return;
+	}
+}
+
+if ( ! class_exists( '{{slugPascalCase}}' ) ) :
+	/**
+	 * The {{slugPascalCase}} class.
+	 */
+	class {{slugPascalCase}} {
+		/**
+		 * This class instance.
+		 *
+		 * @var \{{slugPascalCase}} single instance of this class.
+		 */
+		private static $instance;
+
+		/**
+		 * Constructor.
+		 */
+		public function __construct() {
+			if ( is_admin() ) {
+				new Setup();
+			}
+		}
+
+		/**
+		 * Cloning is forbidden.
+		 */
+		public function __clone() {
+			wc_doing_it_wrong( __FUNCTION__, __( 'Cloning is forbidden.', '{{textdomain}}' ), '{{version}}' );
+		}
+
+		/**
+		 * Unserializing instances of this class is forbidden.
+		 */
+		public function __wakeup() {
+			wc_doing_it_wrong( __FUNCTION__, __( 'Unserializing instances of this class is forbidden.', '{{textdomain}}' ), '{{version}}' );
+		}
+
+		/**
+		 * Gets the main instance.
+		 *
+		 * Ensures only one instance can be loaded.
+		 *
+		 * @return \{{slugPascalCase}}
+		 */
+		public static function instance() {
+
+			if ( null === self::$instance ) {
+				self::$instance = new self();
+			}
+
+			return self::$instance;
+		}
+	}
+endif;
+
+add_action( 'plugins_loaded', '{{slugSnakeCase}}_init', 10 );
+
+/**
+ * Initialize the plugin.
+ *
+ * @since {{version}}
+ */
+function {{slugSnakeCase}}_init() {
+	load_plugin_textdomain( '{{textdomain}}', false, plugin_basename( dirname( __FILE__ ) ) . '/languages' );
+
+	if ( ! class_exists( 'WooCommerce' ) ) {
+		add_action( 'admin_notices', '{{slugSnakeCase}}_missing_wc_notice' );
+		return;
+	}
+
+	{{slugPascalCase}}::instance();
+}
diff --git a/packages/js/create-woo-extension/variants/table-column/.editorconfig.mustache b/packages/js/create-woo-extension/variants/table-column/.editorconfig.mustache
new file mode 100644
index 0000000000..d7dbce738b
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/table-column/.editorconfig.mustache
@@ -0,0 +1,27 @@
+# This file is for unifying the coding style for different editors and IDEs
+# editorconfig.org
+
+# WordPress Coding Standards
+# https://make.wordpress.org/core/handbook/coding-standards/
+
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+indent_size = 4
+tab_width = 4
+indent_style = tab
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.txt]
+trim_trailing_whitespace = false
+
+[*.{md,json,yml}]
+trim_trailing_whitespace = false
+indent_style = space
+indent_size = 2
+
+[*.json]
+indent_style = tab
\ No newline at end of file
diff --git a/packages/js/create-woo-extension/variants/table-column/.eslintrc.js.mustache b/packages/js/create-woo-extension/variants/table-column/.eslintrc.js.mustache
new file mode 100644
index 0000000000..22ddc24c58
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/table-column/.eslintrc.js.mustache
@@ -0,0 +1,6 @@
+module.exports = {
+	extends: [ 'plugin:@woocommerce/eslint-plugin/recommended' ],
+	rules: {
+		'react/react-in-jsx-scope': 'off',
+	},
+};
diff --git a/packages/js/create-woo-extension/variants/table-column/.gitignore.mustache b/packages/js/create-woo-extension/variants/table-column/.gitignore.mustache
new file mode 100644
index 0000000000..14dfbf25c0
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/table-column/.gitignore.mustache
@@ -0,0 +1,62 @@
+
+# Operating System files
+.DS_Store
+Thumbs.db
+
+# IDE files
+.idea
+.vscode/*
+project.xml
+project.properties
+.project
+.settings*
+*.sublime-project
+*.sublime-workspace
+.sublimelinterrc
+
+# Sass
+.sass-cache/
+
+# Logs
+logs/
+
+# Environment files
+wp-cli.local.yml
+yarn-error.log
+npm-debug.log
+.pnpm-debug.log
+
+# Build files
+*.sql
+*.swp
+*.zip
+
+# Built packages
+build/
+build-module/
+build-style/
+build-types/
+dist/
+
+# Project files
+node_modules/
+vendor/
+
+# TypeScript files
+tsconfig.tsbuildinfo
+
+# Node Package Dependencies
+package-lock.json
+
+# wp-env config
+.wp-env.override.json
+
+# Unit tests
+tmp/
+
+# Composer
+vendor/
+bin/composer/**/vendor/
+lib/vendor/
+contributors.md
+contributors.html
diff --git a/packages/js/create-woo-extension/variants/table-column/.prettierrc.json.mustache b/packages/js/create-woo-extension/variants/table-column/.prettierrc.json.mustache
new file mode 100644
index 0000000000..235376574a
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/table-column/.prettierrc.json.mustache
@@ -0,0 +1 @@
+"@wordpress/prettier-config"
diff --git a/packages/js/create-woo-extension/variants/table-column/.wp-env.json.mustache b/packages/js/create-woo-extension/variants/table-column/.wp-env.json.mustache
new file mode 100644
index 0000000000..1368e9f5eb
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/table-column/.wp-env.json.mustache
@@ -0,0 +1,13 @@
+{
+	"phpVersion": null,
+	"core": null,
+	"plugins": [
+		"https://downloads.wordpress.org/plugin/woocommerce.zip",
+		"."
+	],
+	"config": {
+		"JETPACK_AUTOLOAD_DEV": true,
+		"WP_DEBUG": true,
+		"SCRIPT_DEBUG": true
+	}
+}
diff --git a/packages/js/create-woo-extension/variants/table-column/README.md.mustache b/packages/js/create-woo-extension/variants/table-column/README.md.mustache
new file mode 100644
index 0000000000..b4e23ee286
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/table-column/README.md.mustache
@@ -0,0 +1,50 @@
+# {{title}}
+
+{{#description}}
+{{description}}
+{{/description}}
+
+This is a WooCommerce extension that adds custom columns to WooCommerce Analytics report tables.
+
+## Development
+
+### Getting started
+
+1. `npm install` to install dependencies
+2. `npm start` to start the development server
+3. `npm run build` to build the production version
+
+### File Structure
+
+- `src/index.js` - Main JavaScript file that filters the report table data
+- `includes/Admin/Setup.php` - PHP class that handles script registration and REST API schema modifications
+- `{{slug}}.php` - Main plugin file
+
+## Features
+
+- Adds custom columns to the Products report table
+- Demonstrates how to extend the REST API schema for reports
+- Shows how to add extended product attributes
+- Example of using the `woocommerce_admin_report_table` filter
+
+## How It Works
+
+This extension demonstrates adding custom columns to report tables in two steps:
+
+1. **Backend (PHP)**: Extends the REST API schema to include additional product data (in this case, `average_rating`)
+2. **Frontend (JavaScript)**: Uses the `woocommerce_admin_report_table` filter to add columns to the report table UI
+
+## Customization
+
+To customize this extension for your needs:
+
+1. In `includes/Admin/Setup.php`:
+   - Add your custom fields to the REST API schema
+   - Add extended attributes to make product data available
+2. In `src/index.js`:
+   - Modify the filter to add your custom columns
+   - Update the column headers and data display
+
+## Learn More
+
+For more information about WooCommerce Analytics and report customization, see the [WooCommerce documentation](https://woocommerce.com/document/woocommerce-analytics/).
diff --git a/packages/js/create-woo-extension/variants/table-column/composer.json.mustache b/packages/js/create-woo-extension/variants/table-column/composer.json.mustache
new file mode 100644
index 0000000000..e1f0f00964
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/table-column/composer.json.mustache
@@ -0,0 +1,18 @@
+{
+	"name": "{{namespace}}/{{slug}}",
+	"description": "WooCommerce plugin",
+	"autoload": {
+		"psr-4": {
+			"{{slugPascalCase}}\\": "includes/"
+		}
+	},
+	"require-dev": {
+		"phpunit/phpunit": "^9.0",
+		"automattic/jetpack-autoloader": "^2"
+	},
+	"config": {
+		"allow-plugins": {
+			"automattic/jetpack-autoloader": true
+		}
+	}
+}
diff --git a/packages/js/create-woo-extension/variants/table-column/includes/Admin/Setup.php.mustache b/packages/js/create-woo-extension/variants/table-column/includes/Admin/Setup.php.mustache
new file mode 100644
index 0000000000..ec1884420f
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/table-column/includes/Admin/Setup.php.mustache
@@ -0,0 +1,84 @@
+<?php
+
+namespace {{slugPascalCase}}\Admin;
+
+/**
+ * {{slugPascalCase}} Setup Class
+ */
+class Setup {
+	/**
+	 * Constructor.
+	 *
+	 * @since 1.0.0
+	 */
+	public function __construct() {
+		add_action( 'admin_enqueue_scripts', array( $this, 'register_scripts' ) );
+		add_filter( 'woocommerce_rest_report_products_schema', array( $this, 'add_product_extended_attributes_schema' ) );
+		add_filter( 'woocommerce_rest_reports_products_extended_attributes', array( $this, 'add_product_extended_attributes' ) );
+	}
+
+	/**
+	 * Load all necessary dependencies.
+	 *
+	 * @since 1.0.0
+	 */
+	public function register_scripts() {
+		if ( ! class_exists( 'Automattic\WooCommerce\Admin\PageController' ) ||
+			! \Automattic\WooCommerce\Admin\PageController::is_admin_page()
+		) {
+			return;
+		}
+
+		$script_path       = '/build/index.js';
+		$script_asset_path = dirname( {{slugConstantCase}}_MAIN_PLUGIN_FILE ) . '/build/index.asset.php';
+		$script_asset      = file_exists( $script_asset_path )
+			? require $script_asset_path
+			: array(
+				'dependencies' => array(),
+				'version'      => filemtime( dirname( {{slugConstantCase}}_MAIN_PLUGIN_FILE ) . $script_path ),
+			);
+		$script_url        = plugins_url( $script_path, {{slugConstantCase}}_MAIN_PLUGIN_FILE );
+
+		wp_register_script(
+			'{{slug}}',
+			$script_url,
+			$script_asset['dependencies'],
+			$script_asset['version'],
+			true
+		);
+
+		wp_enqueue_script( '{{slug}}' );
+	}
+
+	/**
+	 * When adding fields to a REST API response, we need to update the schema
+	 * to reflect these changes. Not only does this let API consumers know of
+	 * the new fields, it also adds them to Report Exports.
+	 *
+	 * @param array $properties The endpoint item schema properties.
+	 * @return array Filtered schema.
+	 */
+	public function add_product_extended_attributes_schema( $properties ) {
+		$properties['extended_info']['average_rating'] = array(
+			'type'        => 'number',
+			'readonly'    => true,
+			'context'     => array( 'view', 'edit' ),
+			'description' => __( 'Average product rating.', '{{textdomain}}' ),
+		);
+
+		return $properties;
+	}
+
+	/**
+	 * Extended attributes can be used to obtain any attribute from a WC_Product instance that is
+	 * available by a `get_*` class method. In other words, we can add `average_rating` because
+	 * `get_average_rating` is an available method on a WC_Product instance.
+	 *
+	 * @param array $extended_attributes - Extra information from WC_Product instance.
+	 * @return array - Extended attributes.
+	 */
+	public function add_product_extended_attributes( $extended_attributes ) {
+		$extended_attributes[] = 'average_rating';
+		return $extended_attributes;
+	}
+}
diff --git a/packages/js/create-woo-extension/variants/table-column/languages/woo-plugin-setup.pot.mustache b/packages/js/create-woo-extension/variants/table-column/languages/woo-plugin-setup.pot.mustache
new file mode 100644
index 0000000000..6b65dab943
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/table-column/languages/woo-plugin-setup.pot.mustache
@@ -0,0 +1,45 @@
+# Copyright (C) 2022 WooCommerce
+# This file is distributed under the GNU General Public License v3.0.
+msgid ""
+msgstr ""
+"Project-Id-Version: Woo Plugin Setup 1.0.0\n"
+"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/{{slug}}\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"POT-Creation-Date: 2022-11-27T21:35:18+00:00\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"X-Generator: WP-CLI 2.7.1\n"
+"X-Domain: {{slug}}\n"
+
+#. Plugin Name of the plugin
+msgid "Woo Plugin Setup"
+msgstr ""
+
+#. Plugin URI of the plugin
+msgid "https://github.com/psealock/woo-plugin-setup"
+msgstr ""
+
+#. Description of the plugin
+msgid "This is an example of an extension template to follow."
+msgstr ""
+
+#. Author of the plugin
+msgid "WooCommerce"
+msgstr ""
+
+#. Author URI of the plugin
+msgid "https://woocommerce.com"
+msgstr ""
+
+#: build/index.js:1
+#: src/index.js:13
+msgid "My Example Extension"
+msgstr ""
+
+#: build/index.js:1
+#: src/index.js:20
+msgid "My Example Page"
+msgstr ""
diff --git a/plugins/woocommerce/client/admin/docs/examples/extensions/table-column/js/index.js b/packages/js/create-woo-extension/variants/table-column/src/index.js.mustache
similarity index 98%
rename from plugins/woocommerce/client/admin/docs/examples/extensions/table-column/js/index.js
rename to packages/js/create-woo-extension/variants/table-column/src/index.js.mustache
index e611ad84bb..73f7aa8dab 100644
--- a/plugins/woocommerce/client/admin/docs/examples/extensions/table-column/js/index.js
+++ b/packages/js/create-woo-extension/variants/table-column/src/index.js.mustache
@@ -7,7 +7,7 @@ import { Rating } from '@woocommerce/components';

 addFilter(
 	'woocommerce_admin_report_table',
-	'plugin-domain',
+	'{{textdomain}}',
 	( reportTableData ) => {
 		if ( reportTableData.endpoint !== 'products' ) {
 			return reportTableData;
diff --git a/packages/js/create-woo-extension/variants/table-column/tests/Test.php.mustache b/packages/js/create-woo-extension/variants/table-column/tests/Test.php.mustache
new file mode 100644
index 0000000000..2a23d93567
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/table-column/tests/Test.php.mustache
@@ -0,0 +1,15 @@
+<?php
+use PHPUnit\Framework\TestCase;
+
+/**
+ * Basic unit tests.
+ */
+final class Test extends TestCase {
+
+	/**
+	 * Test if 1 === 1.
+	 */
+	public function testEquality(): void {
+		$this->assertEquals( 1, 1 );
+	}
+}
diff --git a/packages/js/create-woo-extension/variants/table-column/webpack.config.js.mustache b/packages/js/create-woo-extension/variants/table-column/webpack.config.js.mustache
new file mode 100644
index 0000000000..7c211bc7ca
--- /dev/null
+++ b/packages/js/create-woo-extension/variants/table-column/webpack.config.js.mustache
@@ -0,0 +1,13 @@
+const defaultConfig = require( '@wordpress/scripts/config/webpack.config' );
+const WooCommerceDependencyExtractionWebpackPlugin = require( '@woocommerce/dependency-extraction-webpack-plugin' );
+
+module.exports = {
+	...defaultConfig,
+	plugins: [
+		...defaultConfig.plugins.filter(
+			( plugin ) =>
+				plugin.constructor.name !== 'DependencyExtractionWebpackPlugin'
+		),
+		new WooCommerceDependencyExtractionWebpackPlugin(),
+	],
+};
diff --git a/plugins/woocommerce/client/admin/docs/examples/extensions/README.md b/plugins/woocommerce/client/admin/docs/examples/extensions/README.md
index b73604aaea..de7931ea86 100644
--- a/plugins/woocommerce/client/admin/docs/examples/extensions/README.md
+++ b/plugins/woocommerce/client/admin/docs/examples/extensions/README.md
@@ -25,7 +25,5 @@ You can make changes to Javascript and PHP files in the example and see changes

 - `add-report` - Create a "Hello World" report page.
 - `add-task` - Create a custom task for the onboarding task list.
-- `dashboard-section` - Adding a custom "section" to the new dashboard area.
-- `table-column` - An example of how to add column(s) to any report.
-- `sql-modification` - An example of how to modify SQL statements.
-- `payment-gateway-suggestions` - An example of how to add a new payment gateway suggestion
+
+> **Note:** Some of the previous examples have been moved to the [@woocommerce/create-woo-extension](https://www.npmjs.com/package/@woocommerce/create-woo-extension) package as extension variants for easier scaffolding of new extensions. See the [Create Woo Extension README](../../../../../../../packages/js/create-woo-extension/README.md) for more information.
diff --git a/plugins/woocommerce/client/admin/docs/examples/extensions/add-report/js/index.js b/plugins/woocommerce/client/admin/docs/examples/extensions/add-report/js/index.js
deleted file mode 100644
index b1ed698368..0000000000
--- a/plugins/woocommerce/client/admin/docs/examples/extensions/add-report/js/index.js
+++ /dev/null
@@ -1,71 +0,0 @@
-/**
- * External dependencies
- */
-
-import { addFilter } from '@wordpress/hooks';
-import { Fragment } from '@wordpress/element';
-import { __ } from '@wordpress/i18n';
-
-/**
- * WooCommerce dependencies
- */
-import { ReportFilters, TableCard } from '@woocommerce/components';
-
-const Report = ( { path, query } ) => {
-	return (
-		<Fragment>
-			<ReportFilters
-				query={ query }
-				path={ path }
-				filters={ [] }
-				advancedFilters={ {} }
-			/>
-			<TableCard
-				title="Apples"
-				headers={ [
-					{ label: 'Type', key: 'type', isLeftAligned: true, required: true },
-					{ label: 'Color', key: 'color' },
-					{ label: 'Taste', key: 'taste' },
-				] }
-				rows={ [
-					[
-						{ display: 'Granny Smith', value: 'type' },
-						{ display: 'Green', value: 'color' },
-						{ display: 'Tangy and sweet', value: 'taste' },
-					],
-					[
-						{ display: 'Golden Delicious', value: 'type' },
-						{ display: 'Gold', value: 'color' },
-						{ display: 'Sweet and cheery', value: 'taste' },
-					],
-					[
-						{ display: 'Gala', value: 'type' },
-						{ display: 'Red', value: 'color' },
-						{ display: 'Mild, sweet and crisp', value: 'taste' },
-					],
-					[
-						{ display: 'Braeburn', value: 'type' },
-						{ display: 'Red', value: 'color' },
-						{ display: 'Firm, crisp and pleasing', value: 'taste' },
-					],
-				] }
-				rowsPerPage={ 100 }
-				totalRows={ 1 }
-			/>
-		</Fragment>
-	);
-};
-
-/**
- * Use the 'woocommerce_admin_reports_list' filter to add a report page.
- */
-addFilter( 'woocommerce_admin_reports_list', 'plugin-domain', ( reports ) => {
-	return [
-		...reports,
-		{
-			report: 'example',
-			title: __( 'Example', 'plugin-domain' ),
-			component: Report,
-		},
-	];
-} );
diff --git a/plugins/woocommerce/client/admin/docs/examples/extensions/add-report/woocommerce-admin-add-report-example.php b/plugins/woocommerce/client/admin/docs/examples/extensions/add-report/woocommerce-admin-add-report-example.php
deleted file mode 100644
index 6b6c482cf6..0000000000
--- a/plugins/woocommerce/client/admin/docs/examples/extensions/add-report/woocommerce-admin-add-report-example.php
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-/**
- * Plugin Name: WooCommerce Admin Add Report Example
- *
- * @package WooCommerce\Admin
- */
-
-/**
- * Register the JS.
- */
-function add_report_register_script() {
-
-	if ( ! class_exists( 'Automattic\WooCommerce\Admin\PageController' ) || ! \Automattic\WooCommerce\Admin\PageController::is_admin_page() ) {
-		return;
-	}
-
-	$asset_file = require __DIR__ . '/dist/index.asset.php';
-	wp_register_script(
-		'add-report',
-		plugins_url( '/dist/index.js', __FILE__ ),
-		$asset_file['dependencies'],
-		$asset_file['version'],
-		true
-	);
-
-	wp_enqueue_script( 'add-report' );
-}
-add_action( 'admin_enqueue_scripts', 'add_report_register_script' );
-
-/**
- * Add "Example" as a Analytics submenu item.
- *
- * @param array $report_pages Report page menu items.
- * @return array Updated report page menu items.
- */
-function add_report_add_report_menu_item( $report_pages ) {
-	$report_pages[] = array(
-		'id'     => 'example-analytics-report',
-		'title'  => __( 'Example', 'woocommerce-admin' ),
-		'parent' => 'woocommerce-analytics',
-		'path'   => '/analytics/example',
-	);
-
-	return $report_pages;
-}
-add_filter( 'woocommerce_analytics_report_menu_items', 'add_report_add_report_menu_item' );
diff --git a/plugins/woocommerce/client/admin/docs/examples/extensions/add-task/README.md b/plugins/woocommerce/client/admin/docs/examples/extensions/add-task/README.md
deleted file mode 100644
index 5101e8aa45..0000000000
--- a/plugins/woocommerce/client/admin/docs/examples/extensions/add-task/README.md
+++ /dev/null
@@ -1,24 +0,0 @@
-# WooCommerce Onboarding Tasks - Adding Custom Tasks Example
-
-This example demonstrates how to add a custom task to the onboarding wizard.
-
-Please refer to the [Onboarding Tasks documentation](../../../features/onboarding-tasks.md) for more information.
-
-## Usage
-
-Run the following command to build the example plugin:
-
-```bash
-WC_EXT=add-task pnpm --filter=@woocommerce/admin-library example
-```
-
-After running the command above, you should see an `add-task` plugin folder in the project's `plugins/` directory. Once activating the plugin, you should see a new task in the onboarding wizard:
-
-<!-- markdownlint-disable-next-line no-inline-html -->
-<img src="./images/task-example.png" width="500px" alt="Screenshot of the onboarding wizard with the custom task" />
-
-You can make changes to the example plugin in the `plugins/woocommerce/client/admin/docs/examples/extensions/add-task` directory. To watch for changes in the example plugin and rebuild it automatically, run the following command:
-
-```bash
-WC_EXT=add-task pnpm --filter=@woocommerce/admin-library example --watch
-```
diff --git a/plugins/woocommerce/client/admin/docs/examples/extensions/add-task/woocommerce-admin-add-task-example.php b/plugins/woocommerce/client/admin/docs/examples/extensions/add-task/woocommerce-admin-add-task-example.php
deleted file mode 100644
index bba36286e4..0000000000
--- a/plugins/woocommerce/client/admin/docs/examples/extensions/add-task/woocommerce-admin-add-task-example.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-/**
- * Plugin Name: WooCommerce Admin Add Task Example
- *
- * @package WooCommerce\Admin
- */
-
-/**
- * Register the task.
- */
-function add_my_task() {
-	require_once __DIR__ . '/class-mytask.php';
-	$task_lists = \Automattic\WooCommerce\Admin\Features\OnboardingTasks\TaskLists::instance();
-
-	// Add the task to the extended list.
-	$task_lists::add_task(
-		'extended',
-		new MyTask(
-			$task_lists::get_list( 'extended' ),
-		)
-	);
-}
-
-add_action( 'init', 'add_my_task' );
-
-/**
- * Register the scripts to fill the task content on the frontend.
- */
-function add_task_register_script() {
-	if (
-		! class_exists( 'Automattic\WooCommerce\Internal\Admin\Loader' ) ||
-		! \Automattic\WooCommerce\Admin\PageController::is_admin_or_embed_page()
-	) {
-		return;
-	}
-
-	$asset_file = require __DIR__ . '/dist/index.asset.php';
-	wp_register_script(
-		'add-task',
-		plugins_url( '/dist/index.js', __FILE__ ),
-		$asset_file['dependencies'],
-		$asset_file['version'],
-		true
-	);
-
-	wp_enqueue_script( 'add-task' );
-}
-
-add_action( 'admin_enqueue_scripts', 'add_task_register_script' );
diff --git a/plugins/woocommerce/client/admin/docs/examples/extensions/dashboard-section/js/global-prices.js b/plugins/woocommerce/client/admin/docs/examples/extensions/dashboard-section/js/global-prices.js
deleted file mode 100644
index 2eb555fbcd..0000000000
--- a/plugins/woocommerce/client/admin/docs/examples/extensions/dashboard-section/js/global-prices.js
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * External dependencies
- */
-import moment from 'moment';
-
-/**
- * WooCommerce dependencies
- */
-import { Card, Chart } from '@woocommerce/components';
-import Currency from '@woocommerce/currency';
-
-const storeCurrency = Currency();
-const data = [];
-
-for ( let i = 1; i <= 20; i++ ) {
-	const date = moment().subtract( i, 'days' );
-	data.push( {
-		date: date.format( 'YYYY-MM-DDT00:00:00' ),
-		primary: {
-			label: 'Global Apple Prices, last 20 days',
-			labelDate: date.format( 'YYYY-MM-DD 00:00:00' ),
-			value: Math.floor( Math.random() * 100 ),
-		},
-	} );
-}
-
-const GlobalPrices = () => {
-	const average =
-		data.reduce( ( total, item ) => total + item.primary.value, 0 ) /
-		data.length;
-	return (
-		<Card
-			className="woocommerce-dashboard__chart-block woocommerce-analytics__card"
-			title="Global Apple Prices"
-		>
-			<Chart
-				title="Global Apple Prices"
-				interval="day"
-				data={ data.reverse() }
-				dateParser="%Y-%m-%dT%H:%M:%S"
-				legendTotals={ { primary: average } }
-				showHeaderControls={ false }
-				valueType={ 'currency' }
-				tooltipValueFormat={ storeCurrency.formatCurrency }
-			/>
-		</Card>
-	);
-};
-
-export default GlobalPrices;
diff --git a/plugins/woocommerce/client/admin/docs/examples/extensions/dashboard-section/woocommerce-admin-dashboard-section.php b/plugins/woocommerce/client/admin/docs/examples/extensions/dashboard-section/woocommerce-admin-dashboard-section.php
deleted file mode 100644
index 376aec61d5..0000000000
--- a/plugins/woocommerce/client/admin/docs/examples/extensions/dashboard-section/woocommerce-admin-dashboard-section.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-/**
- * Plugin Name: WooCommerce Admin Dashboard Section Example
- *
- * @package WooCommerce\Admin
- */
-
-/**
- * Register the JS.
- */
-function dashboard_section_register_script() {
-
-	if ( ! class_exists( 'Automattic\WooCommerce\Admin\PageController' ) || ! \Automattic\WooCommerce\Admin\PageController::is_admin_page() ) {
-		return;
-	}
-
-	$asset_file = require __DIR__ . '/dist/index.asset.php';
-	wp_register_script(
-		'dashboard_section',
-		plugins_url( '/dist/index.js', __FILE__ ),
-		$asset_file['dependencies'],
-		$asset_file['version'],
-		true
-	);
-
-	wp_enqueue_script( 'dashboard_section' );
-}
-add_action( 'admin_enqueue_scripts', 'dashboard_section_register_script' );
diff --git a/plugins/woocommerce/client/admin/docs/examples/extensions/payment-gateway-suggestions/class-my-simple-gateway.php b/plugins/woocommerce/client/admin/docs/examples/extensions/payment-gateway-suggestions/class-my-simple-gateway.php
deleted file mode 100644
index 5d528cc148..0000000000
--- a/plugins/woocommerce/client/admin/docs/examples/extensions/payment-gateway-suggestions/class-my-simple-gateway.php
+++ /dev/null
@@ -1,82 +0,0 @@
-<?php
-/**
- * Class My_Simple_Gateway
- *
- * @package WooCommerce\Admin
- */
-
-/**
- * Class My_Simple_Gateway
- */
-class My_Simple_Gateway extends WC_Payment_Gateway {
-	/**
-	 * Constructor for the gateway.
-	 */
-	public function __construct() {
-		$this->id                 = 'my-simple-gateway';
-		$this->has_fields         = false;
-		$this->method_title       = __( 'Simple gateway', 'woocommerce-admin' );
-		$this->method_description = __( 'A simple gateway to show extension of gateway installation during onboarding.', 'woocommerce-admin' );
-
-		// Load the settings.
-		$this->init_form_fields();
-		$this->init_settings();
-
-		add_action( 'woocommerce_update_options_payment_gateways_' . $this->id, array( $this, 'process_admin_options' ) );
-	}
-
-	/**
-	 * Init settings for gateways.
-	 */
-	public function init_settings() {
-		parent::init_settings();
-		$this->enabled = ! empty( $this->settings['enabled'] ) && 'yes' === $this->settings['enabled'] ? 'yes' : 'no';
-	}
-
-
-	/**
-	 * Initialise Gateway Settings Form Fields.
-	 */
-	public function init_form_fields() {
-		$this->form_fields = array(
-			'enabled' => array(
-				'title'   => __( 'Enabled', 'woocommerce-admin' ),
-				'type'    => 'checkbox',
-				'label'   => '',
-				'default' => 'no',
-			),
-			'api_key' => array(
-				'title'   => __( 'API Key', 'woocommerce-admin' ),
-				'type'    => 'text',
-				'default' => '',
-			),
-		);
-	}
-
-	/**
-	 * Determine if the gateway requires further setup.
-	 */
-	public function needs_setup() {
-		$settings = get_option( 'woocommerce_my-simple-gateway_settings', array() );
-		return ! isset( $settings['api_key'] ) || empty( $settings['api_key'] );
-	}
-
-	/**
-	 * Get setup help text.
-	 *
-	 * @return string
-	 */
-	public function get_setup_help_text() {
-		return __( 'Help text displayed beneath the configuration form.', 'woocommerce-admin' );
-	}
-
-	/**
-	 * Get required settings keys.
-	 *
-	 * @return array
-	 */
-	public function get_required_settings_keys() {
-		return array( 'api_key' );
-	}
-}
-
diff --git a/plugins/woocommerce/client/admin/docs/examples/extensions/payment-gateway-suggestions/class-my-slot-filled-gateway.php b/plugins/woocommerce/client/admin/docs/examples/extensions/payment-gateway-suggestions/class-my-slot-filled-gateway.php
deleted file mode 100644
index 0a7f3d4ab5..0000000000
--- a/plugins/woocommerce/client/admin/docs/examples/extensions/payment-gateway-suggestions/class-my-slot-filled-gateway.php
+++ /dev/null
@@ -1,75 +0,0 @@
-<?php
-/**
- * Class My_Slot_Filled_Gateway
- *
- * @package WooCommerce\Admin
- */
-
-/**
- * Class My_Simple_Gateway
- */
-class My_Slot_Filled_Gateway extends WC_Payment_Gateway {
-	/**
-	 * Constructor for the gateway.
-	 */
-	public function __construct() {
-		$this->id                 = 'my-slot-filled-gateway';
-		$this->has_fields         = false;
-		$this->method_title       = __( 'Slot filled gateway', 'woocommerce-admin' );
-		$this->method_description = __( 'A gateway demonstrating the use of slot fill for custom configuration screens.', 'woocommerce-admin' );
-
-		// Load the settings.
-		$this->init_form_fields();
-		$this->init_settings();
-
-		add_action( 'woocommerce_update_options_payment_gateways_' . $this->id, array( $this, 'process_admin_options' ) );
-	}
-
-	/**
-	 * Initialise Gateway Settings Form Fields.
-	 */
-	public function init_form_fields() {
-		$this->form_fields = array(
-			'enabled'    => array(
-				'title'   => __( 'Enabled', 'woocommerce-admin' ),
-				'type'    => 'checkbox',
-				'label'   => '',
-				'default' => 'no',
-			),
-			'my_setting' => array(
-				'title'   => __( 'My setting', 'woocommerce-admin' ),
-				'type'    => 'text',
-				'default' => '',
-			),
-		);
-	}
-
-	/**
-	 * Determine if the gateway requires further setup.
-	 */
-	public function needs_setup() {
-		$settings = get_option( 'woocommerce_my-slot-filled-gateway_settings', array() );
-		return ! isset( $settings['my_setting'] ) || empty( $settings['my_setting'] );
-	}
-
-	/**
-	 * Get post install script handles.
-	 *
-	 * @return array
-	 */
-	public function get_post_install_script_handles() {
-		$asset_file = require __DIR__ . '/dist/index.asset.php';
-		wp_register_script(
-			'payment-gateway-suggestion-slot-fill',
-			plugins_url( '/dist/index.js', __FILE__ ),
-			$asset_file['dependencies'],
-			$asset_file['version'],
-			true
-		);
-
-		return array(
-			'payment-gateway-suggestion-slot-fill',
-		);
-	}
-}
-
diff --git a/plugins/woocommerce/client/admin/docs/examples/extensions/payment-gateway-suggestions/js/index.js b/plugins/woocommerce/client/admin/docs/examples/extensions/payment-gateway-suggestions/js/index.js
deleted file mode 100644
index b4a7db2995..0000000000
--- a/plugins/woocommerce/client/admin/docs/examples/extensions/payment-gateway-suggestions/js/index.js
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
- * External dependencies
- */
-import { __ } from '@wordpress/i18n';
-import { createElement } from '@wordpress/element';
-import { PAYMENT_GATEWAYS_STORE_NAME } from '@woocommerce/data';
-import { registerPlugin } from '@wordpress/plugins';
-import { useDispatch } from '@wordpress/data';
-import { WooPaymentGatewayConfigure } from '@woocommerce/onboarding';
-
-const MyPaymentGatewaySuggestion = () => {
-	const { updatePaymentGateway } = useDispatch( PAYMENT_GATEWAYS_STORE_NAME );
-
-	return (
-		<WooPaymentGatewayConfigure id={ 'my-slot-filled-gateway' }>
-			{ ( { markConfigured, paymentGateway } ) => {
-				const completeSetup = () => {
-					updatePaymentGateway( paymentGateway.id, {
-						settings: {
-							my_setting: 123,
-						},
-					} ).then( () => {
-						markConfigured();
-					} );
-				};
-
-				return (
-					<>
-						<p>
-							{ __(
-								"This payment's configuration screen can be slot filled with any custom content.",
-								'woocommerce-admin'
-							) }
-						</p>
-						<button onClick={ completeSetup }>
-							{ __( 'Complete', 'woocommerce-admin' ) }
-						</button>
-					</>
-				);
-			} }
-		</WooPaymentGatewayConfigure>
-	);
-};
-
-export default registerPlugin( 'my-payment-gateway-suggestion', {
-	render: MyPaymentGatewaySuggestion,
-	scope: 'woocommerce-tasks',
-} );
diff --git a/plugins/woocommerce/client/admin/docs/examples/extensions/payment-gateway-suggestions/woocommerce-admin-payment-gateway-suggestions-mock-installer.php b/plugins/woocommerce/client/admin/docs/examples/extensions/payment-gateway-suggestions/woocommerce-admin-payment-gateway-suggestions-mock-installer.php
deleted file mode 100644
index 245a300964..0000000000
--- a/plugins/woocommerce/client/admin/docs/examples/extensions/payment-gateway-suggestions/woocommerce-admin-payment-gateway-suggestions-mock-installer.php
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-/**
- * This file includes functions that bypass the typical install process for the sake of the example.
- *
- * @package WooCommerce\Admin
- */
-
-/**
- * This is a workaround to bypass installing the gateway plugins from WP.org.
- * This is not necessary provided your suggestion is a valid WP.org plugin.
- *
- * @param array      $response Response data.
- * @param array      $handler Matched handler.
- * @param WP_Request $request Request data.
- * @return array
- */
-function payment_gateway_suggestions_mock_install_activate_response( $response, $handler, $request ) {
-	$plugins          = array( 'my-slot-filled-gateway-wporg-slug', 'my-simple-gateway-wporg-slug' );
-	$params           = $request->get_params();
-	$requested_plugin = isset( $params['plugins'] ) ? $params['plugins'] : null;
-
-	if ( '/wc-admin/plugins/install' === $request->get_route() && in_array( $requested_plugin, $plugins, true ) ) {
-		$response['data']    = array(
-			'installed' => array( $requested_plugin ),
-		);
-		$response['errors']  = array(
-			'errors' => array(),
-		);
-		$response['success'] = true;
-		$response['message'] = __( 'Plugins were successfully installed.', 'woocommerce-admin' );
-	}
-
-	if ( '/wc-admin/plugins/activate' === $request->get_route() && in_array( $requested_plugin, $plugins, true ) ) {
-		$response['data']['activated'] = array( $requested_plugin );
-		$response['data']['active']    = array_merge( $response['data']['active'], array( $requested_plugin ) );
-		$response['errors']            = array(
-			'errors' => array(),
-		);
-		$response['success']           = true;
-		$response['message']           = __( 'Plugins were successfully activated.', 'woocommerce-admin' );
-	}
-	return $response;
-}
-add_filter( 'rest_request_after_callbacks', 'payment_gateway_suggestions_mock_install_activate_response', 10, 3 );
-
-/**
- * This is a workaround to fake the installation check for the plugins.
- * This is not necessary when a plugin with the matching slug has been installed from WP.org.
- *
- * @param array $active_plugins Active plugins.
- * @return array
- */
-function payment_gateway_suggestions_mock_installed_gateway( $active_plugins ) {
-	if ( 'yes' === get_option( 'slot_filled_gateway_installed' ) ) {
-		$active_plugins[] = 'my-slot-filled-gateway-wporg-slug';
-	}
-
-	if ( 'yes' === get_option( 'my-simple-gateway-wporg-slug' ) ) {
-		$active_plugins[] = 'my-simple-gateway-wporg-slug';
-	}
-
-	return $active_plugins;
-}
-add_filter( 'option_active_plugins', 'payment_gateway_suggestions_mock_installed_gateway' );
diff --git a/plugins/woocommerce/client/admin/docs/examples/extensions/payment-gateway-suggestions/woocommerce-admin-payment-gateway-suggestions.php b/plugins/woocommerce/client/admin/docs/examples/extensions/payment-gateway-suggestions/woocommerce-admin-payment-gateway-suggestions.php
deleted file mode 100644
index a274b6393f..0000000000
--- a/plugins/woocommerce/client/admin/docs/examples/extensions/payment-gateway-suggestions/woocommerce-admin-payment-gateway-suggestions.php
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-/**
- * Plugin Name: WooCommerce Admin Payment Gateway Suggestions
- *
- * @package WooCommerce\Admin
- */
-
-/**
- * Include files.
- */
-function payment_gateway_suggestions_includes() {
-	include_once __DIR__ . '/woocommerce-admin-payment-gateway-suggestions-mock-installer.php';
-	include_once __DIR__ . '/class-my-simple-gateway.php';
-	include_once __DIR__ . '/class-my-slot-filled-gateway.php';
-}
-add_action( 'plugins_loaded', 'payment_gateway_suggestions_includes' );
-
-
-/**
- * Register the gateways with WooCommerce.
- *
- * @param array $gateways Gateways.
- * @return array
- */
-function payment_gateway_suggestions_register_gateways( $gateways ) {
-	$gateways[] = 'My_Simple_Gateway';
-	$gateways[] = 'My_Slot_Filled_Gateway';
-
-	return $gateways;
-}
-add_filter( 'woocommerce_payment_gateways', 'payment_gateway_suggestions_register_gateways' );
-
-/**
- * Add examples to the data sources.
- *
- * @param array $specs Specs.
- * @return array
- */
-function payment_gateway_suggestions_add_suggestions( $specs ) {
-	$specs[] = array(
-		'id'         => 'my-simple-gateway',
-		'title'      => __( 'Simple Gateway', 'woocommerce-admin' ),
-		'content'    => __( "This is a simple gateway that pulls its configuration fields from the gateway's class.", 'woocommerce-admin' ),
-		'image'      => WC()->plugin_url() . '/assets/images/placeholder.webp',
-		'plugins'    => array( 'my-simple-gateway-wporg-slug' ),
-		'is_visible' => array(
-			(object) array(
-				'type'      => 'base_location_country',
-				'value'     => 'US',
-				'operation' => '=',
-			),
-		),
-	);
-
-	$specs[] = array(
-		'id'      => 'my-slot-filled-gateway',
-		'title'   => __( 'Slot Filled Gateway', 'woocommerce-admin' ),
-		'content' => __( 'This gateway makes use of registered SlotFill scripts to show its content.', 'woocommerce-admin' ),
-		'image'   => WC()->plugin_url() . '/assets/images/placeholder.webp',
-		'plugins' => array( 'my-slot-filled-gateway-wporg-slug' ),
-	);
-
-	return $specs;
-}
-add_filter( 'woocommerce_admin_payment_gateway_suggestion_specs', 'payment_gateway_suggestions_add_suggestions' );
diff --git a/plugins/woocommerce/client/admin/docs/examples/extensions/sql-modification/woocommerce-admin-sql-modification.php b/plugins/woocommerce/client/admin/docs/examples/extensions/sql-modification/woocommerce-admin-sql-modification.php
deleted file mode 100644
index eedc7e024c..0000000000
--- a/plugins/woocommerce/client/admin/docs/examples/extensions/sql-modification/woocommerce-admin-sql-modification.php
+++ /dev/null
@@ -1,225 +0,0 @@
-<?php
-/**
- * Plugin Name: WooCommerce Admin SQL modification Example
- *
- * @package WooCommerce\Admin
- */
-
-/**
- * Make the currency settings available to the javascript client using
- * AssetDataRegistry, available in WooCommerce 3.9.
- *
- * The add_currency_settings function is a most basic example, but below is
- * a more elaborate example of how one might use AssetDataRegistry in classes.
- *
-	```php
-	<?php
-
-	class MyClassWithAssetData {
-		private $asset_data_registry;
-		public function __construct( Automattic\WooCommerce\Blocks\AssetDataRegistry $asset_data_registry ) {
-			$this->asset_data_registry = $asset_data_registry;
-		}
-
-		protected function some_method_adding_assets() {
-			$this->asset_data_registry->add( 'myData', [ 'foo' => 'bar' ] );
-		}
-	}
-
-	// somewhere in the extensions bootstrap
-	class Bootstrap {
-		protected $container;
-		public function __construct( Automattic\WooCommerce\Blocks\Container $container ) {
-			$this->container = $container;
-			$this->container->register( MyClassWithAssetData::class, function( $blocks_container ) => {
-				return new MyClassWithAssetData( $blocks_container->get( Automattic\WooCommerce\Blocks\AssetDataRegistry::class ) );
-			} );
-		}
-	}
-
-	// now anywhere MyClassWithAssetData is instantiated it will automatically be
-	// constructed with the AssetDataRegistry
-	```
- */
-function add_currency_settings() {
-	$currencies = array(
-		array(
-			'label' => __( 'United States Dollar', 'woocommerce-admin' ),
-			'value' => 'USD',
-		),
-		array(
-			'label' => __( 'New Zealand Dollar', 'woocommerce-admin' ),
-			'value' => 'NZD',
-		),
-		array(
-			'label' => __( 'South African Rand', 'woocommerce-admin' ),
-			'value' => 'ZAR',
-		),
-	);
-
-	$data_registry = Automattic\WooCommerce\Blocks\Package::container()->get(
-		Automattic\WooCommerce\Blocks\Assets\AssetDataRegistry::class
-	);
-
-	$data_registry->add( 'multiCurrency', $currencies );
-}
-
-/**
- * Register the JS.
- */
-function add_report_register_script() {
-
-	if ( ! class_exists( 'Automattic\WooCommerce\Admin\PageController' ) || ! \Automattic\WooCommerce\Admin\PageController::is_admin_page() ) {
-		return;
-	}
-
-	add_currency_settings();
-
-	$asset_file = require __DIR__ . '/dist/index.asset.php';
-	wp_register_script(
-		'sql-modification',
-		plugins_url( '/dist/index.js', __FILE__ ),
-		$asset_file['dependencies'],
-		$asset_file['version'],
-		true
-	);
-
-	wp_enqueue_script( 'sql-modification' );
-}
-add_action( 'admin_enqueue_scripts', 'add_report_register_script' );
-
-/**
- * Add the query argument `currency` for caching purposes. Otherwise, a
- * change of the currency will return the previous request's data.
- *
- * @param array $args query arguments.
- * @return array augmented query arguments.
- */
-function apply_currency_arg( $args ) {
-	$currency = 'USD';
-
-	// phpcs:disable WordPress.Security.NonceVerification.Recommended
-	if ( isset( $_GET['currency'] ) ) {
-		$currency = sanitize_text_field( wp_unslash( $_GET['currency'] ) );
-	}
-	// phpcs:enable
-
-	$args['currency'] = $currency;
-
-	return $args;
-}
-
-add_filter( 'woocommerce_analytics_revenue_query_args', 'apply_currency_arg' );
-
-add_filter( 'woocommerce_analytics_orders_query_args', 'apply_currency_arg' );
-add_filter( 'woocommerce_analytics_orders_stats_query_args', 'apply_currency_arg' );
-
-add_filter( 'woocommerce_analytics_products_query_args', 'apply_currency_arg' );
-add_filter( 'woocommerce_analytics_products_stats_query_args', 'apply_currency_arg' );
-
-add_filter( 'woocommerce_analytics_categories_query_args', 'apply_currency_arg' );
-
-add_filter( 'woocommerce_analytics_coupons_query_args', 'apply_currency_arg' );
-add_filter( 'woocommerce_analytics_coupons_stats_query_args', 'apply_currency_arg' );
-
-add_filter( 'woocommerce_analytics_taxes_query_args', 'apply_currency_arg' );
-add_filter( 'woocommerce_analytics_taxes_stats_query_args', 'apply_currency_arg' );
-
-/**
- * Add a JOIN clause.
- *
- * @param array $clauses an array of JOIN query strings.
- * @return array augmented clauses.
- */
-function add_join_subquery( $clauses ) {
-	global $wpdb;
-
-	$clauses[] = "JOIN {$wpdb->postmeta} currency_postmeta ON {$wpdb->prefix}wc_order_stats.order_id = currency_postmeta.post_id";
-
-	return $clauses;
-}
-
-add_filter( 'woocommerce_analytics_clauses_join_orders_subquery', 'add_join_subquery' );
-add_filter( 'woocommerce_analytics_clauses_join_orders_stats_total', 'add_join_subquery' );
-add_filter( 'woocommerce_analytics_clauses_join_orders_stats_interval', 'add_join_subquery' );
-
-add_filter( 'woocommerce_analytics_clauses_join_products_subquery', 'add_join_subquery' );
-add_filter( 'woocommerce_analytics_clauses_join_products_stats_total', 'add_join_subquery' );
-add_filter( 'woocommerce_analytics_clauses_join_products_stats_interval', 'add_join_subquery' );
-
-add_filter( 'woocommerce_analytics_clauses_join_categories_subquery', 'add_join_subquery' );
-
-add_filter( 'woocommerce_analytics_clauses_join_coupons_subquery', 'add_join_subquery' );
-add_filter( 'woocommerce_analytics_clauses_join_coupons_stats_total', 'add_join_subquery' );
-add_filter( 'woocommerce_analytics_clauses_join_coupons_stats_interval', 'add_join_subquery' );
-
-add_filter( 'woocommerce_analytics_clauses_join_taxes_subquery', 'add_join_subquery' );
-add_filter( 'woocommerce_analytics_clauses_join_taxes_stats_total', 'add_join_subquery' );
-add_filter( 'woocommerce_analytics_clauses_join_taxes_stats_interval', 'add_join_subquery' );
-
-/**
- * Add a WHERE clause.
- *
- * @param array $clauses an array of WHERE query strings.
- * @return array augmented clauses.
- */
-function add_where_subquery( $clauses ) {
-	$currency = 'USD';
-
-	// phpcs:disable WordPress.Security.NonceVerification.Recommended
-	if ( isset( $_GET['currency'] ) ) {
-		$currency = sanitize_text_field( wp_unslash( $_GET['currency'] ) );
-	}
-	// phpcs:enable
-
-	$clauses[] = "AND currency_postmeta.meta_key = '_order_currency' AND currency_postmeta.meta_value = '{$currency}'";
-
-	return $clauses;
-}
-add_filter( 'woocommerce_analytics_clauses_where_orders_subquery', 'add_where_subquery' );
-add_filter( 'woocommerce_analytics_clauses_where_orders_stats_total', 'add_where_subquery' );
-add_filter( 'woocommerce_analytics_clauses_where_orders_stats_interval', 'add_where_subquery' );
-
-add_filter( 'woocommerce_analytics_clauses_where_products_subquery', 'add_where_subquery' );
-add_filter( 'woocommerce_analytics_clauses_where_products_stats_total', 'add_where_subquery' );
-add_filter( 'woocommerce_analytics_clauses_where_products_stats_interval', 'add_where_subquery' );
-
-add_filter( 'woocommerce_analytics_clauses_where_categories_subquery', 'add_where_subquery' );
-
-add_filter( 'woocommerce_analytics_clauses_where_coupons_subquery', 'add_where_subquery' );
-add_filter( 'woocommerce_analytics_clauses_where_coupons_stats_total', 'add_where_subquery' );
-add_filter( 'woocommerce_analytics_clauses_where_coupons_stats_interval', 'add_where_subquery' );
-
-add_filter( 'woocommerce_analytics_clauses_where_taxes_subquery', 'add_where_subquery' );
-add_filter( 'woocommerce_analytics_clauses_where_taxes_stats_total', 'add_where_subquery' );
-add_filter( 'woocommerce_analytics_clauses_where_taxes_stats_interval', 'add_where_subquery' );
-
-/**
- * Add a SELECT clause.
- *
- * @param array $clauses an array of WHERE query strings.
- * @return array augmented clauses.
- */
-function add_select_subquery( $clauses ) {
-	$clauses[] = ', currency_postmeta.meta_value AS currency';
-
-	return $clauses;
-}
-
-add_filter( 'woocommerce_analytics_clauses_select_orders_subquery', 'add_select_subquery' );
-add_filter( 'woocommerce_analytics_clauses_select_orders_stats_total', 'add_select_subquery' );
-add_filter( 'woocommerce_analytics_clauses_select_orders_stats_interval', 'add_select_subquery' );
-
-add_filter( 'woocommerce_analytics_clauses_select_products_subquery', 'add_select_subquery' );
-add_filter( 'woocommerce_analytics_clauses_select_products_stats_total', 'add_select_subquery' );
-add_filter( 'woocommerce_analytics_clauses_select_products_stats_interval', 'add_select_subquery' );
-
-add_filter( 'woocommerce_analytics_clauses_select_categories_subquery', 'add_select_subquery' );
-
-add_filter( 'woocommerce_analytics_clauses_select_coupons_subquery', 'add_select_subquery' );
-add_filter( 'woocommerce_analytics_clauses_select_coupons_stats_total', 'add_select_subquery' );
-add_filter( 'woocommerce_analytics_clauses_select_coupons_stats_interval', 'add_select_subquery' );
-
-add_filter( 'woocommerce_analytics_clauses_select_taxes_subquery', 'add_select_subquery' );
-add_filter( 'woocommerce_analytics_clauses_select_taxes_stats_total', 'add_select_subquery' );
-add_filter( 'woocommerce_analytics_clauses_select_taxes_stats_interval', 'add_select_subquery' );
diff --git a/plugins/woocommerce/client/admin/docs/examples/extensions/table-column/woocommerce-admin-table-column.php b/plugins/woocommerce/client/admin/docs/examples/extensions/table-column/woocommerce-admin-table-column.php
deleted file mode 100644
index 620a30b0b1..0000000000
--- a/plugins/woocommerce/client/admin/docs/examples/extensions/table-column/woocommerce-admin-table-column.php
+++ /dev/null
@@ -1,67 +0,0 @@
-<?php
-/**
- * Plugin Name: WooCommerce Admin Table Column Example
- *
- * @package WooCommerce\Admin
- */
-
-/**
- * Register the JS.
- */
-function table_column_register_script() {
-
-	if ( ! class_exists( 'Automattic\WooCommerce\Admin\PageController' ) || ! \Automattic\WooCommerce\Admin\PageController::is_admin_page() ) {
-		return;
-	}
-
-	$asset_file = require __DIR__ . '/dist/index.asset.php';
-	wp_register_script(
-		'table_column',
-		plugins_url( '/dist/index.js', __FILE__ ),
-		$asset_file['dependencies'],
-		$asset_file['version'],
-		true
-	);
-
-	wp_enqueue_script( 'table_column' );
-}
-add_action( 'admin_enqueue_scripts', 'table_column_register_script' );
-
-/**
- * When adding fields to a REST API response, we need to update the schema
- * to reflect these changes. Not only does this let API consumers know of
- * the new fields, it also adds them to Report Exports.
- *
- * @param array $properties The endpoint item schema properties.
- * @return array Filtered schema.
- */
-function add_product_extended_attributes_schema( $properties ) {
-	$properties['extended_info']['average_rating'] = array(
-		'type'        => 'number',
-		'readonly'    => true,
-		'context'     => array( 'view', 'edit' ),
-		'description' => 'Average product rating.',
-	);
-
-	return $properties;
-}
-
-add_filter( 'woocommerce_rest_report_products_schema', 'add_product_extended_attributes_schema' );
-
-/**
- * Extended attributes can be used to obtain any attribute from a WC_Product instance that is
- * available by a `get_*` class method. In other words, we can add `average_rating` because
- * `get_average_rating` is an available method on a WC_Product instance.
- *
- * @param array $extended_attributes - Extra information from WC_Product instance.
- * @return array - Extended attributes.
- */
-function add_product_extended_attributes( $extended_attributes ) {
-	$extended_attributes[] = 'average_rating';
-	return $extended_attributes;
-}
-add_filter( 'woocommerce_rest_reports_products_extended_attributes', 'add_product_extended_attributes' );
-
-
-
-