{
    "componentChunkName": "component---node-modules-rocketseat-gatsby-theme-docs-core-src-templates-docs-query-js",
    "path": "/docs/user-guides/how-to-guides/developing-integrations-for-rudderstack/",
    "result": {"data":{"mdx":{"id":"182b3ed0-0695-5299-a2ab-44fc89c1c18b","excerpt":"How to Develop Integrations for RudderStack RudderStack currently supports over 80  destinations . This guide is useful if you wish to send events to a target…","fields":{"slug":"/docs/user-guides/how-to-guides/developing-integrations-for-rudderstack/"},"frontmatter":{"title":"How to Develop Integrations for RudderStack","description":"Useful tips for developers who wish to send events to their own destination platforms via RudderStack.","image":null,"disableTableOfContents":null},"body":"var _excluded = [\"components\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"How to Develop Integrations for RudderStack\",\n  \"description\": \"Useful tips for developers who wish to send events to their own destination platforms via RudderStack.\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, _excluded);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h1\", {\n    \"id\": \"how-to-develop-integrations-for-rudderstack\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h1\",\n    \"href\": \"#how-to-develop-integrations-for-rudderstack\",\n    \"aria-label\": \"how to develop integrations for rudderstack permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"How to Develop Integrations for RudderStack\"), mdx(\"div\", {\n    className: \"successBlock\"\n  }, mdx(\"p\", null, \"RudderStack currently supports over 80 \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://rudderstack.com/docs/destinations/\"\n  }, mdx(\"strong\", {\n    parentName: \"a\"\n  }, \"destinations\")), \".\"), mdx(\"p\", null, \"This guide is useful if you wish to send events to a target platform \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"not supported by us currently.\"))), mdx(\"h2\", {\n    \"id\": \"what-is-an-integration\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#what-is-an-integration\",\n    \"aria-label\": \"what is an integration permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"What is an integration?\"), mdx(\"p\", null, \"\\u200CA RudderStack integration is a package that includes the client-side \", \"(\", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"SDK\"), \")\", \" enhancements as well as the server-side \", \"(\", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Transformer\"), \")\", \" additions required to support a new destination platform.\"), mdx(\"h2\", {\n    \"id\": \"how-does-an-integration-work\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#how-does-an-integration-work\",\n    \"aria-label\": \"how does an integration work permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"How does an integration work?\"), mdx(\"p\", null, \"The RudderStack \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://rudderstack.com/docs/stream-sources/rudderstack-sdk-integration-guides/\"\n  }, mdx(\"strong\", {\n    parentName: \"a\"\n  }, \"SDKs\")), \" help the developers capture business events within their enterprise systems and route them to RudderStack. The events sent from the SDKs to RudderStack follow a canonical model and are independent of the programming language or the source platform.\"), mdx(\"p\", null, \"The RudderStack engine is message-agnostic and performs resilient but optimized routing functions. The \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/rudderlabs/rudder-transformer\"\n  }, mdx(\"strong\", {\n    parentName: \"a\"\n  }, \"transformer\")), \" service is responsible for the final mapping from the canonical message to the destination-specific semantics.\"), mdx(\"h2\", {\n    \"id\": \"why-not-just-develop-the-transformer-then\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#why-not-just-develop-the-transformer-then\",\n    \"aria-label\": \"why not just develop the transformer then permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Why not just develop the transformer, then?\"), mdx(\"p\", null, \"Given the above high-level distribution of responsibilities among the various RudderStack components, it might first appear that developing a new integration should involve only the development of the transformer, since the canonical payload that undergoes the transformation would already be part of the existing SDK.\"), mdx(\"p\", null, \"However, this is not the case due to a few underlying reasons:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Most destination platforms provide their own SDKs. While RudderStack relies on the destinations to offer some means of server-to-server communication, this communication support might not always be there or might not provide all the functionalities offered by the destination SDK. In such cases, the RudderStack SDK has to rely on the destination SDK to support the events not addressed as part of the platform's server-side APIs.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Certain platforms \", \"(\", \"especially attribution\", \")\", \" rely on establishing a cross-device identifier for delivering actionable insights. The proprietary systems typically generate such an identifier within the platform that leverages cross-references from various other sources. To integrate with such platforms, RudderStack leverages the platform SDK for establishing the identifier.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"In certain cases, the destination SDK captures events over and above its advertised APIs. In such cases, the RudderStack SDK has no option but to include the destination SDK.\")), mdx(\"p\", null, \"\\u200CThe following sections familiarize you with the RudderStack SDK components and then delve into the details of enhancing the SDKs.\"), mdx(\"h2\", {\n    \"id\": \"rudderstack-sdk-components\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#rudderstack-sdk-components\",\n    \"aria-label\": \"rudderstack sdk components permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"RudderStack SDK components\"), mdx(\"p\", null, \"The RudderStack SDKs have two major components\\u200C:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"The \", mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Core SDK\"), \" provides the APIs that application developers need to use to route events via RudderStack. Apart from routing events to the RudderStack backend, the core SDK also implements a factory pattern wherein the concrete implementations are the wrappers for the supported destination SDKs.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"The \", mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"integration sub-component\"), \" combines the wrapper implementation and the actual destination SDK that the wrapper adapts to the RudderStack framework.\")), mdx(\"h3\", {\n    \"id\": \"enhancing-the-core-sdks\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#enhancing-the-core-sdks\",\n    \"aria-label\": \"enhancing the core sdks permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Enhancing the core SDKs\"), mdx(\"p\", null, \"You can control the inclusion of a platform during development by including or excluding the corresponding \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"integration\"), \" \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"sub-component\"), \" in the build. The core SDK prepares an inventory of the supported integration modules and includes only those in the factory calls. Using this approach, you can restrict the application size to include only the required components.\"), mdx(\"p\", null, \"Even after an integration component has been included in the build, you can control its usage at runtime through appropriate server-side configurations which the client SDK downloads and uses. Using this approach, the developers can enable or disable the direct flow of events to the destination.\"), mdx(\"h2\", {\n    \"id\": \"submitting-an-integration-pull-request\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#submitting-an-integration-pull-request\",\n    \"aria-label\": \"submitting an integration pull request permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Submitting an integration pull request\"), mdx(\"p\", null, \"When developing a new integration for RudderStack, you need to submit a pull request (PR) to a couple of RudderStack repositories. For more details on submitting these PRs, refer to our \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://rudderstack.com/docs/user-guides/how-to-guides/how-to-submit-an-integration-pull-request\"\n  }, mdx(\"strong\", {\n    parentName: \"a\"\n  }, \"step-by-step guide\")), \".\"), mdx(\"h2\", {\n    \"id\": \"contact-us\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#contact-us\",\n    \"aria-label\": \"contact us permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Contact us\"), mdx(\"p\", null, \"For more information on any of the sections covered in this guide, feel free to \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"mailto:%20docs@rudderstack.com\"\n  }, mdx(\"strong\", {\n    parentName: \"a\"\n  }, \"contact us\")), \" or start a conversation in our \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://rudderstack.com/join-rudderstack-slack-community\"\n  }, mdx(\"strong\", {\n    parentName: \"a\"\n  }, \"Slack\")), \" community.\"));\n}\n;\nMDXContent.isMDXComponent = true;","headings":[{"depth":1,"value":"How to Develop Integrations for RudderStack"},{"depth":2,"value":"What is an integration?"},{"depth":2,"value":"How does an integration work?"},{"depth":2,"value":"Why not just develop the transformer, then?"},{"depth":2,"value":"RudderStack SDK components"},{"depth":3,"value":"Enhancing the core SDKs"},{"depth":2,"value":"Submitting an integration pull request"},{"depth":2,"value":"Contact us"}]}},"pageContext":{"slug":"/docs/user-guides/how-to-guides/developing-integrations-for-rudderstack/","next":{"label":"Home","link":"/docs/home"},"repositoryEditUrl":"","repositoryProvider":""}},
    "staticQueryHashes": ["2501019404"]}