# Step 5: Adding Best Buy In-Store Pickup Component to Your Storefront Source: https://docs.runalloy.com/best-buy/app-configuration/adding-pickup-component In this section, you will configure your Product Detail, Cart, Checkout, and Order Confirmation pages to allow your customers to choose Best Buy In-store pickup when shopping on your site. From the Best Buy Fulfillment App homepage, click on **Theme Editor**. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/10.png) Then click on **Customize** under your current theme. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/app-configuration/storefront-component/2.png) ### Product Page Adding the Best Buy Product Pickup Selector will allow your customers to search and discover nearby Best Buy locations available for pickup. This component will give your customer an estimate on when they can pick up the item in store. Navigate to **Products** from the top navigation inside Theme Editor. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/app-configuration/storefront-component/3.png) Add the block called **Product Pickup Selector** onto the page. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/app-configuration/storefront-component/4.png) You may position this where you like to fit your layout. We recommend putting this block close to the Add to Cart button. ### Cart Page Adding the Cart Pickup Selector will allow your shoppers to express intent for Best Buy pickup. Customers can also change the store location that is best for pickup for the entire order. Navigate to **Cart** from the top navigation inside Theme Editor. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/app-configuration/storefront-component/5.png) Add the block called **Cart Pickup Selector** onto the page. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/app-configuration/storefront-component/6.png) ### Checkout Page In this section, you will be adding a few components to the checkout page. These components will only show up if your customer selects Best Buy Pickup from the Cart page. Navigate to **Cart** from the top navigation inside Theme Editor. Add the block called **Pickup Address Message** under Contact to the page. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/app-configuration/storefront-component/7.png) Add the block called **Pickup Location Detail** under Delivery on this page. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/app-configuration/storefront-component/8.png) Add the block called **Fulfillment Change Message** under Delivery to the page. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/app-configuration/storefront-component/9.png) Your final checkout page should look like this. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/app-configuration/storefront-component/10.png) ### Order Confirmation Page (Thank You Page) Navigate to **Thank you** from the top navigation inside Theme Editor. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/app-configuration/storefront-component/11.png) Add the **Confirmation Page Detail** block under Order Details to the page. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/app-configuration/storefront-component/12.png) Lastly, navigate to **Order status** from the top navigation inside Theme Editor. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/app-configuration/storefront-component/13.png) Add the **Status Page Details** block under Order Details to the page. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/app-configuration/storefront-component/14.png) You are done configuring your storefront to support Best Buy In-Store Pickup for your shoppers! Next, we will move on to managing the Best Buy Pickup Eligibility for your SKUs. # Step 2: Managing SKUs for Best Buy Pickup Eligibility Source: https://docs.runalloy.com/best-buy/app-configuration/managing-skus In this section, you will set up Best Buy Pickup Eligibility for your SKUs. SKUs with Best Buy Pickup Eligibility set to true will allow the product variant to be picked up at Best Buy Location. You will also provide a mapping of your Shopify SKUs to Best Buy SKUs so that the order can be properly fulfilled by Best Buy. ### Upload a CSV file to set Eligibility and Best Buy SKU mapping From the Best Buy Fulfillment App homepage, click on **Eligibility Settings**. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/7.png) In this interface, you will see all of your Shopify SKUs. At this moment none of the SKUs are eligible for Best Buy Pickup. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/app-configuration/managing-skus/2.png) To manage Best Buy Pickup Eligibility, you will upload a CSV file with all of the Shopify SKUs that you agree to sell via Best Buy Partner Plus and a mapping of the corresponding Best Buy SKU. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/app-configuration/managing-skus/3.png) Once you upload the CSV file, it should look like this. SKUs Eligible for pickup will have a check under the Eligibility column and should have a corresponding Best Buy SKU. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/app-configuration/managing-skus/4.png) That’s it for setting up your SKUs! # Step 3: Configure Checkout in Settings Source: https://docs.runalloy.com/best-buy/app-configuration/setup-checkout ### Checkout Settings From the Best Buy Fulfillment App homepage, click on **Checkout Settings** ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/8.png) In order for customers to pick up their order from Best Buy successfully, First Name, Last Name, Home Address, and Phone Number must be provided at checkout. Make sure you set the **Full name** to **Require first and last name** for under **Customer Information**. Additionally, set the **Shipping address phone number** to **required**. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/app-configuration/setup-fulfillment/1.png) # Step 1: Setup a Connection with Best Buy Source: https://docs.runalloy.com/best-buy/app-configuration/setup-connection First, please select your implementation method: Theme builder or Headless. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/3.png) Then you will need to connect your Shopify with Best Buy in order for your storefront to communicate with Best Buy Fulfillment Service provided by Best Partner Plus. ### Click on Connect in Step 1 Click on Connect under Step 1 in the Best Buy Fulfillment App Home Screen in Shopify Admin. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/4.png) A modal will open on the screen indicating that you are about to install an integration. Click **Install**. In the next screen, you will input your Best Buy Partner Plus credential in order to integrate with Best Buy Fulfillment Service. Click **Connect** next to Best Buy. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/5.png) You will input your **Client ID** and **Client Secret** provided by Best Buy Partner Plus. If you would like to test the app with Best Buy's lower (test) environment, be sure to request the proper credential for this step. You may change this later to the production credential any time. Click **Connect** to proceed. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/6.png) Click **Continue** until you see the "Your integration was successfully installed" screen. Click **Done** to finish this portion of the setup. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/app-configuration/setup-connection/4.png) # Step 4: Setup Best Buy Fulfillment and Order Routing Source: https://docs.runalloy.com/best-buy/app-configuration/setup-fulfillment ### Shipping and Delivery From the Best Buy Fulfillment App homepage, click on **Shipping Settings** ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/9.png) In the shipping section, click on **General shipping rates**. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/app-configuration/setup-fulfillment/2.png) At the bottom of the page, you should see a section called **Not Shipping from** with **Best Buy In-Store Pickup**. Click on **Add Rates.** ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/app-configuration/setup-fulfillment/3.png) In the modal, select **Create new rates**. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/app-configuration/setup-fulfillment/4.png) Then click on **create zone** and add a **United States** zone. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/app-configuration/setup-fulfillment/5.png) Click on **Add rate** for this zone. In the modal, select the following: Click **Done**. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/app-configuration/setup-fulfillment/6.png) ### Order Routing Under the same **Shipping and Delivery** page in **Settings**, click on **Order Routing Rules** in the **Order routing section**. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/app-configuration/order-routing/1.png) Make sure that you add the Use Ranked Locations rule at the top. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/app-configuration/order-routing/2.png) Click **edit** on the **User ranked locations** rule and make sure Best Buy In-Store Pickup is at the bottom of the ranking. This will ensure this location will only be selected at checkout if the In-Store pickup option is selected by the customer. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/app-configuration/order-routing/3.png) Voila! You are all set up! Now you can checkout your storefront and see Best Buy In-Store Pickup in action! # App Installation Source: https://docs.runalloy.com/best-buy/app-installation ## Install app from Shopify App Marketplace Visit this URL: [https://apps.shopify.com/best-buy-fulfillment](https://apps.shopify.com/best-buy-fulfillment) ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/app-installation/1.png) ### Click Install Click **Install** from the App Listing Page. ### Accept Access Merchant will be asked to accept the following scopes before proceeding. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/1.png) # Best Buy Fulfillment App for Shopify Source: https://docs.runalloy.com/best-buy/introduction ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/bb.png) The Best Buy BOPIS App is not currently compatible with split fulfillment or upsells apps. Please make sure you disable cross-sells and upsells for BOPIS-enabled products. Enhance your storefront with the convenient Buy Online Pickup In Store (BOPIS) option using our user-friendly Best Buy Fulfillment app. With a simple drag-and-drop setup, you can offer your customers the ability to search for pickup availability at nearby Best Buy retail locations and select the pickup option during checkout. **Requirements:** * Enroll in Best Buy Partner Plus * On Shopify Plus * Installed Shopify Checkout Extension ## Changelog All notable changes to this project, both visible and invisible, will be documented in this file. * New checkout UI extension allowing shoppers to select or change BBY pickup location in the checkout page #### Breaking Changes * Merchants will need to navigate to their checkout settings and enable 2 settings within the **Pickup Location Details** extension: * Allow app to block checkout * Include app block in Shop Pay * New integration with Sentry (invisible to Best Buy Partners) to enable better logging for the Alloy team to debug order issues * Fix for mismatched promise dates has been deployed # Order Update Email Notification Source: https://docs.runalloy.com/best-buy/order-update-email-notification Best Buy partners with Alloy Integration to provide a seamless capability to send out order update notifications to your customer whenever there is an update for Best Buy Order. For example, when an order is **ready for pickup** at the Best Buy location, you can send out an email update to your customer. These notifications will come to your store with your branding. Alloy Integration currently provides 2 integration options for you to send out notifications: * Integrate with your 3rd party marketing automation platform (e.g. Mailchimp, Klaviyo, SMTP) * Custom API endpoints During the onboarding process, merchants will work with Alloy Automation and Best Buy to set up the customer communication flow. ### Steps: ### Best Buy provides recommended email templates for Merchants Merchants can modify the email with their branding. Merchants will create these email templates or campaigns in their own 3rd party applications. Merchants should create an email template or campaign for the following order fulfillment events: * Best Buy fulfillment confirmation * Ready for pickup * Reminder to pickup * Promise date changed * Confirm pickup * Cancel due to customer missed pickup * Cancel due to Best Buy unable to fulfill * Item is returned at Best Buy Following are the instructions on what each merchant will need to set up depending on which 3rd party email provider they are using. #### Klaviyo The preferred method to trigger emails via Klaviyo is via their [Flows](https://help.klaviyo.com/hc/en-us/sections/14543521377819) tool. It has [custom event triggers](https://developers.klaviyo.com/en/reference/create_event) that merchants can build Flows with. Alloy would create these triggers that can be selected by the merchant, then would listen to events from Best Buy and would trigger the merchant-created Flows in Klaviyo. The configuration of the emails and data to send over would be up to the merchant, who needs to consider: * The [email template used in the Flow](https://help.klaviyo.com/hc/en-us/articles/4408802597659) * The events to trigger emails off of. Alloy creates these programmatically, and the merchant can select them in the list of triggers on the Klaviyo Flow. They'll be able to select from: * Order Confirmation * Ready for Pickup * Reminder for Pickup * Promise Date Changed * Confirm Pickup * Cancel due to Missed Pickup * Cancel to Availability * Whether they want emails to trigger when all line items reach the status or send emails based on line items status changes (vs. the entire order). * The mail merge variables available to them for use in their Flows. #### SMTP WIP #### Mailchimp WIP #### Custom Endpoint WIP # Returns & Cancellations Source: https://docs.runalloy.com/best-buy/returns-cancellations Most of the time customers will return the item to the Best Buy store location. Once the return is processed at Best Buy, a workflow will be triggered to update the order status and refund on Shopify. The refund amount will be calculated and issued to the customer via the Merchant’s Shopify account. Upon installing the Best Buy Fulfillment app, the refund workflow will automatically be installed, therefore merchants will not need to do anything to set this up. ## How does it work behind the scenes? When a customer returns an item or an order was canceled after being purchased through Best Buy BOPIS, Alloy Automation will trigger the refund process through Shopify and reflect the order status in the Shopify UI for the merchant. Broadly speaking, and for the purposes of understanding the return and cancellation flow specifically, the relevant lifecycles are as follows: | Line item Lifecycle | Alloy Action | | :-------------------------------------------------------------------------------- | :--------------------------- | | SENT\_FOR\_FULFILLMENT -> CREATED -> READY\_FOR\_PICKUP -> PICKED\_UP | No action taken | | SENT\_FOR\_FULFILLMENT -> CREATED -> CANCELED | Cancel and refund in Shopify | | SENT\_FOR\_FULFILLMENT -> CREATED -> READY\_FOR\_PICKUP -> CANCELED | Cancel and refund in Shopify | | SENT\_FOR\_FULFILLMENT -> CREATED -> READY\_FOR\_PICKUP -> PICKED\_UP -> RETURNED | Refund in Shopify | When it comes to refunds, we will use the following Shopify endpoints: * [Calculates a refund](https://shopify.dev/docs/api/admin-rest/2024-07/resources/refund#post-orders-order-id-refunds-calculate) - Used to understand if line items may have already been refunded and how much to refund. * [Creates a refund](https://shopify.dev/docs) When it comes to cancellations, we will use the endpoints: * Cancel a fulfillment - Fulfillments (which we create upon order creation) need to be canceled before the order can be. * Cancel an order - Note that while orders cannot be partially canceled, they can be partially refunded. If only one line item is canceled, we will cancel the full order but only refund the relevant line item. Canceling an order gives it a canceled indicator on Shopify and prevents the order from being edited via the Shopify UI. Here’s what the orders could potentially look like in the different stages of the life cycle (ignored the “Test order” section, merchants will not see that. Order immediately after placement (order is created in a fulfilled state) * Order partially canceled (one or more line items returned or canceled) ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/returns-cancellations/1.png) * Order fully canceled (single line item return, single cancelation) ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/returns-cancellations/2.png) * Order fully canceled (single line item return, single cancelation) ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/returns-cancellations/3.png) # Shopper Experience Source: https://docs.runalloy.com/best-buy/shopper-experience In this section, we will walk through the shopper experience for purchasing an order using Best Buy In-Store Pickup. ## Product Page When shoppers visit a product page that is eligible for Best Buy In-Store Pickup, an In-Store Pickup component will show up. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/shopper-experience/pdp/1.png) They can click select a store to see pickup availability for nearby Best Buy Locations. First, they will input their zip code if location service is not enabled. They will see a list of nearby stores with pickup availability to choose from. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/shopper-experience/pdp/2.png) Once they select a store location, they can add the item to cart. ## Cart On the cart page, this is where the shopper will express intention to pick up the order at a Best Buy location. If the shoppers do not wish to pick up at a Best Buy location, they can still select Shipping before checkout. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/shopper-experience/cart/1.png) If the cart contains an item that is not available for pickup at the current location, the shopper can change to a different store location with availability for the entire order. We currently do not support split fulfillment, so the entire cart has to be available at one location before checkout. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/shopper-experience/cart/2.png) Same rule applies if one of the items in the cart is not eligible for Best Buy Pickup. Shoppers will have to remove such items before proceeding with pickup. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/shopper-experience/cart/3.png) ## Checkout If the shopper selects Best In-Store Pickup, the checkout experience will vary slightly from the standard checkout. There will be a copy explaining the required information the shopper must provide for a successful pickup at Best Buy. The shipping method will show In-Store Pickup with the location detail and timeframe. And finally, there will be a link to return to the cart page if the shopper wishes to change the fulfillment option back to Shipping. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/shopper-experience/checkout/1.png) ## Order Confirmation Order confirmation for Best Buy Pickup will also indicate the order fulfillment method as Best Buy In-Store Pickup with details on the pickup location and timeframe. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/shopper-experience/checkout/2.png) At this point, the shopper should wait for email notifications when the order is ready for pickup. ## Order Management As a Shopify merchant, you can still see your Best Buy Pickup Order in Order History in Shopify. As Best Buy will handle the fulfillment, the Best Buy Fulfillment app will continuously update your order status automatically. ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/shopper-experience/checkout/3.png) ![](https://s3.amazonaws.com/alloy-assets/alloy-docs/best-buy/shopper-experience/checkout/4.png) **For merchants:** If you wish to add any custom tags or metadata to your Best Buy Pickup Order, please contact Best Buy Partner Plus. # App Action Dashboard Source: https://docs.runalloy.com/embedded/app-action-dashboard App Action Usage Dashboard is an observability feature allowing you to see the usage for the Alloy Embedded Platform. Customers who are on the usage pricing plan can see the app action usage towards their app action limit for the billing cycle. You can find this dashboard in the application navigation under **Monitor > App Actions**. ![App Actions Dashboard](https://cdn.runalloy.com/alloy-docs/alloy-automation-app-actions-dashboard.png) App Actions are tracked from two different type of actions, workflow actions and api actions * **Workflow actions**: These are counted whenever your workflow is executed. The number of app actions for each workflow run is calculated by the number of actions in the workflow * **API actions**: these are tracked whenever you make an API call using our passthrough API calls, Unified API calls and Unified API data syncs ## Monitor your app action limit You can monitor the app actions you consumed in your current billing cycle. The dashboard presents you the progress of your usage towards your app actions limit for your account. Billing cycle is normally one year. ![Monitor App Actions Limits](https://cdn.runalloy.com/alloy-docs/alloy-automation-monitor-app-actions.png) In this dashboard, you will be able to see when you are over your app action limit during your billing cycle. We will continue to run your integration workflow without disruption even if you are over the limit. In the event of going over the limit. You will be contacted by our sales team to purchase more app actions. ![](https://alloy-assets.s3.amazonaws.com/alloy-docs/embedded/app-actions/03-app-actions.png) ## App Action usage over time The dashboard offers the capability to track your usage over time in various time ranges. The time series chart will help you understand the rate app actions are being consumed over time. By default, we show the accumulated usage for each time interval. ![](https://alloy-assets.s3.amazonaws.com/alloy-docs/embedded/app-actions/05-app-actions.png) ## App Action usage by Integration Breaking down the app action usage by Integrations allows you see which integration is consuming the most App Actions over time. By default, we show the accumulated usage for each time interval. ![](https://alloy-assets.s3.amazonaws.com/alloy-docs/embedded/app-actions/06-app-actions.png) ## App Action usage by end-user Breaking down the app action usage by user allows you to see which of your customers are using the most App Actions over time. By default, we show the accumulated usage for each time interval. ![](https://alloy-assets.s3.amazonaws.com/alloy-docs/embedded/app-actions/07-app-actions.png) ## App Action Usage API You can also programmatically fetch all of the app action usage data by using our REST API endpoint. This will allow you to build your own observability application for your own internal application or for your customers. Check out our [API reference](/reference/embedded/get-app-actions-usage) for more details. # Authentication Source: https://docs.runalloy.com/embedded/authentication Learn how to connect to Alloy's Embedded iPaaS and make requests. If you've read the Quick Start, you can skip this section. ## Overview When connecting to Embedded iPaaS, you must authenticate both the frontend and backend: * **API Key** authenticates outgoing requests from your backend server * **JWTs** securely render the Hosted Modal from your application's frontend ## Get Your API Keys Login to your account and navigate to the **API Keys** tab under **Settings**. There are two types of API Keys to generate: * Development Key * Production Key ![Embedded iPaaS API Keys](https://cdn.runalloy.com/alloy-docs/embedded-ipaas/alloy-automation-api-key.png) **Info**: The development and production keys are effectively identical with one minor caveat: users created using the development key will be isolated in development. Because the platform relies heavily on the concept of users, you can use your development key to generate as many test users as you like without congesting your production environment. When you're ready, you can easily swap keys to production. These keys are intended for backend use only and should never be exposed to customers on the frontend. ### Bearer Auth When making a request, include the key in the `Authentication` header as a bearer token: ***Sample Request*** ```curl cURL theme={null} curl https://embedded.runalloy.com/{VERSION}/ENDPOINT_TO_HIT -H "Accept: application/json" -H "Authorization: Bearer YOUR_API_KEY" ``` ```javascript JavaScript theme={null} const request = require("request"); request( { url: "https://embedded.runalloy.com/{VERSION}/ENDPOINT_TO_HIT", headers: { Authorization: "Bearer YOUR_API_KEY", }, }, function (err, res) { if (err) { console.error(err); } else { console.log(res.body); } } ); ``` ## User Management You must first create a user before making most API calls. On your backend, create an end user. An end user represents a tenant in your system. To get started, invoke the **[POST Create User](/reference/embedded/create-a-user)** endpoint. This endpoint generates a unique `userId` which you'll use later. Make sure to pass a `username` in the body. This username must be unique for each user you create. ```curl cURL theme={null} curl --request POST \ --url https://embedded.runalloy.com/{VERSION}/users \ --header 'Authorization: bearer YOUR_API_KEY' \ --header 'accept: application/json' \ --header 'content-type: application/json' \ --data '{ "username": "YOUR_USERNAME" }' ``` This endpoint returns a unique userId: ```json JSON theme={null} { "userId": "658c703c524d011f001fe3e4" } ``` ### Installing the Frontend SDK Now that you've created a user, connect your application's frontend to the API. Use the Frontend SDK to instantiate the modal, which makes it easy for your users to connect to third-party apps and abstracts away complexities like credential management and redirect URLs. To install the frontend SDK, use npm or add the following snippet to your application's header: ```html JavaScript theme={null} ``` ```curl cURL theme={null} npm install alloy-frontend ``` With the SDK installed, render the modal by triggering the frontend SDK's `authenticate()` method. **Note**: If you're interacting with the hosted Frontend SDK from a React app (i.e., you imported the HTML snippet), call these methods by invoking `window.Alloy.authenticate()`. ### Passing the Token to Your Frontend To securely render the `authenticate()` method on your frontend, you must generate a JSON Web Token. Generate this token by making an API request to the [GET `/user/:userId/token`](/reference/embedded/generate-jwt-token) endpoint. You must pass a `userId` as this JWT is specific to a user. ***Request*** ```curl cURL theme={null} curl --request GET \ --url https://embedded.runalloy.com/{VERSION}/users/:userId/token \ --header 'Accept: application/json' \ --header 'Authorization: bearer YOUR_API_KEY' ``` ***Response*** ```json JSON theme={null} { "token": "XXXXXXXX.YYYYYYYYY.ZZZZZZZZ" } ``` Call the `setToken()` method and pass the JWT as the argument. This authenticates the frontend SDK and allows you to render the modal. ```javascript JavaScript theme={null} JavaScriptAlloy.setToken(""); ``` Next, call the `install()` method to prompt your end user to install an integration and its workflows. Once the user has installed, this creates an installation. This method takes the following arguments: * `integrationId`: the Id of the integration you want to install. A complete list of integrations available for a user can be found by calling the [GET List Integrations](/reference/embedded/list-integrations) API. The callback returns a `success` message. ***Invocation*** ```javascript JavaScript theme={null} Alloy.install({ integrationId: "YOUR_INTEGRATION_ID", callback: (data) => { console.log(data); }, }); ``` ***Response*** ```json JSON theme={null} { "success": true } ``` ## Security ### Revoking Keys Always closely guard your production key. When you click the **Generate** button, the production API key will be shown once. Securely store this key as it will not be shown again. If you click the Generate button again, the system will revoke the previous key and generate a new one. **Info**: Production keys should be treated with the utmost care. If someone accidentally accesses your production key, they can make requests on behalf of your entire account. That's why we recommend never sharing this key with anyone else (or using it directly in the browser) and storing it in a secrets manager. ### Alloy IP Addresses Several apps, including many database connectors, require you to access them only via an IP whitelist. If you are planning to [stream data](/connectors/utility/data-streaming) to a data warehouse or database, you may need to whitelist our IP address. The IPs from which Alloy will make requests are: * `3.211.13.53` * `54.160.36.113` ## Summary This article covered how to authenticate requests to the API and how to securely pass JWTs to the frontend. # Basic Debugging Source: https://docs.runalloy.com/embedded/basic-debugging ## Managing Errors When workflows error unexpectedly, we provide several methods to help you identify what went wrong. You can access workflow logs via the Error Logging API, receive errors in real-time to your API, or stream error logs via our AWS EventBridge integration. ### Retrieve Logs for a Single Workflow Use the `GET /2024-03/workflow/{workflowId}/logs` endpoint to retrieve log data for a given workflow. Each log includes the `executionId` (which can be used to rerun an execution), the `startedAt` and `stoppedAt` date stamps, and the JSON output of the execution. **Endpoint** ``` GET https://embedded.runalloy.com/{VERSION}/workflow/{workflowId}/logs ``` **Sample Request** ```bash cURL theme={null} curl -X GET 'https://embedded.runalloy.com/2024-03/workflow/{workflowId}/logs' \ -H 'Accept: application/json' \ -H 'Authorization: bearer YOUR_API_KEY' ``` **Sample Response** ```json JSON theme={null} { "data": [ { "executionId": "6daaa0cf1a3daa6c41b5-ef", "startedAt": "2022-10-04T01:12:40.406Z", "stoppedAt": "2022-10-04T01:12:59.508Z", "status": "success", "results": [ { "blockId": "f2eb053c-d04a-1a6c-8cd1-dbd6b8d016d0", "startedAt": "2022-10-04T01:12:40.406Z", "stoppedAt": "2022-10-04T01:12:40.782Z", "data": [ { "json": { "body": { "brandValue": "Order Placed" } }, "meta": { "url": "embedded.runalloy.com", "x-request-id": "0a2253180d67dd23f96d81f49bac", "x-real-ip": "00.118.107.70", "x-forwarded-for": "00.118.107.70", "x-forwarded-host": "embedded.runalloy.com", "x-forwarded-port": "80", "x-forwarded-proto": "http", "x-forwarded-scheme": "http", "x-scheme": "http", "content-length": "1809", "content-type": "application/x-www-form-urlencoded; charset=utf-8; boundary=1-dsDx0TBzB4bDi3maDvCe", "user-agent": "PostmanRuntime/7.28.4", "postman-token": "c6c95c92-ebed-4ade-bdcd-b49f97d7a6c5", "cache-control": "no-cache", "accept-encoding": "gzip, deflate, br" } } ], "id": "0ab1892x-d28e-443b-a03b-20efbedc4c5" } ] } ] } ``` ### AWS EventBridge The platform also supports direct integration with AWS EventBridge for streaming error logs. To enable this feature: 1. Navigate to the AWS EventBridge connection in Settings 2. Enter your AWS keys (securely encrypted) 3. Enter your Event Bus Name and save Once enabled, error logs will automatically stream to AWS. You can disable this feature at any time by toggling the EventBridge connector off. # Calculating App Actions Source: https://docs.runalloy.com/embedded/calculating-app-actions ## Overview An "app action" is counted every time a workflow moves data or takes action for you. You can think of it as every time an app is involved as well. ## How to Calculate App Actions ### Example #1 Let's take a look at the example workflow below. This workflow triggers every time a Custom Event is called. Since this workflow has two blocks, a single run will result in two app actions. ![](https://alloy-assets.s3.amazonaws.com/alloy-docs/embedded/calculating-app-actions/1.png) ### Example #2 In the next example, we have a workflow that runs once upon installation, then gets a list of sales orders from NetSuite, and subsequently streams them to your sever via Data Stream. Let's say you have 1,000 orders in NetSuite. This workflow is a bit more complex to calculate the action usage for: * The upon installation trigger counts as one action * The NetSuite list all Sales Orders counts as another single action * The Stream Data block needs to page through all the sales orders returned from NetSuite. Assuming the chunk size is set to 50 in Stream Data, then this block will result in 20 actions. Therefore, we have a total of 22 actions for this workflow (1 + 1 + 20). ![](https://alloy-assets.s3.amazonaws.com/alloy-docs/embedded/calculating-app-actions/2.png) ### Example #3 Now let's consider a slightly more advanced workflow. The workflow below runs once upon installation, then gets a list of sales orders from NetSuite, iterates through each item in the list, and subsequently inserts each record into Snowflake. Once again, let's assume you have 1,000 orders in NetSuite. The action count would be as follows: * The upon installation trigger counts as one action * The NetSuite list all Sales Orders counts as another single action * The Iterate block runs through every item returned by NetSuite. However, the block itself only counts as one action. * Inside the Iterate block, we add each record to Snowflake. Because we need to iterate through 1,000 records in NetSuite, we multiple the Snowflake block by this value (1 \* 1,000). This results in 1,000 actions. Therefore, we have a total action count of 1,003 (1 + 1 + 1 + 1,000). ![](https://alloy-assets.s3.amazonaws.com/alloy-docs/embedded/calculating-app-actions/3.png) ### Example #4 (Polling Triggers) Some apps don't offer webhooks, or require complicated end user-setup. In these cases, Alloy opts for a 12 minute polling mechanism. For each object change captured in a 12 minute period, a single workflow execution will be created. Scenario: After a 12 minute period, the poller runs and finds 17 contacts were changed. This will initiate 17 workflow executions, each with 2 app actions. Objects are not grouped into a single execution, if you'd prefer capturing many changes in a single execution, use our schedule trigger. The total action count is 17\*2 = 34 ![](https://alloy-assets.s3.amazonaws.com/alloy-docs/embedded/calculating-app-actions/4.png) ## Wrapping Up In this article, we took a look at how to calculate app actions using Alloy Embedded. # CCPA Policies Source: https://docs.runalloy.com/embedded/certifications/ccpa To comply with GDPR, we allow you to remove any customer data for any given user. By using Alloy Automation products, it is your responsibility to remove any and all user data upon a user's request in accordance with European Union law. # Certifications Source: https://docs.runalloy.com/embedded/certifications/certifications ## Compliance Certifications At Alloy Automation, we take security very seriously. In fact, we take a number of steps to mitigate any security risk. Alloy Automation is [SOC 2 Type I and II Compliant](https://us.aicpa.org/interestareas/frc/assuranceadvisoryservices/aicpasoc2report), SOC3, HIPAA, GDPR, and CCPA compliant. We undergo a regular SOC2 audit yearly. We work with a 3rd Party monitoring system to ensure continuous compliance. Potential customers can reach out to us to request a copy of our SOC 2 Report. SOC 2 is a report based on the Auditing Standards Board of the American Institute of Certified Public Accountants' (AICPA) existing Trust Services Criteria (TSC). The purpose of this report is to evaluate an organization’s information systems relevant to security, availability, processing integrity, confidentiality, and privacy. In addition to SOC 2, we are HIPAA, CCPA and GDPR Compliant and offers endpoints to allow customers to easily request data deletion in compliance with GDPR standards. # GDPR Policies Source: https://docs.runalloy.com/embedded/certifications/gdpr To comply with GDPR, we allow you to remove any customer data for any given user. By using Alloy Embedded, it is your responsibility to remove any and all user data upon a user's request in accordance with European Union law. To remove user data, you can invoke our [DELETE users/logs](/reference/embedded/delete-logs-for-a-user) endpoint. # HIPAA Policies Source: https://docs.runalloy.com/embedded/certifications/hipaa Alloy Automation is compliant with the Health Insurance Portability and Accountability Act (HIPAA). To ensure compliance, Alloy Automation has partnered with [Secureframe](https://secureframe.com/frameworks/hipaa). If you have any questions about our HIPAA compliance, please contact your account rep. # SOC 2 Source: https://docs.runalloy.com/embedded/certifications/soc-2 Alloy Automation maintains compliance with the Service Organization Control Type 2 standards. Alloy Automation is both SOC2 Type I and SOC2 Type II compliant. Further, Alloy Automation maintains SOC3 compliance as well. We undergo an annual audit of all systems to ensure strict adherence to SOC requirements. If you are a prospective customer looking to obtain a copy of our SOC2 report or if you have any questions on our controls, please contact your account rep. # Concurrency Source: https://docs.runalloy.com/embedded/concurrency ## Overview In this guide, we'll take a look at how Alloy handles concurrency when running workflow executions. Understanding concurrency is important to having a solid grasp of our infrastructure. ## How it Works To understand how concurrency works at Alloy, let's take two scenarios: * Scenario 1: You have a single workflow that listens for new records created in BigCommerce and proxies those events over to your API. Let's assume this workflow receives 5,000 events in the first hour. * Scenario 2: You've set up two workflows, one that receives customer sign-up events and adds them to a list in klaviyo, and a second workflow that receives Clicked Email events from Klaviyo and proxies those events to your API. Alloy handles concurrency by spreading out workflow executions at the Workflow level. In other words, a workflow execution, or execution for short, represents any given job associated with a workflow. In Scenario 1, the rate at which Alloy can process the event and send it to your API is largely dictated by the rate-limiting of your API. If BigCommerce sends the first 1,000 events to Alloy over the course of a minute, we wouldn't want to immediately send those 1,000 events to your API if it has a 60 request-per-minute limit. Alloy instead adds those requests to a queue spread out over time to avoid having to handle rate-limit errors with retries. When the remaining 4,000 events are received over the course of an hour, they will be queued up to run after the last batch of events if there are still any outstanding. In Scenario 2, if Alloy receives a customer signup event and clicked email event simultaneously, both workflows will execute simultaneously. These two workflows function independent of one another, and events received by one will not impact the event scheduling of the other. ## Wrapping Up In this tutorial, we took at look at how Alloy handles concurrency across workflow executions. # Custom Action Source: https://docs.runalloy.com/embedded/custom-action The Custom Action connector allows developers to define and execute arbitrary API requests using an existing application's authenticated credentials. This feature only applies to Embedded iPaaS ## Overview The Custom Action connector provides low-level access to any REST or GraphQL endpoint for a connected application. It is used when Embedded iPaaS does not yet expose a specific endpoint through a pre-built connector. Custom Action inherits the authentication context of the parent app connector, allowing requests to be made with the same credentials and authorization scopes already configured for that connection. *** ## How It Works When a workflow runs, Embedded iPaaS executes the Custom Action call using the stored app credentials. The connector automatically appends the correct base URL, handles authentication headers, and surfaces the raw API response as output to downstream connectors. This enables direct interaction with any valid API method, without needing to wait for new connector versions. Example:\ Shopify releases a new **`POST /orders`** endpoint that isn’t yet mapped in the Shopify connector. You can use Custom Action to call this endpoint directly and return the JSON response into your workflow. *** ## Setup **1. Add a Trigger** Insert any trigger connector (for example, *Shopify Trigger* or *HTTP Request*). **2. Add the Target App** Add the app connector whose credentials you want to reuse—e.g. *Shopify* under **Destinations**. **3. Create a Custom Action** Under **Action**, select **Create Custom Action**. ![](https://alloy-assets.s3.amazonaws.com/alloy-docs/embedded/custom-action/1.png) **4. Select Credentials** Choose an existing credential from the **Authentication** tab.\ This credential determines the OAuth or API key used to sign requests. ![](https://alloy-assets.s3.amazonaws.com/alloy-docs/embedded/custom-action/2.png) **5. Configure the Request** Specify the HTTP **Method** (`GET`, `POST`, `PUT`, etc.) and the **Request Path** relative to the app’s API root. Example: for `POST https://api.shopify.com/admin/api/2023-10/orders.json`,\ enter only `/orders.json`. Embedded iPaaS prepends the base URL automatically. ![](https://alloy-assets.s3.amazonaws.com/alloy-docs/embedded/custom-action/3.png) **6. Add Parameters and Body** Configure query parameters, headers, or a JSON request body.\ Authentication headers are not required—Embedded iPaaS injects them automatically. Use **Send Request** to execute a test call and inspect the HTTP response payload. ![](https://alloy-assets.s3.amazonaws.com/alloy-docs/embedded/custom-action/5.png) *** ## Dynamic Path Variables Some endpoints include variable segments in their URL path.\ Use the templating syntax `{{variableName}}` to substitute dynamic values at runtime. Example: # Custom Events Source: https://docs.runalloy.com/embedded/custom-events This feature only applies to Embedded iPaaS ## Overview Custom Events provide a secure, programmatic way to trigger workflows from your application. Unlike traditional webhook triggers that respond to external events, Custom Events give you precise control over when and how workflows execute, allowing you to integrate workflow automation directly into your application's business logic. ## Understanding Custom Events Custom Events act as bridges between your application and your integration workflows. When specific actions occur in your application, such as a user completing a purchase, submitting a form, or reaching a milestone, you can trigger workflows that automate downstream processes across your integrated systems. The power of Custom Events lies in their flexibility. You define both the trigger conditions and the data structure, ensuring workflows receive exactly the information they need to execute properly. ## Defining a Custom Event Schema Every Custom Event requires a schema that defines the structure of data you'll send when triggering the workflow. This schema acts as a contract between your application and the workflow, ensuring data consistency and enabling you to reference specific fields throughout your workflow configuration. Let’s walk through a practical example. Suppose you’re building an accounting feature where users can automatically log invoices to be created in your ERP, NetSuite, by filling out a form within your internal admin panel. First, you'll create a Custom Event called `create_invoice` and define its schema with the data points you need to pass: ```json JSON theme={null} { "id": "String", "invoiceNumber": "String", "invoiceAmount": 2 } ``` ![Custom Events in Embedded](https://cdn.runalloy.com/alloy-docs/embedded-ipaas/alloy-automation-embedded-ipaas-custom-event-1.png) This schema tells the system to expect three fields: an `id`, `invoiceNumber`, and `invoiceAmount`. When you invoke this Custom Event from your application, you'll need to include values for each of these fields. ## Building Workflows with Custom Event Data Once you've defined your Custom Event schema, you can reference those fields throughout your workflow. In our example, we've configured the NetSuite connector to create an invoice using the data from our Custom Event: ![Custom Events Mapping](https://cdn.runalloy.com/alloy-docs/embedded-ipaas/alloy-automation-embedded-ipaas-custom-event-2.png) Notice how the fields from the Custom Event schema are mapped directly to NetSuite. This dynamic mapping ensures that each time the workflow runs, it uses the specific data you provide when triggering the event. ## Invoking a Custom Event To trigger your Custom Event from your application, make a request to the [**POST /run/event**](/reference/embedded/run-event) endpoint. You'll need to specify three key pieces of information: 1. **event**: The name of your Custom Event (e.g., `invoice_created`) 2. **userId**: The unique identifier for the user triggering this workflow 3. **data**: An object containing the values for each field in your schema Here's how to invoke the `invoice_created` Custom Event: **Sample Request** ```sh theme={null} curl --request POST \ --url https://embedded.runalloy.com/{VERSION}/run/event \ --header 'Authorization: bearer YOUR_API_KEY' \ --header 'accept: application/json' \ --header 'content-type: application/json' \ --data '{ "event": "invoice_created", "userId": "user_123456", "data": { "id": "0be1050f-4d0d-4682-b972-241ec8139cfa", "invoiceNumber": "00001", "invoiceAmount": 1002 } }' ``` When this request executes, the workflow will trigger for the specified user, and create an invoice in NetSuite with the exact data you provided. ## Best Practices When working with Custom Events, keep these guidelines in mind: **Choose descriptive event names**: Use clear, action-based names like `invoice_created`, `order_completed`, or `user_onboarded` that immediately communicate what triggered the workflow. **Keep schemas focused**: Include only the data points your workflow actually needs. Smaller, focused schemas are easier to maintain and less prone to errors. **Validate data before sending**: Ensure the data you're passing matches your schema structure. Missing or incorrectly typed fields can cause workflow failures. **Use consistent naming conventions**: Stick to a naming pattern across your Custom Events (e.g., Title Case for event names, camelCase for field names) to maintain consistency as you scale. **Handle errors gracefully**: Implement error handling when invoking Custom Events to catch and log failures for debugging. ## Summary Custom Events provide a powerful way to integrate workflow automation directly into your application's logic. By defining schemas and triggering events programmatically, you can automate complex processes across multiple systems while maintaining full control over when and how those workflows execute. ``` ``` # Custom Field Types Source: https://docs.runalloy.com/embedded/custom-field-types As we previously discussed in the variable selector documentation, the platform provides tools to make data mappings straightforward. However, enterprise applications like NetSuite, SAP, Salesforce, and HubSpot often require greater customization due to their support for custom fields, which can complicate data mappings. Let's explore how to handle this challenge. ## The Challenge with Custom Fields Enterprise applications allow organizations to extend standard object schemas with custom fields tailored to their specific business needs. While this flexibility empowers your users, it creates a challenge for integration builders: how do you map data to fields that don't exist in the standard schema? Consider this scenario: You're building a NetSuite integration that creates Invoices. Your integration maps standard fields like customer name, order date, and line items. However, one of your customers has added a custom field called `VI_ORDER_NAME` to their NetSuite Invoice object, which they use as the primary identifier for orders. Without support for custom fields, your integration would fail to populate this critical field, forcing you to build custom logic for each customer's unique requirements. This doesn't scale. ## How Custom Fields Work Custom Field support is available on select connectors including NetSuite, Salesforce CRM, and HubSpot. This feature allows end users to map data to their organization-specific custom fields without requiring you to modify the underlying workflow. When configuring an action (such as "Create a new Invoice" in NetSuite), you'll find a **Custom Fields** option below the standard optional fields section: ![Custom Fields NetSuite Embedded iPaaS](https://cdn.runalloy.com/alloy-docs/embedded-ipaas/alloy-automation-custom-fields.png) By selecting the **Allow user to add their Custom Fields** checkbox, you enable end users to define their own field mappings during the workflow installation process. ![Allow User to Add CUstom Fields](https://cdn.runalloy.com/alloy-docs/embedded-ipaas/alloy-automation-netsuite-custom-fields.png) ## End User Experience When you publish a workflow with Custom Fields enabled, the modal automatically detects this configuration and presents an **Add Custom Field** button to end users during installation: ![Custom Fields Preview](http://cdn.runalloy.com/alloy-docs/embedded-ipaas/alloy-automation-netsuite-custom-fields-preview.png) End users can click this button to add as many custom field mappings as they need. For each custom field, they'll provide: * **Field Name**: The exact field identifier from their system (e.g., `VI_ORDER_NAME`) * **Field Value**: The data to populate in that field, which can include static values or dynamic variables from earlier in the workflow This approach provides the flexibility enterprise customers need while maintaining a single, reusable workflow that works across all your users. ## When to Use Custom Fields Enable Custom Fields when: * You're integrating with enterprise applications that commonly use custom schemas * Your users operate in regulated industries with specific data requirements * You want to provide a white-glove experience for high-value customers * The application you're integrating with has highly variable object structures ## Best Practices **Document custom field requirements**: When onboarding customers who need custom fields, provide clear documentation about what fields they need to map and where to find the field names in their system. **Validate field names**: Custom field identifiers are often case-sensitive and must match exactly. Encourage users to copy field names directly from their system rather than typing them manually. **Test with actual custom fields**: Before deploying integrations with Custom Fields support, test with real custom field scenarios to ensure mappings work correctly. **Consider governance**: For customers with many custom fields, work with them to identify which fields are truly necessary for the integration versus nice-to-haves. ## Supported Connectors Custom Fields are currently available for: * NetSuite * Salesforce CRM * HubSpot Additional connectors are being added regularly. Check the connector documentation for the most up-to-date list of supported applications. ## Summary Custom Fields enable you to build integrations that adapt to your customers' unique data models without requiring custom development for each implementation. By allowing end users to configure their own field mappings, you can provide enterprise-grade flexibility while maintaining a single, scalable workflow. # Data Centers Source: https://docs.runalloy.com/embedded/data-centers Alloy offers two data center options to segregate your data for regional data privacy laws. ISVs can choose between our US and EU data centers. The US data center is primarily located in the `us-east-1` version (North Virginia) while the EU data center is located in `eu-west-1` (Ireland). Read more about the [US data center](/embedded/data-centers/us-data-center) or [EU data center](/embedded/data-centers/eu-data-center). # EU Data Center Source: https://docs.runalloy.com/embedded/data-centers/eu-data-center To access the European Union (EU) data center, navigate to the login dropdown from our home page and select the EU option. You can also access the EU center [here](https://eu-app.runalloy.com/login). All data housed inside the EU data center is isolated and separated from the US data center. ### Base API URL When making requests against our APIs, it's important to select the EU data center if you intend to have all data pass through the European Union. Note that any users, credentials, etc created in the EU data center will not be accessible in the US data center and vice versa. **Info** The base URL for all requests to the EU data center is: [https://eu-embedded.runalloy.com](https://eu-embedded.runalloy.com/) # US Data Center Source: https://docs.runalloy.com/embedded/data-centers/us-data-center To access the US data center, navigate to the login dropdown from our home page and select the US option. Alloy defaults to the US data center if another center is not selected. All data housed inside the US data center is isolated and separated from the EU data center. ### Base API URL When making requests against our APIs, it's important to select the US data center if you intend to have all data pass through the United States. Note that any users, credentials, etc created in the US data center will not be accessible in the EU data center and vice versa. **Info** The base URL for all requests to the US data center is: [https://embedded.runalloy.com/](https://embedded.runalloy.com/) # Data Chunking Source: https://docs.runalloy.com/embedded/data-chunking ## Overview When streaming large datasets to your application, processing items one at a time can overwhelm your API and slow down data synchronization. Data chunking solves this problem by breaking large arrays into manageable batches, allowing you to process data more efficiently while respecting rate limits. ## Understanding Data Chunking As covered in [streaming data to a destination](/connectors/utility/data-streaming), the Stream Data connector sends data from workflows to your webhook endpoints. By default, it streams one item at a time. While this works fine for small datasets, it becomes problematic when dealing with hundreds or thousands of records. Data chunking automatically groups array items into batches of your specified size. Instead of receiving 10,000 individual webhook calls for 10,000 records, you might receive 200 calls with 50 records each. This approach offers several benefits: **Reduced API overhead**: Fewer webhook calls mean less connection overhead and reduced latency **Better rate limit management**: Batch processing helps you stay within your API's rate limits **Improved processing efficiency**: Your application can process multiple records in a single operation **Simplified error handling**: Failures affect entire chunks rather than individual items, making retry logic more straightforward ## Configuring Chunk Size To enable data chunking in the Stream Data connector, click the **Optional Parameters** dropdown and specify your desired chunk size: ![Data Chunking](http://cdn.runalloy.com/alloy-docs/embedded-ipaas/alloy-automation-data-chunking.png) The chunk size determines how many items will be included in each batch sent to your webhook. Choose a size that balances efficiency with your API's processing capabilities. ## Example: Syncing NetSuite Orders Consider a workflow that exports a user's complete NetSuite order catalog. If a store has 10,000 orders, processing them individually would result in 10,000 separate webhook calls to your endpoint. With a chunk size of 50, the workflow instead sends 200 webhook calls, each containing 50 orders. This reduces the total number of API calls by 98% while still delivering all the data your application needs. Here's what your webhook receives with chunking enabled: ```json JSON theme={null} { "data": [ { "orderId": "SO-001", "customer": "Acme Corp", "amount": 1250.00, "date": "2024-10-15" }, { "orderId": "SO-002", "customer": "TechStart Inc", "amount": 3400.00, "date": "2024-10-15" }, // ... 48 more orders in this chunk ] } ``` ## Choosing the Right Chunk Size When determining your chunk size, consider: **Your API's rate limits**: Larger chunks mean fewer requests, helping you stay within rate limit boundaries **Payload size constraints**: Some APIs or infrastructure have maximum payload size limits. Ensure your chunks don't exceed these limits **Processing time**: Larger chunks take longer to process. If processing a chunk times out, consider using smaller chunks **Memory constraints**: Your application needs sufficient memory to process entire chunks at once **Error recovery**: Smaller chunks mean less data to reprocess if a batch fails As a starting point, chunk sizes between 25-100 items work well for most use cases. You can adjust based on your specific requirements and performance observations. ## Best Practices **Test with production data volumes**: Test your chunking configuration with realistic data volumes to ensure it performs well under actual load conditions. **Implement idempotency**: Design your webhook endpoint to handle duplicate chunks gracefully in case of retries. **Monitor chunk processing time**: Track how long it takes to process each chunk. If processing time approaches timeout limits, reduce your chunk size. **Log chunk metadata**: Record which chunks you've processed to aid debugging and ensure complete data synchronization. ## Summary Data chunking transforms how you handle large datasets by batching items into manageable groups. By configuring an appropriate chunk size in the Stream Data connector, you can significantly reduce API overhead, respect rate limits, and improve overall integration performance. # Dedicated Infrastructure Source: https://docs.runalloy.com/embedded/dedicated-infrastructure ## Overview By default, all workflows run in a shared processing queue that dynamically autoscales based on traffic load. For enterprise clients with strict SLA requirements or high-volume processing needs, Dedicated Infrastructure provides isolated resources that guarantee consistent performance and minimal latency. ## What is Dedicated Infrastructure? Dedicated Infrastructure segregates your workflow execution from the shared processing queue, running all your workflows on isolated compute resources specifically allocated to your account. This architecture ensures your workflow performance remains consistent regardless of activity from other customers. ## Benefits **Guaranteed performance**: Your workflows run on dedicated resources, eliminating performance variability caused by shared infrastructure **Predictable latency**: Consistent response times make it easier to meet SLAs and provide reliable service to your users **Higher throughput**: Dedicated resources can be scaled to match your specific volume requirements without competing with other workloads **Enhanced isolation**: Your workflow data and execution remain completely separate from other customers for improved security and compliance **Custom scaling**: Infrastructure can be configured to handle your peak loads without the constraints of shared resource pools ## When to Consider Dedicated Infrastructure Dedicated Infrastructure is ideal for organizations that: * Process high volumes of workflows with strict performance requirements * Have contractual SLAs that require guaranteed response times * Need predictable, consistent workflow execution for business-critical integrations * Operate in regulated industries requiring enhanced data isolation * Experience workflow volumes that would benefit from dedicated compute resources ## Technical Architecture When enabled, Dedicated Infrastructure provisions a separate processing cluster exclusively for your workflows. This cluster: * Runs independently from the shared queue * Scales based on your specific workload patterns * Maintains dedicated compute, memory, and network resources * Provides isolated monitoring and logging All workflow execution happens within your dedicated environment, ensuring performance isolation from other customers. **Only available as an add-on** This feature is only available as an add-on to enterprise plans. If you are interested in learning more about pricing and configuration options, please [contact us](mailto:contact@runalloy.com). ## Summary Dedicated Infrastructure provides enterprise customers with isolated compute resources for workflow execution, ensuring consistent performance and predictable latency regardless of platform-wide traffic patterns. Contact our team to discuss whether Dedicated Infrastructure aligns with your performance and compliance requirements. # Encryption Practices Source: https://docs.runalloy.com/embedded/encryption-practices ## How do you store my API keys? Alloy integrates best-in-class encryption protocols to safeguard your API keys. We employ AES-256 encryption, recognized globally as a leading standard for secure data encryption. This protocol is adopted by financial institutions for safeguarding sensitive information and governmental agencies for protecting classified data. Further information about AES-256 can be found [here](https://www.nist.gov/publications/advanced-encryption-standard-aes). System wide, we use AES-256 encryption to store data at rest and TLS/SSL while data is in transit. Every API key is uniquely encrypted so that we can't even access the data stored in our own system, so rest assured your API keys are safe. If at any point you feel concerned, you are always able to revoke your API key or delete it from the Alloy platform. ## Tell me more about your security practices * Alloy stores credentials in their encrypted state – never as raw text. API Keys or tokens using AES-256 bit encryption in our systems. * We use TLS whenever possible and in all external API calls to ensure sensitive information is encrypted * Tokens and secret keys are censored and hidden to the best of our ability from our logs Should you have any questions regarding our data practices or how we handle our data, please feel free to contact us at [security@runalloy.com](mailto:security@runalloy.com) and we will promptly get back to you. For all Google specific APIs, Alloy’s use of information received from Google APIs (including Gmail, Google Drive, Google Sheets, and Google Calendar, etc) adheres to Google’s Limited Use Requirements. You may find additional information about how we store data in our Privacy Policy. ## How do you handle data? Data stored in Alloy is protected with industry best practices including IP whitelisting, encryption at rest, and network peering. That means that your data is always under a constant state of security. Our team regularly performs security audits. ## Are you reselling my data? No! We're not an ad platform so rest assured all your data is secure and we're not reselling it to the highest bidder. ## Tell me more about privacy? You can learn more about our privacy efforts by visiting our privacy policy or terms of service. Please also view our data privacy page here. # End User Configuration Source: https://docs.runalloy.com/embedded/end-user-configuration ## Overview Most of the time, the workflow you build is the one end users end up adopting without any customizations. However, situations arise that require slight configurations per user. For example, let's assume we want to create a Slack integration. This integration has a workflow that sends a notification to a Slack channel each time an event happens in your application. While the message might be pre-defined, the channel cannot be. This is because everyone's slack channels are different so it'd be impossible to pre-set the channel to post this message to. Therefore, your end user will need to customize this on their own. ## End User Customization Options To solve this, Alloy Embedded lets you determine if a field should be customizable by your end users. Each field in the Alloy Workflow Builder comes with a checkbox labeled "Configurable by user". When selected, your end users will be prompted to configure this field. You can see an example of how this works in our Slack example below. ![](https://alloy-assets.s3.amazonaws.com/alloy-docs/embedded/end-user-workflow-configuration/1.png) Selecting the Configurable by user option will prompt your end user to select a Slack channel. This field is dynamically generated using their Third Party App credential after they've authenticated. You can see what this would look like in the Alloy Modal below. ![](https://alloy-assets.s3.amazonaws.com/alloy-docs/embedded/end-user-workflow-configuration/2.png) ## Additional Settings Let's say you wanted to further customize and define what is required by the end user upon configuration. Activating the Configurable by User option in Alloy enhances the field customization capabilities, offering both display and data configuration options. This feature is key for creating a user-friendly and efficient input interface. Below, we detail the available settings under Display and Data categories. ![](https://alloy-assets.s3.amazonaws.com/alloy-docs/embedded/end-user-workflow-configuration/3.png) ### Additional Customization Features #### Display Settings These settings control how the field appears to the end user: * **Label:** Allows you to define the text that will be displayed as the label above the input field. This is crucial for clear identification of the field's purpose. * **Placeholder Text:** Sets the placeholder text within the input. This text serves as an example or hint, guiding the user on the expected input format or content. * **Show Help Text Toggle:** Enables the option to provide instructions right below the input field. Useful for short, immediate guidance related to the input. * **Show Info Icon Toggle:** When enabled, an information icon appears near the input. This icon is ideal for displaying longer instructional texts that provide detailed guidance. ![](https://alloy-assets.s3.amazonaws.com/alloy-docs/embedded/end-user-workflow-configuration/4.png) #### Data Settings These settings help define the data requirements and constraints for the input: * **Required Dropdown:** Determine whether the input field is mandatory or optional. Options include 'Yes' (required) and 'No' (optional). * **Data Format Dropdown:** Allows you to define the accepted data types for the input. The options include 'Variable + Text', 'Just Variables', and 'Just Text', providing flexibility in data entry requirements. * **Variable Sources Dropdown:** Select which of the previous blocks in the workflow that will be displayed during the variable selection process. This setting is key for specifying the source of data allowed for the input field. ![](https://alloy-assets.s3.amazonaws.com/alloy-docs/embedded/end-user-workflow-configuration/5.png) #### Benefits * **Enhanced Clarity and Guidance:** With labels, placeholder text, help texts, and info icons, the user interface becomes more intuitive and informative. * **Flexibility in Data Handling:** The data settings offer control over the type of data entered and its source, ensuring that the data collected is accurate and relevant. * **User-Centric Design:** These additional settings focus on making the interface user-friendly, thus improving the overall user experience. ![](https://alloy-assets.s3.amazonaws.com/alloy-docs/embedded/end-user-workflow-configuration/6.png) ## Wrapping Up In this article, we looked at how to enable end users to configure fields in the Alloy Workflow Builder along with how to further customize each fields settings to enhance clarity. # FAQs Source: https://docs.runalloy.com/embedded/faqs Want to learn more about how we handle best practices at Alloy? See our FAQ below. If you still don't see an anwser you're looking for, be sure to contact your support rep. You can also visit our security page [here](https://runalloy.com/security/) to learn more. SOC 2 is a report based on the Auditing Standards Board of the American Institute of Certified Public Accountants' (AICPA) existing Trust Services Criteria (TSC). The purpose of this report is to evaluate an organization’s information systems relevant to security, availability, processing integrity, confidentiality, and privacy. Alloy's annual SOC 2 report tests our controls to ensure we are in continuous compliance with SOC 2 requirements. This means ensuring our systems are secure, safe, and that our personnel follow a set of security best practices. Yes. Alloy is SOC 2 Type I and II compliant. Contact your account rep to request a copy of the Alloy SOC 2 Report. Yes, an NDA is required to review the Alloy SOC 2 reports. Please contact us to begin the process. Alloy is hosted on the AWS Cloud. Our primary data center is hosted in the US region. We provide compliance endpoints which are better described in our API reference. These endpoints allow you to search for a specific user and wipe all data from Alloy servers for that account. Yes! We have a standard SLA which is available [here](https://runalloy.com/sla/). If you require a custom SLA, please contact your account rep to discuss options for an additional fee. Very scalable. Don't believe us? We count companies as large as Amazon and Burberry among our customers. We've processed billions of API requests through our servers. We invest heavily in infrastructure at Alloy. You can read more about our infrastructure in our SOC 2 Report. All data is encrypted at rest using bank-level AES-256 bit encryption. All information is encrypted in tranit with TLS/SSL. We've received a A score from [Qualys SSL Labs](https://www.ssllabs.com/ssltest/analyze.html?d=runalloy.com). We provide an RSA signature you can reconstruct which is signed against our public key. This allows you to always ensure outgoing requests are coming from Alloy. Yes! We support Google and Shopify Single Sign-On (SSO). We audit code a number of ways to mitigate the chances that bugs are ever seen in production: every line of code undergoes a peer review, has to pass a battery of automated test cases, manual quality assurance and static code analysis. Yes! We regularly undergo routine penetration tests to ensure our ongoing SOC 2 compliance and work to quickly remedy any penetration tests findings. # Field Types Source: https://docs.runalloy.com/embedded/field-types ## Overview Alloy Embedded supports several different field types. The term field types refers to the various options that present when configuring the inputs in the Alloy Workflow Builder. Understanding what types of data and variables can be entered into input fields will greatly improve your workflow building experience. ## Single line fields Single line fields are the simplest field type. They accept a string value. You can map a variable in lieu of string to dynamically pass data. In the example below, the `Order` field is a single line field while the `Fulfillment Status` is a dropdown (more on this later). Of course, you may also enter static text in any of these single line fields. ![](https://alloy-assets.s3.amazonaws.com/alloy-docs/embedded/field-types/1.png) ## Multi-line fields The next most common field type is the multi-line content composer, usually for longer messages, emails, and notes. The larger content composer gives you the freedom to include any type of variable from the Variable Selector. Multi-line fields allow you to concatenate strings with variables as seen below. ![](https://alloy-assets.s3.amazonaws.com/alloy-docs/embedded/field-types/2.png) ## Tag fields Tag fields allow you to add as many separate text or variable tags as you'd like. In the example below, the workflow tags a customer with the "VIP" and "Important" tags. ![](https://alloy-assets.s3.amazonaws.com/alloy-docs/embedded/field-types/3.png) ![](https://alloy-assets.s3.amazonaws.com/alloy-docs/embedded/field-types/4.png) ## Date field Date fields are a common field necessary whenever you interact with time based workflows. Note that that many Third Party Apps interpret dates and their formats differently. In the case that two apps have incompatible date fields, you can use the Date Formatter block found under *Utilities* to manage and access dates across different apps. When selecting a date on Alloy Embedded, we present a calendar and timestamp view. ![](https://alloy-assets.s3.amazonaws.com/alloy-docs/embedded/field-types/5.png) ## Boolean field Binary variables are used throughout Alloy Embedded to customize data outputs (usually lists) to a user's needs. In this example, the Boolean field prevents Alloy from pulling in thousands of rows in an Airtable as users are often only interested in those that are recently edited. ![](https://alloy-assets.s3.amazonaws.com/alloy-docs/embedded/field-types/6.png) ## Phone field The phone field makes it easy to format phone numbers as seen below. ![](https://alloy-assets.s3.amazonaws.com/alloy-docs/embedded/field-types/7.png) ## Dropdowns Dropdowns allow you to handle a selection when there are multiple options to choose from. ![](https://alloy-assets.s3.amazonaws.com/alloy-docs/embedded/field-types/8.png) # Handling Custom OAuth Source: https://docs.runalloy.com/embedded/handling-custom-oauth ## Overview In this tutorial, we'll look at how to customize the Alloy Embedded OAuth experience with your own branding. ## How it Works By default, when an end user authenticates any Third Party App that uses OAuth (examples include Shopify, Salesforce CRM, etc) via Alloy Embedded they see a prompt saying "Alloy Automation is requesting access to..." You may wish to have additional customization and control over the authentication experience as seen in the below example. On the left hand side, we have a Shopify integration that is not using Custom OAuth. As you can see, the Alloy logo is visible. On the right hand side, we've enabled Custom OAuth. As you can see, when an end user authenticates you're able to customize the branding to include your company name and logo. With Custom OAuth, you can supply your own **Client Id** and **Client Secret**and Alloy Embedded will use those credentials to make the appropriate requests on your behalf. The result of this is that when an end user authenticates, they see "Your \[App Name] is requesting access...". The below video shows how an Embedded integration will look when Custom OAuth is enabled.