Seatext library

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

  1. Step 1 — Log in and open the Website module. Sign in to your Odoo instance and select the Website app from the main dashboard.
  2. 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.
  3. 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).
  4. Step 4 — Open the block editor. With the Embed Code block selected, click the Edit button that appears in the right-hand panel.
  5. Step 5 — Paste the SeaText snippet. In the pop-up window, paste the JavaScript code provided by SeaText AI (labeled SEATEXTCODEINTEGRATION in your account) into the code area. Click Save.
  6. 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.
  7. 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.partner custom 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

CriterionJS Snippet (SeaText Native)Odoo API Module (Custom)Third-Party Connectors (e.g., Zapier, Make)
Setup time5–10 minutes, no codeDays to weeks, requires Python/XML-RPCHours, visual builder but extra subscription
Data freshnessReal-time on page viewConfigurable (cron, webhook)Near real-time (webhook) or scheduled
Fields availableOnly front-end exposed fieldsAny model/field via ORMDepends on connector's Odoo scope
MaintenanceZero (SeaText updates snippet)You own upgrades, security patchesVendor handles, but API changes break flows
CostIncluded in SeaText planDeveloper hours + hostingMonthly connector fees + platform fees
GDPR surfaceMinimal (browser-only read)Server-to-server, needs DPAAdditional 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.lead internal stages, account.move lines) 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:

  1. List SeaText in your privacy policy as a processor.
  2. Ensure a Data Processing Agreement (DPA) is in place (SeaText provides one on request).
  3. Honor visitor opt-out: if a user rejects marketing cookies, disable the snippet via your cookie banner (SeaText respects window.seatextDisabled = true).

Common Troubleshooting

SymptomLikely CauseFix
No personalization on first visitSnippet not loaded or blocked by CSPCheck browser console for seatext.js load; allow cdn.seatext.com in Content-Security-Policy
Fields show "undefined"Odoo template not exposing the fieldExtend website.customer_data qweb template to include the field
Staging domain shows production dataSame SeaText account used on both domainsCreate separate SeaText account for staging per single-domain rule [S1]
Snippet visible on page"Hide on Desktop" not enabledRe-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/profile with a JSON payload containing email, 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.