Drop-in product customization for any e-commerce platform
The easiest way to add the customizer. Just add data attributes to an element:
<!-- Container where customizer will render -->
<div id="customizer"
data-pc-product-id="YOUR_PRODUCT_ID"
data-pc-store-id="YOUR_STORE_ID"
data-pc-template-id="OPTIONAL_TEMPLATE_ID"
data-pc-variant-id="OPTIONAL_VARIANT_ID"
data-pc-on-finalize="handleFinalize">
</div>
<!-- Include SDK - it auto-detects its host from script src -->
<script src="/sdk/product-customizer.js" data-pc-auto-init></script>
<script>
// Register callback for when design is finalized
ProductCustomizer.registerCallback('handleFinalize', function(data) {
console.log('Design finalized!', data);
// Add to cart logic here
});
</script>
For more control, initialize programmatically:
<script src="/sdk/product-customizer.js"></script>
<script>
const customizer = ProductCustomizer.init({
container: '#customizer',
productId: 'prod_abc123',
storeId: 'store_xyz',
templateId: 'tmpl_001', // Optional: pre-load template
variantId: 'var_red', // Optional: pre-select variant
token: 'existing_session', // Optional: resume design
mode: 'inline', // 'inline' | 'modal' | 'fullscreen'
theme: {
primaryColor: '#4f46e5',
fontFamily: 'Inter, sans-serif'
},
onReady: (instance) => {
console.log('Customizer ready!');
},
onDesignChange: (design) => {
console.log('Design changed:', design);
},
onFinalize: (data) => {
console.log('Finalized:', data);
addToCart(data);
},
onError: (error) => {
console.error('Error:', error);
}
});
// Control methods
customizer.setVariant('var_blue');
customizer.save();
customizer.finalize();
customizer.destroy();
</script>
Open the customizer in a modal when user clicks a button:
<!-- Customize button with data attributes -->
<button data-pc-open
data-pc-product-id="prod_abc123"
data-pc-store-id="store_xyz"
data-pc-variant-id="var_red">
Customize This Product
</button>
<script src="/sdk/product-customizer.js" data-pc-auto-init></script>
Live Demo:
| Option | Data Attribute | Type | Description |
|---|---|---|---|
productId |
data-pc-product-id |
String (required) | Your product ID |
storeId |
data-pc-store-id |
String (required) | Your store ID from the dashboard |
templateId |
data-pc-template-id |
String | Pre-load a design template |
variantId |
data-pc-variant-id |
String | Pre-select product variant |
token |
data-pc-token |
String | Session token to resume existing design |
mode |
data-pc-mode |
String | inline, modal, or fullscreen |
theme |
data-pc-theme |
Object/JSON | Custom theming options |
onFinalize |
data-pc-on-finalize |
Function/String | Callback when design is finalized |
Complete example for adding customized products to cart:
<script src="/sdk/product-customizer.js"></script>
<script>
ProductCustomizer.init({
container: '#customizer',
productId: '{{ product.id }}',
storeId: 'YOUR_STORE_ID',
variantId: '{{ selected_variant.id }}',
onFinalize: function(data) {
// data contains:
// - design: { id, session_token, canvas_data, preview_url }
// - product: { id, name }
// - variant: selected variant ID
// - previewUrl: base64 preview image
// Add to cart with customization data
fetch('/cart/add', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
product_id: data.product.id,
variant_id: data.variant,
quantity: 1,
properties: {
_customization_id: data.design.id,
_customization_preview: data.previewUrl,
_customization_token: data.design.session_token
}
})
})
.then(res => res.json())
.then(cart => {
// Redirect to cart or show success
window.location.href = '/cart';
});
}
});
</script>
<!-- In your Swell product template -->
<div id="customizer"
data-pc-product-id="{{ product.id }}"
data-pc-store-id="{{ store.customizer_store_id }}"
data-pc-variant-id="{{ selected_option.id }}">
</div>
<script src="{{ settings.customizer_host }}/sdk/product-customizer.js"></script>
<script>
ProductCustomizer.init({
container: '#customizer',
productId: '{{ product.id }}',
storeId: '{{ store.customizer_store_id }}',
onFinalize: async function(data) {
// Swell cart integration
await swell.cart.addItem({
product_id: '{{ product.id }}',
quantity: 1,
options: {
customization_design_id: data.design.id,
customization_preview: data.previewUrl
}
});
// Refresh cart
window.location.reload();
}
});
</script>
Set these environment variables on your TruCustom server:
# .env or environment configuration
APP_URL=https://customizer.yourdomain.com
RAILS_ENV=production
# Database
DATABASE_URL=postgres://user:pass@host:5432/product_customizer
# File Storage (AWS S3)
AWS_ACCESS_KEY_ID=your_key
AWS_SECRET_ACCESS_KEY=your_secret
AWS_REGION=us-east-1
AWS_BUCKET=your-bucket
# Optional: Redis for caching
REDIS_URL=redis://localhost:6379/0
Your dashboard provides a ready-to-use embed snippet with your store ID pre-filled:
<!-- Generated from Dashboard → Stores → [Your Store] → Embed Code -->
<script
src="https://customizer.yourdomain.com/sdk/product-customizer.js"
data-pc-store-id="your-actual-store-id"
data-pc-auto-init>
</script>