Connect Retool to PrestaShop by creating a REST API Resource using PrestaShop's Webservice API key with Basic Auth. PrestaShop's API returns XML by default — use JavaScript transformers in Retool to parse the response into table-ready data. Build a modern admin panel for products, orders, and customers that's faster than PrestaShop's native back office.
| Fact | Value |
|---|---|
| Tool | PrestaShop |
| Category | E-commerce |
| Method | REST API Resource |
| Difficulty | Intermediate |
| Time required | 30 minutes |
| Last updated | April 2026 |
Build a Custom PrestaShop Admin Panel in Retool
PrestaShop's built-in back office is comprehensive but slow for repetitive operational tasks — bulk updating product prices, reviewing a day's orders, or searching customer records across a large catalog. Retool integrates directly with PrestaShop's Webservice API to give operations teams a faster, more flexible admin interface that can be customized exactly for their workflows.
With a Retool-PrestaShop integration, your team can view and manage orders with sortable tables and bulk status updates, search and edit product details without navigating multiple back office pages, and look up customer records with their full order history in a single panel. Unlike third-party PrestaShop management tools, Retool's integration can also combine PrestaShop data with your own databases — joining order data with fulfillment records, inventory systems, or supplier pricing in the same app.
PrestaShop's Webservice API uses a simple key-based authentication scheme and returns data in XML format by default (JSON output is available via a query parameter). The integration requires enabling the Webservice feature in PrestaShop's Advanced Parameters settings and creating an API key with scoped permissions for the resources Retool needs to access.
Integration method
PrestaShop connects to Retool via a REST API Resource using Webservice API key authentication (sent as Basic Auth with the key as the username and an empty password). Unlike JSON-native APIs, PrestaShop's Webservice returns XML by default — you can request JSON output by adding output_format=JSON as a URL parameter. All requests are proxied server-side through Retool, keeping API keys secure and eliminating CORS issues from your browser.
Prerequisites
- A PrestaShop store with Webservice API enabled (Advanced Parameters → Webservice → Enable PrestaShop's Webservice)
- A PrestaShop Webservice API key with permissions for the resources you need (orders, products, customers, etc.)
- Your PrestaShop store URL (e.g., https://your-store.com)
- A Retool account with permission to create Resources
- Basic familiarity with Retool's query editor, Table component, and JavaScript transformer syntax
Step-by-step guide
Enable PrestaShop Webservice and create an API key
Before configuring Retool, you need to enable PrestaShop's Webservice and generate an API key. Log into your PrestaShop back office and navigate to Advanced Parameters → Webservice. Toggle 'Enable PrestaShop's Webservice' to Yes and save. Next, click 'Add new webservice key' to create a new key for Retool. In the Key field, either paste a custom 32-character key or click 'Generate' to auto-generate one. Add a description such as 'Retool Integration' to identify this key's purpose. In the Permissions section, grant the permissions Retool needs. For a read-only reporting dashboard, enable GET permission for: orders, order_states, order_details, customers, products, stock_availables, and carriers. For a management panel that can update records, also enable PUT. For order creation, enable POST. Avoid granting unnecessary permissions — follow the principle of least privilege. Click Save to create the key. Copy the generated API key string — you'll need it for the Retool resource configuration. Note: PrestaShop's Webservice returns XML by default. You can request JSON by appending ?output_format=JSON to all API requests, which is much easier to work with in Retool.
Pro tip: Create separate Webservice API keys for different Retool apps — a read-only key for reporting dashboards and a read-write key for management tools. This limits the blast radius if a key is ever accidentally exposed.
Expected result: A PrestaShop Webservice API key is created and visible in Advanced Parameters → Webservice with your configured permissions.
Create a PrestaShop REST API Resource in Retool
Go to the Resources tab in your Retool instance and click Add Resource. Select REST API from the resource type list. Name the resource 'PrestaShop API'. In the Base URL field, enter your PrestaShop store URL followed by /api — for example, https://your-store.com/api. Do not include a trailing slash after /api. For authentication, PrestaShop Webservice uses Basic Auth where the API key is the username and the password is empty. Select Basic Auth from the Authentication dropdown. In the Username field, enter your Webservice API key. Leave the Password field completely empty. PrestaShop requires the output_format=JSON parameter on every request to return JSON instead of XML. Add this as a default URL parameter at the resource level: click Add URL parameter, enter key = output_format and value = JSON. This ensures every query automatically requests JSON without needing to add it to each individual query. Optionally, store your API key as a Retool configuration variable for better security: Settings → Configuration Variables → create PRESTASHOP_API_KEY as a Secret variable, then use {{ retoolContext.configVars.PRESTASHOP_API_KEY }} in the Basic Auth username field. Click Save Changes. Test the connection by clicking Test Connection or by creating a simple test query.
Pro tip: If your PrestaShop store uses a self-signed SSL certificate, you may see SSL verification errors. For self-hosted Retool, you can set NODE_EXTRA_CA_CERTS to your certificate's path. For Retool Cloud, ensure your PrestaShop store uses a valid SSL certificate from a trusted CA.
Expected result: The PrestaShop API resource is saved in Retool with Basic Auth configured and the output_format=JSON default URL parameter set. The Resources tab shows the resource with a green status indicator.
Query PrestaShop orders and product data
Create your first Retool query to fetch orders. In your app's Code panel, click + to add a new query. Name it getOrders and select the PrestaShop API resource. Set Method to GET. In the Path field, enter /orders. Add URL parameters: - key = display, value = full (returns all order fields instead of just IDs) - key = sort, value = id_DESC (latest orders first) - key = limit, value = 50 - key = filter[current_state], value = {{ dropdown_status.value || '' }} (optional status filter) The display=full parameter is critical — without it, PrestaShop returns only the list of order IDs, not the actual order data. Similarly, create a getProducts query (GET, /products) with display=full, limit=100, and a filter[name] parameter: {{ '%' + textInput_search.value + '%' }} for name search. For order states (status names), create a getOrderStates query (GET, /order_states, display=full). Run this on page load to populate your status filter dropdown with human-readable state names like 'Payment Accepted', 'Shipped', 'Delivered'. Bind getOrders data to a Table component. Set the table's Data property to {{ getOrders.data.orders }} and configure relevant columns: reference, id, total_paid_tax_incl, date_add, current_state.
1// JavaScript transformer — flatten PrestaShop orders for Table display2const orders = data.orders || [];3const orderStates = getOrderStates.data?.order_states || [];45// Build a map of state ID -> state name for display6const stateMap = {};7orderStates.forEach(state => {8 stateMap[state.id] = state.name?.[0]?.value || `State ${state.id}`;9});1011return orders.map(order => ({12 id: order.id,13 reference: order.reference || `#${order.id}`,14 customer_id: order.id_customer,15 total: `€${parseFloat(order.total_paid_tax_incl || 0).toFixed(2)}`,16 status: stateMap[order.current_state] || `State ${order.current_state}`,17 payment_method: order.payment || 'N/A',18 date: order.date_add19 ? new Date(order.date_add).toLocaleDateString('en-GB')20 : 'N/A',21 carrier_id: order.id_carrier22}));Pro tip: PrestaShop's display=full parameter can return very large payloads for queries without filters. For products with large catalogs (10,000+ SKUs), always add filter and limit parameters to avoid timeout issues. Retool Cloud has a 100 MB response size limit.
Expected result: The getOrders query returns orders as a JSON array. The transformer converts each order into a flat object with human-readable status names. The Table displays orders with formatted price values and date strings.
Build order status update and product edit queries
Create write queries to update records in PrestaShop from Retool. PrestaShop's Webservice uses PUT for updates and requires you to send the full XML or JSON representation of the resource — not just the changed fields. This is different from PATCH-style partial updates. For updating order status, create a query named updateOrderState. Set Method to PUT. Path = /orders/{{ table_orders.selectedRow.id }}. Set Body type to JSON. In the body, construct the full order object with the updated current_state field: Note: PrestaShop's PUT endpoint requires the complete order object, not just the changed fields. The safest approach is to first fetch the full order, modify the current_state field, and then PUT the modified object back. Create a JavaScript query that combines these two steps. For updating product prices, create a query named updateProductPrice (PUT, /products/{{ table_products.selectedRow.id }}) with a body containing the full product object with an updated price field. Add a Dropdown component for order state selection with options populated from getOrderStates.data.order_states. Add an 'Update Status' button that triggers updateOrderState. In the On Success event handler, trigger getOrders to refresh the table and show a success notification. For complex multi-step operations that fetch-then-update PrestaShop resources, RapidDev's team can help architect reliable Retool Workflow patterns for bulk operations across large PrestaShop catalogs.
1// JavaScript query — fetch order then update its state2// Step 1: Get the current order data3const orderResponse = await getOrderById.trigger();4const order = orderResponse.order;56// Step 2: Modify only the current_state field7const updatedOrder = {8 ...order,9 current_state: dropdown_status.value10};1112// Step 3: PUT the modified order back13const updateResponse = await utils.sendRequest({14 url: `${context.baseUrl}/orders/${order.id}`,15 method: 'PUT',16 body: JSON.stringify({ order: updatedOrder }),17 headers: { 'Content-Type': 'application/json' }18});1920return updateResponse;Pro tip: PrestaShop's Webservice API requires the complete resource body for PUT requests. An easier pattern is to use PrestaShop's order_histories endpoint (POST to /order_histories) to add a new state history entry — this is simpler than constructing the full order PUT payload and is the same mechanism PrestaShop's own back office uses.
Expected result: The order status dropdown and Update Status button are functional. Selecting an order, choosing a new state, and clicking Update sends the request to PrestaShop. The orders table refreshes with the updated status after a successful update.
Build a customer lookup and order history panel
Create a customer service view that combines customer profile data with their order history. Add a TextInput component named textInput_email for email search. Create a query named searchCustomers (GET, /customers) with URL parameters: - display = full - filter[email] = {{ '%' + textInput_email.value + '%' }} - limit = 20 When a customer is selected from the results table, trigger a second query named getCustomerOrders (GET, /orders) with parameters: - display = full - filter[id_customer] = {{ table_customers.selectedRow.id }} - sort = id_DESC - limit = 50 Create a query named getCustomerAddresses (GET, /addresses) with filter[id_customer] = {{ table_customers.selectedRow.id }} to load the customer's saved addresses. Build the layout with a search bar at the top, a customers table showing matching results, and a detail panel below (or to the right) that shows the selected customer's profile, address list, and order history when a customer row is clicked. Add a stat row above the orders table showing computed values: total orders, total spend, average order value, and last order date — computed from the customer's order data using a JavaScript transformer. Finally, add a 'View in PrestaShop' button that opens the customer's back office page: {{ 'https://your-store.com/admin/index.php?controller=AdminCustomers&id_customer=' + table_customers.selectedRow.id + '&viewcustomer' }}. This gives support staff a quick escape hatch to the full PrestaShop UI for complex cases.
1// JavaScript transformer — compute customer order summary stats2const orders = getCustomerOrders.data?.orders || [];34if (orders.length === 0) {5 return { total_orders: 0, total_spend: '€0.00', avg_order: '€0.00', last_order: 'Never' };6}78const totalSpend = orders.reduce((sum, o) =>9 sum + parseFloat(o.total_paid_tax_incl || 0), 0);1011const sortedDates = orders12 .map(o => new Date(o.date_add))13 .sort((a, b) => b - a);1415return {16 total_orders: orders.length,17 total_spend: `€${totalSpend.toFixed(2)}`,18 avg_order: `€${(totalSpend / orders.length).toFixed(2)}`,19 last_order: sortedDates[0].toLocaleDateString('en-GB')20};Pro tip: PrestaShop stores customer passwords hashed and never returns them through the API — which is correct behavior. If you're building an account management panel, avoid any UI that suggests viewing or changing passwords. Use PrestaShop's built-in password reset flow for account recovery.
Expected result: Searching by email filters the customers table. Clicking a customer row loads their address list and full order history in the detail panel. The summary stats row shows total orders, total spend, average order value, and last order date.
Common use cases
Build an order management panel with bulk status updates
Create a Retool app that lists all orders with columns for order ID, customer name, total, payment status, and shipping status. Add filters for date range, order status, and payment method. Include a multi-select mechanism to bulk update selected orders to 'Shipped' status and input a carrier tracking number.
Build an order management panel that queries /api/orders with status and date filters, displays orders in a Table with order_id, customer, total_paid, and current_state, and includes a bulk update button that sends PATCH requests to update order state for all checked rows.
Copy this prompt to try it in Retool
Product catalog editor with pricing and stock management
Build a product management dashboard where catalog managers can search products by name or reference, view current price and stock levels, and edit fields directly in a Retool Table with inline editing enabled. Include a bulk price adjustment tool that applies a percentage markup to a selection of products.
Create a product editor that fetches products from /api/products with name/reference search, shows price, wholesale_price, quantity, and active status in an editable table, and includes a 'Apply Price Change' button that calculates new prices and sends PUT requests for each selected product.
Copy this prompt to try it in Retool
Customer lookup and order history panel
Build a customer service panel where support staff can search for a customer by email or name, view their account details, and see all orders placed with current status. Include a quick link to view the order in PrestaShop's back office and buttons to update order notes or initiate a refund.
Build a customer service panel with an email search input, a customer profile section from /api/customers, and a related orders table from /api/orders filtered by customer ID, showing order dates, amounts, and status with an 'Add Note' button that posts to the order messages endpoint.
Copy this prompt to try it in Retool
Troubleshooting
API returns XML even though output_format=JSON is set
Cause: The output_format=JSON parameter is being overridden at the query level, or it wasn't saved correctly as a default URL parameter on the resource. PrestaShop ignores the parameter if it's formatted incorrectly.
Solution: Verify that the default URL parameter is correctly set in the Resource settings (Resources tab → Edit your PrestaShop resource → URL Parameters → output_format: JSON). In individual queries, check that no duplicate output_format parameter is present with a different value. You can also add output_format=JSON directly to the Path field as a query string: /orders?output_format=JSON&display=full.
401 Unauthorized error on all requests despite correct API key
Cause: PrestaShop's Basic Auth expects the API key as the username with an empty password. If the Basic Auth username or password fields are swapped or the password contains any characters (including a space), authentication fails.
Solution: Go to your Retool Resource settings and verify that the API key is in the Username field and the Password field is completely empty (not even a space). Double-check the API key value in PrestaShop's Advanced Parameters → Webservice and confirm the key is still active and not expired. Also verify the Webservice feature is still enabled in PrestaShop.
Queries return only a list of IDs instead of full resource data
Cause: The display parameter is missing or not set to 'full'. By default, PrestaShop Webservice returns only resource IDs in a list, not the full resource objects.
Solution: Add display=full as a URL parameter to every GET query. Alternatively, set display=full as a default URL parameter on the Resource so it applies to all queries automatically. For very large datasets, you can also use display=[field1,field2,field3] to request only specific fields and reduce response size.
PUT request returns 400 Bad Request or 500 error
Cause: PrestaShop's PUT endpoint requires the complete resource object, not a partial update. Sending only the changed fields causes validation errors because required fields are missing.
Solution: Use a two-step pattern: first GET the complete resource (e.g., GET /orders/123), then modify the specific field you want to change, and then PUT the entire modified object back. Alternatively, for order status changes, POST to /order_histories instead of PUT to /orders — this is the correct semantic endpoint for changing order state.
1// POST to order_histories for status changes (simpler than PUT to orders)2// Method: POST3// Path: /order_histories4// Body:5{6 "order_history": {7 "id_order": "{{ table_orders.selectedRow.id }}",8 "id_order_state": "{{ dropdown_status.value }}",9 "id_employee": "1"10 }11}Best practices
- Store your PrestaShop Webservice API key as a Secret configuration variable in Retool — never paste it directly into the Basic Auth username field as a plain string.
- Always add output_format=JSON as a default URL parameter on the PrestaShop resource so every query returns JSON instead of XML without needing per-query configuration.
- Always include display=full in GET queries — without it, PrestaShop returns only resource ID lists, not usable data.
- Create API keys with the minimum permissions needed for each Retool app — read-only keys for reporting dashboards, write-enabled keys only for management tools.
- For order status updates, use POST to /order_histories instead of PUT to /orders — it's simpler, requires less payload construction, and is how PrestaShop's own back office works.
- Add JavaScript transformers to all PrestaShop queries to flatten multi-language fields (PrestaShop stores names as arrays with language IDs) into readable strings for Retool Table columns.
- Paginate all list queries using PrestaShop's limit and limit[offset] parameters — large catalogs can have thousands of products that will cause timeouts without pagination.
- Test write operations (PUT, POST, DELETE) against a PrestaShop staging or development store before running them against production to avoid accidental data changes.
Alternatives
WooCommerce runs on WordPress with a JSON-native REST API that's easier to work with in Retool, while PrestaShop uses XML-based responses and is self-hosted as a standalone platform.
Magento (Adobe Commerce) is an enterprise-grade e-commerce platform with a more comprehensive REST API and stronger support for large catalogs, while PrestaShop is better suited for small-to-mid-size stores with simpler requirements.
BigCommerce is a SaaS-hosted e-commerce platform with a modern JSON API and no XML parsing complexity, while PrestaShop is self-hosted open-source with more customization flexibility but greater API complexity.
Frequently asked questions
Does Retool have a native connector for PrestaShop?
No, PrestaShop does not have a native connector in Retool. You connect via a REST API Resource using PrestaShop's Webservice API with Basic Auth authentication. This means you need to know the endpoint paths and handle response parsing yourself, but all core e-commerce operations — orders, products, customers, carriers — are accessible through the Webservice API.
Why does PrestaShop's API return XML instead of JSON?
PrestaShop's Webservice API defaults to XML output for historical reasons (it predates JSON's dominance). To get JSON, add output_format=JSON as a URL parameter on every request. The easiest approach is to set this as a default URL parameter on your Retool resource so it applies to all queries automatically without needing to add it to each query individually.
Can I create orders in PrestaShop from Retool?
Yes, PrestaShop's Webservice API supports creating orders via POST requests to the /orders endpoint, but constructing a valid order payload is complex — it requires valid references to a customer, address, carrier, product combinations, and tax rules. For order creation, it's often simpler to build a form in Retool that collects the data and uses a Retool Workflow to assemble the correct PrestaShop order payload before POSTing it.
How do I search products by name in PrestaShop's API?
PrestaShop's Webservice supports partial name search using SQL LIKE syntax in filter parameters. Set the filter[name] URL parameter to %{{ textInput_search.value }}% where % is the wildcard character. For multilingual stores, the name field is stored per language — you may need to filter using filter[name][1] (where 1 is the language ID) to search in a specific language.
Can Retool connect to multiple PrestaShop stores?
Yes, create a separate REST API Resource in Retool for each PrestaShop store, each with its own base URL and API key. In your Retool app, add a store selector dropdown and use JavaScript to conditionally reference the appropriate resource. Alternatively, build separate Retool apps for each store and use Retool's app switching or cross-app navigation features to move between store dashboards.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation