Repository: amp-labs/connectors
Pull request #1693 (2025-05-27 01:13:21)

tidy(zendesk): Combine modules
# Change

Consolidated 2 zendesk modules into one. All references use `common.moduleRoot`.

# Tests
Ran every read/write/metadata, each passing. Example read tickets:
![image](https://github.com/user-attachments/assets/53d66242-5139-4e17-bace-b67943d94e53)

# Note
Turns out the default pagination for HelpDesk module differs from Ticketing module. Hard coded the values for several objects that were part of HelpDesk module. This change is required, otherwise API would return:
![image](https://github.com/user-attachments/assets/007660a2-3848-460b-93e6-b5a345998dc5)


Cobalt0s: * **#1693** <a href="https://app.graphite.dev/github/pr/amp-labs/connectors/1693?utm_source=stack-comment-icon" target="_blank"><img src="https://static.graphite.dev/graphite-32x32-black.png" alt="Graphite" width="10px" height="10px"/></a> 👈 <a href="https://app.graphite.dev/github/pr/amp-labs/connectors/1693?utm_source=stack-comment-view-in-graphite" target="_blank">(View in Graphite)</a>
* `main`


<h2></h2>

This stack of pull requests is managed by <a href="https://graphite.dev?utm-source=stack-comment"><b>Graphite</b></a>. Learn more about <a href="https://stacking.dev/?utm_source=stack-comment">stacking</a>.
<!-- Current dependencies on/for this PR: -->
RajatPawar: >Turns out the default pagination for HelpDesk module differs from Ticketing module. Hard coded the values for several objects that were part of HelpDesk module. This change is required, otherwise API would return:
Thanks for taking care of this!

Patch:
diff --git a/providers/zendesk.go b/providers/zendesk.go
index 386dd37f..4be87dfa 100644
--- a/providers/zendesk.go
+++ b/providers/zendesk.go
@@ -1,21 +1,10 @@
 package providers
 
-import "github.com/amp-labs/connectors/common"
-
 const (
 	ZendeskChat    Provider = "zendeskChat"
 	ZendeskSupport Provider = "zendeskSupport"
 )
 
-const (
-	// ModuleZendeskTicketing is used for proxying requests through.
-	// https://developer.zendesk.com/api-reference/ticketing/introduction/
-	ModuleZendeskTicketing common.ModuleID = "ticketing"
-	// ModuleZendeskHelpCenter is Zendesk Help Center.
-	// https://developer.zendesk.com/api-reference/help_center/help-center-api/introduction/
-	ModuleZendeskHelpCenter common.ModuleID = "help-center"
-)
-
 func init() { // nolint:funlen
 	// Zendesk Support configuration
 	SetInfo(ZendeskSupport, ProviderInfo{
@@ -29,27 +18,6 @@ func init() { // nolint:funlen
 			ExplicitScopesRequired:    true,
 			ExplicitWorkspaceRequired: true,
 		},
-		DefaultModule: ModuleZendeskTicketing,
-		Modules: &Modules{
-			ModuleZendeskTicketing: {
-				BaseURL:     "https://{{.workspace}}.zendesk.com/api/v2",
-				DisplayName: "Zendesk Ticketing",
-				Support: Support{
-					Read:      true,
-					Subscribe: false,
-					Write:     true,
-				},
-			},
-			ModuleZendeskHelpCenter: {
-				BaseURL:     "https://{{.workspace}}.zendesk.com/api/v2",
-				DisplayName: "Zendesk Help Center",
-				Support: Support{
-					Read:      true,
-					Subscribe: false,
-					Write:     true,
-				},
-			},
-		},
 		Media: &Media{
 			DarkMode: &MediaTypeDarkMode{
 				IconURL: "https://res.cloudinary.com/dycvts6vp/image/upload/v1724169124/media/wkaellrizizwvelbdl6r.png",
diff --git a/providers/zendesksupport/connector.go b/providers/zendesksupport/connector.go
index d980eaf9..85e416a5 100644
--- a/providers/zendesksupport/connector.go
+++ b/providers/zendesksupport/connector.go
@@ -9,18 +9,18 @@ import (
 	"github.com/amp-labs/connectors/providers/zendesksupport/metadata"
 )
 
+const apiVersion = "/api/v2"
+
+// Connector covers ticketing as well as help center.
+// https://developer.zendesk.com/api-reference/ticketing/introduction/
+// https://developer.zendesk.com/api-reference/help_center/help-center-api/introduction/
 type Connector struct {
-	BaseURL    string
-	Client     *common.JSONHTTPClient
-	moduleInfo *providers.ModuleInfo
-	moduleID   common.ModuleID
+	BaseURL string
+	Client  *common.JSONHTTPClient
 }
 
 func NewConnector(opts ...Option) (conn *Connector, outErr error) {
-	params, err := paramsbuilder.Apply(parameters{}, opts,
-		// The module is resolved on behalf of the user if the option is missing.
-		WithModule(providers.ModuleZendeskTicketing),
-	)
+	params, err := paramsbuilder.Apply(parameters{}, opts)
 	if err != nil {
 		return nil, err
 	}
@@ -30,7 +30,6 @@ func NewConnector(opts ...Option) (conn *Connector, outErr error) {
 		Client: &common.JSONHTTPClient{
 			HTTPClient: httpClient,
 		},
-		moduleID: params.Module.Selection.ID,
 	}
 
 	providerInfo, err := providers.ReadInfo(conn.Provider(), &params.Workspace)
@@ -38,8 +37,6 @@ func NewConnector(opts ...Option) (conn *Connector, outErr error) {
 		return nil, err
 	}
 
-	conn.moduleInfo = providerInfo.ReadModuleInfo(conn.moduleID)
-
 	// connector and its client must mirror base url and provide its own error parser
 	conn.setBaseURL(providerInfo.BaseURL)
 	conn.Client.HTTPClient.ErrorHandler = interpreter.ErrorHandler{
@@ -58,22 +55,22 @@ func (c *Connector) String() string {
 }
 
 func (c *Connector) getReadURL(objectName string) (*urlbuilder.URL, error) {
-	path, err := metadata.Schemas.LookupURLPath(c.moduleID, objectName)
+	path, err := metadata.Schemas.FindURLPath(common.ModuleRoot, objectName)
 	if err != nil {
 		return nil, err
 	}
 
-	return urlbuilder.New(c.BaseURL, path)
+	return urlbuilder.New(c.BaseURL, apiVersion, path)
 }
 
 func (c *Connector) getWriteURL(objectName string) (*urlbuilder.URL, error) {
-	if objectsUnsupportedWrite[c.moduleID].Has(objectName) {
+	if objectsUnsupportedWrite[common.ModuleRoot].Has(objectName) {
 		return nil, common.ErrOperationNotSupportedForObject
 	}
 
-	if path, ok := writeURLExceptions[c.moduleID][objectName]; ok {
+	if path, ok := writeURLExceptions[common.ModuleRoot][objectName]; ok {
 		// URL for write differs from read.
-		return urlbuilder.New(c.BaseURL, path)
+		return urlbuilder.New(c.BaseURL, apiVersion, path)
 	}
 
 	return c.getReadURL(objectName)
diff --git a/providers/zendesksupport/customFields.go b/providers/zendesksupport/customFields.go
index e5a154a1..51680b35 100644
--- a/providers/zendesksupport/customFields.go
+++ b/providers/zendesksupport/customFields.go
@@ -18,7 +18,7 @@ import (
 func (c *Connector) requestCustomTicketFields(
 	ctx context.Context, objectName string,
 ) (map[int64]ticketField, error) {
-	if !objectsWithCustomFields[c.moduleID].Has(objectName) {
+	if !objectsWithCustomFields[common.ModuleRoot].Has(objectName) {
 		// This object doesn't have custom fields, we are done.
 		return map[int64]ticketField{}, nil
 	}
diff --git a/providers/zendesksupport/metadata.go b/providers/zendesksupport/metadata.go
index c9ca0a8e..38f0d9b8 100644
--- a/providers/zendesksupport/metadata.go
+++ b/providers/zendesksupport/metadata.go
@@ -11,12 +11,12 @@ import (
 func (c *Connector) ListObjectMetadata(
 	ctx context.Context, objectNames []string,
 ) (*common.ListObjectMetadataResult, error) {
-	metadataResult, err := metadata.Schemas.Select(c.moduleID, objectNames)
+	metadataResult, err := metadata.Schemas.Select(common.ModuleRoot, objectNames)
 	if err != nil {
 		return nil, err
 	}
 
-	customObjectNames := objectsWithCustomFields[c.moduleID].Intersection(datautils.NewSetFromList(objectNames))
+	customObjectNames := objectsWithCustomFields[common.ModuleRoot].Intersection(datautils.NewSetFromList(objectNames))
 	if len(customObjectNames) == 0 {
 		return metadataResult, nil
 	}
diff --git a/providers/zendesksupport/metadata/metadata.go b/providers/zendesksupport/metadata/metadata.go
index ff818423..ce3fc0d8 100644
--- a/providers/zendesksupport/metadata/metadata.go
+++ b/providers/zendesksupport/metadata/metadata.go
@@ -34,14 +34,8 @@ type CustomProperties struct {
 	Incremental bool   `json:"incremental,omitempty"`
 }
 
-func (s ZendeskSchemas) LookupPaginationType(
-	moduleID common.ModuleID, objectName string,
-) string {
-	if len(moduleID) == 0 {
-		moduleID = common.ModuleRoot
-	}
-
-	ptype := s.Modules[moduleID].Objects[objectName].Custom.Pagination
+func (s ZendeskSchemas) LookupPaginationType(objectName string) string {
+	ptype := s.Modules[common.ModuleRoot].Objects[objectName].Custom.Pagination
 	if len(ptype) == 0 {
 		// If no pagination type is found, the API assumes offset pagination.
 		return "offset"
@@ -50,19 +44,13 @@ func (s ZendeskSchemas) LookupPaginationType(
 	return ptype
 }
 
-func (s ZendeskSchemas) IsIncrementalRead(
-	moduleID common.ModuleID, objectName string,
-) bool {
-	if len(moduleID) == 0 {
-		moduleID = common.ModuleRoot
-	}
-
-	return s.Modules[moduleID].Objects[objectName].Custom.Incremental
+func (s ZendeskSchemas) IsIncrementalRead(objectName string) bool {
+	return s.Modules[common.ModuleRoot].Objects[objectName].Custom.Incremental
 }
 
 // nolint:lll
 var pageSizes = map[common.ModuleID]datautils.DefaultMap[string, string]{ //nolint:gochecknoglobals
-	"ticketing": datautils.NewDefaultMap(map[string]string{
+	common.ModuleRoot: datautils.NewDefaultMap(map[string]string{
 		// Every object below was verified.
 		// Increasing any of them would result in Bad Request error.
 		// Note some objects couldn't be tested due to account permissions.
@@ -100,25 +88,18 @@ var pageSizes = map[common.ModuleID]datautils.DefaultMap[string, string]{ //noli
 		"users":                      "1000",
 		"user_fields":                "100",
 		"views":                      "100",
+		// Every Help Center object uses 100 as a page size.
+		"articles/labels": "100",
+		"posts":           "100",
+		"topics":          "100",
+		"user_segments":   "100",
 	}, func(objectName string) string {
 		// Any large page size is accepted by API without an error.
 		return "2000"
 	}),
-	"help-center": datautils.NewDefaultMap(nil,
-		func(objectName string) string {
-			// Every object uses 100 as a page size.
-			return "100"
-		},
-	),
 }
 
-func (s ZendeskSchemas) PageSize(
-	moduleID common.ModuleID, objectName string,
-) string {
-	if len(moduleID) == 0 {
-		moduleID = common.ModuleRoot
-	}
-
+func (s ZendeskSchemas) PageSize(objectName string) string {
 	// TODO the map should be part of schema.json.
-	return pageSizes[moduleID].Get(objectName)
+	return pageSizes[common.ModuleRoot].Get(objectName)
 }
diff --git a/providers/zendesksupport/metadata/schemas.json b/providers/zendesksupport/metadata/schemas.json
index 5296a09e..92914760 100755
--- a/providers/zendesksupport/metadata/schemas.json
+++ b/providers/zendesksupport/metadata/schemas.json
@@ -1,293 +1,7 @@
 {
   "modules": {
-    "help-center": {
-      "id": "help-center",
-      "path": "/api/v2",
-      "objects": {
-        "articles/labels": {
-          "displayName": "Article Labels",
-          "path": "/help_center/articles/labels",
-          "responseKey": "labels",
-          "fields": {
-            "created_at": {
-              "displayName": "created_at",
-              "valueType": "string",
-              "providerType": "string"
-            },
-            "id": {
-              "displayName": "id",
-              "valueType": "int",
-              "providerType": "integer"
-            },
-            "name": {
-              "displayName": "name",
-              "valueType": "string",
-              "providerType": "string"
-            },
-            "updated_at": {
-              "displayName": "updated_at",
-              "valueType": "string",
-              "providerType": "string"
-            },
-            "url": {
-              "displayName": "url",
-              "valueType": "string",
-              "providerType": "string"
-            }
-          },
-          "custom": {
-            "pagination": "cursor"
-          }
-        },
-        "posts": {
-          "displayName": "Posts",
-          "path": "/community/posts",
-          "responseKey": "posts",
-          "fields": {
-            "author_id": {
-              "displayName": "author_id",
-              "valueType": "int",
-              "providerType": "integer"
-            },
-            "closed": {
-              "displayName": "closed",
-              "valueType": "boolean",
-              "providerType": "boolean"
-            },
-            "comment_count": {
-              "displayName": "comment_count",
-              "valueType": "int",
-              "providerType": "integer"
-            },
-            "content_tag_ids": {
-              "displayName": "content_tag_ids",
-              "valueType": "other",
-              "providerType": "array"
-            },
-            "created_at": {
-              "displayName": "created_at",
-              "valueType": "string",
-              "providerType": "string"
-            },
-            "details": {
-              "displayName": "details",
-              "valueType": "string",
-              "providerType": "string"
-            },
-            "featured": {
-              "displayName": "featured",
-              "valueType": "boolean",
-              "providerType": "boolean"
-            },
-            "follower_count": {
-              "displayName": "follower_count",
-              "valueType": "int",
-              "providerType": "integer"
-            },
-            "html_url": {
-              "displayName": "html_url",
-              "valueType": "string",
-              "providerType": "string"
-            },
-            "id": {
-              "displayName": "id",
-              "valueType": "int",
-              "providerType": "integer"
-            },
-            "non_author_editor_id": {
-              "displayName": "non_author_editor_id",
-              "valueType": "int",
-              "providerType": "integer"
-            },
-            "non_author_updated_at": {
-              "displayName": "non_author_updated_at",
-              "valueType": "string",
-              "providerType": "string"
-            },
-            "pinned": {
-              "displayName": "pinned",
-              "valueType": "boolean",
-              "providerType": "boolean"
-            },
-            "status": {
-              "displayName": "status",
-              "valueType": "string",
-              "providerType": "string"
-            },
-            "title": {
-              "displayName": "title",
-              "valueType": "string",
-              "providerType": "string"
-            },
-            "topic_id": {
-              "displayName": "topic_id",
-              "valueType": "int",
-              "providerType": "integer"
-            },
-            "updated_at": {
-              "displayName": "updated_at",
-              "valueType": "string",
-              "providerType": "string"
-            },
-            "url": {
-              "displayName": "url",
-              "valueType": "string",
-              "providerType": "string"
-            },
-            "vote_count": {
-              "displayName": "vote_count",
-              "valueType": "int",
-              "providerType": "integer"
-            },
-            "vote_sum": {
-              "displayName": "vote_sum",
-              "valueType": "int",
-              "providerType": "integer"
-            }
-          },
-          "custom": {
-            "pagination": "cursor"
-          }
-        },
-        "topics": {
-          "displayName": "Topics",
-          "path": "/community/topics",
-          "responseKey": "topics",
-          "fields": {
-            "created_at": {
-              "displayName": "created_at",
-              "valueType": "string",
-              "providerType": "string"
-            },
-            "description": {
-              "displayName": "description",
-              "valueType": "string",
-              "providerType": "string"
-            },
-            "follower_count": {
-              "displayName": "follower_count",
-              "valueType": "int",
-              "providerType": "integer"
-            },
-            "html_url": {
-              "displayName": "html_url",
-              "valueType": "string",
-              "providerType": "string"
-            },
-            "id": {
-              "displayName": "id",
-              "valueType": "int",
-              "providerType": "integer"
-            },
-            "manageable_by": {
-              "displayName": "manageable_by",
-              "valueType": "singleSelect",
-              "providerType": "string",
-              "values": [
-                {
-                  "value": "staff",
-                  "displayValue": "staff"
-                },
-                {
-                  "value": "managers",
-                  "displayValue": "managers"
-                }
-              ]
-            },
-            "name": {
-              "displayName": "name",
-              "valueType": "string",
-              "providerType": "string"
-            },
-            "position": {
-              "displayName": "position",
-              "valueType": "int",
-              "providerType": "integer"
-            },
-            "updated_at": {
-              "displayName": "updated_at",
-              "valueType": "string",
-              "providerType": "string"
-            },
-            "url": {
-              "displayName": "url",
-              "valueType": "string",
-              "providerType": "string"
-            },
-            "user_segment_id": {
-              "displayName": "user_segment_id",
-              "valueType": "int",
-              "providerType": "integer"
-            }
-          },
-          "custom": {
-            "pagination": "cursor"
-          }
-        },
-        "user_segments": {
-          "displayName": "User Segments",
-          "path": "/help_center/user_segments",
-          "responseKey": "user_segments",
-          "fields": {
-            "built_in": {
-              "displayName": "built_in",
-              "valueType": "boolean",
-              "providerType": "boolean"
-            },
-            "created_at": {
-              "displayName": "created_at",
-              "valueType": "string",
-              "providerType": "string"
-            },
-            "group_ids": {
-              "displayName": "group_ids",
-              "valueType": "other",
-              "providerType": "array"
-            },
-            "id": {
-              "displayName": "id",
-              "valueType": "int",
-              "providerType": "integer"
-            },
-            "name": {
-              "displayName": "name",
-              "valueType": "string",
-              "providerType": "string"
-            },
-            "or_tags": {
-              "displayName": "or_tags",
-              "valueType": "other",
-              "providerType": "array"
-            },
-            "organization_ids": {
-              "displayName": "organization_ids",
-              "valueType": "other",
-              "providerType": "array"
-            },
-            "tags": {
-              "displayName": "tags",
-              "valueType": "other",
-              "providerType": "array"
-            },
-            "updated_at": {
-              "displayName": "updated_at",
-              "valueType": "string",
-              "providerType": "string"
-            },
-            "user_type": {
-              "displayName": "user_type",
-              "valueType": "string",
-              "providerType": "string"
-            }
-          },
-          "custom": {
-            "pagination": "cursor"
-          }
-        }
-      }
-    },
-    "ticketing": {
-      "id": "ticketing",
+    "root": {
+      "id": "root",
       "path": "/api/v2",
       "objects": {
         "activities": {
@@ -350,8 +64,43 @@
               "valueType": "int",
               "providerType": "integer"
             },
-            "verb": {
-              "displayName": "verb",
+            "verb": {
+              "displayName": "verb",
+              "valueType": "string",
+              "providerType": "string"
+            }
+          },
+          "custom": {
+            "pagination": "cursor"
+          }
+        },
+        "articles/labels": {
+          "displayName": "Article Labels",
+          "path": "/help_center/articles/labels",
+          "responseKey": "labels",
+          "fields": {
+            "created_at": {
+              "displayName": "created_at",
+              "valueType": "string",
+              "providerType": "string"
+            },
+            "id": {
+              "displayName": "id",
+              "valueType": "int",
+              "providerType": "integer"
+            },
+            "name": {
+              "displayName": "name",
+              "valueType": "string",
+              "providerType": "string"
+            },
+            "updated_at": {
+              "displayName": "updated_at",
+              "valueType": "string",
+              "providerType": "string"
+            },
+            "url": {
+              "displayName": "url",
               "valueType": "string",
               "providerType": "string"
             }
@@ -1790,6 +1539,116 @@
             "incremental": true
           }
         },
+        "posts": {
+          "displayName": "Posts",
+          "path": "/community/posts",
+          "responseKey": "posts",
+          "fields": {
+            "author_id": {
+              "displayName": "author_id",
+              "valueType": "int",
+              "providerType": "integer"
+            },
+            "closed": {
+              "displayName": "closed",
+              "valueType": "boolean",
+              "providerType": "boolean"
+            },
+            "comment_count": {
+              "displayName": "comment_count",
+              "valueType": "int",
+              "providerType": "integer"
+            },
+            "content_tag_ids": {
+              "displayName": "content_tag_ids",
+              "valueType": "other",
+              "providerType": "array"
+            },
+            "created_at": {
+              "displayName": "created_at",
+              "valueType": "string",
+              "providerType": "string"
+            },
+            "details": {
+              "displayName": "details",
+              "valueType": "string",
+              "providerType": "string"
+            },
+            "featured": {
+              "displayName": "featured",
+              "valueType": "boolean",
+              "providerType": "boolean"
+            },
+            "follower_count": {
+              "displayName": "follower_count",
+              "valueType": "int",
+              "providerType": "integer"
+            },
+            "html_url": {
+              "displayName": "html_url",
+              "valueType": "string",
+              "providerType": "string"
+            },
+            "id": {
+              "displayName": "id",
+              "valueType": "int",
+              "providerType": "integer"
+            },
+            "non_author_editor_id": {
+              "displayName": "non_author_editor_id",
+              "valueType": "int",
+              "providerType": "integer"
+            },
+            "non_author_updated_at": {
+              "displayName": "non_author_updated_at",
+              "valueType": "string",
+              "providerType": "string"
+            },
+            "pinned": {
+              "displayName": "pinned",
+              "valueType": "boolean",
+              "providerType": "boolean"
+            },
+            "status": {
+              "displayName": "status",
+              "valueType": "string",
+              "providerType": "string"
+            },
+            "title": {
+              "displayName": "title",
+              "valueType": "string",
+              "providerType": "string"
+            },
+            "topic_id": {
+              "displayName": "topic_id",
+              "valueType": "int",
+              "providerType": "integer"
+            },
+            "updated_at": {
+              "displayName": "updated_at",
+              "valueType": "string",
+              "providerType": "string"
+            },
+            "url": {
+              "displayName": "url",
+              "valueType": "string",
+              "providerType": "string"
+            },
+            "vote_count": {
+              "displayName": "vote_count",
+              "valueType": "int",
+              "providerType": "integer"
+            },
+            "vote_sum": {
+              "displayName": "vote_sum",
+              "valueType": "int",
+              "providerType": "integer"
+            }
+          },
+          "custom": {
+            "pagination": "cursor"
+          }
+        },
         "queues": {
           "displayName": "Queues",
           "path": "/queues",
@@ -3696,6 +3555,81 @@
             "incremental": true
           }
         },
+        "topics": {
+          "displayName": "Topics",
+          "path": "/community/topics",
+          "responseKey": "topics",
+          "fields": {
+            "created_at": {
+              "displayName": "created_at",
+              "valueType": "string",
+              "providerType": "string"
+            },
+            "description": {
+              "displayName": "description",
+              "valueType": "string",
+              "providerType": "string"
+            },
+            "follower_count": {
+              "displayName": "follower_count",
+              "valueType": "int",
+              "providerType": "integer"
+            },
+            "html_url": {
+              "displayName": "html_url",
+              "valueType": "string",
+              "providerType": "string"
+            },
+            "id": {
+              "displayName": "id",
+              "valueType": "int",
+              "providerType": "integer"
+            },
+            "manageable_by": {
+              "displayName": "manageable_by",
+              "valueType": "singleSelect",
+              "providerType": "string",
+              "values": [
+                {
+                  "value": "staff",
+                  "displayValue": "staff"
+                },
+                {
+                  "value": "managers",
+                  "displayValue": "managers"
+                }
+              ]
+            },
+            "name": {
+              "displayName": "name",
+              "valueType": "string",
+              "providerType": "string"
+            },
+            "position": {
+              "displayName": "position",
+              "valueType": "int",
+              "providerType": "integer"
+            },
+            "updated_at": {
+              "displayName": "updated_at",
+              "valueType": "string",
+              "providerType": "string"
+            },
+            "url": {
+              "displayName": "url",
+              "valueType": "string",
+              "providerType": "string"
+            },
+            "user_segment_id": {
+              "displayName": "user_segment_id",
+              "valueType": "int",
+              "providerType": "integer"
+            }
+          },
+          "custom": {
+            "pagination": "cursor"
+          }
+        },
         "trigger_categories": {
           "displayName": "Trigger Categories",
           "path": "/trigger_categories",
@@ -3916,6 +3850,66 @@
             "pagination": "cursor"
           }
         },
+        "user_segments": {
+          "displayName": "User Segments",
+          "path": "/help_center/user_segments",
+          "responseKey": "user_segments",
+          "fields": {
+            "built_in": {
+              "displayName": "built_in",
+              "valueType": "boolean",
+              "providerType": "boolean"
+            },
+            "created_at": {
+              "displayName": "created_at",
+              "valueType": "string",
+              "providerType": "string"
+            },
+            "group_ids": {
+              "displayName": "group_ids",
+              "valueType": "other",
+              "providerType": "array"
+            },
+            "id": {
+              "displayName": "id",
+              "valueType": "int",
+              "providerType": "integer"
+            },
+            "name": {
+              "displayName": "name",
+              "valueType": "string",
+              "providerType": "string"
+            },
+            "or_tags": {
+              "displayName": "or_tags",
+              "valueType": "other",
+              "providerType": "array"
+            },
+            "organization_ids": {
+              "displayName": "organization_ids",
+              "valueType": "other",
+              "providerType": "array"
+            },
+            "tags": {
+              "displayName": "tags",
+              "valueType": "other",
+              "providerType": "array"
+            },
+            "updated_at": {
+              "displayName": "updated_at",
+              "valueType": "string",
+              "providerType": "string"
+            },
+            "user_type": {
+              "displayName": "user_type",
+              "valueType": "string",
+              "providerType": "string"
+            }
+          },
+          "custom": {
+            "pagination": "cursor"
+          }
+        },
         "users": {
           "displayName": "Users",
           "path": "/incremental/users/cursor",
diff --git a/providers/zendesksupport/modules.go b/providers/zendesksupport/modules.go
deleted file mode 100644
index e71a13b9..00000000
--- a/providers/zendesksupport/modules.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package zendesksupport
-
-import (
-	"github.com/amp-labs/connectors/providers"
-	"github.com/amp-labs/connectors/providers/zendesksupport/metadata"
-)
-
-const (
-	// ModuleTicketing
-	// Deprecated.
-	ModuleTicketing = providers.ModuleZendeskTicketing
-	// ModuleHelpCenter
-	// Deprecated.
-	ModuleHelpCenter = providers.ModuleZendeskHelpCenter
-)
-
-// SupportedModules represents currently working and supported modules within the Zendesk connector.
-// Modules are added to schema.json file using OpenAPI script.
-var SupportedModules = metadata.Schemas.ModuleRegistry() // nolint: gochecknoglobals
diff --git a/providers/zendesksupport/objectNames.go b/providers/zendesksupport/objectNames.go
index 3e446f18..58382145 100644
--- a/providers/zendesksupport/objectNames.go
+++ b/providers/zendesksupport/objectNames.go
@@ -3,7 +3,6 @@ package zendesksupport
 import (
 	"github.com/amp-labs/connectors/common"
 	"github.com/amp-labs/connectors/internal/datautils"
-	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/providers/zendesksupport/metadata"
 )
 
@@ -16,27 +15,25 @@ const (
 var supportedObjectsByRead = metadata.Schemas.ObjectNames() //nolint:gochecknoglobals
 
 var objectsUnsupportedWrite = map[common.ModuleID]datautils.Set[string]{ //nolint:gochecknoglobals
-	providers.ModuleZendeskTicketing: datautils.NewSet(
+	common.ModuleRoot: datautils.NewSet(
 		"attribute_values",
 		"instance_values",
 		"ticket_events",
 		"ticket_metric_events",
 	),
-	providers.ModuleZendeskHelpCenter: datautils.NewStringSet(),
 }
 
 var writeURLExceptions = map[common.ModuleID]datautils.Map[string, string]{ //nolint:gochecknoglobals
-	providers.ModuleZendeskTicketing: {
-		"attributes":    "/api/v2/routing/attributes",
-		"organizations": "/api/v2/organizations",
-		"tickets":       "/api/v2/tickets",
-		"users":         "/api/v2/users",
+	common.ModuleRoot: {
+		"attributes":    "/routing/attributes",
+		"organizations": "/organizations",
+		"tickets":       "/tickets",
+		"users":         "/users",
 	},
-	providers.ModuleZendeskHelpCenter: {},
 }
 
 var objectsWithCustomFields = map[common.ModuleID]datautils.StringSet{ // nolint:gochecknoglobals
-	ModuleTicketing: datautils.NewStringSet(
+	common.ModuleRoot: datautils.NewStringSet(
 		// https://developer.zendesk.com/api-reference/ticketing/tickets/tickets/#json-format
 		objectNameTickets,
 		// https://developer.zendesk.com/api-reference/ticketing/tickets/ticket-requests/#json-format
diff --git a/providers/zendesksupport/params.go b/providers/zendesksupport/params.go
index e8acc47a..9c3c9169 100644
--- a/providers/zendesksupport/params.go
+++ b/providers/zendesksupport/params.go
@@ -7,7 +7,6 @@ import (
 
 	"github.com/amp-labs/connectors/common"
 	"github.com/amp-labs/connectors/common/paramsbuilder"
-	"github.com/amp-labs/connectors/providers"
 	"golang.org/x/oauth2"
 )
 
@@ -18,19 +17,15 @@ type Option = func(params *parameters)
 type parameters struct {
 	paramsbuilder.Client
 	paramsbuilder.Workspace
-	paramsbuilder.Module
 }
 
 func newParams(opts []Option) (*common.ConnectorParams, error) { // nolint:unused
-	oldParams, err := paramsbuilder.Apply(parameters{}, opts,
-		WithModule(providers.ModuleZendeskTicketing),
-	)
+	oldParams, err := paramsbuilder.Apply(parameters{}, opts)
 	if err != nil {
 		return nil, err
 	}
 
 	return &common.ConnectorParams{
-		Module:              oldParams.Module.Selection.ID,
 		AuthenticatedClient: oldParams.Client.Caller.Client,
 		Workspace:           oldParams.Workspace.Name,
 	}, nil
@@ -40,7 +35,6 @@ func (p parameters) ValidateParams() error {
 	return errors.Join(
 		p.Client.ValidateParams(),
 		p.Workspace.ValidateParams(),
-		p.Module.ValidateParams(),
 	)
 }
 
@@ -63,10 +57,3 @@ func WithWorkspace(workspaceRef string) Option {
 		params.WithWorkspace(workspaceRef)
 	}
 }
-
-// WithModule sets the zendesk API module to use for the connector. It's required.
-func WithModule(module common.ModuleID) Option {
-	return func(params *parameters) {
-		params.WithModule(module, SupportedModules, providers.ModuleZendeskTicketing)
-	}
-}
diff --git a/providers/zendesksupport/parse.go b/providers/zendesksupport/parse.go
index 3188aadd..d02f947b 100644
--- a/providers/zendesksupport/parse.go
+++ b/providers/zendesksupport/parse.go
@@ -39,7 +39,7 @@ func getNextRecordsURL(node *ajson.Node) (string, error) {
 	}
 
 	// Next page can be found under different location.
-	// This format was noticed via Zendesk HelpCenter module.
+	// This format was noticed via Zendesk HelpCenter provider-module.
 	nextPage, err = jsonquery.New(node).StrWithDefault("next_page", "")
 	if err != nil {
 		return "", err
@@ -52,9 +52,9 @@ func getNextRecordsURL(node *ajson.Node) (string, error) {
 	return jsonquery.New(node).StrWithDefault("after_url", "")
 }
 
-func getRecords(moduleID common.ModuleID, objectName string) common.NodeRecordsFunc {
+func getRecords(objectName string) common.NodeRecordsFunc {
 	return func(node *ajson.Node) ([]*ajson.Node, error) {
-		responseFieldName := metadata.Schemas.LookupArrayFieldName(moduleID, objectName)
+		responseFieldName := metadata.Schemas.LookupArrayFieldName(common.ModuleRoot, objectName)
 
 		return jsonquery.New(node).ArrayRequired(responseFieldName)
 	}
diff --git a/providers/zendesksupport/read.go b/providers/zendesksupport/read.go
index e41c0190..6a2cdbb8 100644
--- a/providers/zendesksupport/read.go
+++ b/providers/zendesksupport/read.go
@@ -15,7 +15,7 @@ func (c *Connector) Read(ctx context.Context, config common.ReadParams) (*common
 		return nil, err
 	}
 
-	if !supportedObjectsByRead[c.moduleID].Has(config.ObjectName) {
+	if !supportedObjectsByRead[common.ModuleRoot].Has(config.ObjectName) {
 		return nil, common.ErrOperationNotSupportedForObject
 	}
 
@@ -36,7 +36,7 @@ func (c *Connector) Read(ctx context.Context, config common.ReadParams) (*common
 
 	return common.ParseResult(
 		rsp,
-		getRecords(c.moduleID, config.ObjectName),
+		getRecords(config.ObjectName),
 		getNextRecordsURL,
 		common.MakeMarshaledDataFunc(c.attachReadCustomFields(customFields)),
 		config.Fields,
@@ -55,8 +55,8 @@ func (c *Connector) buildReadURL(config common.ReadParams) (*urlbuilder.URL, err
 		return nil, err
 	}
 
-	pageSizeStr := metadata.Schemas.PageSize(c.moduleID, config.ObjectName)
-	isIncremental := metadata.Schemas.IsIncrementalRead(c.moduleID, config.ObjectName)
+	pageSizeStr := metadata.Schemas.PageSize(config.ObjectName)
+	isIncremental := metadata.Schemas.IsIncrementalRead(config.ObjectName)
 
 	if isIncremental {
 		// Incremental endpoints requires start query parameter.
@@ -68,7 +68,7 @@ func (c *Connector) buildReadURL(config common.ReadParams) (*urlbuilder.URL, err
 	} else {
 		// Different objects have different pagination types.
 		// https://developer.zendesk.com/api-reference/introduction/pagination/#using-offset-pagination
-		ptype := metadata.Schemas.LookupPaginationType(c.moduleID, config.ObjectName)
+		ptype := metadata.Schemas.LookupPaginationType(config.ObjectName)
 		if ptype == "cursor" {
 			url.WithQueryParam("page[size]", pageSizeStr)
 		}
diff --git a/scripts/openapi/zendesksupport/metadata/main.go b/scripts/openapi/zendesksupport/metadata/main.go
index 8be0101c..677b3509 100644
--- a/scripts/openapi/zendesksupport/metadata/main.go
+++ b/scripts/openapi/zendesksupport/metadata/main.go
@@ -6,9 +6,7 @@ import (
 	"github.com/amp-labs/connectors/common"
 	"github.com/amp-labs/connectors/internal/datautils"
 	"github.com/amp-labs/connectors/internal/goutils"
-	"github.com/amp-labs/connectors/internal/metadatadef"
 	"github.com/amp-labs/connectors/internal/staticschema"
-	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/providers/zendesksupport/metadata"
 	utilsopenapi "github.com/amp-labs/connectors/scripts/openapi/utils"
 	"github.com/amp-labs/connectors/scripts/openapi/zendesksupport/metadata/helpcenter"
@@ -19,28 +17,27 @@ import (
 func main() {
 	schemas := staticschema.NewExtendedMetadata[staticschema.FieldMetadataMapV2, metadata.CustomProperties]()
 	registry := datautils.NamedLists[string]{}
-	lists := datautils.IndexedLists[common.ModuleID, metadatadef.ExtendedSchema[metadata.CustomProperties]]{}
-
-	lists.Add(providers.ModuleZendeskTicketing, support.Objects()...)
-	lists.Add(providers.ModuleZendeskHelpCenter, helpcenter.Objects()...)
-
-	for module, objects := range lists {
-		for _, object := range objects {
-			if object.Problem != nil {
-				slog.Error("schema not extracted",
-					"objectName", object.ObjectName,
-					"error", object.Problem,
-				)
-			}
-
-			for _, field := range object.Fields {
-				schemas.Add(module, object.ObjectName, object.DisplayName, object.URLPath, object.ResponseKey,
-					utilsopenapi.ConvertMetadataFieldToFieldMetadataMapV2(field), nil, object.Custom)
-			}
-
-			for _, queryParam := range object.QueryParams {
-				registry.Add(queryParam, object.ObjectName)
-			}
+
+	objects := append(
+		support.Objects(),
+		helpcenter.Objects()...,
+	)
+
+	for _, object := range objects {
+		if object.Problem != nil {
+			slog.Error("schema not extracted",
+				"objectName", object.ObjectName,
+				"error", object.Problem,
+			)
+		}
+
+		for _, field := range object.Fields {
+			schemas.Add(common.ModuleRoot, object.ObjectName, object.DisplayName, object.URLPath, object.ResponseKey,
+				utilsopenapi.ConvertMetadataFieldToFieldMetadataMapV2(field), nil, object.Custom)
+		}
+
+		for _, queryParam := range object.QueryParams {
+			registry.Add(queryParam, object.ObjectName)
 		}
 	}
 


Test patch:
diff --git a/providers/utils_test.go b/providers/utils_test.go
index 288ea51f..846f7a55 100644
--- a/providers/utils_test.go
+++ b/providers/utils_test.go
@@ -298,23 +298,6 @@ func TestReadModuleInfo(t *testing.T) { // nolint:funlen,maintidx
 				},
 			},
 		},
-		{
-			name: "Zendesk root module",
-			input: inType{
-				provider: ZendeskSupport,
-				vars:     createCatalogVars("workspace", "london"),
-				moduleID: common.ModuleRoot,
-			},
-			expected: &ModuleInfo{
-				BaseURL:     "https://london.zendesk.com",
-				DisplayName: "Zendesk Support",
-				Support: Support{
-					Proxy: true,
-					Read:  true,
-					Write: true,
-				},
-			},
-		},
 		{
 			name: "Zoom root module",
 			input: inType{
@@ -438,23 +421,6 @@ func TestReadModuleInfo(t *testing.T) { // nolint:funlen,maintidx
 			},
 			// expectedErr: common.ErrMissingModule,
 		},
-		{
-			name: "Zendesk unknown module",
-			input: inType{
-				provider: ZendeskSupport,
-				vars:     createCatalogVars("workspace", "london"),
-				moduleID: "random-module-name",
-			},
-			expected: &ModuleInfo{
-				BaseURL:     "https://london.zendesk.com/api/v2",
-				DisplayName: "Zendesk Ticketing",
-				Support: Support{
-					Read:  true,
-					Write: true,
-				},
-			},
-			// expectedErr: common.ErrMissingModule,
-		},
 		// Choosing non-root module for providers supporting several modules.
 		{
 			name: "Atlassian Jira module",
@@ -525,36 +491,6 @@ func TestReadModuleInfo(t *testing.T) { // nolint:funlen,maintidx
 				Support:     Support{},
 			},
 		},
-		{
-			name: "Zendesk Ticketing module",
-			input: inType{
-				provider: ZendeskSupport,
-				moduleID: ModuleZendeskTicketing,
-			},
-			expected: &ModuleInfo{
-				BaseURL:     "https://{{.workspace}}.zendesk.com/api/v2",
-				DisplayName: "Zendesk Ticketing",
-				Support: Support{
-					Read:  true,
-					Write: true,
-				},
-			},
-		},
-		{
-			name: "Zendesk Help Center module",
-			input: inType{
-				provider: ZendeskSupport,
-				moduleID: ModuleZendeskHelpCenter,
-			},
-			expected: &ModuleInfo{
-				BaseURL:     "https://{{.workspace}}.zendesk.com/api/v2",
-				DisplayName: "Zendesk Help Center",
-				Support: Support{
-					Read:  true,
-					Write: true,
-				},
-			},
-		},
 		// Empty module for providers that have no modules defaults to root.
 		{
 			name: "Dynamics empty module",
diff --git a/providers/zendesksupport/delete_test.go b/providers/zendesksupport/delete_test.go
index 9dee90d8..bf4873ef 100644
--- a/providers/zendesksupport/delete_test.go
+++ b/providers/zendesksupport/delete_test.go
@@ -7,7 +7,6 @@ import (
 
 	"github.com/amp-labs/connectors"
 	"github.com/amp-labs/connectors/common"
-	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockcond"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockserver"
 	"github.com/amp-labs/connectors/test/utils/testroutines"
@@ -65,7 +64,7 @@ func TestDelete(t *testing.T) { // nolint:funlen,cyclop
 			t.Parallel()
 
 			tt.Run(t, func() (connectors.DeleteConnector, error) {
-				return constructTestConnector(tt.Server.URL, providers.ModuleZendeskTicketing)
+				return constructTestConnector(tt.Server.URL)
 			})
 		})
 	}
diff --git a/providers/zendesksupport/metadata_test.go b/providers/zendesksupport/metadata_test.go
index 35c319a2..004bccba 100644
--- a/providers/zendesksupport/metadata_test.go
+++ b/providers/zendesksupport/metadata_test.go
@@ -7,7 +7,6 @@ import (
 
 	"github.com/amp-labs/connectors"
 	"github.com/amp-labs/connectors/common"
-	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/test/utils/mockutils"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockcond"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockserver"
@@ -15,7 +14,7 @@ import (
 	"github.com/amp-labs/connectors/test/utils/testutils"
 )
 
-func TestListObjectMetadataZendeskSupportModule(t *testing.T) { // nolint:funlen,gocognit,cyclop
+func TestListObjectMetadata(t *testing.T) { // nolint:funlen,gocognit,cyclop
 	t.Parallel()
 
 	responseTicketsCustomFields := testutils.DataFromFile(t, "read/custom_fields/ticket_fields.json")
@@ -28,7 +27,7 @@ func TestListObjectMetadataZendeskSupportModule(t *testing.T) { // nolint:funlen
 			ExpectedErrs: []error{common.ErrMissingObjects},
 		},
 		{
-			Name:       "Object coming from different module is unknown",
+			Name:       "Unknown object",
 			Input:      []string{"articles"},
 			Server:     mockserver.Dummy(),
 			Comparator: testroutines.ComparatorSubsetMetadata,
@@ -170,35 +169,6 @@ func TestListObjectMetadataZendeskSupportModule(t *testing.T) { // nolint:funlen
 			},
 			ExpectedErrs: nil,
 		},
-	}
-
-	for _, tt := range tests {
-		// nolint:varnamelen
-		t.Run(tt.Name, func(t *testing.T) {
-			t.Parallel()
-
-			tt.Run(t, func() (connectors.ObjectMetadataConnector, error) {
-				return constructTestConnector(tt.Server.URL, providers.ModuleZendeskTicketing)
-			})
-		})
-	}
-}
-
-func TestListObjectMetadataHelpCenterModule(t *testing.T) { // nolint:funlen,gocognit,cyclop
-	t.Parallel()
-
-	tests := []testroutines.Metadata{
-		{
-			Name:       "Object coming from different module is unknown",
-			Input:      []string{"brands"},
-			Server:     mockserver.Dummy(),
-			Comparator: testroutines.ComparatorSubsetMetadata,
-			Expected: &common.ListObjectMetadataResult{
-				Errors: map[string]error{
-					"brands": common.ErrObjectNotSupported,
-				},
-			},
-		},
 		{
 			Name:       "Successfully describe one object with metadata",
 			Input:      []string{"articles/labels"},
@@ -229,7 +199,7 @@ func TestListObjectMetadataHelpCenterModule(t *testing.T) { // nolint:funlen,goc
 			t.Parallel()
 
 			tt.Run(t, func() (connectors.ObjectMetadataConnector, error) {
-				return constructTestConnector(tt.Server.URL, providers.ModuleZendeskHelpCenter)
+				return constructTestConnector(tt.Server.URL)
 			})
 		})
 	}
diff --git a/providers/zendesksupport/read_test.go b/providers/zendesksupport/read_test.go
index ca311dda..aeb4ea8f 100644
--- a/providers/zendesksupport/read_test.go
+++ b/providers/zendesksupport/read_test.go
@@ -9,7 +9,6 @@ import (
 	"github.com/amp-labs/connectors"
 	"github.com/amp-labs/connectors/common"
 	"github.com/amp-labs/connectors/internal/jsonquery"
-	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/test/utils/mockutils"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockcond"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockserver"
@@ -17,13 +16,14 @@ import (
 	"github.com/amp-labs/connectors/test/utils/testutils"
 )
 
-func TestReadZendeskSupportModule(t *testing.T) { //nolint:funlen,gocognit,cyclop,maintidx
+func TestRead(t *testing.T) { //nolint:funlen,gocognit,cyclop,maintidx
 	t.Parallel()
 
 	responseErrorFormat := testutils.DataFromFile(t, "resource-not-found.json")
 	responseForbiddenError := testutils.DataFromFile(t, "forbidden.json")
 	responseTriggersFirstPage := testutils.DataFromFile(t, "read/triggers-1-first-page.json")
 	responseTriggersLastPage := testutils.DataFromFile(t, "read/triggers-2-last-page.json")
+	responseReadPosts := testutils.DataFromFile(t, "read/help-center-posts.json")
 
 	tests := []testroutines.Read{
 		{
@@ -37,12 +37,6 @@ func TestReadZendeskSupportModule(t *testing.T) { //nolint:funlen,gocognit,cyclo
 			Server:       mockserver.Dummy(),
 			ExpectedErrs: []error{common.ErrMissingFields},
 		},
-		{
-			Name:         "Object coming from different module is unknown",
-			Input:        common.ReadParams{ObjectName: "user_segments", Fields: connectors.Fields("id")},
-			Server:       mockserver.Dummy(),
-			ExpectedErrs: []error{common.ErrOperationNotSupportedForObject},
-		},
 		{
 			Name:  "Correct error message is understood from JSON response",
 			Input: common.ReadParams{ObjectName: "triggers", Fields: connectors.Fields("id")},
@@ -121,6 +115,41 @@ func TestReadZendeskSupportModule(t *testing.T) { //nolint:funlen,gocognit,cyclo
 			},
 			ExpectedErrs: nil,
 		},
+		{
+			Name: "Successful read of help desk's posts with chosen fields",
+			Input: common.ReadParams{
+				ObjectName: "posts",
+				Fields:     connectors.Fields("title", "topic_id", "status"),
+			},
+			Server: mockserver.Conditional{
+				Setup: mockserver.ContentJSON(),
+				If: mockcond.And{
+					mockcond.Path("/api/v2/community/posts"),
+					mockcond.QueryParam("page[size]", "100"),
+				},
+				Then: mockserver.Response(http.StatusOK, responseReadPosts),
+			}.Server(),
+			Comparator: testroutines.ComparatorSubsetRead,
+			Expected: &common.ReadResult{
+				Rows: 1,
+				Data: []common.ReadResultRow{{
+					Fields: map[string]any{
+						"title":    "How do I get around the community?",
+						"topic_id": float64(27980065395091),
+						"status":   "none",
+					},
+					Raw: map[string]any{
+						"id":         float64(27980065413139),
+						"created_at": "2024-04-01T13:01:11Z",
+						"updated_at": "2024-04-01T13:01:11Z",
+					},
+				}},
+				NextPage: "https://d3v-ampersand.zendesk.com" +
+					"/api/v2/help_center/community/posts.json?page=2&per_page=30",
+				Done: false,
+			},
+			ExpectedErrs: nil,
+		},
 	}
 
 	for _, tt := range tests {
@@ -129,13 +158,13 @@ func TestReadZendeskSupportModule(t *testing.T) { //nolint:funlen,gocognit,cyclo
 			t.Parallel()
 
 			tt.Run(t, func() (connectors.ReadConnector, error) {
-				return constructTestConnector(tt.Server.URL, providers.ModuleZendeskTicketing)
+				return constructTestConnector(tt.Server.URL)
 			})
 		})
 	}
 }
 
-func TestIncrementalReadZendeskSupportModule(t *testing.T) { //nolint:funlen,gocognit,cyclop,maintidx
+func TestIncrementalRead(t *testing.T) { //nolint:funlen,gocognit,cyclop,maintidx
 	t.Parallel()
 
 	responseTickets := testutils.DataFromFile(t, "read/incremental/tickets.json")
@@ -302,75 +331,16 @@ func TestIncrementalReadZendeskSupportModule(t *testing.T) { //nolint:funlen,goc
 			t.Parallel()
 
 			tt.Run(t, func() (connectors.ReadConnector, error) {
-				return constructTestConnector(tt.Server.URL, providers.ModuleZendeskTicketing)
-			})
-		})
-	}
-}
-
-func TestReadHelpCenterModule(t *testing.T) { //nolint:funlen,gocognit,cyclop,maintidx
-	t.Parallel()
-
-	responseReadPosts := testutils.DataFromFile(t, "read-posts.json")
-
-	tests := []testroutines.Read{
-		{
-			Name:         "Object coming from different module is unknown",
-			Input:        common.ReadParams{ObjectName: "triggers", Fields: connectors.Fields("id")},
-			Server:       mockserver.Dummy(),
-			ExpectedErrs: []error{common.ErrOperationNotSupportedForObject},
-		},
-		{
-			Name: "Successful read with chosen fields",
-			Input: common.ReadParams{
-				ObjectName: "posts",
-				Fields:     connectors.Fields("title", "topic_id", "status"),
-			},
-			Server: mockserver.Conditional{
-				Setup: mockserver.ContentJSON(),
-				If:    mockcond.Path("/api/v2/community/posts"),
-				Then:  mockserver.Response(http.StatusOK, responseReadPosts),
-			}.Server(),
-			Comparator: testroutines.ComparatorSubsetRead,
-			Expected: &common.ReadResult{
-				Rows: 1,
-				Data: []common.ReadResultRow{{
-					Fields: map[string]any{
-						"title":    "How do I get around the community?",
-						"topic_id": float64(27980065395091),
-						"status":   "none",
-					},
-					Raw: map[string]any{
-						"id":         float64(27980065413139),
-						"created_at": "2024-04-01T13:01:11Z",
-						"updated_at": "2024-04-01T13:01:11Z",
-					},
-				}},
-				NextPage: "https://d3v-ampersand.zendesk.com" +
-					"/api/v2/help_center/community/posts.json?page=2&per_page=30",
-				Done: false,
-			},
-			ExpectedErrs: nil,
-		},
-	}
-
-	for _, tt := range tests {
-		// nolint:varnamelen
-		t.Run(tt.Name, func(t *testing.T) {
-			t.Parallel()
-
-			tt.Run(t, func() (connectors.ReadConnector, error) {
-				return constructTestConnector(tt.Server.URL, providers.ModuleZendeskHelpCenter)
+				return constructTestConnector(tt.Server.URL)
 			})
 		})
 	}
 }
 
-func constructTestConnector(serverURL string, moduleID common.ModuleID) (*Connector, error) {
+func constructTestConnector(serverURL string) (*Connector, error) {
 	connector, err := NewConnector(
 		WithAuthenticatedClient(mockutils.NewClient()),
 		WithWorkspace("test-workspace"),
-		WithModule(moduleID),
 	)
 	if err != nil {
 		return nil, err
diff --git a/providers/zendesksupport/schema_test.go b/providers/zendesksupport/schema_test.go
index 402e07fa..9393d6e3 100644
--- a/providers/zendesksupport/schema_test.go
+++ b/providers/zendesksupport/schema_test.go
@@ -3,8 +3,6 @@ package zendesksupport
 import (
 	"testing"
 
-	"github.com/amp-labs/connectors/common"
-	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/providers/zendesksupport/metadata"
 )
 
@@ -12,32 +10,26 @@ func TestLookupPaginationType(t *testing.T) {
 	t.Parallel()
 
 	tests := []struct {
-		module common.ModuleID
 		object string
 		want   string
 	}{
 		{
-			module: providers.ModuleZendeskTicketing,
 			object: "tickets",
 			want:   "cursor",
 		},
 		{
-			module: providers.ModuleZendeskTicketing,
 			object: "workspaces",
 			want:   "offset",
 		},
 		{
-			module: providers.ModuleZendeskHelpCenter,
 			object: "articles",
 			want:   "offset",
 		},
 		{
-			module: providers.ModuleZendeskTicketing,
 			object: "macros",
 			want:   "cursor",
 		},
 		{
-			module: providers.ModuleZendeskHelpCenter,
 			object: "community_posts",
 			want:   "offset",
 		},
@@ -47,7 +39,7 @@ func TestLookupPaginationType(t *testing.T) {
 		t.Run(test.object, func(t *testing.T) {
 			t.Parallel()
 
-			got := metadata.Schemas.LookupPaginationType(test.module, test.object)
+			got := metadata.Schemas.LookupPaginationType(test.object)
 			if test.want != got {
 				t.Errorf("LookupPaginationType(%s) = %v, want %v", test.object, got, test.want)
 			}
diff --git a/providers/zendesksupport/test/read-posts.json b/providers/zendesksupport/test/read/help-center-posts.json
similarity index 100%
rename from providers/zendesksupport/test/read-posts.json
rename to providers/zendesksupport/test/read/help-center-posts.json
diff --git a/providers/zendesksupport/write_test.go b/providers/zendesksupport/write_test.go
index f39512c4..ce690732 100644
--- a/providers/zendesksupport/write_test.go
+++ b/providers/zendesksupport/write_test.go
@@ -7,7 +7,6 @@ import (
 
 	"github.com/amp-labs/connectors"
 	"github.com/amp-labs/connectors/common"
-	"github.com/amp-labs/connectors/providers"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockcond"
 	"github.com/amp-labs/connectors/test/utils/mockutils/mockserver"
 	"github.com/amp-labs/connectors/test/utils/testroutines"
@@ -167,7 +166,7 @@ func TestWriteZendeskSupportModule(t *testing.T) { // nolint:funlen,cyclop
 			t.Parallel()
 
 			tt.Run(t, func() (connectors.WriteConnector, error) {
-				return constructTestConnector(tt.Server.URL, providers.ModuleZendeskTicketing)
+				return constructTestConnector(tt.Server.URL)
 			})
 		})
 	}
@@ -211,7 +210,7 @@ func TestWriteHelpCenterModule(t *testing.T) { //nolint:funlen,gocognit,cyclop,m
 			t.Parallel()
 
 			tt.Run(t, func() (connectors.WriteConnector, error) {
-				return constructTestConnector(tt.Server.URL, providers.ModuleZendeskHelpCenter)
+				return constructTestConnector(tt.Server.URL)
 			})
 		})
 	}
diff --git a/test/zendesksupport/connector.go b/test/zendesksupport/connector.go
index 3fff22e8..313e792e 100644
--- a/test/zendesksupport/connector.go
+++ b/test/zendesksupport/connector.go
@@ -19,7 +19,6 @@ func GetZendeskSupportConnector(ctx context.Context) *zendesksupport.Connector {
 	conn, err := zendesksupport.NewConnector(
 		zendesksupport.WithClient(ctx, http.DefaultClient, getConfig(reader), reader.GetOauthToken()),
 		zendesksupport.WithWorkspace(reader.Get(credscanning.Fields.Workspace)),
-		zendesksupport.WithModule(providers.ModuleZendeskTicketing),
 	)
 	if err != nil {
 		utils.Fail("error creating connector", "error", err)