| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
CRM (crm)
• Discuss (mail) • Calendar (calendar) • Contacts (contacts) |
| Lines of code | 2807 |
| Technical Name |
rteam_prozorro |
| License | LGPL-3 |
| Website | https://rteam.agency |
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
CRM (crm)
• Discuss (mail) • Calendar (calendar) • Contacts (contacts) |
| Lines of code | 2807 |
| Technical Name |
rteam_prozorro |
| License | LGPL-3 |
| Website | https://rteam.agency |
Ukrainian Prozorro tenders, matched and routed into your CRM
Watch the Prozorro public-procurement feed, filter by your CPV / keywords / region rules, and turn matches into CRM leads automatically.
Localized in 8 languages: English · Русский · Українська · Deutsch · Español · Română · Polski · العربية
What it does
Ukrainian businesses participating in public procurement read the Prozorro feed manually every morning, copy interesting tender numbers into a spreadsheet, and lose hours every week. Prozorro Connector moves that workflow into Odoo: define your subscription once (CPV codes, keywords, region, value range, status), and the cron pulls the public feed hourly, persists only matches, emails an alert, and optionally creates a CRM lead per match.
Odoo 19 LGPL-3 Free No external dependencies Community & Enterprise
Matched tenders, grouped by status
Open the Tenders kanban and see every matched tender from the live Prozorro feed, grouped by lifecycle status - active, awarded, clarification period, qualification, complete. Cards show the tender ID, title, expected value, and the deadline countdown. Drag is intentionally disabled - status is owned by the Prozorro feed, not by your sales team.
Key features
1 Subscription rules with five filter dimensions
Each subscription combines CPV codes (DK021:2015), one or more keywords (contains, regex, or negate), regions (mapped to Ukrainian oblasts and cities of special status), a value range, target statuses (active.tendering, complete, cancelled, etc.), and selected procurement methods. A tender matches only when every active filter on the subscription accepts it.
A built-in form-view warning fires if a subscription has neither CPV codes nor keywords - so a misconfigured subscription that would match the entire feed never goes live by accident.
2 Filter-at-sync: only matched tenders persist
The cron walks the Prozorro feed page by page (default 20 pages per run, configurable). For each tender, the matcher evaluates every active subscription. Only tenders that match at least one subscription are stored - the rest are dropped immediately, so the database stays small even on a busy feed.
A daily retention cron drops matched tenders 60 days after their
tender_period_end unless they were converted to a CRM
lead. The retention window is configurable from Settings.
3 Settings page: schedule, live status, force stop
One screen controls everything: sync schedule (off by default, configurable to any cron interval), API endpoint, pages per run, retention days, and whether to auto-create CRM leads from matches.
A live status block shows whether a sync is currently running, the timestamp of the last successful run, and the last error message if any. A Manager-only Force stop button appears only if a sync has been "running" for more than 60 minutes - clearing stale flags without an Odoo restart.
4 Test wizard: paste a UUID, get a per-filter verdict
Want to know whether your subscription would match a specific tender?
Open the tender on prozorro.gov.ua, copy its UUID, paste
it into the Test wizard. The wizard fetches the live tender from the
API and prints a per-filter verdict: which filters
accepted it, which rejected it, and the final overall match. No more
guessing whether your CPV list was too narrow or your keyword regex
was too strict.
5 CRM leads created automatically (with audit trail)
Per-subscription opt-in: enable Auto-create CRM lead
and every match for that subscription becomes a crm.lead
linked back to the source tender. Leads are always created with
type='lead' (never Opportunity) so they go through your
normal manual triage. The lead's chatter shows the originating
subscription and the tender UUID for traceability.
6 Email alert per match with deep-link
On every successful sync that produces at least one match, the
subscribed users receive a per-tender alert email with a teal NEW
MATCH badge, the tender header (name, value, deadline), the tender
items collapsed inside a <details> block so the
inbox preview stays clean, and a one-click "View in Odoo" button
deep-linking into the tender form.
Available in your language
Field labels, settings help text, search filters, action menus, cron names, and the alert email body are translated to seven additional languages. Translations apply automatically based on each user's Odoo language preference - no extra configuration.
English · Русский · Українська · Deutsch · Español · Română · Polski · العربية
en · ru · uk · de · es · ro · pl · ar
Configuration
Open Prozorro → Settings after installation, switch on Enable scheduled sync, pick an interval (default off so you can sync manually first), and you are done. The feed is public and unauthenticated - no API key, no token, no account on prozorro.gov.ua required.
- API URL - default `https://public.api.openprocurement.org/api/2.5/tenders`, override only for staging or load-balanced mirrors
- Pages per run - safety cap on the cron walker (default 20, raise carefully)
- Retention (days) - how long matched tenders stay in the database after `tender_period_end` (default 60, set 0 to disable retention)
- Enable CRM Leads - master toggle. Off = no leads ever created, regardless of per-subscription setting
Technical details
- Targets: Odoo 19 Community and Enterprise. The module depends only on
base,mail, andcrm. - License: LGPL-3, free.
- Security: all menus and operational records restricted to
base.group_user; settings and force-stop restricted tobase.group_system. No public HTTP endpoints exposed by this module. - HTTP client: Python stdlib
urllib.requestonly. Norequestsdependency, no third-party HTTP library required at install time. - Storage: seven new tables (subscription, keyword, tender, classification, region, procurement method, status, sync cursor) - all small, all retention-bounded.
- Cron resilience: stale `is_running` self-heal after 60 min, postcommit-deferred reschedule writes (no `lock_for_update` UserError), isolated chatter cursor (cron rollback never erases the audit trail).
- Test coverage: 20 unit and integration tests covering subscription matching, feed sync with mocked HTTP, lead-creation gating, and cursor lifecycle.
What this module does not do
- It does not submit bids on Prozorro - this is a read-only mirror plus alerting
- It does not authenticate to the Prozorro API - the public feed is unauthenticated and that is what we read
- It does not download tender attachments - only the structured metadata exposed by the API
- It does not generate quotations or sale orders from tenders - that is the scope of the paid sibling
rteam_prozorro_salesmodule
Need any of the above? The paid extension rteam_prozorro_sales adds tender-to-quotation auto-conversion, full DK021:2015 dictionary, and a daily HTML digest. Get in touch.
Support
Source code, issues, and feature requests: github.com/RteamAgency/rteam-prozorro
Built and maintained by Rteam, an Odoo Enterprise consulting agency. rteam.agency
Please log in to comment on this module