{
  "version": 3,
  "sources": ["ssg:https://framerusercontent.com/modules/wBzerm5ZyEamUfsdp0Rb/2o2LbO0aAhlhGRqyTQp2/Q6EOzQnd6-8.js"],
  "sourcesContent": ["import{jsx as e,jsxs as t}from\"react/jsx-runtime\";import{Link as n}from\"framer\";import{motion as o}from\"framer-motion\";import*as a from\"react\";export const richText=/*#__PURE__*/t(a.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"Building native product integrations with popular apps such as Salesforce, Slack, or Jira into an application always seems simple at the beginning. All you\u2019d need to do is build an authentication mechanism, make a few API calls, and deploy it to your customers, right?\"}),/*#__PURE__*/e(\"p\",{children:\"Unfortunately, many engineering teams spend weeks stuck just at step 1 - authentication.\"}),/*#__PURE__*/t(\"p\",{children:[\"During the process of building an authentication infrastructure that provides fully managed auth for over \",/*#__PURE__*/e(n,{href:\"https://paragon-staging.framer.website/integrations/all\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"100 SaaS integration connectors\"})}),\", as well as any integration built through our \",/*#__PURE__*/e(n,{href:\"https://www.useparagon.com/custom-integrations\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Custom Integration Builder\"})}),\", we uncovered and overcame challenges that even our team could\u2019ve never anticipated when we set out on this journey to build Paragon years ago.\"]}),/*#__PURE__*/e(\"p\",{children:\"I thought it would be helpful to share our learnings with you in case you still wanted to build your product\u2019s native integrations in-house, even though Paragon solves this problem out-of-the-box and at scale for your team.\"}),/*#__PURE__*/e(\"h2\",{children:\"Auth <> Security\"}),/*#__PURE__*/e(\"p\",{children:\"We can\u2019t talk about authentication without discussing security.\"}),/*#__PURE__*/e(\"p\",{children:\"When handling auth for native integrations, whether it be through API Keys, OAuth, or even username and passwords (in rare cases), you\u2019ll have to store multiple credentials for each of your users. Depending on your integration use case, you may be storing credentials/tokens that give you access to sensitive data in their accounting systems, to private Slack/Teams messages, to employee data in their HR platform - you get the idea.\"}),/*#__PURE__*/e(\"p\",{children:\"And with great power comes great responsibility - your auth services need to be bulletproof from a security standpoint. It\u2019s crucial to treat tokens like passwords, because they can be functionally equivalent in most cases.\"}),/*#__PURE__*/e(\"p\",{children:\"Sure, it\u2019s easy enough to store these credential values as plaintext in some database table that you can grab whenever you need to make a request on behalf of your users. But by doing so, you\u2019re leaving yourself extremely vulnerable to data breaches, which can leak access to data across dozens of your customers\u2019 other apps - a mistake that you may not ever recover from.\"}),/*#__PURE__*/t(\"p\",{children:[\"As an example, back in April 2022, Heroku was compromised and their users\u2019 GitHub integration \",/*#__PURE__*/e(n,{href:\"https://www.bleepingcomputer.com/news/security/heroku-admits-that-customer-credentials-were-stolen-in-cyberattack/\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"OAuth access tokens were stolen\"})}),\", causing several private GitHub repositories to be breached and cloned. Even npm had their data harvested, an event that was immediately covered by dozens of publications, including \",/*#__PURE__*/e(n,{href:\"https://www.forbes.com/sites/forbestechcouncil/2022/08/05/how-to-protect-your-company-against-the-next-big-cyberattack/?sh=57f4f9852e69\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Forbes\"})}),\".\"]}),/*#__PURE__*/e(\"h3\",{children:\"Paragon\u2019s Approach to Securely Storing Credentials\"}),/*#__PURE__*/e(\"p\",{children:\"At Paragon, we wanted to ensure that even in the worst-case scenario in which a database is compromised, the attacker cannot obtain decrypted credentials.\"}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"1. Encryption & Storage\"})}),/*#__PURE__*/e(\"p\",{children:\"We ensure that your customers\u2019 integration credentials are symmetrically encrypted before they are stored.\"}),/*#__PURE__*/t(\"p\",{children:[\"Encryption keys are stored independently in a separate database, and whenever we need to access the decrypted credentials to make an API call, our \",/*#__PURE__*/e(n,{href:\"https://docs.useparagon.com/on-premise/application-architecture#execution\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Workflow\"})}),\" service will fetch the encrypted value and the associated encryption key and decrypt it locally in memory.\"]}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"2. Penetration tests\"})}),/*#__PURE__*/e(\"p\",{children:\"We regularly pen test our infrastructure to ensure that it\u2019s equipped to prevent attackers from \\xa0getting unauthorized access to both our customers\u2019 and their users\u2019 credentials.\"}),/*#__PURE__*/e(\"h2\",{children:\"Challenges with OAuth\"}),/*#__PURE__*/e(\"p\",{children:\"While many services do use API Keys to authenticate requests, over 50% of the top SaaS companies use OAuth 2.0 in order to authorize requests to their API.\"}),/*#__PURE__*/e(\"p\",{children:\"Generally, implementing OAuth based authorization flows for integrations involves setting up services to handle:\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"The initial authorization request to get the access and refresh tokens\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Storage of the access and refresh tokens\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Authenticating requests to the 3rd party API with the access tokens\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Using the refresh tokens to get new access tokens\"})})]}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",src:\"https://framerusercontent.com/images/FUkx7cFCc2s4Pc4bvBT93qabfzc.svg\",srcSet:\"https://framerusercontent.com/images/FUkx7cFCc2s4Pc4bvBT93qabfzc.svg?scale-down-to=512 512w,https://framerusercontent.com/images/FUkx7cFCc2s4Pc4bvBT93qabfzc.svg?scale-down-to=1024 1024w,https://framerusercontent.com/images/FUkx7cFCc2s4Pc4bvBT93qabfzc.svg?scale-down-to=2048 2048w,https://framerusercontent.com/images/FUkx7cFCc2s4Pc4bvBT93qabfzc.svg 2322w\"}),/*#__PURE__*/e(\"p\",{children:\"Many teams initially think that since OAuth 2.0 is a \u2018standard\u2019, it would be trivial to implement across dozens of integrations.\"}),/*#__PURE__*/e(\"p\",{children:\"However, there are many hidden challenges that need to be overcome in order to build an auth layer for your integration roadmap - challenges that even our own team didn\u2019t anticipate when we initially set out to build Paragon a few years ago, and spent years of dedicated engineering to solve.\"}),/*#__PURE__*/e(\"p\",{children:\"Let\u2019s talk about some of those challenges.\"}),/*#__PURE__*/e(\"h3\",{children:\"An Unstandardized Standard\"}),/*#__PURE__*/e(\"p\",{children:\"The main issue with OAuth is that it isn\u2019t really a protocol. Rather, it\u2019s a skeleton of a protocol and everything is dependent on how the app developer decides to implement it.\"}),/*#__PURE__*/e(\"p\",{children:\"Every app has its own interpretation of the OAuth standard (just look at each 3rd party application\u2019s API documentation), which introduces significant variations and inconsistencies when it comes to how you need to address it.\"}),/*#__PURE__*/e(\"p\",{children:\"Here are just a few of the many examples we\u2019ve run into:\"}),/*#__PURE__*/t(\"ol\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"The \",/*#__PURE__*/e(n,{href:\"https://datatracker.ietf.org/doc/html/rfc6749#section-4.1.1\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"state parameter\"})}),\" in the OAuth authorization request should support URL-encoded values but \",/*#__PURE__*/e(n,{href:\"https://twittercommunity.com/t/redirect-url-receiving-state-parameter-with-some-characters-stripped-out/170092?u=ethanlee\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Twitter does not\"})}),\".\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"While you have to specify the \",/*#__PURE__*/e(n,{href:\"https://datatracker.ietf.org/doc/html/rfc6749#section-3.3\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"scope\"})}),\" for most apps, Mailchimp and Notion don\u2019t use them.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"Every app can have very different \",/*#__PURE__*/e(n,{href:\"https://datatracker.ietf.org/doc/html/rfc6749#section-5.1\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"refresh token\"})}),\" policies. For Google, refresh tokens never expire and you get to create as many as you\u2019d like. But for Salesforce, each refresh token expires on a user-configurable basis and you can only \",/*#__PURE__*/e(n,{href:\"https://help.salesforce.com/s/articleView?id=sf.remoteaccess_request_manage.htm&type=5\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"issue 5 of them at a time\"})}),\".\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"Some apps require a Proof of Key for Code Exchange (\",/*#__PURE__*/e(n,{href:\"https://auth0.com/docs/get-started/authentication-and-authorization-flow/authorization-code-flow-with-proof-key-for-code-exchange-pkce\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"PKCE\"})}),\"), which adds additional requirements and steps in the Authorization Code Flow, while others do not.\"]})})]}),/*#__PURE__*/e(\"p\",{children:\"The list goes on, but the greatest challenge is undoubtedly around handling token refresh.\"}),/*#__PURE__*/e(\"h2\",{children:\"Complexities with Refreshing Tokens\"}),/*#__PURE__*/t(\"p\",{children:[\"Under OAuth, access tokens typically have a \",/*#__PURE__*/e(n,{href:\"https://datatracker.ietf.org/doc/html/rfc6749#section-1.5\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"time-to-live\"})}),\" or TTL (the expires_in parameter of a token response) before expiring and becoming invalid.\"]}),/*#__PURE__*/e(\"div\",{children:/*#__PURE__*/e(\"br\",{className:\"trailing-break\"})}),/*#__PURE__*/e(\"p\",{children:\"When it expires, new access tokens can be obtained using the provided refresh token (as shown in the diagram earlier).\"}),/*#__PURE__*/e(\"p\",{children:\"To prevent your users\u2019 access tokens from expiring (which will break the connection, cause requests to fail, and inconveniently require your user to authenticate again), your authentication service needs to refresh them periodically in the background. But how?\"}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Approach #1: Refreshing before every Request\"})}),/*#__PURE__*/e(\"p\",{children:\"The easiest implementation is to get a new access token using the refresh token each time when an API call is made.\"}),/*#__PURE__*/t(\"p\",{children:[\"But as you can imagine, this scales poorly because you would have to \",/*#__PURE__*/e(\"strong\",{children:\"double\"}),\" the number of requests your integration services need to make, which can easily lead to rate-limiting and load balancing issues.\"]}),/*#__PURE__*/e(\"p\",{children:\"Additionally, with integration use cases that don\u2019t run jobs in the background (such as user-triggered workflows), longer durations of inactivity can lead to even refresh tokens expiring.\"}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Approach #2: Refreshing Periodically in the Background\"})}),/*#__PURE__*/e(\"p\",{children:\"So instead of refreshing before every request, we landed on a much more robust (though complex) approach. Instead of refreshing tokens before making a request, Paragon runs a background job that refreshed all our users\u2019 tokens periodically by sending requests to sample endpoints to determine if an access token was still valid or not.\"}),/*#__PURE__*/e(\"p\",{children:\"This approach resolves the two issues we outlined earlier - running into rate limits and tokens expiring because of inactivity.\"}),/*#__PURE__*/e(\"p\",{children:\"However, implementing this into our auth infrastructure was significantly more complex than the first approach, as it led to us having to handle many complications and edge cases, including:\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Differing refresh policies\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Preventing race conditions\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Forced De-authorization\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Ambiguous errors\"})})]}),/*#__PURE__*/e(\"h2\",{children:\"Differing Refresh Policies\"}),/*#__PURE__*/e(\"p\",{children:\"To start, each app you want to integrate with may have implemented the token refresh flow differently.\"}),/*#__PURE__*/e(\"p\",{children:\"Some apps let you keep your existing refresh token indefinitely.\"}),/*#__PURE__*/e(\"ul\",{children:/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"ie. Google, where you can use a single refresh token forever\"})})}),/*#__PURE__*/e(\"p\",{children:\"Some apps will issue you a new refresh token after every access token retrieval.\"}),/*#__PURE__*/e(\"ul\",{children:/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"ie. QuickBooks, which gives you a new refresh token every time you get a new access token\"})})}),/*#__PURE__*/e(\"p\",{children:\"Some apps limit how many refresh tokens you can generate per organization\"}),/*#__PURE__*/e(\"ul\",{children:/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"ie. Salesforce limits an organization to 5 refresh tokens - any more and the rest are immediately invalidated\"})})}),/*#__PURE__*/e(\"p\",{children:\"Some apps have expiring refresh tokens (expiry completely up to the app developer).\"}),/*#__PURE__*/e(\"ul\",{children:/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"ie. Netsuite\u2019s refresh tokens expire every 3 hours if unused, Outlook refresh tokens after 60 days, etc.\"})})}),/*#__PURE__*/e(\"p\",{children:\"Some apps have different Inactivity and Absolute Expirations\"}),/*#__PURE__*/e(\"ul\",{children:/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"ie. Jira has a 90 day inactivity expiry and a 365 day absolute expiry (which forces your users to re-auth no matter what)\"})})}),/*#__PURE__*/e(\"p\",{children:\"While each of these adhere to the general OAuth standard, you can\u2019t leverage the same approach to handle every integration\u2019s auth. Not accounting for all the edge cases can lead to many production-level challenges with your integration after going live.\"}),/*#__PURE__*/e(\"p\",{children:\"That\u2019s why our integrations engineering team had to become OAuth experts in order to build the unified layer for auth that all our customers rely on for their products\u2019 native integrations.\"}),/*#__PURE__*/t(\"p\",{children:[\"On the bright side, this led to Paragon releasing its \",/*#__PURE__*/e(n,{href:\"https://useparagon.com/custom-integrations\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Custom Integration Builder\"})}),\" which enables customers to rely on our authentication service for \",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"any\"})}),\" native integration, beyond our \",/*#__PURE__*/e(n,{href:\"https://useparagon.com/integrations\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"100+ pre-built connectors\"})}),\".\"]}),/*#__PURE__*/e(\"h2\",{children:\"Preventing Race Conditions\"}),/*#__PURE__*/e(\"p\",{children:\"If you\u2019re able to comprehensively handle the complications with the varying refresh policies, next comes the challenge of preventing race conditions when refreshing tokens. Never fun to deal with when it comes to distributed systems.\"}),/*#__PURE__*/e(\"p\",{children:\"Just as one example, if a token is being refreshed, but a concurrent request is made to the 3rd party API, what do you do?\"}),/*#__PURE__*/e(\"p\",{children:\"In many cases, such as with QuickBooks, if you accidentally use a stale token, it will not only return an 400 unauthorized error on the request, it will also invalidate all other tokens, including the one being refreshed.\"}),/*#__PURE__*/t(\"p\",{children:[\"To prevent race conditions, we introduced a token \",/*#__PURE__*/e(n,{href:\"https://www.techtarget.com/searchnetworking/definition/mutex\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"mutex\"})}),\" as a locking mechanism.\"]}),/*#__PURE__*/e(\"p\",{children:\"This means that if a refresh job obtained the token mutex, all requests to that specific 3rd party service would be paused until it completes.\"}),/*#__PURE__*/e(\"h2\",{children:\"Handling Forced De-authorization\"}),/*#__PURE__*/e(\"p\",{children:\"If that wasn\u2019t enough, you have to also deal with forced de-authorization from the app\u2019s side (which is more common than we expected). For example, we\u2019ve seen vigilant Salesforce and Google Workspace admins manually revoke several connected apps at once. Since the app is deauthorized, it\u2019s not always reliable to depend on the access token TTL to check its validity.\"}),/*#__PURE__*/e(\"p\",{children:\"I hinted at this earlier, but since we can\u2019t rely on the TTL, we use sample endpoints for each app to test if a token was still valid.\"}),/*#__PURE__*/e(\"p\",{children:\"For example, \\xa0[.inline-code-highlight]GET /rest/api/3/mypreferences/locale[.inline-code-highlight] for all Atlassian applications - if a 200 Authorized response is returned, our service will know that the token is still valid - but otherwise it will use the refresh token to get a new access/refresh token.\"}),/*#__PURE__*/e(\"h2\",{children:\"Ambiguous Authentication Errors\"}),/*#__PURE__*/e(\"p\",{children:\"Finally, debugging auth errors. There are very few services that we\u2019ve built integrations for where we felt that they provided sufficient explanations as to why an error occurred, and in most cases the 3rd party app\u2019s API docs completely lack details on auth errors, or provide very generic and unhelpful resources.\"}),/*#__PURE__*/e(\"p\",{children:\"To make our OAuth client reliable and make debugging easier, we needed to be able to identify which errors are recoverable and which are not.\"}),/*#__PURE__*/t(\"p\",{children:[\"While \",/*#__PURE__*/e(n,{href:\"https://datatracker.ietf.org/doc/html/rfc6749#section-5.2\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"OAuth outlines standardized errors\"})}),\", which are invalid_request, invalid_client, invalid_grant, unauthorized_client, unsupported_grant_type, and invalid_scope, due to all the different policies listed earlier, it is incredibly difficult to debug, especially across dozens of services.\"]}),/*#__PURE__*/e(\"p\",{children:\"This led us to creating a repository of error responses such that our auth service can identify which errors are recoverable and which ones aren\u2019t, which has taken years to compile and is constantly being updated as changes are made to the 3rd party app\u2019s API and authentication flow.\"}),/*#__PURE__*/e(\"h2\",{children:\"Closing Thoughts\"}),/*#__PURE__*/e(\"p\",{children:\"Although auth is just the first step in building any native integration for your application, it is incredibly complex to get right and is the pre-requisite to any of your integrations functioning properly.\"}),/*#__PURE__*/t(\"p\",{children:[\"That\u2019s why it was critical for our customers that Paragon provides \",/*#__PURE__*/e(n,{href:\"http://useparagon.com/authentication\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"fully managed authentication\"})}),\" - we wanted to take on the burden of auth so your team can focus on challenges that are unique to your product and business.\"]}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"em\",{children:\"If you want to see how you can use Paragon to handle auth for your integrations, book some time with our team \"}),/*#__PURE__*/e(n,{href:\"https://useparagon.com/book-demo\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:/*#__PURE__*/e(\"em\",{children:\"here\"})})}),/*#__PURE__*/e(\"em\",{children:\".\"})]}),/*#__PURE__*/e(\"p\",{children:\"But if you do decide that your team should still be the one to own these challenges, I hope this article provides a roadmap/blueprint for building your own authentication infrastructure for integrations.\"}),/*#__PURE__*/e(\"p\",{children:\"\u200D\"})]});export const richText1=/*#__PURE__*/t(a.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"I\u2019ve had multiple conversations recently with customers who, despite being able to ship the integrations that were in their backlog for months in record time with Paragon, all ran into the same challenge. Lack of adoption.\"}),/*#__PURE__*/e(\"p\",{children:\"When leveraging a proper integration prioritization framework that accounts for demand from both prospects and customers, it\u2019s easy to fall into the trap of focusing solely on shipping the integration and making the assumption that users will rush to enable the integration as soon as it goes live.\"}),/*#__PURE__*/t(\"p\",{children:[\"However, without a proper go-to-market and launch strategy for each integration your team builds, you\u2019ll experience subpar usage which ultimately impacts the \",/*#__PURE__*/e(n,{href:\"https://www.useparagon.com/blog/measure-the-roi-of-your-native-integrations\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"ROI\"})}),\" of building the integration. And even in cases where the integration is easily discoverable, you can still suffer from low adoption if you don\u2019t equip your users with the necessary resources and support to successfully set up the integration.\\xa0\"]}),/*#__PURE__*/e(\"p\",{children:\"Launching an integration successfully will require cross-functional support across product, product marketing, customer success, sales, support, and engineering, and in this article, I\u2019ll walk you through every component of our integration launch framework.\"}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"em\",{children:\"Short on time? Scroll to the bottom for our Integration Launch Checklist that summarizes everything you need to consider for a successful launch.\"})}),/*#__PURE__*/e(\"h3\",{children:\"TL;DR\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Prior to launching your integration, map out your TAM and set up target rates for adoption, retention and task usage.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Set measurable KPIs for adoption, across integration activation, retention, and usage\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Beyond marketing channels, every source of an integration request is a channel that you need to communicate the launch through - from sales, customer success\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Create the necessary core assets that will be distributed when the integration is launched, such as video tutorials, blog article, and support documentation\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Communicate the value through marketing, sales, customer success, and partner channels\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Train your support staff on how to use the integration and common issues that may come up\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Never stop optimizing your integration for adoption and retention.\"})})]}),/*#__PURE__*/e(\"h2\",{children:\"Setting adoption and usage KPIs\"}),/*#__PURE__*/e(\"p\",{children:\"Since it\u2019s impossible to measure the success of your integration launch without setting a target, it\u2019s essential for the whole team to align on KPIs right at the start of the launch planning process. Specifically, you need to consider the following:\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"The total addressable market (TAM) of the integration\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Target adoption rate across different segments\"})})]}),/*#__PURE__*/e(\"h3\",{children:\"TAM of the integration\"}),/*#__PURE__*/e(\"p\",{children:\"The integration\u2019s total addressable market (TAM) is the universe of possible users or companies that could hypothetically use your integration. At a high level, this would be all of your users and prospects that use the 3rd party product.\"}),/*#__PURE__*/e(\"p\",{children:\"For example, if you are planning to build a HubSpot integration, the TAM for that integration would be any existing user that uses HubSpot for their CRM/marketing automation, as well as all prospects that use HubSpot.\"}),/*#__PURE__*/e(\"p\",{children:\"Determining the TAM for the integration consists of three segments:\\xa0\"}),/*#__PURE__*/t(\"ol\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Customers who have asked for the integration (via customer success/support)\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Users who use the 3rd party tool but have not expressed interest (via data enrichment using tools such as Crossbeam or Reveal)\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"All new users who use the 3rd party tool (including prospects who have asked for the integration)\"})})]}),/*#__PURE__*/e(\"h3\",{children:\"Target adoption rate\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"The next step is to set target adoption rates for the integration. For each segment, you should align on and set a goal in terms of % adoption of the integration.\"}),/*#__PURE__*/e(\"div\",{children:/*#__PURE__*/e(\"br\",{className:\"trailing-break\"})}),/*#__PURE__*/e(\"p\",{children:\"Setting these goals with your cross-functional teams will translate into downstream initiatives to ensure that you can maximize the adoption of the integration, which we\u2019ll dive deeper into later.\"}),/*#__PURE__*/e(\"p\",{children:\"While getting users to enable an integration indicates you successfully communicated the launch of the integration to the targeted users, you also want to make sure that the integration is actually providing the expected value.\"}),/*#__PURE__*/e(\"p\",{children:\"This brings us to the next KPI you need to track.\"}),/*#__PURE__*/e(\"h3\",{children:\"Integration deactivation rate\"}),/*#__PURE__*/e(\"p\",{children:\"Of the users who adopt your integration, what percentage of those do you expect to keep the integration enabled, and over what timeframe?\"}),/*#__PURE__*/e(\"p\",{children:\"It\u2019s important to measure integration retention and usage over time for a few reasons, because it can serve as a warning sign that there are issues or opportunities to improve the integration.\"}),/*#__PURE__*/e(\"p\",{children:\"If users deactivate an integration, it can be a signal that:\"}),/*#__PURE__*/t(\"ol\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"The integration features you\u2019ve built don\u2019t address the use case they need (whether their use case is not covered at all, or the integration is not sufficiently configurable)\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"The actual behavior did not match their expected behavior\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"There are issues with the integration (errors)\"})})]}),/*#__PURE__*/e(\"p\",{children:\"You need to set a benchmark on the integration deactivation rate, as keeping track of this metric will help you measure true adoption levels, and get ahead of issues early on by providing better support or by shipping improvements for the integration feature.\"}),/*#__PURE__*/e(\"h3\",{children:\"Integration task usage\"}),/*#__PURE__*/e(\"p\",{children:\"To take it to an even more granular level, you\u2019ll want to know how frequently your users are leveraging the integration.\"}),/*#__PURE__*/e(\"p\",{children:\"Even if an integration feature is enabled, if a customer is not actively using it, then it is not delivering any value, nor providing you the benefits that integrations have on product stickiness (as your customers will not build dependencies on your product).\"}),/*#__PURE__*/e(\"p\",{children:\"For example, when Asana launched its integration with Slack, they tracked metrics such as the number of Slack channels that used the integration and the number of tasks created through the integration.\"}),/*#__PURE__*/e(\"p\",{children:\"If you identify low integration task usage, the takeaways will be similar to the list above on integration deactivation rate, and will require you to dig deeper to identify the root cause(s).\"}),/*#__PURE__*/e(\"h2\",{children:\"Tracking adoption and usage KPIs\"}),/*#__PURE__*/e(\"p\",{children:\"To track each of the metrics outlined above, your engineering team will need to build event based analytics for the integration, and use a 3rd party service like Segment to pass that data into your product analytics tools and your CRM.\"}),/*#__PURE__*/t(\"p\",{children:[\"If you\u2019re building the integration on Paragon however, you\u2019ll be able to easily identify adoption and activity at the user level with our\",/*#__PURE__*/e(n,{href:\"https://docs.useparagon.com/monitoring/users\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\" Connected Users Dashboard\"})}),\", or perform deeper analysis by piping all usage data from our \",/*#__PURE__*/e(n,{href:\"https://docs.useparagon.com/api/task-history\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Task History API\"})}),\" into any BI tool of your team\u2019s choice.\"]}),/*#__PURE__*/e(\"p\",{children:\"Now that we\u2019ve identified the KPIs you need to set for a successful integration launch, let\u2019s get into everything you need to do to hit those KPIs.\"}),/*#__PURE__*/e(\"h2\",{children:\"Building the necessary resources\"}),/*#__PURE__*/e(\"h3\",{children:\"Messaging & Content\"}),/*#__PURE__*/e(\"p\",{children:\"Work with your product marketing team to ensure that you highlight the pain points that each integration feature solves, and build consistent messaging around the integration that can be later used across all launch communications, as well as the actual configuration experience in your application.\"}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Article\"})}),/*#__PURE__*/e(\"p\",{children:\"If you want to maximize the chances of your customers adopting the integration, make sure your team writes a blog post that dives deeper into the challenges that the integration solves, why they should use it, and if possible, include testimonials from customers who have tried the integration in beta. Here\u2019s an example of an article that Productboard published when they launched their Mixpanel and Heap integrations.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",src:\"https://framerusercontent.com/images/7BRAI1iNzo1RBnskiUHMccZho.png\",srcSet:\"https://framerusercontent.com/images/7BRAI1iNzo1RBnskiUHMccZho.png?scale-down-to=512 512w,https://framerusercontent.com/images/7BRAI1iNzo1RBnskiUHMccZho.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/7BRAI1iNzo1RBnskiUHMccZho.png 1379w\"}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Support Docs/Knowledge Base\"})}),/*#__PURE__*/e(\"p\",{children:\"Additionally, you need to make sure that you have adequate resources in place to make it easy for your customers to enable and configure the integration, even if you have an intuitive setup experience.\"}),/*#__PURE__*/t(\"p\",{children:[\"Here\u2019s an example from the support center from one of our customers, \",/*#__PURE__*/e(n,{href:\"https://support.bugherd.com/hc/en-us/articles/5913710676239\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Bugherd\"})}),\".\"]}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",src:\"https://framerusercontent.com/images/U7DwAYkCKUN11Ufr8oY9EpqrlM.png\",srcSet:\"https://framerusercontent.com/images/U7DwAYkCKUN11Ufr8oY9EpqrlM.png?scale-down-to=1024 965w,https://framerusercontent.com/images/U7DwAYkCKUN11Ufr8oY9EpqrlM.png 1199w\"}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Video Demo\"})}),/*#__PURE__*/e(\"p\",{children:\"You\u2019ll notice in Bugherd\u2019s support docs that they also provide a video walkthrough of the integration. The best way to showcase how an integration works and the improved experience your customers will achieve with the integration is to film a quick video walking through the integration, and I\u2019d highly recommend including this in both your blog article as well as the docs.\"}),/*#__PURE__*/e(\"p\",{children:\"Once you align on the resources and content you\u2019ll have in place for the integration, you can begin planning how you will communicate the integration to your customers.\"}),/*#__PURE__*/e(\"h2\",{children:\"Distribution / Launch Communications\"}),/*#__PURE__*/e(\"p\",{children:\"Earlier we provided a generalized segmentation of the different user segments that you should expect to adopt the integration (or specific features within the integration).\"}),/*#__PURE__*/e(\"p\",{children:\"In this framework, we\u2019ll group the communication methods into 2 categories: Launch and Evergreen\"}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Launch\"}),\": communications surround the integration during the initial launch of the integration\"]}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Evergreen\"}),\": efforts that will drive future prospects and customers who research and/or try out your product\"]}),/*#__PURE__*/e(\"h3\",{children:\"Initial Launch\"}),/*#__PURE__*/e(\"p\",{children:\"The first bucket are comms around the initial launch\\xa0 to consider is promoting the integration proactively. I\u2019ll break this down by team and the audience.\"}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Marketing\"})}),/*#__PURE__*/e(\"p\",{children:\"Marketing will have the largest reach when it comes to communicating the launch, so it\u2019s natural to start with them. Here is a table that contains the list of marketing opportunities to promote the integration, split up by the intended audience and the associated channels/tactics.\"}),/*#__PURE__*/e(\"div\",{children:/*#__PURE__*/e(\"br\",{className:\"trailing-break\"})}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Sales\"})}),/*#__PURE__*/e(\"p\",{children:\"For many of the integrations on your roadmap, there are going to be deals that your sales team has lost in the past due to not having the integration, or prospects who are currently in the pipeline that have expressed that the integration is a requirement. This makes the launch of the integration the perfect opportunity for your sales team to re-engage those prospects. The prerequisite here is that your sales team can easily pull a list of lost opportunities in your CRM where the integration was a requirement.\"}),/*#__PURE__*/t(\"p\",{children:[\"If you don\u2019t have that set up internally, have your sales operations team \",/*#__PURE__*/e(n,{href:\"https://www.useparagon.com/blog/calculate-the-revenue-impact-of-backlogging-integrations#measuring-sales-pipeline-impact\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"follow these steps\"})}),\".\"]}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Customer Success\"})}),/*#__PURE__*/e(\"p\",{children:\"If you have existing customers who have asked for this integration, informing them that the integration is available will be your customer success team\u2019s responsibility.\"}),/*#__PURE__*/e(\"p\",{children:\"Similar to the above, make sure that they have access to the list of your current customers who have requested the integration, so they can follow up as soon as the integration goes live.\"}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Partnerships\"})}),/*#__PURE__*/t(\"p\",{children:[\"If you have a tech partnership in place with the 3rd party company that you\u2019re integrating with, it can serve as a multiplier across all of the efforts outlined above. We dive more into the joint go-to-market opportunities you can explore with partners \",/*#__PURE__*/e(n,{href:\"https://www.useparagon.com/blog/how-to-build-a-tech-partnership\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"in this article\"})}),\", but to give a few examples:\"]}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Have the partner announce the integration to their customer/prospects via their newsletter or social media pages\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Incentivizing their sales teams to promote the integration\\xa0\\xa0\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Hosting a joint webinar showcasing the integration\"})})]}),/*#__PURE__*/e(\"h2\",{children:\"Evergreen adoption\"}),/*#__PURE__*/e(\"p\",{children:\"The evergreen component consists of the things you need to have in place that will drive integration adoption perpetually even after the initial announcement.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",src:\"https://framerusercontent.com/images/Z4YhtswWbBzDbMjyIa5OboBJS8.svg\",srcSet:\"https://framerusercontent.com/images/Z4YhtswWbBzDbMjyIa5OboBJS8.svg?scale-down-to=512 512w,https://framerusercontent.com/images/Z4YhtswWbBzDbMjyIa5OboBJS8.svg?scale-down-to=1024 1024w,https://framerusercontent.com/images/Z4YhtswWbBzDbMjyIa5OboBJS8.svg?scale-down-to=2048 2048w,https://framerusercontent.com/images/Z4YhtswWbBzDbMjyIa5OboBJS8.svg 2593w\"}),/*#__PURE__*/e(\"h3\",{children:\"Discoverability\"}),/*#__PURE__*/e(\"p\",{children:\"Whether it\u2019s for prospects who are doing research on your product, or users who will sign up, it\u2019s important that you make it as easy as possible for them to discover that the integration exists.\"}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Website\"})}),/*#__PURE__*/e(\"p\",{children:\"Most B2B SaaS companies today have an /integrations page on their website that makes it easy for prospects to quickly identify what integrations their products offer.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"If you don\u2019t have one yet, make sure your marketing team gets to it. After all, integrations are one of the top evaluation criteria for buyers today when they evaluate SaaS products.\"}),/*#__PURE__*/e(\"p\",{children:\"Assuming that\u2019s in place, make sure that the integrations page is updated with the integration\\xa0 you are launching.\"}),/*#__PURE__*/e(\"p\",{children:\"To take it a step further, ensure that you have a page dedicated to the integration that will provide your prospects more context on the features provided within the integration, and the value that it will add to their experience with your product.\"}),/*#__PURE__*/e(\"p\",{children:\"Continuing with BugHerd\u2019s example, their website is the perfect example of what should be included:\"}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"em\",{children:\"Bugherd\u2019s integration page\"})}),/*#__PURE__*/e(\"img\",{alt:\"Bugherd's integrations page\",className:\"framer-image\",src:\"https://framerusercontent.com/images/xKCMgDzTnILgJ5op22XyzqLVAI4.png\",srcSet:\"https://framerusercontent.com/images/xKCMgDzTnILgJ5op22XyzqLVAI4.png?scale-down-to=512 512w,https://framerusercontent.com/images/xKCMgDzTnILgJ5op22XyzqLVAI4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/xKCMgDzTnILgJ5op22XyzqLVAI4.png 1723w\"}),/*#__PURE__*/e(\"p\",{children:\"\u200D\"}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"em\",{children:\"Bugherd\u2019s Jira-specific integration page\"})}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",src:\"https://framerusercontent.com/images/PtMsi2dICM5RDi1tiMzluOSEzhQ.png\",srcSet:\"https://framerusercontent.com/images/PtMsi2dICM5RDi1tiMzluOSEzhQ.png?scale-down-to=512 512w,https://framerusercontent.com/images/PtMsi2dICM5RDi1tiMzluOSEzhQ.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/PtMsi2dICM5RDi1tiMzluOSEzhQ.png 1902w\"}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"In-App Integration Marketplace\"})}),/*#__PURE__*/e(\"p\",{children:\"Along the same theme as the website, you also want to ensure that integrations are easily discoverable in your application.\"}),/*#__PURE__*/t(\"p\",{children:[\"I\u2019ve written about the best practices for building an \",/*#__PURE__*/e(n,{href:\"https://www.useparagon.com/blog/building-a-saas-integration-marketplace\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"in-app integration marketplace\"})}),\" in the past, but the high level requirements will be similar to the website.\"]}),/*#__PURE__*/e(\"h3\",{children:\"Product onboarding\"}),/*#__PURE__*/e(\"p\",{children:\"If you want to maximize the odds of new users discovering the integration, you need to ensure that it is promoted as part of their product onboarding experience.\"}),/*#__PURE__*/t(\"p\",{children:[\"However, \",/*#__PURE__*/e(\"em\",{children:\"when\"}),\" you should introduce the integration in your users\u2019 onboarding journey largely depends on how critical the integration is in getting them to the \u2018aha\u2019 moment. If the integration is core to your product and can help shorten your users\u2019 time to value, then you want to drive your users towards enabling it as early on as possible, in the first session.\"]}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Critical integrations\"})}),/*#__PURE__*/t(\"p\",{children:[\"Integrations that help your customers understand \",/*#__PURE__*/e(\"em\",{children:\"how\"}),\" your product delivers value, or \",/*#__PURE__*/e(\"em\",{children:\"how \"}),\"it differentiates you from competitors, should be presented as early on as realistically possible.\"]}),/*#__PURE__*/e(\"p\",{children:\"For example, LeadIQ, a sales prospecting tool, relies heavily on their superior CRM and sales engagement integrations as a key differentiating feature against competitors in their crowded market. As a result, they present all the mission critical integrations they provide as early as the sign up form.\"}),/*#__PURE__*/e(\"img\",{alt:\"LeadIQ signup form that asks for the user's CRM and Sales Engagement platforms\",className:\"framer-image\",src:\"https://framerusercontent.com/images/mZMHn5KdsdtXsYqGe7pSUMNOjA.png\",srcSet:\"https://framerusercontent.com/images/mZMHn5KdsdtXsYqGe7pSUMNOjA.png?scale-down-to=512 512w,https://framerusercontent.com/images/mZMHn5KdsdtXsYqGe7pSUMNOjA.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/mZMHn5KdsdtXsYqGe7pSUMNOjA.png 1227w\"}),/*#__PURE__*/t(\"p\",{children:[\"Additionally, certain integrations may be critical to present upon signup for one segment of your users, but not another. If you have firmographic or demographic data at your disposal, you may want to present the integration only to specific user segments during onboarding, as it may only be relevant to a subset of your users. Here\u2019s one of our customers, \",/*#__PURE__*/e(n,{href:\"https://www.useparagon.com/customers/tldv\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"tl;dv\"})}),\", that has set themselves up for success with this in mind.\"]}),/*#__PURE__*/e(\"img\",{alt:\"TLDV signup that asks for role and language\",className:\"framer-image\",src:\"https://framerusercontent.com/images/NLd5TTCxW1MoacU8A0dpLdWuHqk.png\",srcSet:\"https://framerusercontent.com/images/NLd5TTCxW1MoacU8A0dpLdWuHqk.png?scale-down-to=512 512w,https://framerusercontent.com/images/NLd5TTCxW1MoacU8A0dpLdWuHqk.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/NLd5TTCxW1MoacU8A0dpLdWuHqk.png 1178w\"}),/*#__PURE__*/e(\"p\",{children:\"This enables them to promote their Salesforce/HubSpot integrations to users in Marketing during onboarding, whereas they would promote their Jira integration to users in Engineering.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Additive integrations\"})}),/*#__PURE__*/e(\"p\",{children:\"If the integration is additive, but not one of the key benefits you want users to take away from that first session, then you should introduce it further down the user onboarding journey.\"}),/*#__PURE__*/e(\"p\",{children:\"This is especially true if you have a product-led growth model, in which every non-critical/differentiating benefit should be deferred until after the user reaches the initial \u2018aha\u2019 moment.\"}),/*#__PURE__*/e(\"p\",{children:\"Slack integrations are a great example of this. In many cases, Slack integrations can provide a 10x improvement in terms of user experience (it\u2019s no surprise that out of the 100+ SaaS companies that build on Paragon, Slack is the 2nd most popular integration). However, it is rarely the deciding factor as to why a prospect will buy a product, and therefore should not be proactively introduced in your users\u2019 first session.\"}),/*#__PURE__*/e(\"p\",{children:\"Instead, consider working with your product marketing team to promote the integration via:\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Post sign-up email automation nurturing flows\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"In-app experiences that prompt users to try out the integration subsequent sessions (commonly built with tools like \",/*#__PURE__*/e(n,{href:\"https://www.appcues.com/\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Appcues\"})}),\" or \",/*#__PURE__*/e(n,{href:\"https://userpilot.com/\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Userpilot\"})}),\")\"]})})]}),/*#__PURE__*/e(\"h2\",{children:\"Internal training and support resources\"}),/*#__PURE__*/e(\"p\",{children:\"So we\u2019ve covered the meaty part of the launch planning, which is all the customer-facing assets and initiatives you need to have your cross-functional team prepare.\"}),/*#__PURE__*/e(\"p\",{children:\"However, equipping your internal team with the right processes to support the integration cannot be overlooked.\"}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Support team training\"})}),/*#__PURE__*/e(\"p\",{children:\"One crucial component of getting your internal operations ready for your integration launch is training your support team. While creating support articles will go a long way, inevitably, users will go to your support team for help, which is why they need to have a good understanding of:\"}),/*#__PURE__*/t(\"ol\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"How users should configure the integration, especially if there are options such as \",/*#__PURE__*/e(n,{href:\"https://docs.useparagon.com/connect-portal/field-mapping\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"field mapping\"})}),\" or \",/*#__PURE__*/e(n,{href:\"https://docs.useparagon.com/connect-portal/workflow-user-settings\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"user-defined settings\"})}),\" involved\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"The common errors that users may encounter when setting up a new integration for the first time include auth errors and incorrect configurations.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Potential error codes that your customers may encounter due to edge cases that can arise, such as outages with the 3rd party application, hitting API rate limits, or even pagination issues\"})})]}),/*#__PURE__*/e(\"p\",{children:\"Of the three items however, it\u2019s nearly impossible to train your support team on an exhaustive list of potential errors that may arise with the integration, which brings us to the most important part of building the integration\u2019s support process.\"}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Escalation and triage process\"})}),/*#__PURE__*/e(\"p\",{children:\"One of the biggest expenses when it comes to shipping an integration is actually in its maintenance. And I\u2019m not referring to the changes in the 3rd party application\u2019s API - it\u2019s the cost of your engineering team being constantly pulled into supporting customers on integration errors.\"}),/*#__PURE__*/e(\"p\",{children:\"That\u2019s why you need to equip your support team with the tools they need to help debug customer integration issues, such that only the tickets that require an engineering fix get passed onto your engineering team.\"}),/*#__PURE__*/t(\"p\",{children:[\"That\u2019s why we built Paragon\u2019s \",/*#__PURE__*/e(n,{href:\"https://docs.useparagon.com/monitoring/users\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Connected Users Dashboard\"})}),\", which empowers our customers\u2019 support teams to get full visibility into every end-user\u2019s integration activity and even manage their integrations\u2019 states. \"]}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",src:\"https://framerusercontent.com/images/F7NlnYRCQeMKbexkBeoEuCsxTl4.svg\",srcSet:\"https://framerusercontent.com/images/F7NlnYRCQeMKbexkBeoEuCsxTl4.svg?scale-down-to=512 512w,https://framerusercontent.com/images/F7NlnYRCQeMKbexkBeoEuCsxTl4.svg?scale-down-to=1024 1024w,https://framerusercontent.com/images/F7NlnYRCQeMKbexkBeoEuCsxTl4.svg 1274w\"}),/*#__PURE__*/e(\"p\",{children:\"As a result, their engineering teams can be focused on building new features and integrations, instead of maintaining existing integrations.\"}),/*#__PURE__*/e(\"p\",{children:\"With all that, you\u2019re now ready to launch the integration.\"}),/*#__PURE__*/e(\"h2\",{children:\"What to do if adoption is subpar\"}),/*#__PURE__*/e(\"p\",{children:\"Even with the best-laid plans for launching the integration and supporting your users, it\u2019s possible that adoption of the integration will be lower than expected. While the analytics you\u2019ve put in place should give you a general sense as to where things are dropping off the most, the easiest way to address this issue is to reach out to eligible users to learn why they didn\u2019t adopt the integration. Common objections we see include:\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"The integration does not provide the functionality the user needs to achieve their use case - this could be due to a lack of sufficient configurability (such as custom \",/*#__PURE__*/e(n,{href:\"https://docs.useparagon.com/connect-portal/field-mapping\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"field mapping\"})}),\") or users requiring a completely different use case\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"The user is unable to successfully set up the integration - this can be due to a lack of sufficient documentation, or simply if the configuration experience is \",/*#__PURE__*/e(n,{href:\"https://www.useparagon.com/blog/7-user-experience-mistakes-to-avoid\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"too confusing\"})})]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"The integration does not behave the way users expect it to - this is either be due to bugs, or insufficient context on how the integration will work\"})})]}),/*#__PURE__*/e(\"h2\",{children:\"Integration launch checklist\"}),/*#__PURE__*/e(\"p\",{children:\"We\u2019ve covered a lot in this article, so to make it easier on you, here\u2019s a checklist you can refer to that summarizes all the things you need to have in place for a successful integration launch.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",src:\"https://framerusercontent.com/images/4oK3DwmejOo3LDeycCLm2ZVj8o.svg\",srcSet:\"https://framerusercontent.com/images/4oK3DwmejOo3LDeycCLm2ZVj8o.svg?scale-down-to=1024 838w,https://framerusercontent.com/images/4oK3DwmejOo3LDeycCLm2ZVj8o.svg?scale-down-to=2048 1676w,https://framerusercontent.com/images/4oK3DwmejOo3LDeycCLm2ZVj8o.svg 1736w\"}),/*#__PURE__*/e(\"h2\",{children:\"Conclusion\"}),/*#__PURE__*/e(\"p\",{children:\"While every company will have a slightly different approach to their go-to-market strategies for each integration, depending on the audience, the product, and GTM motion (ie. product-led vs. sales led), this guide should serve you well as a template/starting point. Make sure that you have metrics in place to measure the success of your integration launches, work cross-functionally to maximize the adoption of the integration, and provide your customers the tools and resources to successfully leverage the integrations you build.\"}),/*#__PURE__*/t(\"p\",{children:[\"If you're looking for a scalable solution that will enable you to ship every integration your customers need without dedicating months of engineering every year on maintaining those integrations, \",/*#__PURE__*/e(n,{href:\"https://www.useparagon.com/book-demo\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"book a demo\"})}),\" with us today.\"]})]});export const richText2=/*#__PURE__*/t(a.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"As the number of SaaS tools used by businesses has exploded over the last decade (the average organization uses 110+ SaaS apps), integrations have become an essential part of product development. There is now an expectation from buyers that the SaaS products they onboard provide interoperability with the rest of their tools, as category leaders including Salesforce, HubSpot, and Atlassian all provide incredibly integrated product experiences.\"}),/*#__PURE__*/e(\"p\",{children:\"This has given rise to numerous SaaS integration platforms, all of whom have tried to solve the problem of the disjointed SaaS ecosystem. At a high level, these are all platforms that enable SaaS applications to be integrated with one another. But the approach in which these platforms approach the problem vary \u2013 as a result, the term \u201CSaaS integration platform\u201D can actually refer to a few different types of solutions.\"}),/*#__PURE__*/e(\"p\",{children:\"There are 3 main approaches:\"}),/*#__PURE__*/t(\"ol\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"Embedded SaaS integration platforms, also referred to as \",/*#__PURE__*/e(n,{href:\"https://www.useparagon.com/blog/build-zapier-connector-or-embed-integrations\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"embedded iPaaS\"})}),\", which are used by engineers and product teams at B2B SaaS companies to provide their customers with native integrations.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Unified APIs, which are constrained APIs that enable engineering teams to interact with multiple SaaS APIs at once.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"SaaS integration platforms-as-a-service (iPaaS), which are used by internal operations teams to pass data between apps in their tech stack.\"})})]}),/*#__PURE__*/e(\"p\",{children:\"In this article, we\u2019ll explore the pros and cons of each solution.\\xa0\"}),/*#__PURE__*/e(\"h2\",{children:\"TL;DR\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"There are two different approaches that SaaS integration platforms take to solving the integration challenges - equipping the buyers vs. equipping SaaS providers\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Buyers use SaaS integration platforms as a service (iPaaS) such as Zapier to connect applications in their own stack\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"SaaS providers can use embedded SaaS integration platforms or unified APIs to accelerate the development of native integrations in their application\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Embedded SaaS integration platforms (embedded iPaaS) platforms offload and abstract away the complexities of managing authentication, defining integration logic, and provide monitoring solutions\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Unified APIs provide a common model that can communicate with multiple 3rd party SaaS APIs with a single request\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"SaaS providers can build a connector on a traditional iPaaS to enable customers to build their own automations\"})})]}),/*#__PURE__*/e(\"h2\",{children:\"#1 Embedded SaaS Integration Platforms (Embedded iPaaS)\"}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Users\"}),\": Engineering teams at SaaS companies\"]}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Problem:\"}),\" Their customers need X integration provided out of the box inside the product, but building these native integrations requires a huge engineering lift.\"]}),/*#__PURE__*/e(\"img\",{alt:\"Embedded SaaS integration platform abstract\",className:\"framer-image\",src:\"https://framerusercontent.com/images/DDevjHPR01Egh3v83NZYFHMo2GQ.svg\",srcSet:\"https://framerusercontent.com/images/DDevjHPR01Egh3v83NZYFHMo2GQ.svg?scale-down-to=512 512w,https://framerusercontent.com/images/DDevjHPR01Egh3v83NZYFHMo2GQ.svg?scale-down-to=1024 1024w,https://framerusercontent.com/images/DDevjHPR01Egh3v83NZYFHMo2GQ.svg?scale-down-to=2048 2048w,https://framerusercontent.com/images/DDevjHPR01Egh3v83NZYFHMo2GQ.svg 2558w\"}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(n,{href:\"https://www.useparagon.com/blog/7-benefits-of-embedded-ipaas\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Embedded iPaaS platforms\"})}),\" are the most extensible solution for engineering teams at B2B SaaS companies to build native integrations into their products for their customers. Native integrations refer to integrations that require no set up or maintenance from the end-user\u2019s perspective, similar to the integrations you\u2019d find in the Slack App Directory or HubSpot\u2019s App Marketplace. Generally, configuring these native integrations is as easy as having users enter their credentials into a login screen for the third-party app, and at most, defining how they\u2019d like the data to map between the two applications. Here's an example of a native HubSpot integration that was built by the the TL;DV (transcription SaaS) engineering team with an embedded iPaaS. They've pre-efined the integration logic, so all end-users have to do is authenticate and toggle on/off the features they want. \"]}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",src:\"https://framerusercontent.com/images/NP4ZPHMyClYyc3qSPCs6GrJI3s.svg\",srcSet:\"https://framerusercontent.com/images/NP4ZPHMyClYyc3qSPCs6GrJI3s.svg?scale-down-to=512 512w,https://framerusercontent.com/images/NP4ZPHMyClYyc3qSPCs6GrJI3s.svg?scale-down-to=1024 1024w,https://framerusercontent.com/images/NP4ZPHMyClYyc3qSPCs6GrJI3s.svg 1504w\"}),/*#__PURE__*/e(\"p\",{children:\"Embedded iPaaS platforms solve the integration problem by abstracting away the most complex parts of developing native integrations from the ground up for SaaS companies. While not every embedded SaaS integration platform has the same set of features, common capabilities include:\\xa0\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Fully managed authentication\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Built-in error handling and auto-retry\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"White-labeled end-user experience\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Integration logic builder\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Logging and monitoring tools\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Pre-built API abstractions to other apps\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Building both native and bespoke integrations for all/specific users\"})})]}),/*#__PURE__*/t(\"p\",{children:[\"Certain embedded iPaaS vendors like \",/*#__PURE__*/e(n,{href:\"http://useparagon.com/\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Paragon\"})}),\" are extremely focused on extensibility and the developer experience, which saves SaaS engineering teams from running into limitations with the types of use cases they can build for their customers.\"]}),/*#__PURE__*/t(\"p\",{children:[\"SaaS companies that leverage these embedded iPaaS solutions today are able to significantly reduce the effort and time required to build the integrations their customers need, making it easier to fulfill customer demand which leads to higher win rates and lower churn. You can learn more about how fast growing SaaS companies leverage our embedded iPaaS to scale their products\u2019 integration roadmap \",/*#__PURE__*/e(n,{href:\"https://useparagon.com/customers\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"here\"})}),\".\"]}),/*#__PURE__*/e(\"h2\",{children:\"#2 SaaS Integration Platforms (iPaaS)\"}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Users\"}),\": Operations teams, or any software end-user\"]}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Problem:\"}),\" The various software applications they use don\u2019t talk to each other, and they need a no-code way of building automations between their tools to pass data back and forth\"]}),/*#__PURE__*/e(\"img\",{alt:\"SaaS integration platform abstract\",className:\"framer-image\",src:\"https://framerusercontent.com/images/olyJrQCmFXBS3NWlUSSWfTk6JcA.svg\",srcSet:\"https://framerusercontent.com/images/olyJrQCmFXBS3NWlUSSWfTk6JcA.svg?scale-down-to=512 512w,https://framerusercontent.com/images/olyJrQCmFXBS3NWlUSSWfTk6JcA.svg?scale-down-to=1024 1024w,https://framerusercontent.com/images/olyJrQCmFXBS3NWlUSSWfTk6JcA.svg?scale-down-to=2048 2048w,https://framerusercontent.com/images/olyJrQCmFXBS3NWlUSSWfTk6JcA.svg 2558w\"}),/*#__PURE__*/e(\"p\",{children:\"SaaS integration platforms, commonly referred to as iPaaS (integration platform as a service), are not used to build productized integrations. Rather, these platforms tackle the integration challenge by providing end-users of SaaS platforms the tools to build their own automations between the various apps that they use.\"}),/*#__PURE__*/t(\"p\",{children:[\"Some of the most well known platforms in this space are \",/*#__PURE__*/e(n,{href:\"https://www.useparagon.com/blog/build-zapier-connector-or-embed-integrations\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Zapier\"})}),\" or Workato. In the past, if teams needed to pass data between apps in their tech stack, they would have either had to export and import CSVs of data on a recurring basis, or if possible, try to get an engineer to help them build an internal integration by working with the APIs of the tools they wanted to connect. Both these methods are both resource intensive and inefficient, and at times unfeasible without an abundance of engineering resources dedicated to serve cross-functional teams.\"]}),/*#__PURE__*/e(\"p\",{children:\"SaaS integration platforms/iPaaS provide no-code/low-code interfaces for operations teams to easily build simple automations/data transfers between multiple applications without having to understand how to work with APIs.\"}),/*#__PURE__*/t(\"p\",{children:[\"This market exists because the software tools they use don\u2019t provide the necessary integrations natively. And even if they do, oftentimes the \",/*#__PURE__*/e(n,{href:\"https://www.useparagon.com/blog/native-integration-design\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"native integration\"})}),\" doesn\u2019t cover all the use cases that the end user requires.\"]}),/*#__PURE__*/e(\"h3\",{children:\"External partners\"}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Partners\"}),\": Engineering teams at SaaS companies\"]}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Problem:\"}),\" Their customers need X integration, but they don\u2019t plan on every building it, yet want to provide their customers a \u2018backdoor\u2019 for building their own automations.\"]}),/*#__PURE__*/e(\"p\",{children:\"Traditional SaaS integration platforms do play a role for SaaS companies as well. Many early stage startups defer building native integrations into their product because of a lack of internal resources, and resort to partnering with traditional SaaS integration platforms.\"}),/*#__PURE__*/e(\"p\",{children:\"By listing their application on the iPaaS platform, they can offload the work of integrating onto their customers. In this model, their customers are forced to become users of the iPaaS platform in order to build their own integrations/automations.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",src:\"https://framerusercontent.com/images/rVm68hgIeB99ptILojphhmLaIH0.svg\",srcSet:\"https://framerusercontent.com/images/rVm68hgIeB99ptILojphhmLaIH0.svg?scale-down-to=512 512w,https://framerusercontent.com/images/rVm68hgIeB99ptILojphhmLaIH0.svg 716w\"}),/*#__PURE__*/e(\"p\",{children:\"You may have seen this within some of the integrations pages of tools that you use, where they will list an \u2018integration\u2019 with a SaaS integration platform like Zapier.\"}),/*#__PURE__*/e(\"img\",{alt:\"Gong iPaaS integrations\",className:\"framer-image\",src:\"https://framerusercontent.com/images/REdB44eIbhQNuwcPsFviKC5XAM.png\",srcSet:\"https://framerusercontent.com/images/REdB44eIbhQNuwcPsFviKC5XAM.png?scale-down-to=512 512w,https://framerusercontent.com/images/REdB44eIbhQNuwcPsFviKC5XAM.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/REdB44eIbhQNuwcPsFviKC5XAM.png 1310w\"}),/*#__PURE__*/e(\"p\",{children:\"However, this approach is generally used as a short term solution to unblock users who require some form of integration capability. Long term, SaaS companies all move towards providing their users native integrations due to benefits including:\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"A better end-user experience\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Ability to support complex and deeper use cases\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Creating upsell opportunities\"})})]}),/*#__PURE__*/e(\"h2\",{children:\"#3 Unified APIs\"}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Users\"}),\": Engineering teams at SaaS companies\"]}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Problem:\"}),\" Different customers need different integrations within the same category of solutions (ie. for CRMs, there is Salesforce, HubSpot, Pipedrive, and for communication, there is Slack and Teams), and engineering teams don\u2019t want to build each one individually.\"]}),/*#__PURE__*/e(\"img\",{alt:\"Unified API abstract\",className:\"framer-image\",src:\"https://framerusercontent.com/images/g1OOHlNtPpbr7rPtEjIZ4up6TZ4.svg\",srcSet:\"https://framerusercontent.com/images/g1OOHlNtPpbr7rPtEjIZ4up6TZ4.svg?scale-down-to=512 512w,https://framerusercontent.com/images/g1OOHlNtPpbr7rPtEjIZ4up6TZ4.svg?scale-down-to=1024 1024w,https://framerusercontent.com/images/g1OOHlNtPpbr7rPtEjIZ4up6TZ4.svg?scale-down-to=2048 2048w,https://framerusercontent.com/images/g1OOHlNtPpbr7rPtEjIZ4up6TZ4.svg 2558w\"}),/*#__PURE__*/t(\"p\",{children:[\"While \",/*#__PURE__*/e(n,{href:\"https://useparagon.com/blog/what-is-a-unified-api\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"a unified API\"})}),\" is not a SaaS integration platform on its own, the vendors supplying the unified API always provide a platform alongside the API, which is why they made it onto this list.\"]}),/*#__PURE__*/e(\"p\",{children:\"A unified API creates a layer of abstraction across a common model across multiple APIs simultaneously. In practice, this means that SaaS companies can build a single integration with the unified API and instantly deploy all the integrations supported by the unified API at once.\"}),/*#__PURE__*/e(\"p\",{children:\"This in theory would save engineers significant effort doing research into each 3rd party SaaS application\u2019s API - instead, they would only have to learn the structure of the unified API.\"}),/*#__PURE__*/e(\"p\",{children:\"Unfortunately, unified APIs come with many limitations when compared to the other SaaS integration platforms on this list. The more apps in a given vertical that a unified API supports, the fewer endpoints it can abstract.\"}),/*#__PURE__*/e(\"img\",{alt:\"Venn diagram showing minimal overlap of shared endpoints in a unified API\",className:\"framer-image\",src:\"https://framerusercontent.com/images/UVHCtA5xOxa9nlVjw2cRfPyN1M.svg\",srcSet:\"https://framerusercontent.com/images/UVHCtA5xOxa9nlVjw2cRfPyN1M.svg?scale-down-to=512 512w,https://framerusercontent.com/images/UVHCtA5xOxa9nlVjw2cRfPyN1M.svg?scale-down-to=1024 1024w,https://framerusercontent.com/images/UVHCtA5xOxa9nlVjw2cRfPyN1M.svg?scale-down-to=2048 2048w,https://framerusercontent.com/images/UVHCtA5xOxa9nlVjw2cRfPyN1M.svg 3431w\"}),/*#__PURE__*/e(\"p\",{children:\"While there is some value in generic integrations, more often than not, end-users want a deep integration experience that is built specifically for the integration they need. If a SaaS company builds an integration that doesn\u2019t support the deeper use cases that their customers need, their customers may look at alternative solutions that can support their requirements.\"}),/*#__PURE__*/e(\"p\",{children:\"When it comes to the platform side, unified integration platforms provide:\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Logging of individual requests\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Managed authentication\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"End-user management dashboard\"})})]}),/*#__PURE__*/t(\"p\",{children:[\"You can learn more about \",/*#__PURE__*/e(n,{href:\"https://useparagon.com/blog/what-is-a-unified-api\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"unified APIs\"})}),\" here.\"]}),/*#__PURE__*/e(\"h2\",{children:\"Recap\"}),/*#__PURE__*/e(\"p\",{children:\"Although each type of SaaS integration platform aims to solve the challenges of the disjointed SaaS ecosystem, \\xa0they do so in very different ways.\\xa0\"}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Embedded iPaaS\"}),\" platforms are SaaS companies' best choice for building the native integrations their customers need into their product, as it enables them to focus purely on designing the integration logic without worrying about the overhead on infrastructure and maintenance.\"]}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Traditional iPaaS\"}),\" platforms enable end-users to set up automations internally when the tools they use aren't natively integrated, and SaaS companies can integrate with these iPaaS solutions to offload the integration effort to their users.\"]}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Unified APIs\"}),\" are a class of solutions that SaaS companies can use to build 1:many integrations, but the fact that they have to cater to a lowest common denominator ultimately means that the possible use cases that these unified APIs support are extremely limited.\\xa0\"]}),/*#__PURE__*/t(\"p\",{children:[\"If you\u2019re a SaaS company and you have integrations in your backlog, \",/*#__PURE__*/e(n,{href:\"https://www.useparagon.com/book-demo\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"book a free demo\"})}),\" today and see how our embedded SaaS integration platform can help you accelerate integration development.\"]})]});export const richText3=/*#__PURE__*/t(a.Fragment,{children:[/*#__PURE__*/t(\"p\",{children:[\"Nearly every B2B SaaS company today has a backlog of integration requests from prospects and customers. \",/*#__PURE__*/e(n,{href:\"https://www.useparagon.com/blog/what-is-embedded-ipaas-integration-platform-as-a-service\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Embedded iPaaS\"})}),\" emerged as a category in 2020 as a solution to this problem, by enabling SaaS companies to more rapidly deliver the integrations their customers need, which ultimately enables them to focus engineering resources towards their core product. Due to the scale of the problem, the embedded iPaaS category has grown significantly over the past few years, with new vendors entering the market every quarter.\"]}),/*#__PURE__*/e(\"p\",{children:\"However, given the embedded nature of these solutions, the decision to partner with a vendor cannot be made lightly, as you\u2019ll want to rely on it for the entire lifecycle of your product.\"}),/*#__PURE__*/e(\"p\",{children:\"There are currently only a handful of players in the embedded iPaaS space that have a product that is designed and built specifically for the embedded use case. In this article, we\u2019ll take you through the top embedded iPaaS providers in 2024, and compare them across multiple factors, including:\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Feature set\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Developer experience\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Pre-built integrations/connectors\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Extensibility\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Support\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Security\"})})]}),/*#__PURE__*/e(\"p\",{children:\"Let\u2019s get right into it.\"}),/*#__PURE__*/e(\"h2\",{children:\"TL;DR\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"The top embedded iPaaS providers are Paragon, Prismatic, Workato Embedded, Tray Embedded and Cyclr.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Paragon provides the best developer experience, is the most extensible, and provides the best technical support, but doesn\u2019t have as many integrations as some of the other vendors.\\xa0\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Prismatic was built specifically for the embedded use case, has the most product features, but is hindered by their infrastructure\u2019s lack of scalability.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"The \u2018wrapped\u2019 version of Workato\u2019s main product offers the largest number of pre-built connectors, but the product requires a lot of workarounds to embed and is not white-labeled/native to your product.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Tray Embedded provides a decent solution for operations teams who want a low-code iPaaS, but Tray as a company is too focused on their main product for their Embedded solution to really be competitive.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Cyclr is the oldest and cheapest embedded iPaaS solution in this article, but their integrations\u2019 endpoint coverage is limited and the overall developer experience is clunky.\"})})]}),/*#__PURE__*/e(\"h2\",{children:\"Top Embedded iPaaS #1: Paragon\"}),/*#__PURE__*/e(\"p\",{children:\"Paragon has been built for the embedded integrations use case, and is designed to be used by the engineers that are responsible for developing the native integrations for their product.\"}),/*#__PURE__*/e(\"h3\",{children:\"Features\"}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Managed authentication\"})}),/*#__PURE__*/t(\"p\",{children:[\"Paragon provides fully managed authentication on all integrations, which includes token refresh for OAuth based integrations. This is true even for their \",/*#__PURE__*/e(n,{href:\"https://www.useparagon.com/custom-integrations\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"custom integrations\"})}),\" - you can leverage the auth layer for any custom connectors you build in about 3 minutes.\"]}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Extensible Workflow Builder\"})}),/*#__PURE__*/e(\"p\",{children:\"Paragon comes with an extensible workflow builder out of the box, which is both intuitive and powerful for developers, in order to ensure any use case can be built out.\"}),/*#__PURE__*/t(\"p\",{children:[\"It combines the ease of use of pre-built abstractions over the 3rd party API into \",/*#__PURE__*/e(n,{href:\"https://docs.useparagon.com/workflows/integration-actions\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"workflow actions\"})}),\", with the ability to still make requests to \",/*#__PURE__*/e(n,{href:\"https://docs.useparagon.com/workflows/requests#making-an-integration-request\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"any endpoint\"})}),\".\"]}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"em\",{children:\"Take a tour of Paragon's workflow builder below!\"})}),/*#__PURE__*/e(n,{href:\"https://tour.useparagon.com/share/hqgzfgy77w6b\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!0,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{className:\"framer-image\",\"data-preset-tag\":\"img\",children:/*#__PURE__*/e(\"img\",{alt:\"Paragon Workflow Builder\",className:\"framer-image\",height:\"483\",src:\"https://framerusercontent.com/images/XNT0NUTO1SPaIz221ePCVPya3ug.svg\",srcSet:\"https://framerusercontent.com/images/XNT0NUTO1SPaIz221ePCVPya3ug.svg?scale-down-to=512 512w,https://framerusercontent.com/images/XNT0NUTO1SPaIz221ePCVPya3ug.svg?scale-down-to=1024 1024w,https://framerusercontent.com/images/XNT0NUTO1SPaIz221ePCVPya3ug.svg 1576w\",style:{aspectRatio:\"1576 / 966\"},width:\"788\"})})}),/*#__PURE__*/e(\"p\",{children:\"Paragon also provides a set of components that make it simple to build any integration logic you need, such as custom functions that give you access to all JavaScript functions and npm packages.\"}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"em\",{children:\"Want to give it a try? \"}),/*#__PURE__*/e(n,{href:\"https://dashboard.useparagon.com/signup?utm_content=Top+Embedded+iPaaS\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:/*#__PURE__*/e(\"em\",{children:\"Sign up and get started for free\"})})}),/*#__PURE__*/e(\"em\",{children:\".\"})]}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"White-labeled, native end-user UI\"})}),/*#__PURE__*/e(\"p\",{children:\"Paragon enables you to provide your customers a fully white-labeled and truly native experience.\"}),/*#__PURE__*/e(\"p\",{children:\"No redirects. No iFrames.\"}),/*#__PURE__*/t(\"p\",{children:[\"You\u2019ll be able to use a configurable, out of the box Javascript component (referred to as the Connect Portal) that will feel truly native to your application. Here's an example of the Connect Portal in our \",/*#__PURE__*/e(n,{href:\"https://www.useparagon.com/customers/tldv\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!0,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"customer's\"})}),\" app.\"]}),/*#__PURE__*/e(\"img\",{alt:\"TLDV Connect Portal\",className:\"framer-image\",src:\"https://framerusercontent.com/images/dydjiSxhY8GmhTttOs8jOQnPcY.png\",srcSet:\"https://framerusercontent.com/images/dydjiSxhY8GmhTttOs8jOQnPcY.png?scale-down-to=512 512w,https://framerusercontent.com/images/dydjiSxhY8GmhTttOs8jOQnPcY.png 967w\"}),/*#__PURE__*/t(\"p\",{children:[\"Additionally, the pre-built UI enables you to easily provide customer-defined configuration, such pick-list selection or even \",/*#__PURE__*/e(n,{href:\"https://docs.useparagon.com/connect-portal/field-mapping\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!0,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"dynamic field mapping\"})}),\".\"]}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",src:\"https://framerusercontent.com/images/tkeLuOOFGizKAlaCPWMgQAXes.svg\",srcSet:\"https://framerusercontent.com/images/tkeLuOOFGizKAlaCPWMgQAXes.svg 630w\"}),/*#__PURE__*/e(\"h3\",{children:\"Developer experience\"}),/*#__PURE__*/e(\"p\",{children:\"Where Paragon really shines is in the developer experience that they provide. With the focus on developers, they are able to overcome the most common limitations that other embedded iPaaS on this list have.\"}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Integrations-as-code framework\"})}),/*#__PURE__*/e(\"p\",{children:\"Paragon is the only Embedded iPaaS that provides engineering teams the ability to interchangeably author workflows in code or in the visual workflow builder. This would enable you to sync Paragon integrations to their git repository for better version control, code review, and collaboration.\"}),/*#__PURE__*/e(n,{href:\"https://tour.useparagon.com/share/ea8gobhxm7ds\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!0,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{className:\"framer-image\",\"data-preset-tag\":\"img\",children:/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"510\",src:\"https://framerusercontent.com/images/6z2zaA2aJrqu6GE5AaIJzRQDnAE.svg\",srcSet:\"https://framerusercontent.com/images/6z2zaA2aJrqu6GE5AaIJzRQDnAE.svg?scale-down-to=512 512w,https://framerusercontent.com/images/6z2zaA2aJrqu6GE5AaIJzRQDnAE.svg?scale-down-to=1024 1024w,https://framerusercontent.com/images/6z2zaA2aJrqu6GE5AaIJzRQDnAE.svg 1719w\",style:{aspectRatio:\"1719 / 1021\"},width:\"859\"})})}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Versioning and Release Management\"})}),/*#__PURE__*/e(\"p\",{children:\"Historically, versioning is a nightmare for iPaaS platforms, as many of them were designed for internal automation use cases.\"}),/*#__PURE__*/e(\"p\",{children:\"However, when deploying integrations to your users in production, you need to have full control over the management and release process.\"}),/*#__PURE__*/t(\"p\",{children:[\"Paragon provides a full \",/*#__PURE__*/e(n,{href:\"https://www.useparagon.com/blog/launching-releases\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Release\"})}),\" pipeline that enables you to have strict controls on who can push changes to prod, and visibility/warnings into the changes that were made between versions.\"]}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",src:\"https://framerusercontent.com/images/y8C8Cjyg9dRrU5KqUExdx0dZSE8.svg\",srcSet:\"https://framerusercontent.com/images/y8C8Cjyg9dRrU5KqUExdx0dZSE8.svg?scale-down-to=512 512w,https://framerusercontent.com/images/y8C8Cjyg9dRrU5KqUExdx0dZSE8.svg?scale-down-to=1024 1024w,https://framerusercontent.com/images/y8C8Cjyg9dRrU5KqUExdx0dZSE8.svg 1440w\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",src:\"https://framerusercontent.com/images/SSInCihmGIg60F0qUrG7Q3oUSs4.svg\",srcSet:\"https://framerusercontent.com/images/SSInCihmGIg60F0qUrG7Q3oUSs4.svg?scale-down-to=512 512w,https://framerusercontent.com/images/SSInCihmGIg60F0qUrG7Q3oUSs4.svg?scale-down-to=1024 1024w,https://framerusercontent.com/images/SSInCihmGIg60F0qUrG7Q3oUSs4.svg 1440w\"}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"End-to-end observability\"})}),/*#__PURE__*/t(\"p\",{children:[\"With the Paragon's \",/*#__PURE__*/e(n,{href:\"https://docs.useparagon.com/monitoring/viewing-task-history\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Task History\"})}),\", you will have end to end tracing of every workflow execution that occurs for your users, the status of those executions, and the ability to dive into/replay any individual workflow execution.\"]}),/*#__PURE__*/e(\"p\",{children:\"Paragon provides full observability into every step execution, which makes it extremely easy to test workflows as your team builds the integration, and equips your team with the best visibility for debugging errors when they occur.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",src:\"https://framerusercontent.com/images/FApgsE6xNfvJvLbNtd4QipIeJg.png\",srcSet:\"https://framerusercontent.com/images/FApgsE6xNfvJvLbNtd4QipIeJg.png?scale-down-to=512 512w,https://framerusercontent.com/images/FApgsE6xNfvJvLbNtd4QipIeJg.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/FApgsE6xNfvJvLbNtd4QipIeJg.png?scale-down-to=2048 2048w,https://framerusercontent.com/images/FApgsE6xNfvJvLbNtd4QipIeJg.png 2650w\"}),/*#__PURE__*/t(\"p\",{children:[\"Additionally, through the \",/*#__PURE__*/e(n,{motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Task History API\"})}),\", you can also query workflow execution data for insights on:\"]}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"The most popular workflows and integrations for your customers\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Task usage volumes between various cohorts of your customer base\"})})]}),/*#__PURE__*/t(\"p\",{children:[\"You will also be able to \",/*#__PURE__*/e(n,{href:\"https://docs.useparagon.com/monitoring/event-destinations\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!0,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"stream logs\"})}),\" in real time with webhooks to your own logging systems (ie. Sentry, Datadog, New Relic), and set up email or Slack alerts.\"]}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",src:\"https://framerusercontent.com/images/QJnbArGPp2c0pGzzX3RSt4RRcY.png\",srcSet:\"https://framerusercontent.com/images/QJnbArGPp2c0pGzzX3RSt4RRcY.png?scale-down-to=512 512w,https://framerusercontent.com/images/QJnbArGPp2c0pGzzX3RSt4RRcY.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/QJnbArGPp2c0pGzzX3RSt4RRcY.png?scale-down-to=2048 2048w,https://framerusercontent.com/images/QJnbArGPp2c0pGzzX3RSt4RRcY.png 2838w\"}),/*#__PURE__*/t(\"p\",{children:[\"\u200D\",/*#__PURE__*/e(\"strong\",{children:\"Connected Users Dashboard\"})]}),/*#__PURE__*/e(\"p\",{children:\"The customer-centric dashboard enables your support team to easily debug and manage your users\u2019 integration states.\"}),/*#__PURE__*/e(\"p\",{children:\"This will accelerate your team\u2019s incidence response time, and empower your support team to fix, or at a minimum, communicate effectively with your customers on any errors that occur even before your engineers can get to it.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",src:\"https://framerusercontent.com/images/Do5BNOKaoIrroqEx0PalBi94W54.gif\",srcSet:\"https://framerusercontent.com/images/Do5BNOKaoIrroqEx0PalBi94W54.gif?scale-down-to=512 512w,https://framerusercontent.com/images/Do5BNOKaoIrroqEx0PalBi94W54.gif?scale-down-to=1024 1024w,https://framerusercontent.com/images/Do5BNOKaoIrroqEx0PalBi94W54.gif 1366w\"}),/*#__PURE__*/e(\"h3\",{children:\"Integrations catalog\"}),/*#__PURE__*/e(\"p\",{children:\"While API\\xa0abstractions are in some ways a commodity, this is one of the areas where Paragon is playing catch up against some of the other solutions.\"}),/*#__PURE__*/t(\"p\",{children:[\"At the time of this article, there are over 100 pre-built integrations in its \",/*#__PURE__*/e(n,{href:\"https://useparagon.com/integrations\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"catalog\"})}),\".\"]}),/*#__PURE__*/e(\"img\",{alt:\"Paragon integrations catalog\",className:\"framer-image\",src:\"https://framerusercontent.com/images/ASwsTPHIjMGd78kHxi1c9Pup8.png\",srcSet:\"https://framerusercontent.com/images/ASwsTPHIjMGd78kHxi1c9Pup8.png?scale-down-to=512 512w,https://framerusercontent.com/images/ASwsTPHIjMGd78kHxi1c9Pup8.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/ASwsTPHIjMGd78kHxi1c9Pup8.png 1668w\"}),/*#__PURE__*/e(\"h3\",{children:\"Custom integration builder\"}),/*#__PURE__*/t(\"p\",{children:[\"Additionally, Paragon is one of the only solutions that provide a \",/*#__PURE__*/e(n,{href:\"https://useparagon.com/custom-integrations\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Custom Integration Builder\"})}),\", which enables you to build any SaaS integration on Paragon, even if it\u2019s not in our catalog. Aside from the 3rd party API abstractions, you will get to leverage every feature of the platform, from auth management to monitoring.\"]}),/*#__PURE__*/e(n,{href:\"https://tour.useparagon.com/share/oiagmkmz2lbm\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!0,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{className:\"framer-image\",\"data-preset-tag\":\"img\",children:/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"517\",src:\"https://framerusercontent.com/images/ClWhJFxgcFAXliAIlKOgH66nk.svg\",srcSet:\"https://framerusercontent.com/images/ClWhJFxgcFAXliAIlKOgH66nk.svg?scale-down-to=512 512w,https://framerusercontent.com/images/ClWhJFxgcFAXliAIlKOgH66nk.svg?scale-down-to=1024 1024w,https://framerusercontent.com/images/ClWhJFxgcFAXliAIlKOgH66nk.svg 1740w\",style:{aspectRatio:\"1740 / 1034\"},width:\"870\"})})}),/*#__PURE__*/e(\"h3\",{children:\"Scalability and reliability\"}),/*#__PURE__*/t(\"p\",{children:[\"From a technical point of view, Paragon\u2019s core \",/*#__PURE__*/e(n,{href:\"https://docs.useparagon.com/on-premise/application-architecture\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"infrastructure\"})}),\" is robust and scalable. It\u2019s been load-tested to handle millions of requests simultaneously, which means you\u2019ll have an embedded iPaaS partner that will be able to accommodate your growth as you scale and add more integrations. Here are some metrics that their infrastructure is supporting for a single enterprise customer:\",/*#__PURE__*/e(\"br\",{}),/*#__PURE__*/e(\"br\",{className:\"trailing-break\"})]}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"over 100 million requests / day\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"peaks at ~1,600 requests / second\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"1 - 2 terrabytes of data transferred / day from the cache\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"46k auth credentials being managed\"})})]}),/*#__PURE__*/e(\"p\",{children:\"Their workflow engine also provides auto-retry and auto-scaling capabilities that ensure your workflows will not fail even if the 3rd party service is down or when your customers\u2019 task usage spikes.\"}),/*#__PURE__*/e(\"h3\",{children:\"Security\"}),/*#__PURE__*/e(\"p\",{children:\"Paragon is GDPR compliant and SOC 2 certified.\"}),/*#__PURE__*/e(\"p\",{children:\"If your business requires an embedded iPaaS to be deployed on your own infrastructure for security reasons, Paragon has you covered there, too. We offer self-serve, on-premise deployment that matches your in-house security standards \u2013 even regulations as complex as HIPAA, SOC 2 and GDPR.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"Technical support\"}),/*#__PURE__*/t(\"p\",{children:[\"One of the most valuable aspects of working with Paragon is the level of technical support you will receive. Being dedicated to providing the best developer experience, you will not be put through layers of non-technical support just to finally talk to an engineer that knows what they\u2019re talking about, unlike Tray and Workato who are primarily focused on their core product that serves non-technical operations teams. Companies like \",/*#__PURE__*/e(n,{href:\"http://useparagon.com/customers/mainstem\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"MainStem\"})}),\" and \",/*#__PURE__*/e(n,{href:\"http://useparagon.com/customers/trustpage\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Trustpage\"})}),\" have all expressed that this is one of their favorite parts about partnering with Paragon.\"]}),/*#__PURE__*/e(\"p\",{children:\"Roadmap and future\"}),/*#__PURE__*/e(\"p\",{children:\"Paragon is dedicated to building the best developer platform for building native SaaS integrations, and will continue to invest in providing a seamless and robust solution that your developers will love.\"}),/*#__PURE__*/t(\"p\",{children:[\"If you want to discuss your integration use case and see if Paragon can help your team save at least 70% of the integration development effort, \",/*#__PURE__*/e(n,{href:\"https://www.useparagon.com/book-demo\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"book a demo\"})}),\" with our team today.\"]}),/*#__PURE__*/e(\"h2\",{children:\"Top Embedded iPaaS #2: Prismatic\"}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(n,{href:\"https://www.useparagon.com/blog/prismatic-alternatives\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Prismatic\"})}),\" is an up and coming embedded iPaaS that primarily serves SaaS businesses in niche verticals, such as agritech. Unlike some of the other embedded iPaaS solutions later on in this article, Prismatic was built specifically with the embedded iPaaS use case in mind, just like Paragon.\"]}),/*#__PURE__*/e(\"h3\",{children:\"Features\"}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Authentication\"})}),/*#__PURE__*/e(\"p\",{children:\"Prismatic offers managed authentication services for integrations used by your users and takes care of managing the token refresh policies for each application on your behalf.\"}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"End-user experience\"})}),/*#__PURE__*/e(\"p\",{children:\"The process of having your end-users configure integrations using Prismatic's UI is not the most intuitive. If you want to enable integrations for your customers, you have three options:\\xa0\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Use Prismatic's embedded marketplace, a full integrations page that you will embed in your application\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Embed individual modals for every integration, similar to Paragon\u2019s Connect Portal\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Provide your customers a self-serve Prismatic account to log in and configure their own instances manually\"})})]}),/*#__PURE__*/e(\"p\",{children:\"Additionally, when end-users configure their integrations, they have to specify the endpoints they want to synchronize data between within the Prismatic dashboard, which can be confusing and error-prone. However overall, they do provide a more white-labeled experience than some of the alternatives further down.\"}),/*#__PURE__*/e(\"h3\",{children:\"Workflows and extensibility\"}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Ease of use\"})}),/*#__PURE__*/e(\"p\",{children:\"Despite offering \u2018pre-built actions\u2019 with their connectors, there is no enforcement of values nor the ability to easily map data to various fields in the 3rd party app, which will often lead to errors in integration logic.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",src:\"https://framerusercontent.com/images/CfyVcBzWfADDHRW7EPnrXun4xTA.png\",srcSet:\"https://framerusercontent.com/images/CfyVcBzWfADDHRW7EPnrXun4xTA.png?scale-down-to=512 512w,https://framerusercontent.com/images/CfyVcBzWfADDHRW7EPnrXun4xTA.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/CfyVcBzWfADDHRW7EPnrXun4xTA.png 1600w\"}),/*#__PURE__*/e(\"p\",{children:\"\u200D\"}),/*#__PURE__*/e(\"p\",{children:\"In the screenshot above, you can see that Prismatic's pre-built Salesforce connector has a \\\"Create Record\\\" action, but it only allows free-text input for record types and doesn't offer a way to reference the fields contained within those types. As a result, engineers still need to refer to Salesforce API documentation to understand object types and field types, rendering the API abstractions and pre-built actions less effective.\"}),/*#__PURE__*/t(\"h5\",{children:[/*#__PURE__*/e(\"em\",{children:'\"Keep in mind that although Prismatic\\'s low code environment makes it simpler to build integrations, you will need to thoroughly understand the API of the platforms you build integrations for to make a successful integration. Integrations will still require this understanding until platforms continue improving and simplifying their APIs.\"'}),\" - SaaS Product Manager, G2 review.\"]}),/*#__PURE__*/e(\"h3\",{children:\"Infrastructure\"}),/*#__PURE__*/e(\"p\",{children:\"According to Prismatic's documentation, users must use a workaround to reference data outputs from previous steps. This highlights a severe scalability challenge with Prismatic's infrastructure. The ability to map specific snippets of data to fields in subsequent workflow steps is crucial for saving engineering time, whether it's data from an event payload or from a third-party webhook.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",src:\"https://framerusercontent.com/images/mAwcjtMH6bbUC86jlfrpw52zs4.png\",srcSet:\"https://framerusercontent.com/images/mAwcjtMH6bbUC86jlfrpw52zs4.png?scale-down-to=512 512w,https://framerusercontent.com/images/mAwcjtMH6bbUC86jlfrpw52zs4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/mAwcjtMH6bbUC86jlfrpw52zs4.png 1600w\"}),/*#__PURE__*/e(\"p\",{children:\"However, Prismatic's documentation shows that they lack an efficient method of storing only the relevant fields that need to be called in subsequent steps in a workflow. Instead, they are forced to store entire outputs of every step within an integration. If a user builds an integration with slightly complex logic, they may experience delayed executions that will time out, leading to data loss for their customers.\"}),/*#__PURE__*/e(\"p\",{children:\"This is a problem that our engineering team faced when building Paragon years ago, and it took us months to refactor our infrastructure to address it.\"}),/*#__PURE__*/e(\"h3\",{children:\"Developer experience\"}),/*#__PURE__*/e(\"p\",{children:\"Overall, however, the developer experience on Prismatic is a mixed one. There are some developer-friendly features that are worth highlighting. Developers can create custom components, enabling them to integrate with third-party apps through http. You can also set configuration variables that are specific to a specific customer, thereby giving them a unique integration instance.\"}),/*#__PURE__*/e(\"p\",{children:\"And, like with some of the other solutions in this article, the logging tools Prismatic has created provide visibility across all the integrations built on their platform, making it easy to spot bugs early. Actually fixing those bugs isn\u2019t always possible though, since Prismatic will only let you test entire workflows, not individual steps in isolation.\"}),/*#__PURE__*/e(\"p\",{children:\"The weakest part of Prismatic is its workflow builder, which is not especially intuitive or seamless. The only way to reference data outputs from previous workflow steps is through a workaround, which is likewise going to slow your engineers down, and testing individual steps is not as straightforward. Additionally, their front end suffers from consistent performance issues, as shared by multiple reviewers.\"}),/*#__PURE__*/e(\"h5\",{children:/*#__PURE__*/e(\"em\",{children:'\"The UI/UX is very limiting. I often need to refresh the page to proceed with my task. This can be very problematic when building or editing a flow because there is no auto-save feature and refreshing will remove all changes if not saved.\"'})}),/*#__PURE__*/e(\"h3\",{children:\"Integration catalog\"}),/*#__PURE__*/e(\"p\",{children:\"Prismatic, being a newer company, has approximately 80 supported integrations in their catalog. However, we do see them publishing new integrations every month. While they do provide the ability to make requests to non-supported integrations as steps within a workflow, they do not offer the ability to build and deploy complete custom integrations on their platform.\"}),/*#__PURE__*/e(\"img\",{alt:\"prismatic catalog\",className:\"framer-image\",src:\"https://framerusercontent.com/images/wnMUXtBSVaeQVrbhG2BFf3wt7s.png\",srcSet:\"https://framerusercontent.com/images/wnMUXtBSVaeQVrbhG2BFf3wt7s.png?scale-down-to=512 512w,https://framerusercontent.com/images/wnMUXtBSVaeQVrbhG2BFf3wt7s.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/wnMUXtBSVaeQVrbhG2BFf3wt7s.png 1677w\"}),/*#__PURE__*/e(\"h3\",{children:\"Security\"}),/*#__PURE__*/e(\"p\",{children:\"Prismatic adheres to robust security standards, with the company complying with both GDPR and SOC 2 regulations, and recently acquiring HIPAA certification. However, they do not provide an on-premise/self-hosted deployment option, which may be a potential blocker if your customers have extremely stringent security requirements.\"}),/*#__PURE__*/e(\"h3\",{children:\"Support\"}),/*#__PURE__*/e(\"p\",{children:\"The level of technical support offered is also better than some of the other companies on this list. Reviews share that Prismatic provides helpful hands-on support throughout the process of working with them.\"}),/*#__PURE__*/e(\"h3\",{children:\"Pricing\"}),/*#__PURE__*/e(\"p\",{children:\"Unfortunately, Prismatic doesn\u2019t scale particularly well. They provide a lower entry point than many of the other platforms, but with their per-instance pricing (aka per user per integration), your costs can quickly become unpredictable as you scale the number of users your platform has as well as the number of integrations you want to offer.\"}),/*#__PURE__*/e(\"h2\",{children:\"Top Embedded iPaaS #3: Workato Embedded\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"Workato is best-known for its dominance in the workflow automation industry. However, Workato launched a secondary product, Workato Embedded, as a means of entering the growing embedded iPaaS sector. While they benefit from carrying over some great features that they built out for their core product, it is a double edged sword as they are also limited by the fact that the DNA of their product is handcuffed by their core product.\"}),/*#__PURE__*/e(\"h3\",{children:\"Authentication\"}),/*#__PURE__*/e(\"p\",{children:\"While Workato technically handles authentication for you, what they're really doing is just creating a Workato Automation instance for each of your users. Given that you'd have to iFrame a Workato dashboard in your application, the authentication process involves you linking your JWT access token to a 'Workato Customer and Team account' via their vendor API key.\"}),/*#__PURE__*/e(\"p\",{children:\"From a security standpoint, this means that your customers' tokens will be stored on their servers, which can be a non-starter if your customers have stringent security requirements.\"}),/*#__PURE__*/e(\"h3\",{children:\"End-user experience\"}),/*#__PURE__*/e(\"p\",{children:\"Workato does not provide the ability to white-label its embedded platform, which is not ideal for most SaaS companies wanting to provide a seamless product experience. As a part of their growth strategy, Workato forces you to maintain their branding across the entire integration experience, in order to increase their brand awareness among your users. It\u2019ll be very clear that you are using a third-party platform to manage integrations.\"}),/*#__PURE__*/e(\"p\",{children:\"The only way to implement Workato is through an iFrame of their platform, which creates a pretty disjointed experience. As seen in the image of their customer, LivePerson, Workato essentially offers a Zapier-like experience within your application's interface, which may not meet your customers' expectations.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",src:\"https://framerusercontent.com/images/oobAeBZKUDLYIjycdkc3y1p6Rzc.png\",srcSet:\"https://framerusercontent.com/images/oobAeBZKUDLYIjycdkc3y1p6Rzc.png?scale-down-to=512 512w,https://framerusercontent.com/images/oobAeBZKUDLYIjycdkc3y1p6Rzc.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/oobAeBZKUDLYIjycdkc3y1p6Rzc.png 1368w\"}),/*#__PURE__*/e(\"h3\",{children:\"Integration Catalog\"}),/*#__PURE__*/e(\"p\",{children:\"Workato\u2019s strongest value prop is the sheer number of pre-built connectors they provide. They offer 1200+, which is more than any of the other top embedded iPaaS providers that exist today.\\xa0\"}),/*#__PURE__*/e(\"p\",{children:\"This is thanks to their origins in the workflow automation space as well as their reliance on community-built (aka customer-built) connectors. The only downside with the community-built connectors is that Workato is not accountable for the maintenance of those connectors in the case that the 3rd party service's API changes.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",src:\"https://framerusercontent.com/images/wbRv2GUbpOdT60z1girLZE2PbQ.png\",srcSet:\"https://framerusercontent.com/images/wbRv2GUbpOdT60z1girLZE2PbQ.png?scale-down-to=512 512w,https://framerusercontent.com/images/wbRv2GUbpOdT60z1girLZE2PbQ.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/wbRv2GUbpOdT60z1girLZE2PbQ.png 1383w\"}),/*#__PURE__*/e(\"h3\",{children:\"Monitoring\"}),/*#__PURE__*/e(\"p\",{children:\"Workato comes with simple logging, log streaming and error handling capabilities, however based on reviews for their users, there is a lot to be desired. The biggest issue is that they don't show clear input/outputs throughout the execution of a workflow, and this limitation also prevents step-specific (unit) testing.\"}),/*#__PURE__*/t(\"h5\",{children:[/*#__PURE__*/e(\"em\",{children:\"\\\"Workato could have the option to run integrations one step at a time, as it would greatly increase recipe debugging. Error handling could also be improved, as a lot of the time the error doesn't show anything and we can't see the HTTP request underneath\\\"\"}),\", says a reviewer.\"]}),/*#__PURE__*/e(\"h3\",{children:\"Infrastructure\"}),/*#__PURE__*/e(\"p\",{children:\"Given that Workato's core workflow automation product is focused on the enterprise market (which is reflected in their non-scalable pricing model), they do provide a scalable infrastructure that is capable of handling most request volumes that you may have.\"}),/*#__PURE__*/e(\"h3\",{children:\"Security\"}),/*#__PURE__*/e(\"p\",{children:\"Workato is both GDPR & SOC II compliant, but they only offer a cloud deployment of their platform. Unfortunately, given that Workato Embedded is handcuffed by their core product, Workato is unable to offer a truly self-hosted on-permise deployment option - they rely on an on-prem agent that still communicates with their servers, which means that your customers\u2019 data will have to pass through their servers no matter what.\"}),/*#__PURE__*/e(\"h3\",{children:\"Support\"}),/*#__PURE__*/e(\"p\",{children:\"While Workato's internal automation product is often used by more technical operations teams, and at times even developers, their support staff is ultimately equipped to support the workflow automation product more than it is the embedded. Requests often get backlogged if it does not align with their core product's use case, which can be a detriment to customers of their secondary, embedded iPaaS product.\"}),/*#__PURE__*/e(\"h3\",{children:\"Pricing\"}),/*#__PURE__*/e(\"p\",{children:\"Workato is known to be one of the most expensive platforms on the market, for what is essentially a secondary product that is not dedicated to the embedded use case. This is in part due to the brand equity that they were able to build with their core workflow automation product, but with all the workarounds required and the subpar end-user experience, the price tag can be hard to justify.\"}),/*#__PURE__*/e(\"h2\",{children:\"Top Embedded iPaaS #4: Tray Embedded\"}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(n,{href:\"https://www.useparagon.com/blog/tray-embedded-alternatives\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"Tray\"})}),\" is another leading workflow automation platform that is more of a mid-market competitor to Workato. Just like Workato, Tray launched Tray Embedded, a workaround product that draws from their core RPA foundations to tackle the embedded iPaaS use case.\\xa0\"]}),/*#__PURE__*/e(\"h3\",{children:\"Authentication\"}),/*#__PURE__*/t(\"p\",{children:[\"While Tray technically handles the authorization flow, the experience for both your developers and your customers is not optimal. At its core, Tray is essentially creating an a\",/*#__PURE__*/e(n,{href:\"http://tray.io/\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\" Tray.io\"})}),\" account for each of your users. Then, via their API and a few workarounds, you need to manually generate an access token to Tray and link each \u2018Tray User\u2019 to a unique integration instance and workflow (or what they call a solution instance). This is due to Tray masking their regular product\u2019s method of creating integration instances, which is not conducive to a seamless authentication experience for the embedded use case. From a security standpoint, this also means that your customers' tokens will be stored on their servers, which can be a non-starter if your customers have stringent security requirements.\"]}),/*#__PURE__*/e(\"h3\",{children:\"End-user experience\"}),/*#__PURE__*/e(\"p\",{children:\"The biggest problem with Tray Embedded is that Tray\u2019s product roadmap is focused on their core internal automation product, not their embedded iPaaS offering. You see this most clearly in Tray Embedded\u2019s authentication process for end-users, which is handcuffed to Tray\u2019s core product.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",src:\"https://framerusercontent.com/images/9C0SncOFCfX77Lpj1IilVGAMiw.png\",srcSet:\"https://framerusercontent.com/images/9C0SncOFCfX77Lpj1IilVGAMiw.png?scale-down-to=512 512w,https://framerusercontent.com/images/9C0SncOFCfX77Lpj1IilVGAMiw.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/9C0SncOFCfX77Lpj1IilVGAMiw.png 1410w\"}),/*#__PURE__*/e(\"p\",{children:\"Out of the box, end-users are taken to an external Tray URL for authentication for their integrations with an inelegant UI, which makes it clear to users that the integration is not truly native. The only compromise is with a domain matching, which masks the URL of the authentication popup, but does not address the rest of the UI challenges.\"}),/*#__PURE__*/e(\"h3\",{children:\"Integration catalog\"}),/*#__PURE__*/e(\"p\",{children:\"Tray Embedded leverages the 600 pre-built connectors from Tray\u2019s core product. This gives customers access to a wide range of different integrations, with a high chance that you\u2019ll find something there that\u2019s relevant for your users. If you want to integrate with an app that\u2019s not in Tray\u2019s catalog, you can pay Tray $3000 to build it for you.\"}),/*#__PURE__*/e(\"p\",{children:\"Unfortunately, they do not provide a custom integration builder that makes it easy for you to deploy unsupported integrations at this time.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",src:\"https://framerusercontent.com/images/UNYyE7sQvQaw2542N4I2otg9TZs.png\",srcSet:\"https://framerusercontent.com/images/UNYyE7sQvQaw2542N4I2otg9TZs.png?scale-down-to=512 512w,https://framerusercontent.com/images/UNYyE7sQvQaw2542N4I2otg9TZs.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/UNYyE7sQvQaw2542N4I2otg9TZs.png 1549w\"}),/*#__PURE__*/e(\"h3\",{children:\"Monitoring\"}),/*#__PURE__*/e(\"p\",{children:\"While Tray does provide basic logging and the ability to easily retry workflows, there is an inherent lack of attention to detail around error-handling and resiliency features such as auto-retry. When external services throw an error, such as hitting rate limits in a bulk update job, Tray\u2019s workflow engine will often cease to retry and complete the workflow.\"}),/*#__PURE__*/e(\"p\",{children:\"Additionally, the lack of versioning in their platform also presents challenges when troubleshooting issues, making it hard to roll back an update/release of a workflow.\"}),/*#__PURE__*/e(\"h3\",{children:\"Security\"}),/*#__PURE__*/e(\"p\",{children:\"Like most solutions on this list, Tray Embedded doesn\u2019t offer on-premise deployment. This means that your customer data will always have to go through their cloud infrastructure, with risks to your data security if that infrastructure were ever to fail. However, if cloud is sufficient, Tray does comply with both SOC 2 and GDPR, but not HIPAA.\\xa0\"}),/*#__PURE__*/e(\"h3\",{children:\"Support\"}),/*#__PURE__*/e(\"p\",{children:\"Similar to Workato, Tray is geared towards operations teams that want a no-code experience, and their team is trained to provide support for that use case. However the embedded iPaaS solution they offer requires much more technical support, and from talking to their customers (or ex-customers), getting access to developer support requires layers of unhelpful, non-technical support. In scenarios where bugs are impacting your own customers' experience with the integrations, this can be incredibly disadvantageous.\"}),/*#__PURE__*/e(\"h3\",{children:\"Pricing\"}),/*#__PURE__*/e(\"p\",{children:\"Tray Embedded is fairly expensive compared to the other embedded iPaaS providers in this article, with an annual platform fee of $20k, plus an additional $7k per integration. Given the pricing scales per user and per integration, these costs can only grow as your business develops.\"}),/*#__PURE__*/e(\"p\",{children:\"\u200D\"}),/*#__PURE__*/e(\"h2\",{children:\"Top Embedded iPaaS #5: Cyclr\"}),/*#__PURE__*/e(\"p\",{children:\"Based in the UK, Cyclr is the oldest embedded iPaaS provider on the market, although they still seem split between serving internal automation and the embedded use case, with customers that are in the consumer/retail space such as Monica Vinader.\\xa0\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",src:\"https://framerusercontent.com/images/7Oh1YQy0JbfQAXT0g5HNoMDvsI.png\",srcSet:\"https://framerusercontent.com/images/7Oh1YQy0JbfQAXT0g5HNoMDvsI.png?scale-down-to=512 512w,https://framerusercontent.com/images/7Oh1YQy0JbfQAXT0g5HNoMDvsI.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/7Oh1YQy0JbfQAXT0g5HNoMDvsI.png 1247w\"}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"em\",{children:\"Many of their case studies are for internal workflow automation for D2C brands/services.\"})}),/*#__PURE__*/e(\"p\",{children:\"They recently raised prices, bringing their pricing closer to other solutions on the market, but their product fails to deliver the extensibility and the seamless experience that modern SaaS companies should expect from an embedded solutions provider.\"}),/*#__PURE__*/e(\"h3\",{children:\"Authentication\"}),/*#__PURE__*/e(\"p\",{children:\"While this was a recent update, Cyclr now provides managed authentication for your users\u2019 integrations and manages the various token refresh policies for each application on your behalf, which b\"})]});export const richText4=/*#__PURE__*/t(a.Fragment,{children:[/*#__PURE__*/e(\"h1\",{children:\"How to Build a Native OpenAI Integration\"}),/*#__PURE__*/e(\"p\",{children:\"\u200D\"}),/*#__PURE__*/t(\"p\",{children:[\"Are you interested in building a native \",/*#__PURE__*/e(n,{href:\"https://docs.useparagon.com/resources/integrations/openai\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"OpenAI integration\"})}),\" for your SaaS application? OpenAI is one of the most discussed companies today, reaching over 100 million users in two months after launch, and more recently, companies like Slack and Notion have launched their own OpenAI integrations into their app.\"]}),/*#__PURE__*/e(\"p\",{children:\"OpenAI has made it easy for developers to integrate their products with these generative AI capabilities through their APIs, and in this post, we\u2019ll go over the steps you need to take to build a native OpenAI integration into your application.\"}),/*#__PURE__*/e(\"p\",{children:\"But first, let\u2019s talk through the 2 ways in which you can integrate OpenAI into your product, and why it\u2019s important to make this decision before building the OpenAi integration.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",src:\"https://framerusercontent.com/images/iJ895sLWohwanNRsFj31t8N8Se8.svg\",srcSet:\"https://framerusercontent.com/images/iJ895sLWohwanNRsFj31t8N8Se8.svg?scale-down-to=512 512w,https://framerusercontent.com/images/iJ895sLWohwanNRsFj31t8N8Se8.svg?scale-down-to=1024 1024w,https://framerusercontent.com/images/iJ895sLWohwanNRsFj31t8N8Se8.svg 1609w\"}),/*#__PURE__*/e(\"h3\",{children:\"User-supplied keys vs. using your own keys\"}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Using your own OpenAI keys\"})}),/*#__PURE__*/e(\"p\",{children:\"In the Notion example, OpenAI is integrated without the end-user having to provide their own keys. In this scenario, Notion is the one authenticating (and paying) for every request made by their users to OpenAI\u2019s API. With no controls in place for how their users will interact with the AI, they could easily incur significant costs for providing users the integration.\"}),/*#__PURE__*/e(\"p\",{children:\"If you approach building the integration in a way where you supply your own OpenAI key and all API requests made on behalf of your users\u2019 interactions with the integration are through your API key, the costs can quickly rack up.\"}),/*#__PURE__*/e(\"img\",{alt:\"OpenAI pricing\",className:\"framer-image\",src:\"https://framerusercontent.com/images/aFG7QutWjdO7KdbkfuvPGXd4i4.svg\",srcSet:\"https://framerusercontent.com/images/aFG7QutWjdO7KdbkfuvPGXd4i4.svg?scale-down-to=512 512w,https://framerusercontent.com/images/aFG7QutWjdO7KdbkfuvPGXd4i4.svg?scale-down-to=1024 1024w,https://framerusercontent.com/images/aFG7QutWjdO7KdbkfuvPGXd4i4.svg 1617w\"}),/*#__PURE__*/e(\"p\",{children:\"While this may be the easiest to implement, it is not ideal when it comes to managing costs for supporting the integration. That\u2019s why we recommend this second option.\"}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Have your users supply their own OpenAI keys\"})}),/*#__PURE__*/e(\"p\",{children:\"By having your users supply their own OpenAI keys, they will be the ones who are responsible for bearing the costs of their usage of the integration in your application.\"}),/*#__PURE__*/t(\"p\",{children:[\"You can still \",/*#__PURE__*/e(n,{href:\"https://www.useparagon.com/blog/integration-pricing-strategies\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"upsell\"})}),\" users on the integration by gating it to certain tiers, but at least you won\u2019t have to incur unpredictable costs from users constantly experimenting with different prompts.\"]}),/*#__PURE__*/e(\"p\",{children:\"Additionally, having your users supply their own keys may also open up personalization and fine-tuning options in the future that can be trained off data from your users\u2019 entire usage history of OpenAI across any application where they\u2019ve supplied their keys.\"}),/*#__PURE__*/e(\"p\",{children:\"With that said, let\u2019s get into the steps for building the native OpenAI integration.\"}),/*#__PURE__*/e(\"h2\",{children:\"Step 1: Sign Up For an OpenAI Account and Get API Access\"}),/*#__PURE__*/e(\"p\",{children:\"Even if you were to use your end-user\u2019s API Keys, in order to test the integration out as you build it, you\u2019ll need your own account and credentials.\"}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Sign Up\"})}),/*#__PURE__*/t(\"p\",{children:[\"The first step is to create an account on their website. Head over to \",/*#__PURE__*/e(n,{href:\"https://platform.openai.com/signup\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"https://platform.openai.com/signup\"})}),\" and create an account.\"]}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Get an OpenAI API Key\"})}),/*#__PURE__*/t(\"p\",{children:[\"Before you can start making OpenAI API requests, you must authenticate your requests using an API key. On the \",/*#__PURE__*/e(n,{href:\"https://platform.openai.com/account/api-keys\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"https://platform.openai.com/account/api-keys\"})}),\" page, click \",/*#__PURE__*/e(\"strong\",{children:\"Create new secret key\"}),\". \",/*#__PURE__*/e(\"em\",{children:\"Remember to copy your secret key and store it securely.\"})]}),/*#__PURE__*/e(\"img\",{alt:\"Generating an OpenAI API key\",className:\"framer-image\",src:\"https://framerusercontent.com/images/ZtK1xjPVmFTCZ64hiuWrS0q0s.png\",srcSet:\"https://framerusercontent.com/images/ZtK1xjPVmFTCZ64hiuWrS0q0s.png?scale-down-to=512 512w,https://framerusercontent.com/images/ZtK1xjPVmFTCZ64hiuWrS0q0s.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/ZtK1xjPVmFTCZ64hiuWrS0q0s.png 1664w\"}),/*#__PURE__*/e(\"p\",{children:\"If you forget or lose access to your API key, you can always create a new one, but make sure to revoke any forgotten keys.\"}),/*#__PURE__*/e(\"p\",{children:\"OpenAI users on the free tier get $18 worth of usage credit per month. If you blow through that credit during testing, you can upgrade your plan to a paid tier by going over to billing to set up a paid account and usage limits.\"}),/*#__PURE__*/e(\"h2\",{children:\"Step 2: Capture Your User\u2019s OpenAI API key\"}),/*#__PURE__*/e(\"p\",{children:\"As mentioned earlier, in production, you want to minimize incurring API call costs and provide the option to more easily fine-tune models for each user. As such, in order to authenticate requests on each of your users\u2019 behalf, you\u2019ll need to build an input prompt to capture their OpenAI API keys, and build a mechanism for securely storing those keys.\"}),/*#__PURE__*/t(\"p\",{children:[\"Now if you were to build the OpenAI integration with Paragon, you can easily embed an \",/*#__PURE__*/e(n,{href:\"http://useparagon.com/authentication\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"authentication\"})}),\" experience with a single \",/*#__PURE__*/e(n,{href:\"https://docs.useparagon.com/getting-started/displaying-the-connect-portal\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:/*#__PURE__*/e(\"strong\",{children:'paragon.connect(\"openai\")'})})}),/*#__PURE__*/e(\"strong\",{children:\";\"}),\" call. Paragon will encrypt and securely store the API Key, and automatically make all requests to the OpenAI API with that key, for that user.\"]}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",src:\"https://framerusercontent.com/images/mIMW0l0G1TnN54350PQzX7PmRk.svg\",srcSet:\"https://framerusercontent.com/images/mIMW0l0G1TnN54350PQzX7PmRk.svg?scale-down-to=512 512w,https://framerusercontent.com/images/mIMW0l0G1TnN54350PQzX7PmRk.svg?scale-down-to=1024 1024w,https://framerusercontent.com/images/mIMW0l0G1TnN54350PQzX7PmRk.svg 1496w\"}),/*#__PURE__*/e(\"h2\",{children:\"Step 3: Choose the right OpenAI API for your application\"}),/*#__PURE__*/e(\"p\",{children:\"OpenAI offers several different APIs each with a specific focus and use case, so you'll need to choose the API that best fits the use case that you want to provide your users. Here are the most commonly used APIs.\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"For conversational features to your application, use their \",/*#__PURE__*/e(n,{href:\"https://platform.openai.com/docs/api-reference/chat\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"chat API\"})})]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"For image generation, use their \",/*#__PURE__*/e(n,{href:\"https://platform.openai.com/docs/api-reference/images\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"images API\"})})]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"For auto-completing text based content creation for your users, use their \",/*#__PURE__*/e(n,{href:\"https://platform.openai.com/docs/api-reference/completions/create\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"completion API\"})})]})})]}),/*#__PURE__*/e(\"p\",{children:\"On top of that, you may will likely want to build models that can be applied towards the responses, and ideally fine-tuned with domain specific data sets, in which you\u2019d have to use their fine-tuning API.\"}),/*#__PURE__*/e(\"h2\",{children:\"Step 4: Start making requests to the OpenAI API\"}),/*#__PURE__*/e(\"p\",{children:\"While there are infinite possibilities for what requests you can make to the OpenAI API.\"}),/*#__PURE__*/e(\"p\",{children:\"Here\u2019s a sample request for using the chat API. Remember to add your or your user\u2019s API key from Step 1 in the Authorization header for each request.\"}),/*#__PURE__*/e(\"p\",{children:\"We decided to take 10 minutes when writing this tutorial to build a sample integration on Paragon. Using a sample chat application, we wanted to have the user ask for a trip itinerary to LA.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",src:\"https://framerusercontent.com/images/dqApvwdLZurrFoQBnOasYtTLo.svg\",srcSet:\"https://framerusercontent.com/images/dqApvwdLZurrFoQBnOasYtTLo.svg?scale-down-to=512 512w,https://framerusercontent.com/images/dqApvwdLZurrFoQBnOasYtTLo.svg?scale-down-to=1024 1024w,https://framerusercontent.com/images/dqApvwdLZurrFoQBnOasYtTLo.svg 1101w\"}),/*#__PURE__*/t(\"p\",{children:[\"Here's what the workflow behind the scenes looked like. We use the user's chat message as an \",/*#__PURE__*/e(n,{href:\"https://docs.useparagon.com/workflows/triggers#creating-an-app-event\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"app event\"})}),\" to trigger the native OpenAI integration workflow.\"]}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",src:\"https://framerusercontent.com/images/Yg4pz7BJIeHQcf4s7pxUH2NzOo.svg\",srcSet:\"https://framerusercontent.com/images/Yg4pz7BJIeHQcf4s7pxUH2NzOo.svg?scale-down-to=512 512w,https://framerusercontent.com/images/Yg4pz7BJIeHQcf4s7pxUH2NzOo.svg?scale-down-to=1024 1024w,https://framerusercontent.com/images/Yg4pz7BJIeHQcf4s7pxUH2NzOo.svg 2000w\"}),/*#__PURE__*/e(\"p\",{children:\"When we execute the test request in the workflow, we see the response generated by OpenAI's chat API.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",src:\"https://framerusercontent.com/images/epDkaUYPDUJsXDtfn9ihAmSvWBw.svg\",srcSet:\"https://framerusercontent.com/images/epDkaUYPDUJsXDtfn9ihAmSvWBw.svg?scale-down-to=512 512w,https://framerusercontent.com/images/epDkaUYPDUJsXDtfn9ihAmSvWBw.svg?scale-down-to=1024 1024w,https://framerusercontent.com/images/epDkaUYPDUJsXDtfn9ihAmSvWBw.svg 2000w\"}),/*#__PURE__*/e(\"p\",{children:\"In the last step, we post the response back to the sample app's API to present it in the chat.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",src:\"https://framerusercontent.com/images/fbL3g6xtazyWyTskFWmmpLeeKqc.png\",srcSet:\"https://framerusercontent.com/images/fbL3g6xtazyWyTskFWmmpLeeKqc.png?scale-down-to=512 512w,https://framerusercontent.com/images/fbL3g6xtazyWyTskFWmmpLeeKqc.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/fbL3g6xtazyWyTskFWmmpLeeKqc.png 1376w\"}),/*#__PURE__*/t(\"p\",{children:[\"You may have noticed in the screenshots that there was an input for 'model'. In general, you will have to supply a model parameter that is optimized for specific use cases. OpenAI currently supports the following \",/*#__PURE__*/e(n,{href:\"https://platform.openai.com/docs/models/overview\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!0,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"models\"})}),\":\"]}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",src:\"https://framerusercontent.com/images/LwS3nW32sz0VWRFkaGgQ1yRyCjo.png\",srcSet:\"https://framerusercontent.com/images/LwS3nW32sz0VWRFkaGgQ1yRyCjo.png?scale-down-to=512 512w,https://framerusercontent.com/images/LwS3nW32sz0VWRFkaGgQ1yRyCjo.png 719w\"}),/*#__PURE__*/e(\"h2\",{children:\"Step 4: Test your OpenAI integration\"}),/*#__PURE__*/t(\"p\",{children:[\"After you have written your integration code, the next step is to test it. OpenAI provides a \",/*#__PURE__*/e(n,{href:\"https://platform.openai.com/playground\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"sandbox playground environment\"})}),\" without depleting your API quota. It is important to thoroughly test your code and handle any errors that may occur.\"]}),/*#__PURE__*/e(\"p\",{children:\"If you build your integration in Paragon, you can easily view each step\u2019s inputs and outputs, making it extremely easy to test and debug any issues with your OpenAI integration logic. Once your logic is sound, you can 'push to prod'. You won't have to worry about building in error-handling as Paragon's auto-retry mechanism ensures execution durability when there are issues on OpenAI's side that can cause the workflow to fail.\"}),/*#__PURE__*/e(\"h2\",{children:\"Step 5: Capture the value of your OpenAI integration\"}),/*#__PURE__*/e(\"p\",{children:\"Having your customers supply their own API keys offloads the costs of making the requests to the OpenAI API. However, this does not mean you cannot monetize the value that this new AI capability creates for your users.\"}),/*#__PURE__*/t(\"p\",{children:[\"Think about how you can leverage this new OpenAI integration to upsell your customers, whether it be usage based, tier based, or a combination of both. For a full guide on how to price your OpenAI integration (and integrations in general), \",/*#__PURE__*/e(n,{href:\"https://www.useparagon.com/blog/integration-pricing-strategies\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"click here\"})}),\".\"]}),/*#__PURE__*/e(\"h2\",{children:\"Conclusion\"}),/*#__PURE__*/e(\"p\",{children:\"In conclusion, integrating with OpenAI's API is a powerful way to bring cutting-edge AI technologies to your application. By following the simple steps outlined in this blog post, you'll be able to easily create a native OpenAI integration that can perform tasks such as chat completion, language translation, natural language processing, and more.\"}),/*#__PURE__*/t(\"p\",{children:[\"If you'd like to learn more about Paragon and how it can streamline integration development for your product, \",/*#__PURE__*/e(n,{href:\"http://useparagon.com/book-demo\",motionChild:!0,nodeId:\"Q6EOzQnd6\",openInNewTab:!1,scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(o.a,{children:\"book a demo\"})}),\" with us here!\"]}),/*#__PURE__*/e(\"p\",{children:\"\u200D\"})]});\nexport const __FramerMetadata__ = {\"exports\":{\"richText3\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText2\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText4\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText1\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}"],
  "mappings": "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",
  "names": ["richText", "u", "x", "p", "Link", "motion", "richText1", "richText2", "richText3", "richText4", "__FramerMetadata__"]
}
