# Authentication To interact with the Salesbricks API, include the `X-SALESBRICKS-KEY` attribute in your request headers. The value for this attribute should be your unique **Public API Token**. Obtain your Public API Token conveniently under **Settings** -> **Integrations** -> **Public API**. [https://app.salesbricks.com/admin/settings/integrations/public-api](https://app.salesbricks.com/admin/settings/integrations/public-api) ## Endpoint URLs Our API is structured with two distinct endpoints: ### GraphQL API Endpoint `https://api.salesbricks.com/api/v1/graphql` ### Usage API Endpoint `https://api.salesbricks.com/api/v2/usage` In most scenarios, you will primarily interact with the **GraphQL API Endpoint**. # Idempotent Requests To ensure idempotent requests, include the `X-SALESBRICKS-IDEMPOTENT-OPERATION-KEY` header in your requests to Salesbricks. This key is crucial for identifying and de-duplicating specific requests, safeguarding against unintended duplication. ## Header Key The header key should be `X-SALESBRICKS-IDEMPOTENT-OPERATION-KEY`. ## Header Value An idempotency key is a **unique-to-you** value generated by you, the client, which the server uses to identify **a specific request** and de-duplicate it from subsequent retries of the same request. How you create unique keys is up to you, but we suggest including UUIDs or other unique IDs as part of the value to avoid collisions. Idempotency keys can be up to 255 characters long. The key should be used to identify the request, not just the data being sent (as even failure requests are saved). We recommend generating and storing a key per-request-to-Salesbricks (see example below). ## Handling of Duplicate Idempotency Keys ### Subsequent Requests with the same idempotency and same payload Salesbricks saves the response of the first request made for any given idempotency key, regardless of whether it succeeded or failed. Subsequent requests with the same key return the same result. This means if you received an error response on a request made with an idempotency key, a following request using that same key will return that same error response. This is true for any error response, including 500 errors, as long as the request actually made it to Salesbricks' servers. ### Subsequent Requests with the same idempotency key but a different payload The idempotency system also compares incoming requests to the original request and errors, unless they're the same, to prevent accidental misuse. If you send a request with the same key but a different payload, you will receive a status code `400` error in response. ### Duplicate Concurrent Requests with the same idempotency keys If you send 2 requests with the same idempotency key to Salesbricks, the requests will be processed serially, and the one which is processed later will return a status code `409` to indicate a conflict. ## Example Implementation Let's say you would like to report usage on an order tracked in Salesbricks. Let's also say you track the usage for the order internally using the timestamp at which the usage occurred. One approach you could take is to create a table called `SalesbricksUsageReportingRequests` in your database, which could look something like: | DB column name | Description | | ------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | | **`salesbricks_idempotent_key` (pk, uuid)** | A **UUID** which is your idempotency key value, that you generate when you make the usage request to Salesbricks | | **`internal_usage_id` (str)** | The ID you use to identify usage internally in your system | | **`created_at` (optional, timestamp)** | Timestamp at which you make the request to Salesbricks, for debugging | | **`response_code` (optional, int)** | Response code you received from Salesbricks, for debugging | | **`response` (optional, jsonb str)** | Response payload you received from Salesbricks, for debugging | Then, when you report your usage, you: Create a row in `SalesbricksUsageReportingRequests` storing the `created_at` timestamp, `internal_usage_id` and `salesbricks_idempotent_key`. Make the request to Salesbricks, specifying the `salesbricks_idempotent_key` in the `X-SALESBRICKS-IDEMPOTENT-OPERATION-KEY` header. Save the response you get back in the `SalesbricksUsageReportingRequests` table. If you got an error response such as a `400`, in which you sent an invalid request where the usage was not successfully reported, you can adjust the sending code to send the correct payload. Then, retry the steps above, generating a new `salesbricks_idempotent_key` for the new request. # Overview Welcome to the Salesbricks GraphQL API – the gateway to seamless access and management of your subscriptions and orders. Our API offers a robust, introspectable schema, empowering you to effortlessly explore and interact with its extensive capabilities. Before you begin, ensure you have read the [Authentication](/api-reference/getting-started/authentication) guide to find your `X-SALESBRICKS-KEY` and the correct **endpoint** for your use case. ## Setting up an Apollo Client In this guide, we leverage Apollo Client, extending the example from their documentation [here](https://www.apollographql.com/docs/react/networking/authentication/). ```javascript JavaScript import { ApolloClient, createHttpLink, InMemoryCache } from '@apollo/client'; import { setContext } from '@apollo/client/link/context'; // discovered using the Authentication guide const SALESBRICKS_API_ENDPOINT = 'https://api.salesbricks.com/api/v1/graphql'; const SALESBRICKS_API_TOKEN = '00000000-0000-0000-0000-000000000000'; const httpLink = createHttpLink({ uri: SALESBRICKS_API_ENDPOINT, }); const authLink = setContext((_, { headers }) => { return { headers: { ...headers, 'X-SALESBRICKS-KEY': SALESBRICKS_API_TOKEN } } }); const client = new ApolloClient({ link: authLink.concat(httpLink), cache: new InMemoryCache() }); ``` ## Query the schema Once your client is configured, make queries following the defined schema. Below is an example query to retrieve all orders: ### Example Query ```javascript JavaScript client .query({ query: gql` query { companyOrders { orders { id buyer { id name } } } } `, }) .then((result) => console.log(result)); ``` ### Example Response ```json JSON { "data": { "companyOrders": { "orders": [ { "id": "00000000-0000-0000-0000-000000000000", "buyer": { "id": "00000000-0000-0000-0000-000000000000", "name": "Buyer Name" }, } ] } } } ``` Explore the powerful features of Salesbricks through this concise GraphQL API. Let's dive in! 🚀 # Manage My Subscription With the **Manage My Subscription** feature, you can embed a link within your app where your customers can manage their subscriptions (for example, increase license counts or change plans) and manage their payments. This is referenced as `subscription_id` within the Webhooks and APIs. This data can be captured through our Webhooks (for example, the **order.complete** webhook), or queried using our GraphQL API. Insert the **subscriptionId** as the variable within the call below. For more guidance with using the GraphQL API, refer to our [API Reference](/api-reference/getting-started/overview). `https://api.salesbricks.com/api/v1/graphql` ```graphql GraphQL mutation($subscriptionId: String!){ createSubscriptionToken(subscriptionId: $subscriptionId){ token { id expiresAt buyer { id } } } } ``` The response to this call includes a temporary access token: ```json JSON { "data": { "createSubscriptionToken": { "token": { "id": "546c21827-8009-4f13-933d-22c8c8a9fb9a", "expiresAt": "2024-01-05T23:38:16.667405+00:00", "buyer": { "id": "997c5c51-17a5-4759-956e-bb87f7afd289" } } } } } ``` `https://app.salesbricks.com/subscription-management/` + `` **Example:** `https://app.salesbricks.com/subscription-management/546c21827-8009-4f13-933d-22c8c8a9fb9a` # Delete a usage entry DELETE /usage/ Use this API to delete an existing usage entry. To use this endpoint, ensure that you are using the `v2/usage/` API endpoint: `https://api.salesbricks.com/api/v2/usage/` # Overview When implementing a usage-based plan for your customers on Salesbricks, you have the flexibility to charge based on two distinct types of usage data: **Gauges** and **Counters**, referred to as **Final value** and **Prorated** in the admin interface. ## Counter / Final value With **final value** measurement, tally up all billable events over a set time period. This approach is suitable for measuring cumulative usage, such as the total number of API calls in a month. ### Example final-value Calculation is `sum(billable events) * unit price = total`. In the illustrated graph, {/* equation wrapped in dollar signs renders in LaTeX format */} $$(6 + 4 + 8 + 5 + 3) * \$2 = \$52$$ ### Use cases Number of API calls used in a month. Count of document exports by a customer. Total service requests made by a client. ## Gauges / Prorated With **prorated** measurement, tally up billable events per time unit over a set period. This method is ideal for tracking usage over time, such as virtual machine hours used in a month. ### Example prorated Calculation is `((billable events * time unit (days), ...) * unit price = total`. In the illustrated graph, {/* equation wrapped in dollar signs renders in LaTeX format */} $$((3 * 6) + (4 * 8) + (8 * 6) + (5 * 3)) * \$2 = \$226$$ ### Use cases Number of virtual machine hours used in a month. Hours spent in different subscription tiers. Time spent using specific features within a service. ## Simple API Calls Regardless of your chosen pricing strategy, integrating usage data with Salesbricks requires just one [simple API call](/api-reference/usage/endpoint): # Update a usage entry PATCH /usage/ Use this API to update an existing usage entry. To use this endpoint, ensure that you are using the `v2/usage/` API endpoint: `https://api.salesbricks.com/api/v2/usage/` # Submit a usage entry POST /usage/ Use this API to set either a prorated gauge or increment a final value counter for a customer. To use this endpoint, ensure that you are using the `v2/usage/` API endpoint: `https://api.salesbricks.com/api/v2/usage/` # invoice.past.due Make sure to read the [Webhooks Overview](/api-reference/webhooks/overview) for important information about signature verification. ## Purpose The `invoice.past.due` webhook is triggered when an **Invoice** exceeds its past due date. ## Payload format Your configured endpoint will receive an [Invoice](/api-reference/webhooks/invoice/payload) payload. # Invoice Webhook Payload ## Example ```json JSON { "invoice": { "due_at": "2023-01-28T02:43:21.859117Z", "due_days": 30, "ends_at": "2023-01-28T23:59:59.999999Z", "id": "16eda8d7-7418-4aa1-bd07-41e6430688bc", "invoice_number": "16eda8d7-0", "is_partial_agreement": false, "num_days": 0, "order": { "agreement_number": 1, "billing_schedule": "annually", "buyer": { "address": { "city": "Address City", "country": "Address Country", "id": "cccccccc-cccc-cccc-cccc-cccccccccccc", "line_1": "123 Address Line 1", "line_2": "Address Line 2 ", "region": "Address Region", "zip": "00000" }, "name": "Example Co." }, "chain_id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "closed_at": "2022-12-28T02:48:21.859117Z", "created_at": "2022-12-28T02:43:21.859117Z", "current_order_skus": [ { "quantity": 1, "sku": { "code": "OrderBrickCode", "id": "ffffffff-ffff-ffff-ffff-ffffffffffff", "name": "OrderBrick" } } ], "ends_at": "2023-12-28T23:59:59.999+00:00", "grand_total": 100, "id": "c9b23aec-b7b7-4d2e-865d-71e4743ba828", "metadata": {}, "order_type": "standard", "primary_user": { "company": { "address": { "city": "Address City", "country": "Address Country", "id": "cccccccc-cccc-cccc-cccc-cccccccccccc", "line_1": "123 Address Line 1", "line_2": "Address Line 2 ", "region": "Address Region", "zip": "00000" }, "name": "Example Co." }, "email": "buyername@buyer.com", "first_name": "BuyerFirstName", "last_name": "BuyerLastName" }, "stage": "closed", "starts_at": "2022-12-29T00:00:00.000+00:00", "updated_at": "2023-12-28T02:43:20.859657Z" }, "paid_amount": 0, "paid_at": null, "payments": [ { "error": null, "id": "4a842a5a-90b3-4f2e-80b0-511ab495226e", "invoice": "16eda8d7-7418-4aa1-bd07-41e6430688bc", "paid_amount": 8, "paid_at": null, "payment_method": "CREDIT_CARD", "status": "FAILED" } ], "remaining_amount": 8.333333333333334, "starts_at": "2022-12-29T00:00:00Z" } } ``` # invoice.payment.failed Make sure to read the [Webhooks Overview](/api-reference/webhooks/overview) for important information about signature verification. ## Purpose The `invoice.payment.failed` webhook is triggered when a **Payment** against an **Invoice** fails. ## Payload format Your configured endpoint will receive a [Payment](/api-reference/webhooks/payment/payload) payload. # invoice.payment.succeeded Make sure to read the [Webhooks Overview](/api-reference/webhooks/overview) for important information about signature verification. ## Purpose The `invoice.payment.succeeded` webhook is triggered when a **Payment** against an **Invoice** succeeds. ## Payload format Your configured endpoint will receive a [Payment](/api-reference/webhooks/payment/payload) payload. # invoice.start Make sure to read the [Webhooks Overview](/api-reference/webhooks/overview) for important information about signature verification. ## Purpose The `invoice.start` webhook is triggered when an **Invoice** has been calculated and is ready to receive payments. ## Payload format Your configured endpoint will receive an [Invoice](/api-reference/webhooks/invoice/payload) payload. # order.closed.delete Make sure to read the [Webhooks Overview](/api-reference/webhooks/overview) for important information about signature verification. ## Purpose The `order.closed.delete` webhook is triggered when an **Order** is deleted. ## Payload format Your configured endpoint will receive an [Order](/api-reference/webhooks/order/payload) payload. # order.closed.lost Make sure to read the [Webhooks Overview](/api-reference/webhooks/overview) for important information about signature verification. ## Purpose The `order.closed.lost` webhook is triggered when an **Order** is closed as `Lost`. ## Payload format Your configured endpoint will receive an [Order](/api-reference/webhooks/order/payload) payload. # order.complete Make sure to read the [Webhooks Overview](/api-reference/webhooks/overview) for important information about signature verification. ## Purpose The `order.complete` webhook is triggered when an **Order** is successfully closed and handled by Salesbricks. ## Payload format Your configured endpoint will receive an [Order](/api-reference/webhooks/order/payload) payload. # order.end Make sure to read the [Webhooks Overview](/api-reference/webhooks/overview) for important information about signature verification. ## Purpose The `order.end` webhook is triggered when an **Order** reaches its `ends_at` date, and has been ended internally by Salesbricks. ## Payload format Your configured endpoint will receive an [Order](/api-reference/webhooks/order/payload) payload. # order.new-ramping-period Make sure to read the [Webhooks Overview](/api-reference/webhooks/overview) for important information about signature verification. ## Purpose The `order.new-ramping-period` webhook is triggered when an **Order** enters into a new [ramping period](/documentation/ramping-structures). For example: if a ramp was configured to increase the quantity of a brick in Month 3 of a contract, this webhook would trigger on the first day of the third month. ## Payload format Your configured endpoint will receive an [Order](/api-reference/webhooks/order/payload) payload. # Order Webhook Payload ## Example ```json JSON { "order": { "agreement_number": 1, "billing_schedule": "annually", "buyer": { "address": { "city": "Address City", "country": "Address Country", "id": "cccccccc-cccc-cccc-cccc-cccccccccccc", "line_1": "123 Address Line 1", "line_2": "Address Line 2 ", "region": "Address Region", "zip": "00000" }, "name": "Example Co." }, "chain_id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "closed_at": null, "created_at": "2023-12-28T01:43:21.807242Z", "current_order_skus": [ { "quantity": 1, "sku": { "code": "OrderBrickCode", "id": "ffffffff-ffff-ffff-ffff-ffffffffffff", "name": "OrderBrick" } } ], "ends_at": "2024-12-28T23:59:59.999+00:00", "grand_total": 100, "id": "9fdf8866-f3c0-4cee-beb1-20c7d39528c7", "metadata": {}, "order_type": "standard", "primary_user": { "company": { "address": { "city": "Address City", "country": "Address Country", "id": "cccccccc-cccc-cccc-cccc-cccccccccccc", "line_1": "123 Address Line 1", "line_2": "Address Line 2 ", "region": "Address Region", "zip": "00000" }, "name": "Example Co." }, "email": "buyername@buyer.com", "first_name": "BuyerFirstName", "last_name": "BuyerLastName" }, "stage": "building", "starts_at": "2023-12-29T00:00:00.000+00:00", "updated_at": "2023-12-28T02:43:20.807242Z", "terminated_at": "2024-01-20T02:00:20.805487Z" } } ``` # order.stage.change Make sure to read the [Webhooks Overview](/api-reference/webhooks/overview) for important information about signature verification. ## Purpose The `order.stage.change` webhook is triggered when an **Order** changes its stage, e.g. from `BUILDING` to `CLOSED`. ## Payload format Your configured endpoint will receive an [Order](/api-reference/webhooks/order/payload) payload. # order.terminated Make sure to read the [Webhooks Overview](/api-reference/webhooks/overview) for important information about signature verification. ## Purpose The `order.terminated` webhook is triggered when an **Order** has been flagged for termination. Since termination can be either scheduled or applied immediately, the timestamp in the `terminated_at` attribute of the payload contains the time at which the termination will be effective. ## Payload format Your configured endpoint will receive an [Order](/api-reference/webhooks/order/payload) payload. # Overview Salesbricks provides webhook support, allowing you to extend its functionality by integrating with external systems, services, or custom workflows. Webhooks enable real-time notifications and data synchronization, enhancing your overall experience with Salesbricks. ## Getting Started To begin working with webhooks, ensure that you configure and enable the specific webhooks you intend to consume. You can do this by navigating to **Settings** -> **Integrations** -> **Webhooks**. [https://app.salesbricks.com/admin/settings/integrations/webhooks](https://app.salesbricks.com/admin/settings/integrations/webhooks) ## Payload Signature To verify that a payload originated from Salesbricks, a signature will be sent in the `X-SALESBRICKS-KEY` header. Follow the instructions below to validate the signature: ```python Python import hmac import base64 from hashlib import sha512 def validate_signature(api_token: str, payload: str, header_signature: str): """ :param api_token: Your Salesbricks API Token :param payload: the request payload as a string, ex: request.get('body') :param header_signature: signature received with payload, ex: request.get('X-SALESBRICKS-KEY') """ import hmac from hashlib import sha512 import base64 hmac_hash = hmac.new( api_token.encode("utf-8"), payload.encode("utf-8"), digestmod=sha512 ) expected_signature = base64.b64encode(hmac_hash.digest()).decode() if header_signature != expected_signature: raise Exception("Invalid webhook signature") ``` ```javascript JavaScript const express = require('express'); const crypto = require('crypto'); const rawBody = require('raw-body'); require('dotenv').config(); // Load environment variables from .env file const app = express(); const PORT = 3001; const API_TOKEN = process.env.API_TOKEN; // Middleware to convert the raw payload to a string app.use((req, res, next) => { rawBody(req, { length: req.headers['content-length'], limit: '1mb', encoding: req.charset || 'utf-8' }, (err, string) => { if (err) return next(err); req.rawBody = string; next(); }); }); // Function to generate HMAC signature function generateSignature(secret, payload) { return crypto .createHmac('sha512', secret) .update(payload, 'utf8') .digest('base64'); } // Webhook endpoint app.post('/webhook', (req, res) => { const payload = req.rawBody; const headerSignature = req.get('X-SALESBRICKS-KEY'); console.log('Received Raw Payload:', payload); console.log('Received Header Signature:', headerSignature); const expectedSignature = generateSignature(API_TOKEN, payload); console.log('Expected Signature:', expectedSignature); if (headerSignature === expectedSignature) { console.log('Signatures match. Payload is authentic.'); res.status(200).send('Webhook signature valid'); } else { console.log('Signatures do not match. Invalid payload.'); res.status(400).send('Invalid webhook signature'); } }); // Start the server app.listen(PORT, () => { console.log(`Server is running on port ${PORT}`); }); ``` Remember to replace the placeholder values (`api_token`, `payload`, `header_signature`) with the actual values from your Salesbricks setup. This signature verification process ensures the integrity and authenticity of webhook payloads received from Salesbricks. # Payment Webhook Payload ## Example ```json JSON { "payment": { "error": null, "id": "a94bb985-7bc3-43de-aa79-ec1c9fa7abaf", "invoice": { "due_at": "2023-01-28T02:43:21.879153Z", "due_days": 30, "ends_at": "2023-01-28T23:59:59.999999Z", "id": "794d16df-03cc-4d6d-a4b7-7884b8b06897", "invoice_number": "794d16df-0", "is_partial_agreement": false, "num_days": 0, "order": { "agreement_number": 1, "billing_schedule": "annually", "buyer": { "address": { "city": "Address City", "country": "Address Country", "id": "cccccccc-cccc-cccc-cccc-cccccccccccc", "line_1": "123 Address Line 1", "line_2": "Address Line 2 ", "region": "Address Region", "zip": "00000" }, "name": "Example Co." }, "chain_id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "closed_at": "2022-12-28T02:48:21.879153Z", "created_at": "2022-12-28T02:43:21.879153Z", "current_order_skus": [ { "quantity": 1, "sku": { "code": "OrderBrickCode", "id": "ffffffff-ffff-ffff-ffff-ffffffffffff", "name": "OrderBrick" } } ], "ends_at": "2023-12-28T23:59:59.999+00:00", "grand_total": 100, "id": "39e4611c-481e-4cb8-bc2d-a33b14208dab", "metadata": {}, "order_type": "standard", "primary_user": { "company": { "address": { "city": "Address City", "country": "Address Country", "id": "cccccccc-cccc-cccc-cccc-cccccccccccc", "line_1": "123 Address Line 1", "line_2": "Address Line 2 ", "region": "Address Region", "zip": "00000" }, "name": "Example Co." }, "email": "buyername@buyer.com", "first_name": "BuyerFirstName", "last_name": "BuyerLastName" }, "stage": "closed", "starts_at": "2022-12-29T00:00:00.000+00:00", "updated_at": "2023-12-28T02:43:20.879444Z" }, "paid_amount": 0, "paid_at": null, "remaining_amount": 8.333333333333334, "starts_at": "2022-12-29T00:00:00Z" }, "paid_amount": 8, "paid_at": null, "payment_method": "CREDIT_CARD", "status": "FAILED" } } ``` # Schemas In-depth look at webhook payload schemas ### Order Stage of the Order Salesbricks ID of the Order Datetime documents were generated at Datetime order was created Datetime order was last updated Datetime order starts at Entity which made this order ### Buyer Buyer user's first name Buyer user's last name Buyer user's email Buyer user's Company ### Company Company name Company address ### Address Street address (e.g. 123 Easy Street) Additional address details (e.g. Suite 123) City State or region, if applicable Zip or postal code Country name ### Current Order SKUs The Plan or Brick setup in Salesbricks How many units of the `sku` are included in the Order ### SKU The name of the SKU The internal code set for this SKU This field is a set aside for your use - Salesbricks doesn't store any data in it # Custom email domain Send customer email notifications from your own domain export const BetaFeatureBanner = () => <>

This feature is currently in beta

We are actively enhancing this feature, and some functionalities may change before the official release.

If you're interested in joining the beta program and sharing feedback to help us improve it, please ping us in your dedicated Slack channel, or email support@salesbricks.com.

; By default, all customer email notifications are sent from `noreply@salesbricks.com`. However, you can easily enhance your brand's credibility and trust by sending emails from your own custom domain. If your custom domain is still being set up, or if there are any DNS issues, your customer-facing emails will still be sent reliably from the default Salesbricks email address. In this guide, we’ll walk you through setting up your custom domain to ensure your brand stands out in all customer communications. This simple step can improve email delivery rates and strengthen your brand’s trustworthiness. While Salesbricks’ default email is highly reputable, using your own domain reduces the chances of your emails ending up in spam folders, making sure your customers never miss important alerts and notifications.

Salesbricks uses Entri to make connecting your domain quick and easy. All you need is your DNS provider login information, and you can complete the setup without leaving the Salesbricks dashboard.

Entri supports most common DNS providers, so it's very likely your provider is compatible. However, if your provider isn’t detected, feel free to contact Salesbricks support for manual setup assistance.

See the full list of DNS providers that Entri supports.

## How to connect your domain to Salesbricks 1. Navigate to **Settings -> Notifications**. [https://app.salesbricks.com/admin/settings/notifications](https://app.salesbricks.com/admin/settings/notifications) 2. Click the **Setup DNS address** button. initial 3. Enter your **domain** and click the **Connect your domain** button. enter-domain 4. You will be prompted to continue. entri-start 5. Re-enter your **domain** and click the **Continue** button. re-enter-domain 6. Entri will try automatically detect your DNS provider. Otherwise, you will be asked to select your DNS provider to log in. analyzing-domain 7. Log in to your provider to provide **one-time** permission to connect your domain. login-domain 8. Once done, the modal should close and you will see the status of your domain. entri-end ### DNS setup verification To allow Salesbricks to send emails on your behalf, the following sample CNAME entries will be automatically added to your DNS records: | Type | Host | Value | TTL | | ----- | -------------------------- | --------------------------------------- | --- | | CNAME | em1234.example.com | u123456.wl123.sendgrid.net | 300 | | CNAME | s1.\_domainkey.example.com | s1.domainkey.u123456.wl123.sendgrid.net | 300 | | CNAME | s2.\_domainkey.example.com | s2.domainkey.u123456.wl123.sendgrid.net | 300 | If the verification is not successful and your domain status is still not **Active**, try clicking the **Check Connection** button again. configuring Note that it can take up to 48 hours for DNS changes to be applied. ## How to update the email sender address Once your custom domain is active, you have the option to specify the email address to be used for billing and sales emails. The default email address is `noreply@example.com`. 1. Navigate to [**Settings -> Notifications**](https://app.salesbricks.com/admin/settings/notifications) page. 2. Click the "Edit email addresses" button. active 3. Enter your preferred **sales** username. 4. Enter your preferred **billing** username. 5. Click the **Apply changes** button and close the modal. edit-email ## Customer emails Now that you've set up both your domain and, optionally, the email sender address you want to use, everything should be seamless. If Salesbricks detects an issue with your domain, you will see a banner notification when you log in to your dashboard. All customer emails will fallback to `noreply@salesbricks.com` until the issue is resolved, ensuring no notifications are missed. In the [next section](/documentation/customer-email-notifications), you will find a comprehensive list of customer emails that Salesbricks sends on your behalf. All emails under the Payment and Invoicing category will use the billing sender, while all emails under the Subscription Lifecycle will use the sales sender. Emails sent to you and your team will continue to come from `noreply@salesbricks.com`. | Email Sender | Email Category | | ------------ | -------------------------------------------------------------------------------------------- | | Billing | [Payment](/documentation/customer-email-notifications#payment) | | Billing | [Invoicing](/documentation/customer-email-notifications#invoicing) | | Sales | [Subscription Lifecycle](/documentation/customer-email-notifications#subscription-lifecycle) | ## FAQ Using a custom email domain enhances your brand's credibility and trustworthiness. It also improves email delivery rates and reduces the chances of your emails being marked as spam. If your DNS provider is not supported, please contact Salesbricks support. We will assist you with manual authentication to ensure your domain is set up correctly. DNS changes can take up to 48 hours to be applied. Please be patient and check the status of your domain after this period. If Salesbricks detects an issue with your custom domain, you will see a banner notification when you log in to your dashboard. In the meantime, all customer emails will be sent from `noreply@salesbricks.com` to ensure no notifications are missed. Yes, once your custom domain is active, you can specify the email addresses to be used for billing and sales emails. Navigate to the [**Settings -> Notifications**](https://app.salesbricks.com/admin/settings/notifications) page to update your preferences. If you need assistance at any point during the setup process, please contact Salesbricks support. Our team is here to help you ensure a smooth and successful setup. # Customer email notifications What emails will Salesbricks send to your customers Salesbricks sends emails automatically throughout your customer's lifecycle. This is a complete listing of those emails. ## Payment ### ACH payment failure | | | | ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Sent from:** | `noreply@salesbricks.com` | | **Received by:** | Your buyer's account payable team | | **Triggered by:** | ACH payment failure | | **Subject:** | Action required: Payment failed for \{\{ product\_name }} | | **Header:** | ACH payment failure for \{\{ product\_name }} | | **Body:** | Your payment for \{\{ product\_name }} has failed to process. Please click the button below to update your payment information and reprocess your payment. | | **Button:** | Update payment information | | **Footer:** | Have questions? \{\{ support\_email }}
Talk to sales \{\{ sales\_email }}
| | **Attachments:** | | ### ACH payment processed | | | | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Sent from:** | `noreply@salesbricks.com` | | **Received by:** | Your buyer's accounts payable team | | **Triggered by:** | ACH payment is successfully processed | | **Subject:** | ACH payment processed for \{\{ product\_name }} | | **Header:** | Your ACH payment for \{\{ product\_name }} was successful | | **Body:** | Your ACH debit payment was successful. Your payment details are below, and a receipt is attached.

Payment details:

Product name
\{\{ product\_name }}

Invoice number
\{\{ invoice\_number }}

Payment method
\{\{ payment\_method }}

Payment date
\{\{ payment\_date }}

Payment amount
\{\{ payment\_amount }}
| | **Button:** | | | **Footer:** | Have questions? \{\{ support\_email }}
Talk to sales \{\{ sales\_email }}
| | **Attachments:** | Payment Receipt | ### ACH payment processing | | | | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Sent from:** | `noreply@salesbricks.com` | | **Received by:** | Your buyer's accounts payable team | | **Triggered by:** | ACH payment processing initiated | | **Subject:** | ACH payment processing for \{\{ product\_name }} | | **Header:** | Your ACH payment for \{\{ product\_name }} is processing | | **Body:** | Your ACH debit payment is processing. Below are your payment details. A follow-up email will be sent when your payment is successfully processed.

Payment details:

Product name
\{\{ product\_name }}

Invoice number
\{\{ invoice\_number }}

Payment method
\{\{ payment\_method }}

Payment date
\{\{ payment\_date }}

Payment amount
\{\{ payment\_amount }}
| | **Button:** | | | **Footer:** | Have questions? \{\{ support\_email }}
Talk to sales \{\{ sales\_email }}
| | **Attachments:** | | ### Credit card upcoming expiration | | | | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Sent from:** | `noreply@salesbricks.com` | | **Received by:** | Your buyer's accounts payable team | | **Triggered by:** | Credit card on file will expire within two months | | **Subject:** | Action required: Credit card expiring soon | | **Header:** | Your credit card will expire soon | | **Body:** | The credit card on file for \{\{ product\_name }} will expire on \{\{ expiration\_date }}. Please update your payment information by clicking the button below to ensure future payments are processed. | | **Button:** | Update payment information | | **Footer:** | Have questions? \{\{ support\_email }}
Talk to sales \{\{ sales\_email }}
| | **Attachments:** | | ### Credit card payment failure | | | | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **Sent from:** | `noreply@salesbricks.com` | | **Received by:** | Your buyer's accounts payable team | | **Triggered by:** | Credit card payment failure | | **Subject:** | Action required: Payment failed for \{\{ product\_name }} | | **Header:** | Credit card payment failure for \{\{ product\_name }} | | **Body:** | Your payment for \{\{ product\_name }} has failed. Please click the button below to update your payment information and reprocess your payment.

Payment details:

Product name
\{\{ product\_name }}

Invoice number
\{\{ invoice\_number }}

Payment method
\{\{ payment\_method }}

Payment date
\{\{ payment\_date }}

Payment amount
\{\{ payment\_amount }}
| | **Button:** | Update payment | | **Footer:** | Have questions? \{\{ support\_email }}
Talk to sales \{\{ sales\_email }}
| | **Attachments:** | | ### Credit card payment success | | | | ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Sent from:** | `noreply@salesbricks.com` | | **Received by:** | Your buyer's accounts payable team | | **Triggered by:** | Credit card payment successfully processed | | **Subject:** | Credit card payment processed for \{\{ product\_name }} | | **Header:** | Your credit card payment for \{\{ product\_name }} was successful | | **Body:** | Your credit card payment was successful. Below are your payment details, and a receipt is attached.

Payment details:

Product name
\{\{ product\_name }}

Invoice number
\{\{ invoice\_number }}

Payment method
\{\{ payment\_method }}

Payment date
\{\{ payment\_date }}

Payment amount
\{\{ payment\_amount }}
| | **Button:** | | | **Footer:** | Have questions? \{\{ support\_email }}
Talk to sales \{\{ sales\_email }}
| | **Attachments:** | Receipt | ### Renewal ACH payment failure | | | | ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Sent from:** | `noreply@salesbricks.com` | | **Received by:** | Your buyer's accounts payable team | | **Triggered by:** | Order renewal ACH payment failure | | **Subject:** | Action required: Payment failed for \{\{ product\_name }} renewal | | **Header:** | ACH payment failure for your \{\{ product\_name }} renewal | | **Body:** | Your payment for your \{\{ product\_name }} renewal has failed to process. Please click the button below to update your payment information and reprocess your payment. | | **Button:** | Update payment information | | **Footer:** | Have questions? \{\{ support\_email }}
Talk to sales \{\{ sales\_email }}
| | **Attachments:** | | ### Renewal ACH payment processed | | | | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Sent from:** | `noreply@salesbricks.com` | | **Received by:** | Your buyer's accounts payable team | | **Triggered by:** | Order renewal ACH payment is successfully processed | | **Subject:** | ACH payment processed for \{\{ product\_name }} renewal | | **Header:** | Your ACH payment for your \{\{ product\_name }} renewal was successful | | **Body:** | Your ACH debit payment was successful. Your payment details are below, and a receipt is attached.

Payment details:

Product name
\{\{ product\_name }}

Invoice number
\{\{ invoice\_number }}

Payment method
\{\{ payment\_method }}

Payment date
\{\{ payment\_date }}

Payment amount
\{\{ payment\_amount }} | | **Button:** | | | **Footer:** | Have questions? \{\{ support\_email }}
Talk to sales \{\{ sales\_email }}
| | **Attachments:** | Payment Receipt, Order Form | ### Renewal ACH payment processing | | | | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Sent from:** | `noreply@salesbricks.com` | | **Received by:** | Your buyer's accounts payable team | | **Triggered by:** | Order renewal ACH payment processing initiated | | **Subject:** | ACH payment processing for \{\{ product\_name }} renewal | | **Header:** | Your ACH payment for your \{\{ product\_name }} renewal is processing | | **Body:** | Your ACH debit payment is processing. Below are your payment details. A follow-up email will be sent when your payment is successfully processed.

Payment details:

Product name
\{\{ product\_name }}

Invoice number
\{\{ invoice\_number }}

Payment method
\{\{ payment\_method }}

Payment date
\{\{ payment\_date }}

Payment amount
\{\{ payment\_amount }} | | **Button:** | | | **Footer:** | Have questions? \{\{ support\_email }}
Talk to sales \{\{ sales\_email }}
| | **Attachments:** | | ### Renewal credit card payment successful | | | | ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Sent from:** | `noreply@salesbricks.com` | | **Received by:** | Your buyer's accounts payable team | | **Triggered by:** | Order renewal credit card payment successfully processed | | **Subject:** | Credit card payment processed for \{\{ product\_name }} renewal | | **Header:** | Your credit card payment for your \{\{ product\_name }} renewal was successful | | **Body:** | Your credit card payment was successful. Below are your payment details, and a receipt is attached.

Payment details:

Product name
\{\{ product\_name }}

Invoice number
\{\{ invoice\_number }}

Payment method
\{\{ payment\_method }}

Payment date
\{\{ payment\_date }}

Payment amount
\{\{ payment\_amount }}
| | **Button:** | | | **Footer:** | Have questions? \{\{ support\_email }}
Talk to sales \{\{ sales\_email }}
| | **Attachments:** | Payment Receipt, Order Form | ## Subscription Lifecycle ### Share link to active order | | | | ----------------- | ------------------------------------------------------------------------------------------------------------------------- | | **Sent from:** | `noreply@salesbricks.com` | | **Received by:** | Your nominated email | | **Triggered by:** | Customer shares an order at checkout | | **Subject:** | Link shared: Your \{\{ product\_name }} order | | **Header:** | A link to your \{\{ product\_name }} order has been shared with you | | **Body:** | \{\{ buyer\_name }} has shared order \{\{ order\_code }} for \{\{ product\_name }} with you. Click “Go to order” to view. | | **Button:** | Go to order | | **Footer:** | Have questions? \{\{ support\_email }}
Talk to sales \{\{ sales\_email }}
| | **Attachments:** | | ### Renewal order completed (order form) | | | | ----------------- | ------------------------------------------------------------------------------------------------------------------------------ | | **Sent from:** | `noreply@salesbricks.com` | | **Received by:** | Your buyer's accounts payable team | | **Triggered by:** | Order renewal is completed via order form | | **Subject:** | \{\{ product\_name }} renewal confirmation | | **Header:** | \{\{ product\_name }} renewal confirmation (\{\{ order\_code }}) | | **Body:** | Your order renewal for \{\{ seller\_name }} \{\{ product\_name }} is complete. A copy of your executed order form is attached. | | **Button:** | | | **Footer:** | Have questions? \{\{ support\_email }}
Talk to sales \{\{ sales\_email }}
| | **Attachments:** | | ### Order form signature required | | | | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **Sent from:** | `noreply@salesbricks.com` | | **Received by:** | Your buyer's nominated signatory | | **Triggered by:** | Customer specifies an alternative signatory | | **Subject:** | Action needed: Sign for your \{\{ product\_name }} order | | **Header:** | Your signature is needed to complete your \{\{ product\_name }} order | | **Body:** | \{\{ buyer\_name }} has requested your signature on order #\{\{ order\_code }} for \{\{ product\_name }}. Click the button below to view the order and sign. | | **Button:** | Go to order | | **Footer:** | Have questions? \{\{ support\_email }}
Talk to sales \{\{ sales\_email }}
| | **Attachments:** | | ### Upcoming auto-renewal | | | | ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | | **Sent from:** | `noreply@salesbricks.com` | | **Received by:** | Your buyer's nominated point of contact | | **Triggered by:** | Auto-renewal occurs in \{\{ X }} days | | **Subject:** | Upcoming auto-renewal for \{\{ product\_name }} | | **Header:** | Your \{\{ product\_name }} order will auto-renew on \{\{renewal date}} | | **Body:** | Your subscription for \{\{ product\_name }} will automatically renew on \{\{renewal date}} for $\{\{renewal amount}}. No further action is required | | **Button:** | | | **Footer:** | Have questions? \{\{ support\_email }}
Talk to sales \{\{ sales\_email }}
| | **Attachments:** | | ### Order completed (electronic) | | | | ----------------- | ---------------------------------------------------------------------------------------------------------------------- | | **Sent from:** | `noreply@salesbricks.com` | | **Received by:** | Your buyer's nominated point of contact | | **Triggered by:** | Order is completed via ACH or credit card | | **Subject:** | \{\{ product\_name }} order confirmation | | **Header:** | \{\{ product\_name }} order confirmation (\{\{ order\_code }}) | | **Body:** | Your order for \{\{ seller\_name }} \{\{ product\_name }} is complete. A copy of your executed order form is attached. | | **Button:** | | | **Footer:** | Have questions? \{\{ support\_email }}
Talk to sales \{\{ sales\_email }}
| | **Attachments:** | Order form receipt PDF | ### Order completed (order form) | | | | ----------------- | ---------------------------------------------------------------------------------------------------------------------- | | **Sent from:** | `noreply@salesbricks.com` | | **Received by:** | Your buyer's nominated point of contact | | **Triggered by:** | Order is completed via order form | | **Subject:** | \{\{ product\_name }} order confirmation | | **Header:** | \{\{ product\_name }} order confirmation (\{\{ order\_code }}) | | **Body:** | Your order for \{\{ seller\_name }} \{\{ product\_name }} is complete. A copy of your executed order form is attached. | | **Button:** | | | **Footer:** | Have questions? \{\{ support\_email }}
Talk to sales \{\{ sales\_email }}
| | **Attachments:** | Signed order form PDF | ### Order has been shared with customer | | | | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Sent from:** | `noreply@salesbricks.com` | | **Received by:** | Your nominated email | | **Triggered by:** | Order is shared with customer | | **Subject:** | Complete your \{\{ product\_name }} order | | **Header:** | Complete your \{\{ product\_name }} order | | **Body:** | \{\{ seller\_name \|\| order\_owner\_name}} has shared order \{\{ order\_code }} for \{\{ product\_name }} with you. Click the button below to complete your order. | | **Button:** | Go to order | | **Footer:** | Have questions? \{\{ support\_email }}
Talk to sales \{\{ sales\_email }}
| | **Attachments:** | | ## Invoicing ### Invoice past due | | | | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **Sent from:** | `noreply@salesbricks.com` | | **Received by:** | Your buyer's accounts payable team | | **Triggered by:** | Invoice has not been paid on due date | | **Subject:** | Payment past due for \{\{ product\_name }} (\{\{ invoice\_number }}) | | **Header:** | Your \{\{ product\_name }} invoice is past due (\{\{ invoice\_number }}) | | **Body:** | Your payment for invoice (\{\{ invoice\_number }}) for \{\{ product\_name }} is past due as of \{\{ payment\_due\_date }}. To make a payment and avoid service disruptions, follow the instructions on the attached invoice or click the button below. | | **Button:** | Make a payment | | **Footer:** | Have questions? \{\{ support\_email }}
Talk to sales \{\{ sales\_email }}
| | **Attachments:** | Invoice | ### New invoice is available | | | | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | | **Sent from:** | `noreply@salesbricks.com` | | **Received by:** | Your buyer's accounts payable team | | **Triggered by:** | Invoice is generated | | **Subject:** | \{\{ product\_name }} invoice \{\{ invoice\_number }} | | **Header:** | Your \{\{ product\_name }} invoice (\{\{ invoice\_number }}) | | **Body:** | Attached is your invoice for \{\{ product\_name }}. To make a payment, follow the instructions on the attached invoice or click the button below. | | **Button:** | Make a payment | | **Footer:** | Have questions? \{\{ support\_email }}
Talk to sales \{\{ sales\_email }}
| | **Attachments:** | Invoice, Order Form | # Deal Shaping Best practices to help you and your customer benefit from a partnership and close the deal **Deal shaping** refers to the process of structuring the terms & conditions of an order strategically, to align with both the vendor's and customer's objectives. Proper deal shaping can significantly improve your company's deal closure rate, can assure a mutually beneficial agreement, and encourages a long-term partnership with your customer. Here are several best practices to follow when building your orders: ## Commercial Terms Clear, well-defined commercial terms help customize the agreement with a specific customer, reduce friction during negotiations, and improve the chances of closing the deal. Under your company settings, allow commercial terms to be shown during the checkout process (how-to). Any time a commercial terms document is added to an order, your customer will be able to review it during checkout. ### Termination Clause Adding a **termination for convenience** clause to the commercial terms gives both parties clarity and flexibility regarding contract exit points. This could help customers feel more comfortable signing the deal. * **Termination for Convenience**: You grant the customer some flexibility by allowing them to terminate the agreement at their discretion. * **Best practices**: * Under your company settings, upload a commercial terms document with the termination for convenience clause. This ensures that the clause applies to all orders by default. * Customize the clause at the order level if you need it for specific customers. * In your commercial terms, specify an opt-out period during which the customer can cancel the contract without any penalty. * **Example**: *"The customer may cancel the Order Form at any time before or on the 90th day from the start date mentioned in this Order Form ('Cancellable Period'). Any fees paid for the period between the Start Date and the termination date ('Cancel Date') are non-refundable. Unpaid invoices are still due and must be settled."* ### Price Lock Clause Offering a price lock clause can help customers feel secure in predicting their budget for the duration of the contract. * **Best practices**: * Offer a price lock for a fixed period (e.g. 12 or 24 months). * Define whether this price lock applies to all products and services, or just specific components. * Clarify what happens after the price lock period ends (e.g. a capped price increase). * **Example**: *"Customer pricing is locked for 24 months from the contract start date. After this period, pricing may be subject to an annual adjustment not exceeding 5%."* ### Marketing Clause It's a common practice to include a marketing clause in agreements. This allows the vendor to leverage the customer's brand and reputation for marketing purposes, while also benefiting the customer by boosting their own visibility. * **Best practices**: * Ask for permission to use the customer's logo, name, or quotes in your marketing materials. * Offer options for video testimonials or case studies to build stronger social proof. * Specify the types of materials (e.g. website, brochures, videos) where the customer's brand may be used. * **Example**: *"Customer agrees to provide Vendor the right to use Customer's name, logo, and any testimonials or quotes for promotional purposes, including on Vendor's website, case studies, and other marketing materials."* ## Customization and Flexibility Customization is a key factor when shaping a deal. Vendors that can tailor their agreements and offerings to meet unique customer needs have a higher chance of securing a deal. ### Custom Terms for Specific Deals While it's important to have default clauses, customizing certain terms for high-value or strategic clients can show flexibility and increase customer satisfaction. For example: * Add customer-specific renewal terms based on their growth or budget constraints. * Introduce custom discount structures for multi-year commitments. ## Additional Considerations When shaping a deal, it's important to consider the following: ### Simplified Pricing Structures Complex pricing models may deter potential customers from signing contracts. Keep pricing clear, easy to understand, and flexible enough to meet a variety of customer needs. ### Flexible Contract Lengths Offering customers flexible contract lengths (monthly, quarterly, or annually) can increase the likelihood of closing deals. Consider offering incentives for longer commitments, such as additional discounts or locked-in pricing. ### Renewal Terms Ensure that renewal terms are transparent. Clearly communicate the conditions under which the contract renews, the notice period required for termination, and any price adjustments that may occur during renewal. # Dunning Handling failed payments in Salesbricks If you've setup your Stripe integration, your customers have the option to pay their invoices electronically. Most subscriptions have a recurring billing schedule, and it's possible for automated invoice payments to fail mid-subscription. In these scenarios, Salesbricks provides several features to help your team triage a failed payment event and implement automated responses. payment-issue Firstly, failed credit card or ACH Debit payments trigger automatic email alerting to your customer's accounts payable and your accounts receivable team. These alerts prompt your customer to update their payment information and pay the invoice using a Salesbricks-powered paywall. ach-failed Secondly, the [invoice.payment.failed](/api-reference/webhooks/invoice/payment/failed) webhook is fired. Depending on the payment terms you've selected for your product, you can choose to take further action - for example, suspending service, or providing an extra in-product prompt about the state of the customer's subscription. Finally, at the point of invoice reconciliation, the [invoice.payment.succeeded](/api-reference/webhooks/invoice/payment/succeeded) webhook is fired, allowing you to take action - for example, restore service if you've elected to pause the customer's access to your product. If a payment has been facilitated outside of Salesbricks, you can mark the individual invoice as paid in the Salesbricks admin UI, or automatically do so via a Finance System integration, such as the Salesbricks Quickbooks Integration. # Magic Links Allow your customers to buy from your pricing page via a checkout experience powered by Salesbricks ## Overview Salesbricks' Magic Links can be used to quickly and easily power the call-to-action buttons within your pricing page. This allows your self-serve / product-led growth (PLG) buyers to check out with Salesbricks. where-to-use ## Implementation In Salesbricks, create and publish your pricing and packaging (Bricks, Products, & Plans). You can find details about that process [here](/quickstart-guide/bricks-products-plans/overview). Navigate to **Settings** -> **Integrations** and click the **Magic Links** card. [https://app.salesbricks.com/admin/settings/integrations](https://app.salesbricks.com/admin/settings/integrations) If you haven't already built a tailored pricing page on your website, we recommend doing that first, then revisiting this page to have Salesbricks power the buttons of your pricing cards. Locate the Salesbricks Plan you want to embed onto your pricing page. magic-links-list Copy the Magic Link for that Plan and embed it onto your pricing page. When a customer clicks this link on your pricing page, they will be directed to a checkout flow for that Plan in Salesbricks. ## Tracking a Buyer's Activity In the event that you already know the identity of a user checking out with Salesbricks (e.g. if they're on a free trial of your app and already have a login), you can leverage the **checkout redirect URL** (along with the metadata parameters below) to track when that user has checked out. Set the checkout redirect URL to a site that you own and can read the URL when the customer checks out. Go to **Products** -> click on your Product -> click the **Details** tab. Here, you can add or edit your checkout redirect URL. checkout-redirect-url Add your identifier to the end of any Magic Link in this format: `` + `&meta_attributionId=`. The URL should look something like this: `https://app.salesbricks.com/products/surveyllama/new?sku=c5938ba7-3d11-439d-ba82-7f764e01cc6f&meta_attributionId=ID123456` Upon checkout, Salesbricks will redirect the user to your specified URL, attaching your identifier to the end of the URL in this format: `attributionId=ID123456`. post-checkout The URL parameter will also be included in any webhooks triggered, under the field name `metadata`. # Managing Your Customer A primer on Upgrades, Renewals, Recasts, and Terminations ## Overview Signing a customer's first Order is only the beginning of the customer's contract journey. Managing that customer's ongoing and future contracts can be just as, if not more important than, the first contract. Although many tools out there will help you get to the finish line of a deal (think DocuSign, spreadsheets, and Stripe links), that's where it ends. This leaves Customer Success teams with the burdensome task of unpacking what was originally sold, and turns the task of managing upgrades, renewals, and recasts into a full-time job. This is not the case with Salesbricks. Our thoughtfully designed customer management flow empowers CS teams to upgrade, renew, and recast customers with ease, freeing up their time for more strategic tasks. Gone are the days of second-guessing if the contact attached in Salesforce, or buried in the Box folder, is the latest one; if the customer's entitlements are up to date from their last upgrade; or pinging the Finance team to help prorate a cancel-and-replace contract. update-subscription ## Definitions and Examples ### Upgrade Upgrading a contract involves modifying a customer's entitlements for the remainder of the current contract dates. #### Example A customer has subscribed to a block of units and is approaching the upper limit. They would like to purchase the next block of units in order to continue service. However, they do not want to extend the contract beyond the current contract end date. The new contract would be effective on the **start date defined in the upgrade**, and remain active until the **end date of the base agreement**. ### Renewal A renewal contract is a continuation of service for a customer. If the original order's renewal terms are set to **Automatic**, the contract will be auto-renewed with the same entitlements and term details that exist on the previous agreement (minus any one-time discounts applied). In the event that a seller does not want to grandfather the customer into a renewal with current pricing terms, the automatic renewal can be overwritten by creating an upgrade to the subscription prior to the end of the current contract. #### Example A customer would like to continue service after their contract end date. Upon the renewal of the contract, they want to add 50 additional user licenses and 100 professional service hours. These additional products and services would go into effect on the **start date of the renewal** (typically the next day after the original contract end date). ### Recast A recast is required when a customer wants to scrap the existing contract and create a completely new agreement with different terms, dates, or entitlements. #### Example 3 weeks in to a 12-month subscription, a customer has decided that a different Product than the one selected in their current contract would be a better fit for their needs. They would like to replace the current contract with a new one. They require that the pre-paid cost of the current contract be applied as a credit to the cost of the new Product. They would like this new contract to extend 12 months from the **start date of the recast**. ### Terminate A customer would like to discontinue service. #### Example A customer is required to reduce their spend and has decided to discontinue their services immediately, or at the end of the contract period. You can set a subscription to terminate on the renewal date, or any other specified date between now and the end of the contract. terminate-subscription # Order Stages orders-list ## Open An order is considered open if one of the following states applies: * the seller is in the process of building the order (sales-led motion) * the buyer is in the process of building the order (self-serve) * the buyer and seller are in the process of reviewing contract terms * the buyer has not yet completed checkout * the buyer has not yet signed the contract (when checking out via order form e-signature) ## Awaiting countersign An order is awaiting a countersignature if the buyer has checked out via order form e-signature and signed. This stage indicates to the seller that their legal document signer must countersign to fully execute the contract. ## Closed won An order is considered closed won when the buyer and seller have agreed to terms, and the contract has been executed by both parties. ## Closed lost An order is considered closed lost if the buyer no longer agrees to the purchase. Closed lost orders will not appear on your Orders table. ## Closed delete The seller has deleted the order. Closed delete orders will not appear on your Orders table. ## Migrating Salesbricks allows sellers to import an order from an external source. After you migrate an order into Salesbricks, you will have the option of manually marking it as closed won, closed lost, or closed delete. # Order Types Understanding upgrades, renewals, recasts, and terminations ## Overview Now that you know how to [structure your pricing](/quickstart-guide/bricks-products-plans/overview), [build an Order](/quickstart-guide/building-an-order), and [configure customer checkout](/quickstart-guide/checkout-invoice-payment-options), you have all the tools needed to close your first Order. And if you've already closed your first Order, congratulations! You've officially converted a prospect to a happy customer. Let's say they want to update their subscription - maybe they need to add more licenses, or they want to extend their one-year contract for two more years. We support four ways to update an Order after the initial close: * Upgrade * Renewal * Recast * Termination Read on to learn the differences between each, and when it's appropriate to use one order type over another. ## Upgrade
upgrade
Use an upgrade to **add** more Bricks to a subscription, or to **upsell** the customer to a higher tier Plan. Any changes will take effect under the current contract dates. Upgrades across Products are not allowed. If you create an upgrade, you will only be able to choose from Plans and Bricks associated with the Product from the current contract. If you're replacing the customer's current Product with a new one, your best bet is to create a [recast](/documentation/order-types#recast) instead. ### Upgrade examples **Current contract:** Customer has signed a one-year contract for a basic plan, which includes 5 seats at no extra cost. Three months in, the customer decides that they need to add 3 more seats to the subscription, so you build this into an upgrade for the remaining 9 months. #### What happens to the current contract after the upgrade closes? This example retains the same Plan from the current contract. The subscription will be an aggregate of entitlements across the current contract and all subsequent upgrades (5 seats from the initial + 3 seats from the upgrade, for a total of 8 seats). Any other contract terms from the current contract will be replaced by the terms defined in the upgrade. Three months in, the customer wants to upgrade to an advanced plan for the remaining 9 months, which includes 10 seats at no extra cost. #### What happens to the current contract after the upgrade closes? Since a different Plan was selected, the entitlements from the current contract are replaced by the entitlements of the upgraded Plan. Any other contract terms from the current contract will be replaced by the terms defined in the upgrade. ### What happens to invoices? The billing schedule of the current contract is replaced by the billing schedule outlined in the upgrade. ## Renewal
renewal
Use a renewal to **continue** your customer's subscription. You may also upgrade the contract (add Bricks or upsell a Plan) when building a renewal. Any changes will take effect after the current contract has expired. ### Renewal example **Current contract:** Customer has signed a one-year contract with manual renewal terms (must be agreed upon by the buyer). 8 months later, the customer decides that they are happy with their subscription, and are ready to set up a renewal for another year. ### What happens to the current contract after the renewal closes? A renewal is a continuation of the customer's subscription under new dates. The current contract remains active until its end date, after which, the renewal begins. ### What happens to invoices? The customer will continue to receive invoices according to the billing schedule of the current contract. Once the renewal begins, the customer will receive invoices according to the billing schedule outlined in the renewal. ## Recast
recast
Use a recast to **replace** the terms, dates, and/or entitlements of the current contract. ### Recast examples **Current contract:** Customer has signed an upcoming 6-month contract, from March 1st to September 30th. Before the contract start date, they decide that they want the subscription to run from March 15th to October 14th instead, so you build these new dates into a recast. Two weeks in, the customer realizes that one of your other Products is a much better fit for their needs, so you build a recast that replaces their current subscription with the new Product. ### What happens to the current contract after the recast closes? The current contract is considered superseded (replaced by the terms of the recast), essentially rendering it inactive. ### What happens to invoices? The billing schedule of the current contract is replaced by the billing schedule outlined in the recast. Any amount from the current contract that the customer has already paid, or has been billed for, will be added to the recast as a prorated discount. ## Termination
termination
Use a termination to **end** a customer's subscription. You may schedule the subscription to terminate on the expected renewal date, or any date before the end of the current contract. ### Termination examples **Current contract:** Customer has signed a 1-year contract. The subscription is set to auto-renew at the end of the current contract. 90 days before the renewal date, the customer decides that they no longer want to renew beyond the current contract, so you update the subscription to terminate on the renewal date. 6 months in, the customer still hasn't implemented the entitlements and asks to terminate the contract at the end of the month. You update the subscription to terminate on the last day of the current month. ### What happens to the current contract after the termination is scheduled? Before the termination date, the subscription will remain active, and the customer will continue to have access to their entitlements. Salesbricks does not control your customers' entitlements, but we do offer APIs and Webhooks that can integrate into your system to automate the process of disabling entitlements on the termination date. After the termination date, the subscription will be rendered inactive. ### What happens to invoices? Customer will continue to be billed until the termination date. # Payment Communications How to tell your customers that they owe you money Salesbricks allows you to send your customers an invoice for the Products they've used or have subscribed to. Salesbricks powers all invoice communications between you and your customer. Most subscriptions have a recurring billing schedule, so it's possible to automate sending out invoices. Here are examples of messages that your company admin can customize in the message editor: ### Invoice Sent invoice-sent ### Invoice Due invoice-due ### Invoice Past Due invoice-past-due ### Credit Card Payment Processed cc-payment-processed ### ACH Payment Processing ach-payment-processing # Ramping Structures ## Overview Ramping is a pricing strategy which is used to gradually increase the cost of a subscription as the quantity of enabled units grows over the course of a contract. Let's illustrate how ramping schedules work by pricing a single contract against two different pricing structures: **flat-rate** pricing and **tiered** pricing. ## Flat-rate ramping Read more about flat-rate pricing here. #### Formula for cost calculation To calculate the subtotal of each ramping period: `unit price * quantity * duration` ### Example - flat-rate ramping #### Contract terms **Start date**: December 14, 2023 **Contract period**: 12 months #### Ramping schedule | Ramping period | Start date | Quantity | | -------------- | ------------- | --------- | | 1st | December 2023 | 50 units | | 2nd | April 2024 | 100 units | | 3rd | July 2024 | 150 units | #### Pricing structure \$39 per unit monthly #### Cost breakdown | Ramping period | Duration | Cost | | -------------- | --------------------------------------------- | ---------------------------------------- | | 1st | 4 months (December 14, 2023 - April 13, 2024) | \$39 \* 50 units \* 4 months = \$7,800 | | 2nd | 3 months (April 14, 2024 - July 13, 2024) | \$39 \* 100 units \* 3 months = \$11,700 | | 3rd | 5 months (July 14, 2024 - December 13, 2024) | \$39 \* 150 units \* 5 months = \$29,250 | #### Grand total \$7,800 + \$11,700 + \$29,250 = **\$48,750** ## Tiered ramping Read more about tiered pricing here. #### Formula for cost calculation To calculate the subtotal of each ramping period: * calculate the cost of each tier: `unit price * qty` * sum the cost of all tiers and multiply by the duration of the ramping period: `sum of all tiers' costs * duration` ### Example - tiered ramping For this example, we'll use the same contract terms and ramping schedule as the flat-rate example, except now using a tiered pricing structure. #### Contract terms **Start date**: December 14, 2023 **Contract period**: 12 months #### Ramping schedule | Ramping period | Start date | Quantity | | -------------- | ------------- | --------- | | 1st | December 2023 | 50 units | | 2nd | April 2024 | 100 units | | 3rd | July 2024 | 150 units | #### Pricing structure | Quantity range | Monthly unit price | | -------------- | ------------------ | | 1-39 | \$39 | | 40-79 | \$35 | | 80-129 | \$29 | | 130+ | \$25 | #### Cost breakdown
Ramping period Duration Cost
1st 4 months (December 14, 2023 - April 13, 2024) **Units 1-39**: \$39 \* 39 units = \$1,521 **Units 40-50**: \$35 \* 11 units = \$385 **Subtotal**: (\$1,521 + \$385) \* 4 months = \$7,624
2nd 3 months (April 14, 2024 - July 13, 2024) **Units 1-39**: \$39 \* 39 units = \$1,521 **Units 40-79**: \$35 \* 40 units = \$1,400 **Units 80-100**: \$29 \* 21 units = \$609 **Subtotal**: (\$1,521 + \$1,400 + \$609) \* 3 months = \$10,590
3rd 5 months (July 14, 2024 - December 13, 2024) **Units 1-39**: \$39 \* 39 units = \$1,521 **Units 40-79**: \$35 \* 40 units = \$1,400 **Units 80-129**: \$29 \* 40 units = \$1,160 **Units 130-150**: \$25 \* 21 units = \$525 **Subtotal**: (\$1,521 + \$1,400 + \$1,160 + \$525) \* 5 months = \$23,030
#### Grand total \$7,624 + \$10,590 + \$23,030 = **\$41,244** # Reports & Charts (Beta) A primer for Salesbricks' reporting and charting features export const BetaFeatureBanner = () => <>

This feature is currently in beta

We are actively enhancing this feature, and some functionalities may change before the official release.

If you're interested in joining the beta program and sharing feedback to help us improve it, please ping us in your dedicated Slack channel, or email support@salesbricks.com.

; [https://app.salesbricks.com/admin/reports](https://app.salesbricks.com/admin/reports) reports-and-charts ## Overview Reports & Charts provides users with visualization and aggregation tools to track various aspects of their revenue and finance data. From revenue and bookings to customer counts and payment status, these reports offer valuable insights into key metrics and trends. Each chart or report focuses on a different aspect of performance: **Charts** * **Revenue:** Tracks total revenue generated each month, broken down by revenue type. * **Bookings:** Displays monthly sales based on the value of a commercial agreement between a buyer and seller, segmented by customer transaction type. * **Customers:** Provides insights into new customer acquisition and customer churn. * **Renewals:** Analyzes subscription renewal amounts and timing, renewal lapses, and churn over time. * **Invoicing and Payments**: Monitors unpaid invoices and revenue suspended by past due payments. * **Collections**: Tracks uncollected payments and collected payments over time. **Reports** * **Bookings**: Displays monthly sales based on the value of a commercial agreement between a buyer and seller, segmented by customer transaction type. * **Customer count:** Breaks down the monthly customer count into various categories. * **Invoice receivable:** Lists all invoices sent to customers within a selected date range. * **Raw data:** Offers detailed revenue data segmented by [Bricks](/quickstart-guide/bricks-products-plans/creating-a-brick#whats-a-brick) and Customers. * **Revenue:** Tracks total revenue generated each month, broken down by revenue type. * **Revenue waterfall:** Analyzes recurring revenue data segmented by Customers. * **Tax remittance:** Displays total taxes billed and amounts to remit by state. ## Key Terms ### Subscription Status #### Renewed Closed won renewal orders. #### Terminated Subscriptions that are scheduled to end before the end date specified on the contract. #### Churned Subscriptions that have been terminated, and the termination date has passed. #### Lapsed Subscriptions that have ended but have not been terminated, nor has a renewal been closed. ### Revenue #### MRR Monthly recurring revenue. Any Brick on an active subscription that the customer is billed for on a recurring basis. MRR is calculated by dividing the grand total of recurring revenue in an agreement by the total contract length in days, and then multiplying it by the number of days in each month. #### Recurring Consistent and periodic income from subscription Bricks. #### Non-recurring One-off payments from one-time, usage, and milestone Bricks. #### Usage Income from Usage Bricks based on actual usage or pre-committed quantities. #### Milestone Income from Milestone Bricks based on achieving predetermined checkpoints. ## Charts The charts listed below offer a single-year view (unless otherwise noted) of your company's revenue data and customer count. ### Revenue The Revenue chart offers a breakdown of the total revenue your company generated on Salesbricks. It includes monthly recurring revenue (MRR) from recurring, non-recurring, usage, and milestone Bricks on active closed won orders for each month. It also provides a forecast of future months' revenue based on the expected MRR of active subscriptions. **Types of Revenue:** * Recurring * Non-recurring * Usage * Milestone Clicking on this chart will take you to the [Revenue report](/documentation/reports-and-charts#revenue-2). Please note that Salesbricks charges usage in arrears; any usage revenue displayed on the chart is based on usage data from the previous month. ### Bookings The Bookings chart displays the total revenue your company has booked each month. Monthly totals are calculated by summing up the revenue made from new logos, upgrades, recasts, and renewals, then subtracting churned amounts. **Types of Transactions:** * **New logo:** Closed won initial orders indicating new customers * **Renewal:** Closed won renewal orders * **Recast:** Closed won recast orders * **Upgrade:** Closed won upgrade orders * **Churn** Clicking on this chart will take you to the [Bookings report](/documentation/reports-and-charts#bookings-2). ### Customers The Customers chart tracks the monthly amount of: * **New customers** from closed won initial orders * **Churned customers** from terminated orders * **Existing customers** from active subscriptions Clicking on this chart will take you to the [Customer count report](/documentation/reports-and-charts#customer-count). Please note that you are not currently able to drill down in the Customers chart to understand which customers make up the numerical values. ### Renewals The Renewals chart visualizes the total monthly revenue from renewed, lapsed as potential loss, churned, and upcoming subscriptions. **Types of Subscriptions:** * **Renewed:** These appear on the chart during the month in which the renewal agreement starts. * **Lapsed** * **Churned** * **Upcoming:** The expected renewal value will appear on the chart under the month in which the next agreement is expected to start. Please note that you are not currently able to drill down in the Renewals chart to understand which customers make up the numerical values. ### Invoicing and Payments The Invoicing and Payments chart monitors your total money due, categorized by how late payments are. Past-due invoices are segregated into five buckets: * 1-30 days past due * 31-60 days past due * 61-90 days past due * 91-120 days past due * 120+ days past due Clicking on this chart will take you to the [Invoice receivable report](/documentation/reports-and-charts#invoice-receivable). ### Collections The Collections chart aggregates the total amount of money collected for the selected fiscal year, as well as uncollected payments of all transactions across all fiscal years. Uncollected money is calculated by the total amount of all unsettled invoices. Collected money is displayed under three categories: * Money collected during the **current month** * Money collected during the **current fiscal quarter** (the consecutive three-month period used for financial reporting and analysis) * Money collected during the **current fiscal year-to-date** (the start of the fiscal year to today) Please note that collections are shown based on fiscal quarters, and currently, this cannot be adjusted manually. ## Reports ### Bookings The Bookings report shows a list of logos and revenue that closed during a selected time range. Bookings are sorted based on the date the order was closed; if an order was closed in February but set to start in April, it will appear in the report as a February booking. Churned logos appear under the month that the order was terminated. ### Customer count The Customer count report tracks customer acquisition and churn rates to determine net customer count changes. Customers are sorted based on the date the order was closed; if an order was closed in February but set to start in April, it will appear in the report as a February customer. Churned customers appear under the month that the order was terminated. This report breaks down your monthly customer count into four quantities: * **Start of month total:** How many unique logos you had coming in to the start of the month * **Added this month:** How many new logos you've added * **Churned this month:** How many logos terminated their subscription * **End of month total:** How many customers you ended the month with after accounting for new and churned logos ### Invoice receivable The Invoice receivable report lists all invoices within a selected date range. An invoice will appear in the report if its "invoice date" (typically, the start of the billing period) falls within the selected date range. If the filter is set to "year-to-date," and the start of an invoice's billing period has already passed, that invoice will appear in this report. Invoices can also be filtered by customer names and payment status (paid and/or unpaid). ### Raw data The Raw data report offers a detailed look at all revenue data, segmented by Bricks and Customers, within a selected date range. This data includes subscriptions, one-time payments, usage, and milestones. Data for this report is filtered by the period that coincides with the report's date range. For example, if a subscription runs from February to December, and the report shows raw data from June to December, the report will only show raw data for this subscription from June to December. The revenue data shown on each row is the MRR for that Brick, which is calculated by dividing the grand total by the total contract length in days, then multiplying it by the number of days in each month. ### Revenue The Revenue report displays the total revenue from sales transactions for each month, also segmented into recurring, non-recurring, milestone, and usage revenue. Data for this report is filtered by the period that coincides with the report's date range. For example, if a subscription runs from February to December, and the report shows revenue from June to December, the report will only show revenue for this subscription from June to December. ### Revenue waterfall The Revenue waterfall report shows all recurring revenue data, segmented by customers. This data takes only the recurring revenue from subscriptions into consideration. Monthly revenue allocations are prorated by day. Data for this report is filtered by the period that coincides with the report's date range. For example, if a subscription runs from February to December, and the report shows revenue from June to December, the report will only show revenue for this subscription from June to December. ### Tax remittance The Tax remittance report displays the total tax amount billed, and the amounts to remit for each state where you have sold your software and services. Salesbricks uses Stripe's APIs ([Taxjar](https://www.taxjar.com/)) to determine nexus - whether or not sales tax should be applied to an order based on your company's address and the buyer's address. As the seller, it is your responsibility to register and remit taxes with each applicable individual state. If you would like assistance with this process, we recommend using our partner, [Zamp](https://zamp.com/). An overview of Zamp's services can be found [here](https://drive.google.com/file/d/1wO-etqxO5WQW0gJ5v_2X5-KDMjostLTq/view). # Your email notifications What emails will Salesbricks send to your team Salesbricks sends emails automatically throughout your customer's lifecycle. This is a complete listing of those emails. ## Payment ### Renewal credit card payment failure | | | | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **Sent from:** | `noreply@salesbricks.com` | | **Received by:** | | | **Triggered by:** | Order renewal credt card payment failure | | **Subject:** | Action required: Payment failed for \{\{ product\_name }} renewal | | **Header:** | Credit card payment failure for your \{\{ product\_name }} renewal | | **Body:** | Your payment for \{\{ product\_name }} has failed. Please click the button below to update your payment information and reprocess your payment.

Payment details:

Product name
\{\{ product\_name }}

Invoice number
\{\{ invoice\_number }}

Payment method
\{\{ payment\_method }}

Payment date
\{\{ payment\_date }}

Payment amount
\{\{ payment\_amount }}
| | **Button:** | Update payment information | | **Footer:** | | | **Attachments:** | | ### Seller ACH Payment Processed | | | | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Sent from:** | `noreply@salesbricks.com` | | **Received by:** | Seller AR email | | **Triggered by:** | ACH Payment succeeds for Invoice | | **Subject:** | \{\{ buyer\_name }} ACH debit payment successfully processed | | **Header:** | ACH debit payment successfully processed | | **Body:** | Payment details:

Product name
\{\{ product\_name }}

Invoice number
\{\{ invoice\_number }}

Payment method
\{\{ payment\_method }}

Payment date
\{\{ payment\_date }}

Payment amount
\{\{ payment\_amount }} | | **Button:** | | | **Footer:** | | | **Attachments:** | Payment Receipt | ### Seller ACH Payment Processing | | | | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Sent from:** | `noreply@salesbricks.com` | | **Received by:** | Seller AR email | | **Triggered by:** | ACH payment starts processing against an invoice | | **Subject:** | \{\{ buyer\_name }} \{\{ invoice\_number }}: ACH debit payment processing | | **Header:** | ACH debit payment processing | | **Body:** | Payment details:

Product name
\{\{ product\_name }}

Invoice number
\{\{ invoice\_number }}

Payment method
\{\{ payment\_method }}

Payment date
\{\{ payment\_date }}

Payment amount
\{\{ payment\_amount }} | | **Button:** | | | **Footer:** | | | **Attachments:** | | ### Seller CC Payment Failed | | | | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Sent from:** | `noreply@salesbricks.com` | | **Received by:** | Seller AR email | | **Triggered by:** | When a payment attempt is made against an Invoice using a CC on file (including via the Invoice paywall) | | **Subject:** | \{\{ buyer\_name }} credit card payment failed | | **Header:** | Credit card payment failed | | **Body:** | Payment details:

Product name
\{\{ product\_name }}

Invoice number
\{\{ invoice\_number }}

Payment method
\{\{ payment\_method }}

Payment date
\{\{ payment\_date }}

Payment amount
\{\{ payment\_amount }}
| | **Button:** | | | **Footer:** | | | **Attachments:** | | ### Seller Credit Card Payment Success | | | | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Sent from:** | `noreply@salesbricks.com` | | **Received by:** | | | **Triggered by:** | CC Payment succeeds for Invoice | | **Subject:** | \{buyer\_name}: credit card payment successfully processed | | **Header:** | Credit card payment successfully processed | | **Body:** |

Payment details:

Product name
\{\{ product\_name }}

Invoice number
\{\{ invoice\_number }}

Payment method
\{\{ payment\_method }}

Payment date
\{\{ payment\_date }}

Payment amount
\{\{ payment\_amount }}
| | **Button:** | | | **Footer:** | Have questions? \{\{ support\_email }}
Talk to sales \{\{ sales\_email }}
| | **Attachments:** | Receipt | ## ### Seller ACH Payment Failed | | | | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Sent from:** | `noreply@salesbricks.com` | | **Received by:** | Seller AR email | | **Triggered by:** | ACH Payment fails for Invoice | | **Subject:** | \{\{ buyer\_name }}: ACH debit payment failed | | **Header:** | ACH debit payment failed | | **Body:** | Payment details:

Product name
\{\{ product\_name }}

Invoice number
\{\{ invoice\_number }}

Payment method
\{\{ payment\_method }}

Payment date
\{\{ payment\_date }}

Payment amount
\{\{ payment\_amount }} | | **Button:** | | | **Footer:** | | | **Attachments:** | | ## Invoicing ### Seller Invoice Past Due | | | | ----------------- | ----------------------------------------------------------------------------------------------------------- | | **Sent from:** | `noreply@salesbricks.com` | | **Received by:** | Seller AR email | | **Triggered by:** | On the day after Invoice is due | | **Subject:** | \{\{ buyer\_name }}: Invoice \{\{ invoice\_number }} is \{\{ invoice\_num\_days\_past\_due} } days past due | | **Header:** | \{\{ buyer\_name }} invoice is past due | | **Body:** | Invoice \{\{ invoice\_number }} is \{\{ invoice\_num\_days\_past\_due }} days past due. | | **Button:** | View invoice | | **Footer:** | | | **Attachments:** | Invoice | ### Seller Invoice Start | | | | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Sent from:** | `noreply@salesbricks.com` | | **Received by:** | Seller AR email | | **Triggered by:** | When invoice is generated (currently day before invoice billing period starts), unless the invoice has been muted (migrated orders which haven't cut over) or the Product purchased has invoicing muted | | **Subject:** | \{\{ buyer\_name }}: Invoice \{\{ invoice\_number }} sent | | **Header:** | Invoice sent to \{\{ buyer }} | | **Body:** | Invoice \{\{ invoice\_number }} was sent on \{\{ sent date }} | | **Button:** | View invoice | | **Footer:** | | | **Attachments:** | Invoice | ## Subscription Lifecycle ### Seller Order Stage Changed | | | | ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Sent from:** | `noreply@salesbricks.com` | | **Received by:** | Order Owner | | **Triggered by:** | When a non-migrated order stage changes to a stage other than Building (ie: not re-opened)

(eg: Building to Awaiting Counter-Sign, or to Closed Lost) | | **Subject:** | Details of your \{\{ buyer\_name }} deal have changed | | **Header:** | Order \{\{ order\_number }} changed status to \{\{ next\_label }} | | **Body:** |
Just a heads up, \{\{ buyer\_name }} order \{\{ order\_number }} changed status from \{\{ previous\_label }} to \{\{ next\_label }}.

- The Salesbricks Team. | | **Button:** | | | **Footer:** | Have questions? \{\{ support\_email }}
Talk to sales \{\{ sales\_email }}
| | **Attachments:** | | ### Seller Signature Required | | | | ----------------- | ---------------------------------------------------------------------------------------------------------------------------------- | | **Sent from:** | `noreply@salesbricks.com` | | **Received by:** | Seller Signatory User | | **Triggered by:** | Sent when a buyer has signed the Order Form | | **Subject:** | Finalize \{\{ buyer\_name }}'s order – countersign now! | | **Header:** | Congratulations! \{\{ buyer\_name }} is ready for you to finalize the order. | | **Body:** | Action Required:
Click 'Countersign now' to finalize \{\{ buyer\_name }}'s purchase by countersigning their order form.
| | **Button:** | Countersign now | | **Footer:** | | | **Attachments:** | | # HubSpot ## Overview Salesbricks allows you to connect with your HubSpot org so you can: * Create a new Order in Salesbricks * Sync metadata from the Salesbricks Order to an associated Deal in HubSpot * Establish a repeatable process for future agreements between you and your customer In order to successfully integrate HubSpot in Salesbricks, you will need to: * Connect your HubSpot instance to Salesbricks * Create the fields in HubSpot needed to host the Salesbricks data * Map the integration fields in Salesbricks to the Deal properties you created in HubSpot * Test a Salesbricks Order with a test HubSpot Deal, and confirm the data is flowing properly ## Setup [https://app.salesbricks.com/admin/settings/integrations](https://app.salesbricks.com/admin/settings/integrations) In Salesbricks, go to **Settings** > **Integrations** and click on HubSpot. When prompted to proceed, click on 'Connect.' Setup-connection You will be redirected to Hubspot's authorization page. Sign in with your HubSpot credentials and choose the HubSpot account you wish to connect. Once the connection has been established, you will be redirected back to Salesbricks to begin mapping your data. A list of Salesbricks fields, data types, and definitions can be found [here](https://docs.google.com/spreadsheets/d/1dFMW5bvi5YJ0dSyhiw-xWAo7F0JCtPRym3cskCs9wlo). In a new tab, open your HubSpot account and review the Deal properties available in your settings. If needed, you may create custom properties. deal-properties Back in Salesbricks, map the fields you would like to push from Orders to HubSpot Deals. Click the "Add a field" button to add new rows, or the X icon on the right side of a row to delete it. We recommend mapping the following field out of the gate: Map Salesbricks Order `Contract Value` to your Hubspot Deal field `Amount`. To map additional fields, you can reference our docs on Salesbricks fields for HubSpot. Click "Save." field-mapping If you are trying to map a Salesbricks field to a "Dropdown select" HubSpot property (For example, **Salesbricks Order Status**), you will have to map each Salesbricks option to an option in Hubspot. field-mapping-enum In HubSpot, create a new Deal and save. In Salesbricks, create a new Order. new-order As you build your Order, [refer to this document](https://drive.google.com/file/d/1KVR-48lMOh_R08jjeQOWfjbPAt3fecU0/view) to help you navigate the fields within the Order Builder. In the CRM Company field, search for the Company associated with the Deal you created in HubSpot. Once you find the correct account, the CRM Deal field will be populated with all Deals associated with that company. crm-company-deal After you save the Order, go to HubSpot and verify that the details from the Order were pushed from Salesbricks to the HubSpot Deal. Each time the Salesbricks Order is updated, the updates will be synced to the HubSpot Deal. If you have any questions or concerns, feel free to reach out to the Salesbricks Support team via your Slack Connect channel. # OIN Configuration Setup How to set up Okta Single Sign-On integration ## Supported features * Single Sign-On (OpenID Connect, IdP-initiated only) * Automatically creates user accounts in Salesbricks when Single Sign-On is initiated by a member of an organization with an active Okta integration To enable this feature on your company's Salesbricks account, you will need to work with Salesbricks Support to activate your instance. ## Prerequisites The Okta Single Sign-On integration is only available to Salesbricks users as a paid feature. ## Setup After installing the application, you will need to obtain some information to send to Salesbricks. ### Gather information from Okta An image of the Okta admin dashboard. There are two red ovals: one around the clipboard icon that copies the client ID, and the other around the clipboard icon that copies the client secret. An image of the Okta admin dashboard. There is a red oval around the clipboard icon that copies the issuer URL to the clipboard. ### Send the information to Salesbricks Once you have all the required information below, email them to [integration-support@salesbricks.com](mailto:integration-support@salesbricks.com). * Client ID * Client Secret * Issuer URL Salesbricks Integration Support will handle your request and follow up with you once the integration is configured. ## Login To log in to Salesbricks using Okta: If you don't have a pre-existing user account, one will automatically be created from your Okta details. end-user-dashboard # Private Integration Setup How to set up a private Okta integration with Salesbricks ## Supported features * Single Sign-On (OpenID Connect, IdP-initiated only) * Automatically creates user accounts in Salesbricks when Single Sign-On is initiated by a member of an organization with an active Okta integration To enable this feature on your company's Salesbricks account, you will need to work with Salesbricks Support to activate your instance. ## Overview The following steps ensure that your users can login to Salesbricks with Okta: ## Prerequisites The Okta Single Sign-On integration is only available to Salesbricks users as a paid feature. ## Setup ### Set up the Salesbricks application in Okta manually You will be directed to a page titled “New Web App Integration.” 1. For the “App integration name,” enter `Salesbricks` 2. For the “Sign-in redirect URI,” enter `https://api.salesbricks.com/sso/okta/callback` 3. For the “Sign-out redirect URI,” delete the default value so that the field is blank. 4. For “Assignments,” determine your company’s level of controlled access and immediate access (Note: Federation Broker Mode would disable your Okta End User Dashboard, so we would want to keep immediate access disabled). 5. Click “Save.” You will be directed to the config settings page for your Salesbricks app integration. 1. Under the “General Settings,” click “Edit.” 2. Update “Login initiated by” to `Either Okta or App`. 3. For “Application visibility,” check the box for `Display application icon to users`. This will make the Salesbricks application icon visible in the end user dashboard. 4. For “Initiate login URI,” enter the Salesbricks Okta login URL (`https://api.salesbricks.com/sso/okta/login?client_id=`) followed by your client ID at the top of the Settings page. It should look like: `https://api.salesbricks.com/sso/okta/login?client_id=0ob8xfou2vZPZCbDk5d7` 5. Click “Save.” After installing the application, you will need to obtain some information to send to Salesbricks. ### Gather information from Okta Click the eye button to toggle the visibility. This is usually located under the admin's email address, e.g. salesbricks.okta.com. ### Send the information to Salesbricks Once you have all the required information (summarized below), email them to [integration-support@salesbricks.com](mailto:integration-support@salesbricks.com). * Client ID * Client Secret * Issuer URL Salesbricks Integration Support will handle your request and follow up with you once the integration is configured. # Quickbooks Quickly and easily connect Salesbricks to Quickbooks to automate your invoice, billing, and accounting workflows. export const ConsecutiveImageGap = () => <>
; ## Overview Linking Salesbricks to your Quickbooks Online account allows you to automatically sync invoices, customers, and payments from Salesbricks into Quickbooks. Salesbricks is the source of truth for customers, invoices, and payments. The Quickbooks integration will only write data into Quickbooks. Currently, it is not designed to read data and updates from Quickbooks. If a customer pays their Salesbricks invoice through Stripe, or if they checkout directly through Stripe, Salesbricks will automatically push those invoice and payment details into Quickbooks. If an invoice is paid outside of Stripe (i.e. the customer pays their invoice through check or wire to your bank) the invoice needs to be manually marked as paid within Salesbricks (not Quickbooks). After the transaction is recorded in Salesbricks, the integration will push the payment details automatically into Quickbooks. ## Field Sync Below are the fields that are currently being synced for each object within Quickbooks: ### Invoice Fields * **Bill Email**: The accounts payable email address the customer inputs when signing the order form within Salesbricks. * **Due Date**: The date that the invoice is due, based on the order billing terms. * **Product Line Items**: This includes Bricks sold, units, and amounts. Taxes and discounts are also included. bill-email invoice ### Customer Fields Salesbricks will generate a customer within Quickbooks when a new subscription is created. If you're interested in syncing current orders with existing Quickbooks customers, reach out to Salesbricks Support. new-customer ### Payment Fields As a payment is recorded in Salesbricks, the payment details will be passed in real-time to Quickbooks. payment-sync ## Connecting Salesbricks to Quickbooks Online [https://app.salesbricks.com/admin/settings/integrations](https://app.salesbricks.com/admin/settings/integrations) In Salesbricks, navigate to **Settings** -> **Integrations** and click the **Finance** card. connect-finance Find QuickBooks and click **Get Started**. get-started At this point, you'll be redirected to the QuickBooks login screen. Salesbricks leverages an OAuth connection to QuickBooks, ensuring your username and password are secured and never stored by Salesbricks. login Click **Sign In** and that's it. Your integration is complete! integrated # Managed Package Our managed package enables sellers to click a button within Salesforce's opportunity layout which easily creates or links to an order in Salesbricks. Before installing the managed package, you will need to [connect your Salesforce account to Salesbricks](/integrations/salesforce/overview). new-order ## Setup Follow the steps below to install the managed package in Salesforce: **You will need to be a Salesforce administrator with access to install packages for all users.** Click on the install link below associated with the desired Salesforce environment. [https://test.salesforce.com/packaging/installPackage.apexp?p0=04t5f00000074sS](https://test.salesforce.com/packaging/installPackage.apexp?p0=04t5f00000074sS) [https://login.salesforce.com/packaging/installPackage.apexp?p0=04t5f00000075fS\&isdtp=p1](https://login.salesforce.com/packaging/installPackage.apexp?p0=04t5f00000075fS\&isdtp=p1) Select the option **Install for All Users**. Next, we'll install the component in your Opportunity Layout. In Salesforce, navigate to an opportunity. Click on the gear icon in the top left and select **Edit Page**. edit-page In the search bar, type **order**. You should see an option called **order** under the **Custom - Managed** dropdown. order Drag this component to your desired location in the opportunity layout, and click **Save**. The component should now be available for use within the opportunities in Salesforce. # Overview ## Overview Salesbricks allows you to connect with your Salesforce org so you can: * Create a new Order in Salesbricks * Sync metadata from the Salesbricks Order to an associated Opportunity in Salesforce * Establish a repeatable process for future agreements between you and your customer In order to successfully integrate Salesforce in Salesbricks, you will need to: * Connect your Salesforce instance to Salesbricks * Create the fields in Salesforce needed to host the Salesbricks data * Map the integration fields in Salesbricks to the Opportunity fields you created in Salesforce * Test a Salesbricks Order with a test Salesforce Opportunity, and confirm the data is flowing properly ## Setup [https://app.salesbricks.com/admin/settings/integrations](https://app.salesbricks.com/admin/settings/integrations) In Salesbricks, go to **Settings** > **Integrations** and click on Salesforce. select-salesforce If this is your first time connecting Salesforce to Salesbricks, a modal may appear prompting you to reach out to Salesbricks Integration Support for a new integration instance. send-request Once we notify you to let you know your instance is ready, you may return to the Salesforce page in Salesbricks to begin connecting your integration. In the meantime, you may proceed to the next step of setting up Opportunity fields in Salesforce. A list of Salesbricks fields, data types, and definitions can be found [here](https://docs.google.com/spreadsheets/d/17J8wWAxeeWno_JbbZj4eeQHh8-HTa3XYYJ15tlzSSCM). In Salesforce, review the Opportunity fields available in your settings. If needed, you may create custom fields. opportunity-fields In Salesbricks, return to the Salesforce page in Settings. If your integration is ready to configure, you will see a screen prompting you to log in to Salesforce via a sandbox or production account. integration-login After you log in to Salesforce, you will return to Salesbricks where the next screen allows you to select the integration level between your Salesbricks and Salesforce accounts ("Basic" is selected by default). Select your integration level and click "Next." integration-level Map the fields you would like to push from Salesbricks Orders to Salesforce Opportunities. Click the "Add a field" button to add new rows, or the X icon on the right side of a row to delete it. We recommend mapping the following field out of the gate: Map Salesbricks Order `Grand Total` to your Salesforce Opportunity field `Salesbricks Grand Total`. To map additional fields, you can reference our docs on Salesbricks fields for Salesforce. Click "Save." field-mapping In Salesforce, create a new Opportunity and save. In Salesbricks, create a new Order. new-order As you build your Order, [refer to this document](https://drive.google.com/file/d/1kNlZiARtiaK4mQ-JsmL_o18Yb8f0PKdg/view) to help you navigate the fields within the Order Builder. In the CRM Account field, search for the Account associated with the Opportunity you created in Salesforce. Once you find the correct account, the CRM Opportunity field will be populated with all Opportunities associated with that company. crm-account-opportunity After you save the Order, go to Salesforce and verify that the details from the Order were pushed from Salesbricks to the Salesforce Opportunity. Each time the Salesbricks Order is updated, the updates will be synced to the Salesforce Opportunity. If you have any questions or concerns, feel free to reach out to the Salesbricks Support team via your Slack Connect channel. # Slack ## Why your Slack integration matters slack-notifications Our Slack integration allows your sales, leadership, finance, and customer success teams to stay updated on order and subscription progress in real-time. Getting notifications directly within Slack accelerates your communication cycles, and helps your teams respond faster to changes. Set up one or more dedicated Slack channels for sales, renewals, and payments. Point your notifications to these channels to avoid missing critical updates. ## Setup **1.** In Salesbricks, go to Settings -> Integrations. **2.** Click Slack and follow the prompts to connect. **3.** Select which Salesbricks events you want to push notifications to your Slack channels. ## Events You can set up notifications for the following types of events in Salesbricks: ### Company-wide 🎉 **Order completed**: Notify a team or the company of new deals that have been won. ### Sales 🚀 **Order stage changed**: Alert your sales team and leadership when a deal moves from `Open` to `Seller-signing` and finally to `Closed won`. 🔓 **Order share link opened**: Notify your sellers when a prospect opens a shared link. ### Leadership & Operations 📝 **Signature required**: Notify those at your company responsible for countersigning orders about deals that require a counter-signature to be fully executed. ### Finance & Collections 💳 **Payment successful**: Notify your team when a successful payment has been processed. ⏰ **Payment past due**: Notify your finance team when a payment becomes past due. ❌ **Payment failed**: Alert your team of payments that have failed. ### Customer Success 🔄 **Auto renewals**: We'll roll up a weekly list of customers set to renew automatically. 🤝 **Mutual renewals**: Your team will be alerted about upcoming and late mutual renewals. # Overview Ready to connect your Stripe account to Salesbricks? Follow our [Setup guide](/integrations/stripe/setup) to get integrated within minutes. ## Stripe is for moving money With its reliability and status as an industry standard, Stripe serves as the backbone for payment processing in Salesbricks. Stripe is integrated seamlessly into the purchasing experience on Salesbricks for payment processing, aka "money movement." When you connect your Stripe account to Salesbricks, Stripe creates a Connect account that acts as a shared intermediary between your company and Salesbricks. Each time a buyer initiates a payment in Salesbricks, we link the transaction to the associated Customer object in your Stripe Connect account. This setup ensures that both parties have controlled access, without granting Salesbricks full read/write permissions to your primary Stripe account. Other than payment processing, Salesbricks does not leverage other Stripe objects like subscriptions, invoices, or quotes; these are all functionalities we support within Salesbricks. ## Salesbricks is for closing deals Although Stripe drives the underlying payment infrastructure, Salesbricks offers many features that are designed to empower your B2B SaaS sales team, providing functionalities beyond what traditional Stripe features offer. ### Pricing and Packaging Pricing and Packaging in Salesbricks offers extensive support for pricing models both common and complex. Subscriptions, one-time services, usage-based billing, and percent-based pricing are some of the many features available to help customize pricing for your software or service. ### Deal shaping Deal shaping in Salesbricks allows for bespoke control of contract periods, payment terms, ramping deal structures, order-specific pricing, discounts, and more. ### Sales-led motions Sales-led motions are streamlined in Salesbricks, with features such as URL-based order sharing, buyer checkout, electronic payments, auto-generated order forms, and e-signatures developed in-house. ### Order management Order management involves complicated mid-flight upsells, downsells, renewals, and deal restructuring. Salesbricks simplifies the calculations and workflows so sellers can build orders mid-flight with a few clicks of a button. ### Sales and Finance analytics Robust, interactive reports and charts provide critical insights to how your sales and finance operations are performing. With our Sales and Finance analytics, you get clarity and visibility on how your business is performing just by closing deals on Salesbricks. Gone are the days of buying tools for your sales team from a dozen different companies – Salesbricks facilitates a seamless journey from building an order to successfully closing deals, empowering your business to drive revenue growth efficiently. ## Troubleshooting This section contains scenarios you may encounter when configuring payment options or authorizing Stripe payments. ### ACH transactions **Error message**: `You've exceeded your weekly ACH volume limit. To request an increased limit, please contact us via https://support.stripe.com/contact` **Cause**: New accounts are limited to \$6,000 USD a day and \$10,000 USD a week for the first 4 months after activating your Stripe account. **Solution**: [Contact Stripe support](https://support.stripe.com/contact) and request to raise the weekly volume limit for your ACH transactions. # Setup Quick to configure; simple yet powerful integration. Learn more about our Stripe integration [here](/integrations/stripe/overview). ## Overview Linking Salesbricks to your Stripe account allows you to collect payments through **credit card** or **ACH** via Stripe's API. Once the connection is established, Salesbricks will create a "Connected account" under your parent Stripe account. This is the only account that Salesbricks will have access to manage within Stripe. Salesbricks leverages Stripe solely to collect payment. It does not use Stripe's subscription or invoicing functionalities. When a credit card or ACH payment needs to be processed, Salesbricks handles all of the logic around subscription, billing frequency, and payment terms, and creates a Customer object within Stripe only. ## Connecting Stripe to Salesbricks [https://app.salesbricks.com/admin/settings/integrations](https://app.salesbricks.com/admin/settings/integrations) Within Salesbricks, navigate to **Settings** -> **Integrations**, and click on the **Stripe** card under the "Billing and payment" section. click-stripe Click **Connect to Stripe**. connect-to-stripe Log in to your Stripe account. login-to-stripe If you have already configured your account within Stripe, you can select the saved details. If you're setting up Stripe for the first time, select **Create a new business**. Click **Continue**. select-account If you have a business created in Stripe, but do not see it listed as a selectable option, you likely do not have administrative permissions within Stripe to perform the integration for that account (see "Troubleshooting"). Verify the details of your Stripe account, or fill in the details if you are creating a new business. Click **Agree & Submit**. Congratulations! Your Stripe business account is now connected to Salesbricks. You can now enable several payment options for your customers to use during checkout: order form, credit card, and/or ACH. Read the guide on [Checkout & Invoice Payment Options](/quickstart-guide/checkout-invoice-payment-options). ## Troubleshooting This section contains scenarios you may encounter when connecting your Stripe account to Salesbricks. ### Integration setup #### You have a saved business in Stripe but it is not appearing as a selectable option. **Cause**: If you have a business created in Stripe, but do not see it listed as a selectable option, you likely do not have administrative permissions within Stripe to perform the integration for that account. **Solution**: Ask the admin/owner of your Stripe business account to add administrative permissions to your user. # Adding Team Members ## Who should be added to Salesbricks? As you configure and rollout Salesbricks within your organization, you will need to add a variety of different individuals, usually in the order below: Responsible for configuring your company's logo, branding, and marketing copy. This individual or team will build your Bricks, Plans, and Products that make up your pricing and packaging. Will ensure that all legal documents, such as Master Service Agreements (MSA) and Commercial Terms are up-to-date and ready for use. Configure the connection to finance systems like Stripe, and help implement the flow of any revenue schedules pushed from Salesbricks to your CRM or accounting systems. They will also handle sales tax. Facilitate connecting to your CRM like Salesforce or HubSpot. After your sales team is trained, they will be building orders within Salesbricks, communicating with your customers, and closing deals 🤑! ## Adding a Team Member [https://app.salesbricks.com/admin/settings/team](https://app.salesbricks.com/admin/settings/team) Navigate to **Settings** -> **Team** and click the **New team member** button. new-team-member Fill out the team member details and click **Save**. team-member-details Your team member will receive an email to **activate their account** and **create a password**. activation-email # Creating a Brick ## What's a Brick? **Bricks** are a crucial part of your pricing and packaging structure. They are the lowest-level data point within a SaaS transaction where pricing is assigned. You can think of a brick as a line-item SKU on your transaction. When checking out at the store, your receipt will have several lines (especially if you're like me and can't stop grabbing things you don't really need). Each line item (block of cream cheese, pellet grill, smart-controlled heated socks, etc) represents a SKU (stock keeping unit). Just as the name denotes, these are items that you are interested in keeping track of in your SaaS inventory. ## How to Create a Brick [https://app.salesbricks.com/admin/bricks](https://app.salesbricks.com/admin/bricks) Navigate to **Bricks** and click **New brick**. new-brick Fill out your Brick details. brick-details ## Schedule Subscriptions, one-time, and usage (oh my!) Use the guide below to determine which pricing schedule to select. Make sure to get it right the first time, as this cannot be edited after your brick is saved (more on that in a minute). ### Subscription Use the Subscription payment schedule type any time your customers agree to make a recurring payment in exchange for ongoing access to the Brick. For example, you may set up your schedule so that users agree to pay for a license to your platform for 12 months. ### One-time One-time payment schedules are used for non-recurring purchases, such as implementation fees or service hours for services outlined in a statement of work. ### Usage Usage pricing denotes billing in arrears for software or services consumed, or allowing your clients to `pay-as-you-go`. Note that Usage Bricks require additional integration for your platform to send usage data to Salesbricks. For usage, you will be presented with two measurement options: `final value` and `prorated`. #### Final value Uses a running counter that tallies up total usage over a billing cycle (generally, per month) #### Prorated Uses a running counter that tallies up usage over a period of time over a billing cycle (generally, per month) ### Milestone Milestone payment schedules allow you to defer payment for a task or service until it has been completed. For example, you may require your customer to complete a virtual onboarding/orientation session. Once you mark this as completed in Salesbricks, the customer would then be invoiced for the milestone. ### Some pricing options are dependent on the Brick pricing schedule Whenever you create a Brick, either **Subscription**, **One-time**, **Usage**, or **Milestone** is set for the Brick schedule. Selecting the correct Brick schedule will impact the options available when setting the pricing on the Brick within the Plan. For example, if **Usage** is selected you will have the option to input a **pay-as-you-go** and **pre-committed** rate, which can be in fractional cents (not available for Subscription nor One-time purchase schedules). ## Why is the Brick framework so important? Just like when building a brick house (like The Commodores?), your Bricks need to have structure and a framework. The Salesbricks Brick framework restricts SKU proliferation - when an organization creates a new underlying SKU each time an item needs to be sold at a different price point or schedule. A brick can belong to one or many Products and Plans, as depicted below. hierarchy Brick pricing is decoupled from from the Brick creation process, and applied when only when adding a Brick to a Plan. This enables your company with the flexibility to innovate on pricing structures, while still allowing those price variations to be tied back to a singular Brick unit. Without the the Brick framework, obtaining SKU/Brick data for a single Brick across all customers and price variations be a Herculean effort. With Salesbricks, this data is only a few clicks away. # Creating a Plan export const ConsecutiveImageGap = () => <>
; ## What's a Plan? A **Plan** is a specific offering or bundle of your software and/or services at a certain price point. Plans can be set up with the following configurations: * **Many** bricks (Platform, Seats, API call volume, and optional bricks like Implementation Services) * **One** brick (User Licenses) * **Zero** bricks (the Plan gives access to the platform) Each Plan variation can be targeted toward a segment of your customers. As your customers mature with your offerings (requiring additional licenses, features, etc.), it's extremely easy to upsell them to a higher Plan within Salesbricks. ## How to Create a Plan [https://app.salesbricks.com/admin/products](https://app.salesbricks.com/admin/products) Navigate to **Products** and click the Product you want to add the Plan to. select-product Click **New plan**. new-plan Fill in your new Plan's **name**, **definition**, and **summary**. fill-plan-details These fields are typically displayed in the following key areas of the platform: **Order builder:** visible to your sales team, and customer order checkout page if the plan is not marked private. order-builder **Order form:** seen in the customer contract. order-form **Invoice:** displayed if the customer checks out with an order form (no invoices are sent if paying electronically via Stripe at checkout). invoice Input the plan pricing options. input-plan-pricing **Example 1:** Displayed billing schedule amortized by no-amortization amortized-by-months amortized-by-days amortized-by-hours **Example 2:** Postscript pricing-page **Example 3:** Allowed billing schedules allowed-billing-schedules ### Do I have to include a Brick on my Plan? It is not required to add Bricks to a Plan. However, if you are looking to include a quantity of units as part of the Plan (e.g. 5 user licenses included in the Plan price) and would like to charge per additional unit, you must include the unit Brick. Add Bricks. Click **Edit bricks**. To add additional Bricks, click the **New brick** button. Check out the [Creating a Brick](/quickstart-guide/bricks-products-plans/creating-a-brick) guide for details on the Brick builder. Select the bricks to be added to the plan by clicking on them. select-brick Hover over the **Pricing not set** and click on the dollar sign. set-pricing Configure your Brick pricing and packaging. See the section on [Pricing Structures](/quickstart-guide/bricks-products-plans/creating-a-plan#pricing-structures) for guidance on structuring the pricing. brick-pricing-packaging Once you've added all the Bricks to your Plan and configured pricing for each, click **Done**. Decide if the plan should be private, and click **Publish**. Marking a Plan as private excludes it from any self-serve views and makes it available exclusively through your sales-led Orders. **One last important step!** After publishing your Plan, don't forget to go back into your product and click **Activate**. This will turn your product live for the world (or, at least your team and customers). successfully-activated Well done! You just did in minutes what would take weeks or months in a traditional CPQ tool. For those crazy enough to try and scale with manual processes and spreadsheets, we just gave you back your nights, weekends, and holidays - not to mention saving you from getting a plethora grey hairs! 🧓🏼 👵🏼 You're welcome. 🙌 😁 ## Pricing Structures A **pricing structure** is a pre-defined discounting mechanism that is designed to incentivize customers as they purchase more of your Product. There are 4 pricing structures that can easily be designed in Salesbricks: ### Flat-rate Flat-rate structure is used when you want to **set the unit price equally**, regardless of how many units your customer is buying. At the grocery store, each apple costs 50¢. Frank wants to buy 3 apples: $$\$0.50 * 3 = \$1.50$$. Rita wants to buy 100 apples: $$\$0.50 * 100 = \$50$$. Under flat-rate pricing, the 1st apple costs as much as the 100th apple, with no discount for having purchased a larger quantity. ### Tiered Tiered is a pricing structure where your customers are charged the **sum of each tier** as unit counts reach tier thresholds. In the example below, there are several pricing tiers and the buyer passes fully through the first two tiers and partially into the third. There are also five licenses included at no additional charge, which are taken from the highest tier. tiered-pricing Tiana wants to book a room at a hotel: * The first two nights are priced at \$100 per night. * The next two nights are discounted at \$80 per night. * Any night after that is \$50 per night. Tiana plans to stay for 7 nights: $$(\$100 * 2) + (\$80 * 2) + (\$50 * 3) = \$510$$. Under tiered pricing, the buyer's total cost is calculated according to the sum of each respective tier. #### Tradeoff to consider when using tiered pricing **Pro:** Tiered pricing allows your customers to enjoy a lower per-unit price point as they purchase additional units, while minimizing the overall discount for you as the seller. **Con:** Tiered pricing adds complexity to the pricing for your buyers especially when trying to forecast growth and may require additional explanation and support. ### Volume Volume pricing is used when you want to provide a quantity discount for volume purchases, but want the discounted unit cost to be the **same for all units** in the Order. volume-pricing Vernon wants to buy tickets to a baseball game: * 1-5 tickets: \$50 per ticket * 6-15 tickets: \$40 per ticket * 16-30 tickets: \$25 per ticket Vernon is buying a row of seats for himself and 9 of his friends: $$10 * \$40 = \$400$$. Unlike tiered pricing, Vernon is getting the same discount for each of the 10 tickets under volume pricing. Each of his friends owes him the same amount. ### Block Block structures are used when you want to **sell your units in blocks instead of individually**. Similar to buying eggs where you must purchase by the dozen (12, 24, 36, etc.), you can package your units together and sell them in blocks. This strategy can be useful if your buyer's unit needs to fluctuate within a billing period, eliminating the need for upgrades or overages, assuming they stay within the block. Bob needs 16 eggs for his recipe. At the farmer's market, eggs are sold by the dozen: * 1 dozen: \$5 * 2 dozen: \$8 * 3 dozen: \$10 Although he only needs 16, Bob will need to purchase a full 2 dozen eggs at \$8. Under block pricing, the seller defines how many units are included in each block. The buyer pays for, and receives, the entire quantity of units for the block they purchased. #### Pricing guide when building an order When activating Tiered, Volume, or Block pricing, a help text icon appears on the order builder to guide both your sales teams and self-service users on the pricing structure (see below for example). pricing-help-icon # Creating a Product ## What's a Product? A Product can be thought of as your company's price book. Within the Product, you will create Plans and within those Plans, Bricks can be added. Building within the Product structure allows for versioning and flexibility as you roll out new pricing structures and deprecate old ones. ## How to Create a Product [https://app.salesbricks.com/admin/products](https://app.salesbricks.com/admin/products) Navigate to **Products** and click **New product**. new-product Edit the Product details. Input your logo, primary color, and fill out the Product fields. Note that Product details will not be visible to your customers. product-details Standard order confirmation page example: order-confirmation Click **Create** or **Update** to save your changes. Once you've added and published your Plan(s) (see [Creating a Plan](/quickstart-guide/bricks-products-plans/creating-a-plan)) within your Product, you'll be ready to activate it. You can easily do this by clicking the **Activate** button. This will make your Product live for the world (or, your team and customers, for now). activate-product # Overview The diagram below outlines the relationship between Products, Plans, and Bricks. Note that a Brick can belong to one or more Plans within a Product, with distinct pricing for each. hierarchy ## What's a Brick? [How to Create a Brick](/quickstart-guide/bricks-products-plans/creating-a-brick#how-to-create-a-brick) A **Brick** is the lowest-level data object within your SaaS transaction, where pricing is assigned and represents the items that you are interested in keeping track of in your SaaS inventory. ## What's a Product? [How to Create a Product](/quickstart-guide/bricks-products-plans/creating-a-product#how-to-create-a-product) A **Product** can be thought of as a price book. Within the Product, you will create Plans and within those Plans, Bricks can be added. Products can be activated or deactivated as they are phased in or out of use by your team. As your sales team begins creating Orders in the Salesbricks Order builder, they are able to select active Products under the Product dropdown. ## What's a Plan? [How to Create a Plan](/quickstart-guide/bricks-products-plans/creating-a-plan#how-to-create-a-plan) A **Plan** is a specific offering of your software and/or services at a certain price point. Plans can include no Bricks (where pricing is set for the entire plan), a single Brick, or many Bricks. Each Plan variation can be targeted toward a segment of your customers. As your customers develop additional depth with your products or require additional features, it's extremely easy to upsell them to a higher plan within Salesbricks. # Building an Order export const ConsecutiveImageGap = () => <>
; ## Setup In Salesbricks, navigate to Orders and click "New order." ## Customer **Customer name:** The name of the customer. Two CRM-specific fields replace the **Customer name** field: **CRM account:** A search field to pull the customer from your CRM. Data from this order will be synced to the associated customer in your CRM. **CRM opportunity:** A search field to pull the opportunity or deal from your CRM. Data from this order will be synced to the associated opportunity or deal in your CRM. **Order description:** Brief description of the order. **Order owner:** The team member who is in charge of managing the order. Pre-populating other customer info (address, point of contact, etc.) is optional. Your customer will have the opportunity to complete these fields during checkout. ## Deal setup **Start date and Contract period (number of months):** The end date will update dynamically based on your selections. **Billing schedule:** How often would you like this customer to receive invoices? Choose one of the following options: * Monthly * Quarterly * Semi-annually * Annually * All upfront **First charge/invoice date:** When would you like this customer to be charged/invoiced for their first payment? Choose one of the following options: | | If the customer checks out via order form: | If the customer checks out via electronic payment: | | ----------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Contract start date** | they will receive the invoice on the declared "Start date" | they will be prompted to enter their payment info (credit card or ACH) during checkout, and their payment method will be charged on the declared "Start date" | | **Checkout date** | they will receive the invoice immediately upon signing the order form and completing checkout | they will be prompted to enter their payment info (credit card or ACH) during checkout, and their payment method will be charged immediately upon completing checkout | The first charge/invoice date applies whether the customer completes checkout, or you close the order manually. **Currency:** Select one of the currency options supported by your company. New orders default to USD. You may update your supported currencies under Settings -> Finance. ## Product **Product:** Select the product for this order. **Plan:** Select the plan for this order. **Add-ons:** Add the desired bricks to this order. ## Discounts and Billing **Sales discount:** Discounts which carry over to the next agreement. **One-time discount:** Discounts which only apply to this specific agreement, and do not carry over to the next agreement. **Expiration date:** When should this discount expire? **Minimum spend:** The minimum TCV required for the discount to apply. **Payment terms:** How many days after the billing date will an invoice be considered past due? Choose one of the following options: * Due on receipt * Net 10 (Due after 10 days) * Net 15 (Due after 15 days) * Net 30 (Due after 30 days) * Net 45 (Due after 45 days) * Net 60 (Due after 60 days) * Net 90 (Due after 90 days) ## Terms **Terms and Conditions:** Your Master Service Agreement. When you create a new Order, Salesbricks automatically includes the terms document you uploaded in the Settings page. **Commercial Terms:** Any terms specific to this order. If you need to adjust and redline your terms, click on the download cloud button, redline the terms with your prospect, and then click the upload cloud button to attach the clean terms to the Order. **Renewal terms:** Choose one of the following options: * Automatic (Renews when contract expires) * Manual (Buyer must agree to renewal) ## Share the Order After you save the order, click on the paper airplane to share it via email, or send a shareable URL link. share-order-button share-order-modal # Checkout & Invoice Payment Options ## Overview Checkout and invoice billing options can be configured to meet your business's and buyer's needs. [https://app.salesbricks.com/admin/settings/finance](https://app.salesbricks.com/admin/settings/finance) Navigate to **Settings** -> **Finance**, and you'll find the configuration options below. global-payment-options ## Checkout options During the final step of the buyer checkout process, your customer can select how they would like to execute the Order. You can customize the checkout and payment options available to your customer at checkout. Opt in or out of the following selections: ### Order Form e-signature If the signatory is the same person as the one checking out, they will be led to an electronic version of the order form, where they will be prompted to review and provide an e-signature. If the signatory is a different person than the one at checkout, they will receive an email containing a link that leads them to review and sign the order form. After the signatory has signed the order form, your company's appointed document signer will be notified to countersign. Once both parties have signed the order, an invoice will be generated and sent to the buyer's accounts payable contact for payment. order-form-checkout Please note that the buyer and seller must both fully execute for the Order to move to closed won. #### Minimum Total Contract Value required to use Order Form e-signature If you opt in to the Order Form e-signature checkout, you can also set a minimum TCV (total contract value) amount in order for the customer to checkout via order form. minimum-tcv-required In the image above, the minimum TCV requirement is set to \$1,000. This means that if the TCV of a given Order is less than \$1,000, the order form option will not appear during checkout. ### Credit card credit-card-checkout Your customer will be able to checkout and pay by credit card at the same time. With this option, no signatures are required to close the Order. Instead, buyers must check the box indicating that they agree to your company's terms and conditions. The customer will receive a receipt via email after the payment is processed successfully. This option is powered by Stripe, and Stripe processing fees may apply. ### ACH debit ach-debit-checkout Your customer will be able to pay the invoice by providing their bank details. With this option, no signatures are required to close the Order. Instead, buyers must check the box indicating that they agree to your company's terms and conditions. The customer will receive a receipt via email after the payment is processed successfully. ACH processing may take up to 4 business days. This option is powered by Stripe, and Stripe processing fees may apply. ## Invoice payment options Each invoice has a clickable link that leads your customer to an electronic paywall powered by Salesbricks. You can now customize the payment options available to the customer at the time of paying the invoice. Opt in or out of the following selections: ### Credit card Your customer will be able to pay the invoice by credit card, and can save credit card details for future payments. This option is powered by Stripe, and Stripe processing fees may apply. ### ACH debit Your customer will be able to pay the invoice by providing their bank details, and can save bank details for future payments. This option is powered by Stripe, and Stripe processing fees may apply. ### Wire transfer wire-transfer Include wire instructions on your invoices. Currently, this option is included by default on all invoices and will reflect the banking information entered under **Settings** -> **Finance**. # Company Details & Branding Tailor your Salesbricks site to your organization [https://app.salesbricks.com/admin/settings/company](https://app.salesbricks.com/admin/settings/company) Navigate to **Settings -> Company**. Click the Edit edit-icon icon. Fill out your company information. company-details Navigate to **Settings -> Branding**. [https://app.salesbricks.com/admin/settings/branding](https://app.salesbricks.com/admin/settings/branding) Click the Edit edit-icon icon. Upload your company logos. logo-upload We recommend uploading your logo in **.png** format, with a transparent background. Logos in **.jpg** format are supported as well. Add a primary color by entering your hexadecimal color code. This color will be listed on your company's branding guide, if available. You can also easily capture the background color of your company's website with a tool like the [ColorPick Eyedropper Chrome Extension](https://chrome.google.com/webstore/detail/colorpick-eyedropper/ohcpnigalekghcmgcdcenkpelffpdolg). # Getting Started Welcome to Salesbricks! This guide will help you prepare your team to build and close your first order. Whether you want to provide your customers a frictionless checkout experience, automate your subscription billing, offer flexible pricing and contract terms, or manage customer subscriptions seamlessly, setting your team up on Salesbricks is the key to your success. ## Overview 1. Update your company settings 2. Integrate your Stripe account 3. Select your customers' payment options 4. Set up pricing & packaging ## 1. Update your company settings **a.** In Salesbricks, go to Settings. **b.** Complete the following sections: * Company (set company details & contact info) * Team (add users & define roles) * Branding (upload company logo & set brand color) * Legal (upload terms & set document signer) * Finance (provide banking info & set payment options) This video guide walks you through how each field is used in the platform. ### Why your company settings matter buyer-checkout When you customize your settings, you tailor the Salesbricks platform to your company's image and goals: order links showcase your logo and product; invoices include your address and bank instructions. Completing this step means that your branding, legal, and financial information are ready for a seamless sales process. ## 2. Integrate your Stripe account **a.** In Salesbricks, go to Settings -> Integrations. **b.** Click Stripe and follow the prompts on screen (along with our detailed setup guide) to create a Stripe Connected account. ### Why your Stripe integration matters
salesbricks-vs-stripe
Salesbricks leverages Stripe for credit card & ACH payments. Integrating your Stripe account ensures that your payment process is compliant and automated, minimizing manual intervention. Read more about how we use Stripe within the Salesbricks platform here. ## 3. Select your customers' payment options **a.** In Salesbricks, go to Settings -> Finance. **b.** Click the Edit icon and select the payment options you want to enable for **checkout** (customer purchase), as well as how your customers can **pay an invoice**. ### Why your customers' payment options matter Now that your Stripe account is integrated, you can enable secure, instant transactions online by allowing your customers to pay via credit card or ACH debit. Click here to read a detailed guide about our variety of payment options. ## 4. Set up pricing & packaging **a.** In Salesbricks, go to Products. **b.** Create a product. [https://docs.salesbricks.com/quickstart-guide/bricks-products-plans/creating-a-product](https://docs.salesbricks.com/quickstart-guide/bricks-products-plans/creating-a-product) **c.** Within your product, create a plan. [https://docs.salesbricks.com/quickstart-guide/bricks-products-plans/creating-a-plan](https://docs.salesbricks.com/quickstart-guide/bricks-products-plans/creating-a-plan) **d.** Within your plan, click "Edit bricks" to start adding bricks to your plan. **e.** Click "+ New brick" to create a brick, which you could then add to your plan. [https://docs.salesbricks.com/quickstart-guide/bricks-products-plans/creating-a-brick](https://docs.salesbricks.com/quickstart-guide/bricks-products-plans/creating-a-brick) **f.** Define your pricing and publish your plan. ### Why pricing & packaging matters hierarchy Configuring your pricing in advance will set you up for repeatable sales motions. From here, you will be able to build orders using your preset pricing. Alternatively, our order builder allows you override your preset pricing at the time of order creation, to build out an entirely bespoke proposal for your customer. ## Next Steps Once you complete these steps, you'll be ready to hit the ground running and start managing deals on Salesbricks. You could use this opportunity to continue connecting other integrations: Currently, we support integration with Salesforce or HubSpot. #### Why your CRM integration matters Integrating your CRM will enable you to quote and close orders in Salesbricks, and allow the order data to sync across both systems for org-wide visibility and continuity. Click here to start setting up your Slack integration. #### Why your Slack integration matters Our Slack integration allows your sales, leadership, finance, and customer success teams to stay updated on order and subscription progress in real-time. Getting notifications directly within Slack accelerates your communication cycles, and helps your teams respond faster to changes. Click here to start setting up your Quickbooks integration. #### Why your Quickbooks integration matters Our Quickbooks integration allows you to automate your invoice, billing, and accounting workflows by seamlessly syncing invoices, customers, and payments from Salesbricks into Quickbooks. Aside from these, it's time to build your very first order - you can read more about that here. For any additional help or troubleshooting, please reach out to Salesbricks Support via Slack. # Introduction Close more deals faster with the simplest way to buy and sell software. Ready to start using Salesbricks? Check out our guide to [Getting Started](/quickstart-guide/getting-started). salesbricks-value ## Overview & Value Proposition Salesbricks is the Shopify for B2B SaaS companies. Whether you are the founder of a new company or part of a larger organization, Salesbricks facilitates: * **Building the sales infrastructure** to power SaaS transactions for your organization. * **Automating administrative processes** around pricing, quoting, billing, and invoicing. * **Setting guardrails** for your sales teams, ensuring best practices are followed. * **Ensuring consistency** across all your deals, including contract management. * **Making the purchase** experience magical for your team and customers alike. * **Managing entitlements** for the features your customers have purchased. Most importantly, Salesbricks **establishes the foundation** for your SaaS transactions, allowing push-button access to mission-critical data in the event of an IPO, acquisition, or other exit event -- data that otherwise is locked away in PDFs and spreadsheets. Enjoy the only platform that lets buyers close, sign, and pay in one seamless motion. # Navigating Salesbricks ## Products [https://app.salesbricks.com/admin/products](https://app.salesbricks.com/admin/products) Think of **Products** as your price book. You can configure various Products and define Plans, Bricks, and default finance settings for any time the Product is selected on an Order. products ## Bricks [https://app.salesbricks.com/admin/bricks](https://app.salesbricks.com/admin/bricks) Your **Bricks** represent line-item SKUs or add-ons offered in each of your Plans. bricks Check out more on Bricks [here](/quickstart-guide/creating-a-brick). ## Connect to your Stripe account [https://app.salesbricks.com/admin/settings/integrations/stripe](https://app.salesbricks.com/admin/settings/integrations/stripe) Connecting to Stripe only takes a few minutes, and is a great option to allow your customers to pay you quickly and easily with a credit card, or by bank through ACH. stripe