Accept quote

After creating an EOR contract, the contract must be signed by three parties to become legally valid. This guide explains the signature workflow and how to sign the contract between your organisation and Deel.

Overview

EOR contracts involve two separate agreements:

  1. Client-Deel contract - Between your organisation and Deel, establishing employment costs and responsibilities
  2. Employment agreement - Between Deel (as employer of record) and the worker, formalising employment terms

This guide focuses on the Client-Deel contract and the three-party signature process.

Three-party signature flow

The contract requires signatures in this sequence:

  1. Deel signs - Deel reviews and signs the contract (automatic or within 24 hours)
  2. Your organisation signs - You accept the quote and sign via API
  3. Worker signs - Worker completes onboarding and signs the employment agreement
1

Deel signs

After contract creation, Deel reviews and automatically or manually signs.

2

You sign

Accept the quote and sign using the API endpoint.

3

Worker signs

Worker completes onboarding and signs the employment agreement.

Step 1: Deel signs the contract

After you create the contract, Deel reviews it, issues a cost quote, and signs the contract.

Automatic signature:

  • Available in select countries with validated job scopes
  • Contract is signed immediately after creation
  • Status changes from under_review to waiting_for_client_sign

Manual signature:

  • Required when automatic signature is unavailable
  • Takes up to 24 hours to review and sign
  • You will be notified when ready for your signature

Automatic signature depends on country-specific requirements and job scope validation. If you used a pre-validated job scope template or validation ID, the contract is more likely to be signed automatically.

Check contract status

Monitor the contract status to know when it is ready for your signature.

API endpoint: GET /eor/contracts/{contract_id}/details

1import requests
2import os
3
4contract_id = "eor_xyz789"
5url = f"https://api.letsdeel.com/rest/v2/eor/contracts/{contract_id}/details"
6headers = {"Authorization": f"Bearer {os.getenv('DEEL_API_TOKEN')}"}
7
8response = requests.get(url, headers=headers)
9print(response.json())

Status values:

  • under_review - Deel is reviewing and preparing to sign
  • waiting_for_client_sign - Ready for your signature
  • waiting_for_employee_contract - Waiting for worker onboarding
  • active - Fully signed and active

Step 2: Review the quote

Before signing, review the cost quote to ensure it matches your expectations.

Quote breakdown:

  • Salary - Monthly salary for the employee
  • Benefits - Cost of selected benefits (health, pension, etc.)
  • Employer costs - Taxes and statutory contributions
  • Deel fee - Deel’s service fee
  • Total monthly cost - Sum of all costs

The quote is included in the contract details response from Step 1.

1import requests
2import os
3
4contract_id = "eor_xyz789"
5url = f"https://api.letsdeel.com/rest/v2/eor/contracts/{contract_id}/details"
6headers = {"Authorization": f"Bearer {os.getenv('DEEL_API_TOKEN')}"}
7
8response = requests.get(url, headers=headers)
9quote = response.json()["data"]["quote"]
10
11print(f"Salary: {quote['currency']} {quote['salary_monthly']}/month")
12print(f"Benefits: {quote['currency']} {quote['benefits_monthly']}/month")
13print(f"Deel fee: {quote['currency']} {quote['deel_fee_monthly']}/month")
14print(f"Total: {quote['currency']} {quote['total_monthly_cost']}/month")
15print(f"Annual total: {quote['currency']} {float(quote['total_monthly_cost']) * 12}")

Step 3: Sign the contract

Once the status is waiting_for_client_sign and you have reviewed the quote, sign the contract to proceed.

API endpoint: POST /contracts/{contract_id}/signatures

1import requests
2import os
3
4contract_id = "eor_xyz789"
5url = f"https://api.letsdeel.com/rest/v2/contracts/{contract_id}/signatures"
6headers = {
7 "Authorization": f"Bearer {os.getenv('DEEL_API_TOKEN')}",
8 "Content-Type": "application/json"
9}
10payload = {
11 "data": {
12 "client_signature": "John Doe"
13 }
14}
15
16response = requests.post(url, json=payload, headers=headers)
17print(response.json())

Request parameters:

ParameterTypeRequiredDescription
client_signaturestringYesName of the person signing on behalf of your organisation
contract_template_idstringNoCustom employee agreement template ID

If you want to use a custom employee agreement template instead of the default, include the contract_template_id. You can retrieve available templates from the contract templates endpoint. Custom templates can only be created from the Deel UI.

After signing:

  • Contract status changes to waiting_for_employee_contract
  • Deel prepares the employee agreement
  • Worker receives a welcome email to begin onboarding

Step 4: Worker onboarding begins

After you sign the contract, Deel sends a welcome email to the worker with instructions to:

  1. Sign up to the Deel platform
  2. Complete identity verification (KYC)
  3. Provide banking and tax information
  4. Review and sign the employment agreement

The worker must complete onboarding before the employment agreement can be signed and the contract becomes active.

Best practices

Subscribe to contract.status.updated events to receive real-time notifications when the contract status changes. This is more efficient than repeatedly calling the contract details endpoint.

Verify total costs match your budget before signing. Once signed, the contract enters the worker onboarding flow and cannot easily be cancelled without incurring costs in some jurisdictions.

Keep a record of contract IDs in your system from the moment of creation. You will need them for future amendments, terminations, and payslip queries.

For contracts where the total cost is within an approved budget range, consider implementing automated signing in your workflow. Add a manual review step only when costs exceed a threshold.

Implement retry logic for failed signature attempts. A common cause of failure is attempting to sign before the contract has reached waiting_for_client_sign status — always check the status before calling the signature endpoint.

Troubleshooting

If a contract remains in under_review for more than 24 hours:

  • Check if the job scope requires manual validation
  • Verify all required fields were provided during contract creation
  • Contact Deel support with the contract ID

Common reasons for signature failures:

  • Contract is not in waiting_for_client_sign status
  • Invalid contract ID
  • Missing required client_signature field
  • Invalid contract_template_id (if using custom templates)

After signing:

  • Verify the worker’s email address in the contract details
  • Check spam and junk folders
  • Allow up to 30 minutes for email delivery
  • Contact Deel support if the email does not arrive after 30 minutes

Next steps