Skip to main content

Fruugo Store Management

This is the installation and configuration guide for Fruugo Store Management, the module you downloaded from your ECOSIRE dashboard. Everything on this page describes the fruugo_store_management module exactly as it ships today — the facts below were read out of the released build, not from a roadmap.

Technical namefruugo_store_management
Odoo versions17.0, 18.0, 19.0 (Community or Enterprise)
Current shipped version17.0 → 17.0.2.6.0, 18.0 → 18.0.2.6.0, 19.0 → 19.0.2.6.0
Price$499 USD — one-time, per Odoo version
Odoo module licenceOPL-1
CategoryConnector
The module installs directly and needs no key

Install the ZIP and you are ready to configure the connector. There is no separate module to download first and no key to paste.

Requirements​

RequirementDetail
Odoo17.0, 18.0 or 19.0, Community or Enterprise. Self-hosted or Odoo.sh — Odoo Online (SaaS) cannot install third-party modules
Odoo appsbase, sale_management, stock, account, delivery, mail, web, product, contacts — Odoo installs any that are missing
Python packagesrequests
Platform accountA Fruugo retailer account, with your Merchant ID and API Password to hand from the Fruugo Retailer Portal

Install the Python packages into the same interpreter that runs Odoo:

sudo -u odoo pip install requests

Installation​

1. Download the ZIP for your Odoo version​

Sign in at ecosire.com and open your dashboard downloads. Take the ZIP that matches the Odoo series you run.

2. Extract into your addons path​

unzip fruugo_store_management_v19_*.zip -d /opt/odoo/addons/
ls /opt/odoo/addons/fruugo_store_management/__manifest__.py # sanity check

The module must end up as a single top-level fruugo_store_management/ directory with __manifest__.py directly inside it. If your ls check fails, the folder landed one level too deep or too shallow — move it so the path above resolves.

3. Restart Odoo and install​

sudo systemctl restart odoo
  1. Go to Apps and click Update Apps List (developer mode must be on).
  2. Search for Fruugo Store Management and click Install.
  3. Odoo pulls in the Odoo apps listed above automatically.

When the install finishes, a Fruugo menu appears in the main Odoo app switcher.

Configuration​

Connect to Fruugo​

Create a connection record on the fruugo.configuration model. The fields the module defines for the connection are:

FieldTechnical nameTypeRequired
Configuration NamenameCharYes
Merchant IDmerchant_idCharYes
API Passwordapi_passwordCharYes
Companycompany_idMany2oneYes
Fruugo URLfruugo_urlCharNo
MarketplacemarketplaceCharNo

The fields marked Yes are enforced by the model — Odoo will not let you save the record without them. The technical name is the reliable identifier if your screen wording differs.

The same record carries 7 behaviour checkboxes — sync_products, sync_orders, sync_customers, sync_inventory, auto_sync_products, auto_sync_orders, auto_sync_customers. They gate what the module is allowed to do automatically once it is connected. Leave anything you are not ready for switched off, and turn them on one at a time.

The module's own source contacts these hosts: www.fruugo.com, retailer.fruugo.com. Your firewall must allow outbound HTTPS to them.

Scheduled actions​

The module installs 6 scheduled actions (Settings → Technical → Scheduled Actions):

Scheduled actionRuns everyEnabled on install
fruugo: Sync Products1 hourYes
fruugo: Sync Orders30 minutesYes
fruugo: Sync Customers6 hoursYes
fruugo: Sync Inventory15 minutesYes
fruugo: Test Connection1 dayYes
fruugo: Cleanup Old Logs1 dayYes

Intervals above are the shipped defaults. Adjust them to your volume — but be aware that the platform, not Odoo, sets the API rate limits, and shortening a sync interval is the usual cause of throttling errors in the logs.

The product feed​

Fruugo is a feed-first marketplace: its Retailer API publishes no product, stock or price endpoints. Fruugo collects your catalogue itself from a URL on your own Odoo instance, and stock and prices travel inside that same document. Serving that feed is what puts your products on the marketplace.

URL on your Odoo instanceFormat
/fruugo/feed/products.xmlThe catalogue feed in XML — register this one with Fruugo
/fruugo/feed/products.csvThe same catalogue as CSV
/fruugo/feedA plain-text page listing the two URLs above

The three feed routes are part of the 19.0 build. The 17.0 and 18.0 builds serve the webhook route and the three logged-in routes described below, and no feed.

Register the feed URL in the Fruugo Retailer Portal as your product feed location. The configuration form also shows it, ready to copy, on the product-feed settings as Feed URL — already carrying your instance's public host.

Publishing is off by default. Until you switch Publish Product Feed on, all three URLs answer 404 — an unpublished feed does not even confirm that it exists, so nothing about your catalogue is exposed until you turn publishing on deliberately.

Feed Token (optional). Set Feed Token and Fruugo must call the URL with ?token=…; a request carrying a missing or wrong token is answered as not found. Leave it empty to serve the feed without a token — the catalogue, prices included, is then readable by anyone who knows the URL.

Feed Last Fetched. Every collection stamps Feed Last Fetched on the configuration record, so you can confirm that Fruugo is actually reading the feed.

Which products are published​

A product reaches the feed only when it carries everything Fruugo's format makes mandatory:

  • a SKU — the product's Fruugo SKU, or its internal reference,
  • a sales price,
  • a Fruugo category mapping for its Odoo product category,
  • a title, a description and a primary image,
  • a VAT rate (a bare number; a merchant with no sales tax configured sends 0).

Anything missing one of those is left out of the feed rather than sent as a half-filled row — Fruugo discards a row it cannot read and tells nobody, and a product absent from the feed is invisible on the marketplace, which looks exactly like being sold out. Every withheld product is named with the reason it was withheld, so the catalogue can be fixed instead of guessed at.

The feed is a full catalogue, not a delta: it is rebuilt on every collection, and each product's stock status and quantity are recalculated from Odoo at that moment.

Webhook and API endpoints your server exposes​

These are the HTTP routes this module adds to your Odoo instance. Only the public ones are reachable without an Odoo login.

EndpointAuthPurpose
/fruugo/feedpublicPlain-text pointer to the two feed URLs below
/fruugo/feed/products.xmlpublicThe catalogue feed Fruugo collects (XML)
/fruugo/feed/products.csvpublicThe same feed as CSV
/fruugo/webhookpublicWebhook receiver — see the note below; Fruugo has no webhook push, so it rejects every delivery
/fruugo/api/statuslogged-in userconnection and sync status read by the dashboard
/fruugo/api/synclogged-in usertriggers a sync from the dashboard
/fruugo/dashboard/datalogged-in userdashboard KPI data
/fruugo/webhook is closed in this build — sync runs on the scheduled actions

The route exists and is publicly reachable, but it fails closed: fruugo.webhook._verify_signature() rejects every delivery and the endpoint answers HTTP 403. Fruugo publishes no webhook or event feed — orders are read by polling the documented Order API download window — so no inbound payload to this route could be authentic. The module will not process an unauthenticated payload, so there is nothing to register in your Fruugo seller portal today — there is no Fruugo-side webhook setting to fill in. Leave the scheduled actions above enabled; they are how this build stays current.

Using the module​

The module's menu is laid out as:

  • Fruugo → Dashboard
  • Fruugo → Orders
  • Fruugo → Products
  • Fruugo → Customers
  • Fruugo → Operations — Import Wizard, Export Wizard, Mapping Wizard, Test Connection, Logs, Reports
  • Fruugo → Configuration — Settings

A normal first run is:

  1. Save the connection record and confirm the module reports a successful connection before importing anything.
  2. Review the mapping records so imported data lands on the right Odoo records.
  3. Run a small import first — restrict it by date or by a handful of products — and check the results before letting the scheduled actions take over.
  4. Watch the log records during the first full sync. Failures are recorded there rather than raised at the user.

Troubleshooting​

Installation and connection​

SymptomCause and fix
The requests library is requiredrequests is missing from Odoo's Python environment. Install it into the interpreter that runs Odoo.
A sync fails with answered 401 -- Fruugo refused the credentialsThe Retailer Portal username or password on the Fruugo configuration is wrong or has been changed in the portal. Update it and test the connection again.
The connection will not validateRe-check every required field in the table above. Most failures are a mistyped secret, or credentials created for a sandbox while the module points at production (or vice-versa).

Syncing​

SymptomCause and fix
Nothing syncs even though the connection is fineThe scheduled actions are disabled at the Odoo level, or Odoo's cron worker is not running. Check Settings → Technical → Scheduled Actions and that --max-cron-threads is greater than zero.
Sync starts then stops part-wayRead the module's log records for that run. Rate limiting and rejected field values are the two common causes; both are logged with the platform's own error text.
Records import but map to the wrong Odoo valuesFix the mapping records under the module's configuration, then re-run the import.
Duplicated products or customersRun the initial import once. If a first attempt half-finished, check the existing records before re-running rather than importing on top.
A product never appears on FruugoIt is missing something the feed requires — a SKU, a sales price, a Fruugo category mapping, an image or a VAT rate. The feed names it with the reason. See Which products are published.
The feed URL answers 404Publish Product Feed is off, or the feed token in the URL does not match the one on the configuration. Both are answered as not found on purpose.

Version history​

Odoo versionVersion you download today
17.017.0.2.6.0
18.018.0.2.6.0
19.019.0.2.6.0

ECOSIRE module versions are <odoo major>.<module major>.<minor>.<patch>, so 19.0.2.6.0 is the Odoo 19 build of module version 2.6.0. Your installed version is shown on the module's card in Apps.

What changed in 2.6.0 (all three Odoo versions)​

A multi-company and dashboard-range release. Nothing the connector sends to Fruugo or reads back changed, except that a setup wizard can no longer act on another company's connection.

  • A connection is only ever changed for its own company. The Test Connection wizard saved the credentials you had just tested onto whichever connection was found first, which in a database with more than one company could be another company's — silently pointing that company's store at your Fruugo account. It now saves to your own company's connection, and creates one for your company if you do not have one yet.
  • The export, import and mapping wizards open on your own company's connection, not on whichever one came first.
  • The dashboard, the API status and the Start Sync button are for your Fruugo users only. They answered any signed-in user, including a customer portal user of the same company, even though the menus leading to them were already restricted. All three now require the module's own access group and refuse the request before doing any work.
  • The Sales Trend covers the period you selected. For a range longer than a month it drew the oldest 30 days and stopped — a 90-day or one-year view ended a month after it began and never showed recent sales. It now plots the most recent 30 days of the range. Ranges of a month or less are unchanged.

What changed in 2.5.0 (all three Odoo versions)​

A dashboard, accessibility and request-coverage release. Nothing the connector sends to Fruugo or reads back changed.

  • The dashboard is now correct in dark mode. Odoo 19 signals a dark theme in a way this module was not listening for, so the dashboard stayed light inside a dark Odoo — only the top bar changed. Every panel, chart, badge and label now follows the theme.
  • Text meets the WCAG AA contrast bar. Seventeen elements on the dashboard (the connection badge, the period buttons, KPI labels, card badges, the empty states, section labels and the outline buttons) were below the 4.5:1 minimum. All of them now pass in both light and dark mode.
  • Charts fill in reliably, and say so when there is nothing to show. The order-status ring could come up empty on a slow first load, and an all-zero chart drew bare axes with the legend still attached. Both charts now draw on the first frame, explain an empty period in words, and say "unavailable" rather than "no sales" when the read itself failed.
  • The dashboard states what is happening while it loads, instead of showing settled zeros behind a thin progress line.
  • A failed load is visible. The error message and the notice banner used to appear at the bottom of the page, below the fold, where a failed load looked exactly like an empty one. Both now sit directly under the header, and the error carries a Retry button.
  • Click a chart to see the records behind it. Clicking a day on the sales trend opens the orders that made that day's revenue; clicking a segment of the order-status ring opens the orders it counts.
  • The API coverage screen has a kanban view, grouped by contract area, so the parts of the Fruugo contract this connector does not perform are readable at a glance.
  • The dashboard header no longer overflows a phone screen. A long store name wrapped mid-word and clipped off the right edge at 375px; it now truncates inside the header.
  • Item-level requests no longer send empty optional fields. Confirm, Ship, Cancel and Return sent messageToCustomer= (and the other optional fields) as empty parameters when they were not set; they are omitted now, as they already were on the requests without item lines.

What changed in 2.4.0 (all three Odoo versions)​

  • Order money is imported completely. Currency, shipping, tax, fee, discount, refund and payment amounts are now read from each Fruugo order in major units, each component is kept distinct (a declared zero is kept as zero), and an order in a currency your database has no exchange rate for is refused with a clear message instead of being stored at 1:1.
  • Products and orders match on Fruugo's own identifiers. A re-synced product updates the record that already carries that SKU instead of creating a duplicate, and a re-imported order resolves to the order already bound to that Fruugo order id.
  • Stock sync reads every page of the Stock Status API (Fruugo pages at 1,000 SKUs), so accounts above 1,000 SKUs are no longer partially synced.
  • Sync reporting is truthful. Counters describe the run that just happened, a partial run stays a warning, a failed run stays a failure, and neither advances the last-successful-sync timestamp. One bad item is counted as failed without aborting the rest of the batch.
  • Capabilities Fruugo does not offer are stated, not faked. Affiliate attribution, creator detail, variant mapping, settlement reconciliation, marketplace analytics and bulk return reconciliation now stop with a message naming the capability and the reason, and are no longer advertised in the interface.
  • Credentials and customer data stay out of the logs, the dashboard period includes today, and the dashboard shows accessible loading, empty and error states.
  • A missing Fruugo Order ID is reported as what it is. Confirm, Ship, Cancel, Return and the packing list answered "Fruugo refused the operation" when the order simply had no Fruugo Order ID: nothing had been sent, and the call was recorded as though the marketplace had rejected it. The message now names the real problem.
  • Multi-account isolation. Records, credentials and sync state stay bound to the configuration they came from; two Fruugo accounts on one database cannot see each other's data.
  • The product, customer and order menus now open this module's own restricted views instead of the broad Odoo screens.
  • Dashboard revenue is in one currency. Revenue, average order value and the sales chart use each order's total converted into your company currency at the rate of its own order date, instead of adding GBP, EUR and company-currency amounts together.
  • Top Products lists your best sellers by the revenue of their order lines in the selected period; it was previously always empty.
  • The dashboard shows your company only. The product and customer tiles, Recent Activity and sync health count this company's records (and shared ones), never another company's. The Products tile counts products published in the feed, and a cancelled order is no longer drawn as both Failed and Cancelled.
  • Fruugo → Products lists your catalogue — every product the published feed carries or holds back — and Fruugo → Configuration → Settings no longer hides a connection that has not been tested yet.
  • Operators can use the ship-with-tracking dialog; it previously opened for administrators only.
  • A wrong Retailer Portal username or password reads as a sentence in the sync log and on the dashboard, naming what to check, instead of Fruugo's HTML error page.
  • Sync-log and dashboard card titles are readable in light and dark mode, and dashboard icons are announced to screen readers.

Support​