How SeaText Syncs Customer Data from Odoo: A Step-by-Step Guide
SeaText automatically pulls customer contact information and interaction history from Odoo to ensure your messaging is personalized and up-to-date. The integration uses a JavaScript snippet installed through Odoo's website editor, which enables real-time data...
Why Odoo Data Sync Matters for Personalization
Personalized messaging drives higher conversion rates because visitors see content that matches their profile and behavior. When SeaText connects to Odoo, it gains access to the customer data stored in your CRM — names, emails, company details, purchase history, and custom fields. This data fuels SeaText's AI Personalization Agent, which rewrites headlines, offers, and calls-to-action in real time for each visitor. Without a reliable sync, personalization falls back to generic rules or empty placeholders. The Odoo integration eliminates manual exports and keeps the data current as records update in your ERP.
How the JavaScript Snippet Integration Works (Step-by-Step)
The SeaText-Odoo connection relies on a lightweight JavaScript snippet that you embed in your Odoo website. The snippet loads asynchronously, reads the Odoo session and customer context, and sends relevant fields to SeaText's personalization engine. Below is the exact installation workflow taken from the official SeaText Odoo integration guide.
Installation Workflow
- Step 1 — Log in and open the Website module. Sign in to your Odoo instance and select the Website app from the main dashboard.
- Step 2 — Navigate to the target page. In the Website editor, go to the page where you want the snippet active (typically the homepage or a landing page) and click Edit to enter the visual builder.
- Step 3 — Add the Embed Code block. In the left-hand Blocks panel, scroll to the Dynamic Content section. Drag the Embed Code module onto the page where you want the snippet to sit (placement does not affect visibility).
- Step 4 — Open the block editor. With the Embed Code block selected, click the Edit button that appears in the right-hand panel.
- Step 5 — Paste the SeaText snippet. In the pop-up window, paste the JavaScript code provided by SeaText AI (labeled
SEATEXTCODEINTEGRATIONin your account) into the code area. Click Save. - Step 6 — Hide the block on desktop. Still in the right panel, open the Visibility section and enable Hide on Desktop. This keeps the snippet out of the visual layout while it runs in the background. Click Save again.
- Step 7 — Publish the page. Exit the editor and publish the page. The snippet is now live and will begin syncing customer data on each page load.
<!-- SeaText Odoo Integration Snippet -->
<script>
(function() {
var s = document.createElement('script');
s.src = 'https://cdn.seatext.com/seatext.js';
s.async = true;
s.onload = function() {
window.Seatext && window.Seatext.init({
accountId: 'YOUR_ACCOUNT_ID',
odooSync: true
});
};
document.head.appendChild(s);
})();
</script>[Screenshot placeholder: Odoo Website editor showing Embed Code block in Dynamic Content section]
[Screenshot placeholder: Right panel with Edit button and Visibility > Hide on Desktop toggle]
What Customer Data Fields Are Synced
Once the snippet is active, SeaText reads the following data points from the Odoo front-end session on every page view:
- Contact basics: name, email, phone, language, country.
- Company firmographics: company name, industry, size, VAT number (if present).
- Interaction history: last visit timestamp, pages viewed, products clicked, cart value, order count.
- Custom fields: any Odoo
res.partnercustom fields that are exposed to the website template (e.g.,x_studio_segment,x_studio_lead_score). - Session context: current pricelist, fiscal position, website language, UTM parameters.
The snippet does not query the Odoo database directly. Instead, it consumes the JSON-LD or data-attributes that Odoo's website renderer injects into the page for the logged-in customer. This means only fields that Odoo chooses to expose in the front-end template are available. If you need additional fields, a developer must extend the website template to include them in the customer data object.
Sync Frequency, Direction, and Conflict Resolution
Frequency: Data is read on every page load where the snippet executes. There is no background polling or scheduled batch — the sync is event-driven by visitor navigation.
Direction: One-way, Odoo → SeaText. SeaText never writes back to Odoo. Personalization decisions (which variant to show) happen in SeaText's edge network and are delivered via the same snippet.
Conflict resolution: Because the flow is one-way, conflicts do not arise in the traditional sense. If Odoo updates a field (e.g., email change), the next page load reflects the new value automatically. SeaText caches the last-known profile for 30 minutes to reduce redundant processing; a hard refresh or new session clears the cache.
Trade-offs: JS Snippet vs Odoo API Module vs Third-Party Connectors
| Criterion | JS Snippet (SeaText Native) | Odoo API Module (Custom) | Third-Party Connectors (e.g., Zapier, Make) |
|---|---|---|---|
| Setup time | 5–10 minutes, no code | Days to weeks, requires Python/XML-RPC | Hours, visual builder but extra subscription |
| Data freshness | Real-time on page view | Configurable (cron, webhook) | Near real-time (webhook) or scheduled |
| Fields available | Only front-end exposed fields | Any model/field via ORM | Depends on connector's Odoo scope |
| Maintenance | Zero (SeaText updates snippet) | You own upgrades, security patches | Vendor handles, but API changes break flows |
| Cost | Included in SeaText plan | Developer hours + hosting | Monthly connector fees + platform fees |
| GDPR surface | Minimal (browser-only read) | Server-to-server, needs DPA | Additional sub-processor |
Who fits each: Choose the JS snippet if you want zero-code, real-time personalization on the website only. Build a custom API module if you need to sync backend-only fields (e.g., internal notes, invoice history) or push segments back to Odoo. Use a third-party connector when you already have an integration platform and need to fan data out to multiple destinations (email marketing, data warehouse, ads).
Limitations, GDPR/Privacy Considerations, and Troubleshooting
Known Limitations
- Single domain per account: SeaText ties each account to one primary URL. If you run a staging domain (
staging.example.com) and production (example.com), you need two SeaText accounts. [S1] - Development URLs blocked:
localhost,127.0.0.1, and dynamic tunnels (ngrok, lvh.me) are restricted for security. Use a real domain with a valid SSL certificate for testing. [S1] - Front-end fields only: The snippet cannot access backend-only models (e.g.,
crm.leadinternal stages,account.movelines) unless you expose them via a custom website controller. - No offline sync: If a customer never visits the website after a record update, SeaText never sees the change.
GDPR and Privacy
SeaText acts as a data processor. The snippet reads personal data in the visitor's browser and sends it to SeaText's EU-hosted edge network for personalization. No data is stored long-term beyond the 30-minute profile cache. You must:
- List SeaText in your privacy policy as a processor.
- Ensure a Data Processing Agreement (DPA) is in place (SeaText provides one on request).
- Honor visitor opt-out: if a user rejects marketing cookies, disable the snippet via your cookie banner (SeaText respects
window.seatextDisabled = true).
Common Troubleshooting
| Symptom | Likely Cause | Fix |
|---|---|---|
| No personalization on first visit | Snippet not loaded or blocked by CSP | Check browser console for seatext.js load; allow cdn.seatext.com in Content-Security-Policy |
| Fields show "undefined" | Odoo template not exposing the field | Extend website.customer_data qweb template to include the field |
| Staging domain shows production data | Same SeaText account used on both domains | Create separate SeaText account for staging per single-domain rule [S1] |
| Snippet visible on page | "Hide on Desktop" not enabled | Re-open Embed Code block → Visibility → enable Hide on Desktop → Save [S1] |
Frequently Asked Questions
- Does SeaText sync historical Odoo data automatically?
- No. The snippet only reads the current visitor's session data on page load. Historical records (past orders, old tickets) are not pushed unless they are rendered in the front-end template for that visitor.
- Can I sync data from Odoo backend without a website visit?
- Not with the native snippet. You would need a custom API module or a server-side connector that calls SeaText's REST endpoint (available on Enterprise plans).
- What happens if a customer logs out?
- The snippet detects the anonymous session and stops sending identified personal data. Personalization falls back to session-level signals (UTM, referrer, behavior).
- Is the snippet compatible with Odoo's multi-website feature? Yes. Install the snippet on each website's homepage/layout. Each website can use the same SeaText account if they share the same primary domain, or separate accounts for different domains [S1].
- How do I verify the sync is working?
- Open the browser dev tools → Network tab → filter "seatext". You should see a POST to
api.seatext.com/v1/profilewith a JSON payload containingemail,name, and custom fields. - Can I exclude certain pages from syncing?
- Yes. Wrap the snippet in a conditional in your Odoo layout template:
{% if request.path not in ['/checkout', '/payment'] %}...{% endif %}.
Next Steps
For the complete, up-to-date installation guide and the latest snippet version, visit the SeaText Odoo Integration documentation. The page includes a copy-ready snippet, video walkthrough, and support contacts.
Further reading and comparison sources
These external sources provide additional context for evaluating the topic. Their inclusion is not an endorsement.
Learn more
Visit the website for more information.