odoo/odoo · error · UserError

A user already exists with theses credentials on our server.

Error message

A user already exists with theses credentials on our server. Please check your information.

What it means

UserError raised during proxy user creation (_create_user path in account_edi_proxy_client). The proxy answered create_user with the raw error string 'A user already exists with this identification.', meaning the edi_identification (company/participant identifier for that proxy_type) is already registered on the Odoo proxy server. Because Peppol IAP errors lack proper codes, Odoo matches the message text and raises this translated UserError.

Source

Thrown at addons/account_edi_proxy_client/models/account_edi_proxy_user.py:195

        )
        edi_identification = self._get_proxy_identification(company, proxy_type)
        if edi_mode == 'demo':
            # simulate registration
            response = {'id_client': f'demo{company.id}{proxy_type}', 'refresh_token': 'demo'}
        else:
            try:
                # b64encode returns a bytestring, we need it as a string
                server_url = self._get_server_url(proxy_type, edi_mode)
                response = self._make_request(
                    f'{server_url}/iap/account_edi/2/create_user',
                    params=self._get_iap_params(company, proxy_type, private_key_sudo))
            except AccountEdiProxyError as e:
                raise UserError(e.message)
            if 'error' in response:
                if response['error'] == 'A user already exists with this identification.':
                    # Note: Peppol IAP errors weren't made properly with error code that are then translated on
                    # Odoo side. We are for now forced to check the error message.
                    raise UserError(_('A user already exists with theses credentials on our server. Please check your information.'))
                raise UserError(response['error'])

        return self.create({
            'id_client': response['id_client'],
            'company_id': company.id,
            'proxy_type': proxy_type,
            'edi_mode': edi_mode,
            'edi_identification': edi_identification,
            'private_key_id': private_key_sudo.id,
            'refresh_token': response['refresh_token'],
        })

    def _renew_token(self):
        ''' Request the proxy for a new refresh token.

        Request to the proxy should be made with a refresh token that expire after 24h to avoid
        that multiple database use the same credentials. When receiving an error for an expired refresh_token,
        This method makes a request to get a new refresh token.

View on GitHub (pinned to 1e661df964)

Solutions

  1. Check whether registration actually already succeeded on this database: an existing account.edi.proxy.user row for the same identification means you can just use it instead of re-creating.
  2. If a previous attempt left a half-registered user, deactivate/remove it and retry, or use the resend/verification flow rather than create_user again.
  3. If the identification was claimed by a different database/party, you must either reclaim it through the provider's verification process or use a different (correct) identification.
  4. Verify the identification value itself (VAT/EAS combination) — a wrong but already-claimed identifier produces the same error.

Example fix

# before: blind registration
proxy_user = self._create_proxy_user(company, proxy_type)

# after: reuse an existing registration when present
existing = self.search([
    ('company_id', '=', company.id),
    ('proxy_type', '=', proxy_type),
    ('edi_identification', '=', edi_identification),
])
proxy_user = existing[:1] or self._create_proxy_user(company, proxy_type)
Defensive patterns

Strategy: validation

Validate before calling

existing = env['account.edi.proxy.user'].search([
    ('company_id', '=', company.id),
    ('proxy_type', '=', proxy_type),
])
if existing:
    return existing[:1]  # already registered; skip create_user

Try / catch

from odoo.exceptions import UserError
try:
    user = self._create_proxy_user(company, proxy_type)
except UserError as e:
    if 'already exists' in str(e):
        return existing_proxy_user(company, proxy_type)
    raise

Prevention

When it happens

Trigger: Registering an EDI proxy user (activating a webservice EDI format / Peppol onboarding) for an edi_identification that was already claimed — by a previous attempt on the same database, another database, or another party using the same identification (e.g. same VAT-based participant ID).

Common situations: Re-running Peppol/EDI registration after a partial first attempt; registering the same company identification on a test and a production database; another service/provider already claimed the participant identifier on the network.

Related errors


AI-assisted analysis of odoo/odoo@1e661df964 (2026-08-15). Data as JSON: /api/errors/8e9110288928dcec. Report an issue: GitHub.