diff --git a/docs/content/api/modules.json.gz b/docs/content/api/modules.json.gz
index eb8cfe5d31507..2e10fbd64fa7e 100644
Binary files a/docs/content/api/modules.json.gz and b/docs/content/api/modules.json.gz differ
diff --git a/docs/content/api/searchindex.json.gz b/docs/content/api/searchindex.json.gz
index 448e146c1dcc8..1e06286146080 100644
Binary files a/docs/content/api/searchindex.json.gz and b/docs/content/api/searchindex.json.gz differ
diff --git a/docs/content/api/sections.json.gz b/docs/content/api/sections.json.gz
index 4569fb3318685..d7dbd7c824564 100644
Binary files a/docs/content/api/sections.json.gz and b/docs/content/api/sections.json.gz differ
diff --git a/docs/content/integrations/fivetran/fivetran.mdx b/docs/content/integrations/fivetran/fivetran.mdx
index e69de29bb2d1d..cd33c2331e76e 100644
--- a/docs/content/integrations/fivetran/fivetran.mdx
+++ b/docs/content/integrations/fivetran/fivetran.mdx
@@ -0,0 +1,184 @@
+---
+title: "Using Dagster with Fivetran"
+description: Represent your Fivetran connectors in Dagster
+---
+
+# Using Dagster with Fivetran
+
+This guide provides instructions for using Dagster with Fivetran using the `dagster-fivetran` library. Your Fivetran connector tables can be represented as assets in the Dagster asset graph, allowing you to track lineage and dependencies between Fivetran assets and data assets you are already modeling in Dagster. You can also use Dagster to orchestrate Fivetran connectors, allowing you to trigger syncs for these on a cadence or based on upstream data changes.
+
+## What you'll learn
+
+- How to represent Fivetran assets in the Dagster asset graph, including lineage to other Dagster assets.
+- How to customize asset definition metadata for these Fivetran assets.
+- How to materialize Fivetran connector tables from Dagster.
+- How to customize how Fivetran connector tables are materialized.
+
+
+ Prerequisites
+
+- The `dagster` and `dagster-fivetran` libraries installed in your environment
+- Familiarity with asset definitions and the Dagster asset graph
+- Familiarity with Dagster resources
+- Familiarity with Fivetran concepts, like connectors and connector tables
+- A Fivetran workspace
+- A Fivetran API key and API secret. For more information, see [Getting Started](https://fivetran.com/docs/rest-api/getting-started) in the Fivetran REST API documentation.
+
+
+
+## Represent Fivetran assets in the asset graph
+
+To load Fivetran assets into the Dagster asset graph, you must first construct a resource, which allows Dagster to communicate with your Fivetran workspace. You'll need to supply your account ID, API key and API secret. See [Getting Started](https://fivetran.com/docs/rest-api/getting-started) in the Fivetran REST API documentation for more information on how to create your API key and API secret.
+
+Dagster can automatically load all connector tables from your Fivetran workspace as asset specs. Call the function, which returns list of s representing your Fivetran assets. You can then include these asset specs in your object:
+
+```python file=/integrations/fivetran/representing_fivetran_assets.py
+from dagster_fivetran import FivetranWorkspace, load_fivetran_asset_specs
+
+import dagster as dg
+
+fivetran_workspace = FivetranWorkspace(
+ account_id=dg.EnvVar("FIVETRAN_ACCOUNT_ID"),
+ api_key=dg.EnvVar("FIVETRAN_API_KEY"),
+ api_secret=dg.EnvVar("FIVETRAN_API_SECRET"),
+)
+
+fivetran_specs = load_fivetran_asset_specs(fivetran_workspace)
+defs = dg.Definitions(assets=fivetran_specs, resources={"fivetran": fivetran_workspace})
+```
+
+### Sync and materialize Fivetran assets
+
+You can use Dagster to sync Fivetran connectors and materialize Fivetran connector tables. You can use the factory to create all assets definitions for your Fivetran workspace.
+
+```python file=/integrations/fivetran/sync_and_materialize_fivetran_assets.py
+from dagster_fivetran import FivetranWorkspace, build_fivetran_assets_definitions
+
+import dagster as dg
+
+fivetran_workspace = FivetranWorkspace(
+ account_id=dg.EnvVar("FIVETRAN_ACCOUNT_ID"),
+ api_key=dg.EnvVar("FIVETRAN_API_KEY"),
+ api_secret=dg.EnvVar("FIVETRAN_API_SECRET"),
+)
+
+all_fivetran_assets = build_fivetran_assets_definitions(workspace=fivetran_workspace)
+
+defs = dg.Definitions(
+ assets=all_fivetran_assets,
+ resources={"fivetran": fivetran_workspace},
+)
+```
+
+### Customize the materialization of Fivetran assets
+
+If you want to customize the sync of your connectors, you can use the decorator to do so. This allows you to execute custom code before and after the call to the fivetran sync.
+
+```python file=/integrations/fivetran/customize_fivetran_asset_defs.py
+from dagster_fivetran import FivetranWorkspace, fivetran_assets
+
+import dagster as dg
+
+fivetran_workspace = FivetranWorkspace(
+ account_id=dg.EnvVar("FIVETRAN_ACCOUNT_ID"),
+ api_key=dg.EnvVar("FIVETRAN_API_KEY"),
+ api_secret=dg.EnvVar("FIVETRAN_API_SECRET"),
+)
+
+
+@fivetran_assets(
+ connector_id="fivetran_connector_id",
+ name="fivetran_connector_id",
+ group_name="fivetran_connector_id",
+ workspace=fivetran_workspace,
+)
+def fivetran_connector_assets(
+ context: dg.AssetExecutionContext, fivetran: FivetranWorkspace
+):
+ # Do something before the materialization...
+ yield from fivetran.sync_and_poll(context=context)
+ # Do something after the materialization...
+
+
+defs = dg.Definitions(
+ assets=[fivetran_connector_assets],
+ resources={"fivetran": fivetran_workspace},
+)
+```
+
+### Customize asset definition metadata for Fivetran assets
+
+By default, Dagster will generate asset specs for each Fivetran asset and populate default metadata. You can further customize asset properties by passing an instance of the custom to the function.
+
+```python file=/integrations/fivetran/customize_fivetran_translator_asset_spec.py
+from dagster_fivetran import (
+ DagsterFivetranTranslator,
+ FivetranConnectorTableProps,
+ FivetranWorkspace,
+ load_fivetran_asset_specs,
+)
+
+import dagster as dg
+
+fivetran_workspace = FivetranWorkspace(
+ account_id=dg.EnvVar("FIVETRAN_ACCOUNT_ID"),
+ api_key=dg.EnvVar("FIVETRAN_API_KEY"),
+ api_secret=dg.EnvVar("FIVETRAN_API_SECRET"),
+)
+
+
+# A translator class lets us customize properties of the built
+# Fivetran assets, such as the owners or asset key
+class MyCustomFivetranTranslator(DagsterFivetranTranslator):
+ def get_asset_spec(self, props: FivetranConnectorTableProps) -> dg.AssetSpec:
+ # We create the default asset spec using super()
+ default_spec = super().get_asset_spec(props)
+ # We customize the metadata and asset key prefix for all assets
+ return default_spec.replace_attributes(
+ key=default_spec.key.with_prefix("prefix"),
+ ).merge_attributes(metadata={"custom": "metadata"})
+
+
+fivetran_specs = load_fivetran_asset_specs(
+ fivetran_workspace, dagster_fivetran_translator=MyCustomFivetranTranslator()
+)
+
+defs = dg.Definitions(assets=fivetran_specs, resources={"fivetran": fivetran_workspace})
+```
+
+Note that `super()` is called in each of the overridden methods to generate the default asset spec. It is best practice to generate the default asset spec before customizing it.
+
+You can pass an instance of the custom to the decorator or the factory.
+
+### Load Fivetran assets from multiple workspaces
+
+Definitions from multiple Fivetran workspaces can be combined by instantiating multiple resources and merging their specs. This lets you view all your Fivetran assets in a single asset graph:
+
+```python file=/integrations/fivetran/multiple_fivetran_workspaces.py
+from dagster_fivetran import FivetranWorkspace, load_fivetran_asset_specs
+
+import dagster as dg
+
+sales_fivetran_workspace = FivetranWorkspace(
+ account_id=dg.EnvVar("FIVETRAN_SALES_ACCOUNT_ID"),
+ api_key=dg.EnvVar("FIVETRAN_SALES_API_KEY"),
+ api_secret=dg.EnvVar("FIVETRAN_SALES_API_SECRET"),
+)
+marketing_fivetran_workspace = FivetranWorkspace(
+ account_id=dg.EnvVar("FIVETRAN_MARKETING_ACCOUNT_ID"),
+ api_key=dg.EnvVar("FIVETRAN_MARKETING_API_KEY"),
+ api_secret=dg.EnvVar("FIVETRAN_MARKETING_API_SECRET"),
+)
+
+sales_fivetran_specs = load_fivetran_asset_specs(sales_fivetran_workspace)
+marketing_fivetran_specs = load_fivetran_asset_specs(marketing_fivetran_workspace)
+
+# Merge the specs into a single set of definitions
+defs = dg.Definitions(
+ assets=[*sales_fivetran_specs, *marketing_fivetran_specs],
+ resources={
+ "marketing_fivetran": marketing_fivetran_workspace,
+ "sales_fivetran": sales_fivetran_workspace,
+ },
+)
+```
diff --git a/docs/next/public/objects.inv b/docs/next/public/objects.inv
index 817246e30d43f..a98d6632e5182 100644
Binary files a/docs/next/public/objects.inv and b/docs/next/public/objects.inv differ
diff --git a/docs/sphinx/sections/api/apidocs/libraries/dagster-fivetran.rst b/docs/sphinx/sections/api/apidocs/libraries/dagster-fivetran.rst
index 7116c528ce7da..de1e266b70ef9 100644
--- a/docs/sphinx/sections/api/apidocs/libraries/dagster-fivetran.rst
+++ b/docs/sphinx/sections/api/apidocs/libraries/dagster-fivetran.rst
@@ -6,24 +6,18 @@ This library provides a Dagster integration with `Fivetran dg.AssetSpec:
+ # We create the default asset spec using super()
+ default_spec = super().get_asset_spec(props)
+ # We customize the metadata and asset key prefix for all assets
+ return default_spec.replace_attributes(
+ key=default_spec.key.with_prefix("prefix"),
+ ).merge_attributes(metadata={"custom": "metadata"})
+
+
+fivetran_specs = load_fivetran_asset_specs(
+ fivetran_workspace, dagster_fivetran_translator=MyCustomFivetranTranslator()
+)
+
+defs = dg.Definitions(assets=fivetran_specs, resources={"fivetran": fivetran_workspace})
diff --git a/examples/docs_snippets/docs_snippets/integrations/fivetran/multiple_fivetran_workspaces.py b/examples/docs_snippets/docs_snippets/integrations/fivetran/multiple_fivetran_workspaces.py
new file mode 100644
index 0000000000000..d28203bf3bcdf
--- /dev/null
+++ b/examples/docs_snippets/docs_snippets/integrations/fivetran/multiple_fivetran_workspaces.py
@@ -0,0 +1,26 @@
+from dagster_fivetran import FivetranWorkspace, load_fivetran_asset_specs
+
+import dagster as dg
+
+sales_fivetran_workspace = FivetranWorkspace(
+ account_id=dg.EnvVar("FIVETRAN_SALES_ACCOUNT_ID"),
+ api_key=dg.EnvVar("FIVETRAN_SALES_API_KEY"),
+ api_secret=dg.EnvVar("FIVETRAN_SALES_API_SECRET"),
+)
+marketing_fivetran_workspace = FivetranWorkspace(
+ account_id=dg.EnvVar("FIVETRAN_MARKETING_ACCOUNT_ID"),
+ api_key=dg.EnvVar("FIVETRAN_MARKETING_API_KEY"),
+ api_secret=dg.EnvVar("FIVETRAN_MARKETING_API_SECRET"),
+)
+
+sales_fivetran_specs = load_fivetran_asset_specs(sales_fivetran_workspace)
+marketing_fivetran_specs = load_fivetran_asset_specs(marketing_fivetran_workspace)
+
+# Merge the specs into a single set of definitions
+defs = dg.Definitions(
+ assets=[*sales_fivetran_specs, *marketing_fivetran_specs],
+ resources={
+ "marketing_fivetran": marketing_fivetran_workspace,
+ "sales_fivetran": sales_fivetran_workspace,
+ },
+)
diff --git a/examples/docs_snippets/docs_snippets/integrations/fivetran/representing_fivetran_assets.py b/examples/docs_snippets/docs_snippets/integrations/fivetran/representing_fivetran_assets.py
new file mode 100644
index 0000000000000..7637330c175cd
--- /dev/null
+++ b/examples/docs_snippets/docs_snippets/integrations/fivetran/representing_fivetran_assets.py
@@ -0,0 +1,12 @@
+from dagster_fivetran import FivetranWorkspace, load_fivetran_asset_specs
+
+import dagster as dg
+
+fivetran_workspace = FivetranWorkspace(
+ account_id=dg.EnvVar("FIVETRAN_ACCOUNT_ID"),
+ api_key=dg.EnvVar("FIVETRAN_API_KEY"),
+ api_secret=dg.EnvVar("FIVETRAN_API_SECRET"),
+)
+
+fivetran_specs = load_fivetran_asset_specs(fivetran_workspace)
+defs = dg.Definitions(assets=fivetran_specs, resources={"fivetran": fivetran_workspace})
diff --git a/examples/docs_snippets/docs_snippets/integrations/fivetran/sync_and_materialize_fivetran_assets.py b/examples/docs_snippets/docs_snippets/integrations/fivetran/sync_and_materialize_fivetran_assets.py
new file mode 100644
index 0000000000000..65a3490f59486
--- /dev/null
+++ b/examples/docs_snippets/docs_snippets/integrations/fivetran/sync_and_materialize_fivetran_assets.py
@@ -0,0 +1,16 @@
+from dagster_fivetran import FivetranWorkspace, build_fivetran_assets_definitions
+
+import dagster as dg
+
+fivetran_workspace = FivetranWorkspace(
+ account_id=dg.EnvVar("FIVETRAN_ACCOUNT_ID"),
+ api_key=dg.EnvVar("FIVETRAN_API_KEY"),
+ api_secret=dg.EnvVar("FIVETRAN_API_SECRET"),
+)
+
+all_fivetran_assets = build_fivetran_assets_definitions(workspace=fivetran_workspace)
+
+defs = dg.Definitions(
+ assets=all_fivetran_assets,
+ resources={"fivetran": fivetran_workspace},
+)
diff --git a/python_modules/libraries/dagster-fivetran/dagster_fivetran/asset_decorator.py b/python_modules/libraries/dagster-fivetran/dagster_fivetran/asset_decorator.py
index 9c276d552b070..12989283941f9 100644
--- a/python_modules/libraries/dagster-fivetran/dagster_fivetran/asset_decorator.py
+++ b/python_modules/libraries/dagster-fivetran/dagster_fivetran/asset_decorator.py
@@ -33,6 +33,7 @@ def fivetran_assets(
Sync the tables of a Fivetran connector:
.. code-block:: python
+
from dagster_fivetran import FivetranWorkspace, fivetran_assets
import dagster as dg
@@ -60,6 +61,7 @@ def fivetran_connector_assets(context: dg.AssetExecutionContext, fivetran: Fivet
Sync the tables of a Fivetran connector with a custom translator:
.. code-block:: python
+
from dagster_fivetran import (
DagsterFivetranTranslator,
FivetranConnectorTableProps,
diff --git a/python_modules/libraries/dagster-fivetran/dagster_fivetran/asset_defs.py b/python_modules/libraries/dagster-fivetran/dagster_fivetran/asset_defs.py
index 74d5752ea72c2..f746c6b3728ea 100644
--- a/python_modules/libraries/dagster-fivetran/dagster_fivetran/asset_defs.py
+++ b/python_modules/libraries/dagster-fivetran/dagster_fivetran/asset_defs.py
@@ -757,6 +757,7 @@ def build_fivetran_assets_definitions(
Sync the tables of a Fivetran connector:
.. code-block:: python
+
from dagster_fivetran import FivetranWorkspace, build_fivetran_assets_definitions
import dagster as dg
@@ -777,6 +778,7 @@ def build_fivetran_assets_definitions(
Sync the tables of a Fivetran connector with a custom translator:
.. code-block:: python
+
from dagster_fivetran import (
DagsterFivetranTranslator,
FivetranConnectorTableProps,
diff --git a/python_modules/libraries/dagster-fivetran/dagster_fivetran/resources.py b/python_modules/libraries/dagster-fivetran/dagster_fivetran/resources.py
index c519248e752d9..f6625618ac7e7 100644
--- a/python_modules/libraries/dagster-fivetran/dagster_fivetran/resources.py
+++ b/python_modules/libraries/dagster-fivetran/dagster_fivetran/resources.py
@@ -1082,6 +1082,7 @@ def load_fivetran_asset_specs(
Loading the asset specs for a given Fivetran workspace:
.. code-block:: python
+
from dagster_fivetran import FivetranWorkspace, load_fivetran_asset_specs
import dagster as dg