Skip to main content
RapidDev - Software Development Agency
retool-integrationsREST API Resource

How to Integrate Retool with PrestaShop

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.

What you'll learn

  • How to create and configure a PrestaShop Webservice API key and set the correct permissions for Retool access
  • How to configure a Retool REST API Resource with Basic Auth for PrestaShop's Webservice
  • How to query products, orders, customers, and carriers using PrestaShop's Webservice endpoints
  • How to use JavaScript transformers to parse and reshape PrestaShop API responses for Retool Tables
  • How to build a custom PrestaShop admin panel that provides faster bulk operations than the native back office
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Intermediate14 min read30 minutesE-commerceLast updated April 2026RapidDev Engineering Team
TL;DR

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.

Quick facts about this guide
FactValue
ToolPrestaShop
CategoryE-commerce
MethodREST API Resource
DifficultyIntermediate
Time required30 minutes
Last updatedApril 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

REST API Resource

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

1

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.

2

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.

3

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.

transformer.js
1// JavaScript transformer — flatten PrestaShop orders for Table display
2const orders = data.orders || [];
3const orderStates = getOrderStates.data?.order_states || [];
4
5// Build a map of state ID -> state name for display
6const stateMap = {};
7orderStates.forEach(state => {
8 stateMap[state.id] = state.name?.[0]?.value || `State ${state.id}`;
9});
10
11return 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_add
19 ? new Date(order.date_add).toLocaleDateString('en-GB')
20 : 'N/A',
21 carrier_id: order.id_carrier
22}));

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.

4

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.

update_order_state.js
1// JavaScript query — fetch order then update its state
2// Step 1: Get the current order data
3const orderResponse = await getOrderById.trigger();
4const order = orderResponse.order;
5
6// Step 2: Modify only the current_state field
7const updatedOrder = {
8 ...order,
9 current_state: dropdown_status.value
10};
11
12// Step 3: PUT the modified order back
13const 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});
19
20return 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.

5

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.

customer_stats.js
1// JavaScript transformer — compute customer order summary stats
2const orders = getCustomerOrders.data?.orders || [];
3
4if (orders.length === 0) {
5 return { total_orders: 0, total_spend: '€0.00', avg_order: '€0.00', last_order: 'Never' };
6}
7
8const totalSpend = orders.reduce((sum, o) =>
9 sum + parseFloat(o.total_paid_tax_incl || 0), 0);
10
11const sortedDates = orders
12 .map(o => new Date(o.date_add))
13 .sort((a, b) => b - a);
14
15return {
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.

Retool Prompt

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.

Retool Prompt

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.

Retool Prompt

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.

typescript
1// POST to order_histories for status changes (simpler than PUT to orders)
2// Method: POST
3// Path: /order_histories
4// 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

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.

RapidDev

Talk to an Expert

Our team has built 600+ apps. Get personalized help with your project.

Book a free consultation

Integrations are where projects stall

We wire Retool integrations like this one every week — auth, webhooks, edge cases included. Fixed-price builds from $13K, delivered in 6–10 weeks.

Talk to an integration engineer

We put the rapid in RapidDev

Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We'll discuss your project and provide a custom quote at no cost.