Integrating your e-commerce backend with Builder.io makes working with your product content and data so much easier, and unlocks use cases like:
-
Symbols or Custom components that can accept a resource identifier, giving the content creator a way to search and choose a specific resource. One example could be a custom component that takes a product collection as an input and renders all its products in a grid.
-
Targeting content by a resource, for example, an announcement bar where its content only targets visitors who have a specific product in their cart, or are identified by a specific persona.
The most straightforward way to integrate your backend is using a @builder.io/commerce-plugin-tools
, and here are some steps to build your own custom backend plugin:
- clone Builder repository and then navigate to the plugin example folder here:
git clone https://github.com/BuilderIO/builder.git
# start from a preconfigured plugin code by copying its content to another folder
cp -r plugins/swell plugins/[my-backend]
npm install @builder.io/commerce-plugin-tools
- Delete content of
src/plugin.tsx
, so we replace it with the new backend operation, then start by
import { registerCommercePlugin } from '@builder.io/commerce-plugin-tools';
const pluginConfig = {
// id should match the name in package.json
id: `@foobar/plugin-builder`,
// will be used to prefix generated types
name: 'FooBar',
// a list of input definition that you might need to communicate with custom backend API ( optional )
settings: [
{
type: 'text',
name: 'storeApiKey',
helperText: 'you can get your store Api Key from your account at https://foobar.io/account',
}
],
ctaText: 'Connect your FooBar backend',
};
registerCommercePlugin(pluginConfig, (settings) => {
const storeApiKey = settings.get('storeApiKey');
const fooBarService = new FooBarService(storeApiKey);
// return a mapping between each resource and it's API functions.
return {
// for example to add product types
product: {
findById: id => fooBarService.findProductById(id),
search: text => fooBarService.searchProducts(text),
// should return BuilderRequest interface
// https://github.com/BuilderIO/builder/blob/master/plugins/shopify/src/interfaces/builder-request.ts
getRequestObject: id => ({
'@type': '@builder.io/core:Request',
request: {
// tell builder how to load this object
url: `https://foobarservice.com/products/${id}.json`,
},
options: {
product: id,
},
})
}
}
})
Now that we connected our API, we can check to see if it’s working correctly by running locally
npm install
npm run start
Start a server at http://localhost:1268
Go to the Builder plugin settings and add your local plugin https://localhost:1268/plugin.system.js?pluginId=
@foobar/plugin-builder`
Now you should see new field types for products, such as:
- A single product picker with search
- A product list picker with search
- A custom field: product preview, that allows you to set the specific model editing url to be a computed value of the product in preview: for example
${space.siteUrl}/product/${previewProduct.handle}
and allow the content editor to test their templates on multiple products.
Once you’re done testing your new integration, submit a pull request to Builder with the new code, we’ll help review it, and publish it to npm. Or, if you’d like it to be a private plugin, talk to us, and we can support private plugins as part of an enterprise plan.
See more:
Swell.is plugin source code for a more concrete example.
Extensibility docs for more ways on how Builder can be extended.