Lime CRM Integration

Sync your Lime CRM contacts and companies with Propstreet automatically.

Overview

Feature Support
Market Nordic (Sweden focus)
Sync Direction Bidirectional
Real-time Updates Yes (customer-managed sync)
Contacts ✅ Full support
Companies ✅ Full support
Projects ✅ Full support (v1.2.0)
Prospects ✅ Full support (v1.2.0)
Properties ⚠️ API available (v1.3.0)

Data Mapping

Contact Fields (Person)

Lime CRM Propstreet Notes
First Name First Name
Last Name Last Name
Email Email Primary email synced
Mobile Phone Phone Preferred phone number
Job Title Job Title Synced to company connection
Person↔Company Connection Links contact to company
Categories/Tags Tags Mapped to Propstreet tags
Notes Notes/Strategy See notes section below
Photo Profile Picture Via Lime's image API if available

Note: Lime CRM data models vary per application. Check your Lime interactive docs at /{application}/api/v1/docs/ for exact field names.

Company Fields

Lime CRM Propstreet Notes
Company Name Name
Organization Number External Reference Used for matching (Nordic markets)
Country Country Code ISO 2-letter code
Website Homepage URL If available in your Lime installation
Domain Set directly or auto-extracted from URL
Company Logo Profile Picture Via Lime's image API if available

How Sync Works

Lime → Propstreet

You control the sync through your own integration layer:

  1. Configure Lime Webhooks to send events to your middleware (e.g., Azure Logic Apps, n8n, or custom service)
  2. Your middleware transforms and pushes data to Propstreet via our API
  3. Records are matched using email or organization number and created/updated in Propstreet

This gives you full control over sync timing, filtering, and data transformation.

Propstreet → Lime

When you update a contact in Propstreet, you have two options:

Option A: Webhooks (Recommended)

  1. Register a Propstreet webhook for contact.* and company.* events
  2. Propstreet pushes changes to your endpoint in real-time
  3. Your middleware transforms and pushes to Lime CRM

Option B: Polling

  1. Your integration layer polls the Propstreet API for changes (using updated_since)
  2. Changes are transformed and pushed to Lime CRM via their API
  3. Your Lime records stay in sync

Webhooks provide near real-time sync without polling overhead.

Duplicate Handling

We use smart matching to prevent duplicates:

  • Contacts: Matched by email address first, then Lime object ID via externalRefs
  • Companies: Matched by organization number, then company name + country

If we detect a potential duplicate, we update the existing record rather than creating a new one.

Field Considerations

Application-Specific Data Models

Lime CRM allows custom data models per application. Before building your integration:

  1. Access your Lime interactive docs at https://{domain}/{application}/api/v1/docs/
  2. Review the available limetypes (e.g., person, company)
  3. Map your specific fields to Propstreet's data model

Person↔Company Relationships

Lime CRM uses relations to link persons to companies. In Propstreet:

  • Each contact can have multiple company connections
  • Exactly one connection must be marked as primary
  • Job title is stored on the connection, not the contact

When syncing, ensure you:

  • Create the company first (or find existing)
  • Link the person to the company with proper relationship data

Notes vs Strategy

Propstreet has two different fields for text information:

  • Strategy - Investment focus (e.g., "Office properties in Stockholm, 50-200 MSEK")
  • Notes - Activity log entries (call notes, meeting summaries, etc.)

How you map Lime's note fields depends on your organization's usage:

  • If notes contain investment criteria → map to strategy field
  • If notes contain call logs/activity → use the Notes API endpoint
  • If mixed usage → consider keyword-based routing in your integration

Phone Numbers

Lime CRM may have multiple phone fields per person. We sync the mobile number to Propstreet; other phone numbers are not synced by default.

Profile Pictures

Lime CRM uses a separate image API for photos. If your Lime installation includes image support:

  • Retrieve images via Lime's file/image API
  • Upload to Propstreet using the profile picture endpoint
  • Propstreet accepts standard image formats (JPEG, PNG)

Setup Requirements

To build a Lime CRM integration, you'll need:

  1. Lime API Access - Create a dedicated API user in Lime and generate an API key
  2. Propstreet API Credentials - Generate in your account settings
  3. Integration Layer - Middleware to handle webhooks and API calls (Azure Logic Apps, n8n, or custom)
  4. Lime Webhooks Add-on - Required for real-time sync from Lime (subscribe to person/company events)

Lime API Key Best Practices

  • Create a dedicated API user for each external system
  • API keys have no expiration date but cannot be retrieved after creation
  • Store the key securely (environment variables or secret management)
  • The x-api-key header is used for authentication

Getting Started

  1. Generate Propstreet API credentials in your account settings (requires login)
  2. Create a dedicated API user in Lime CRM and generate an API key
  3. Review your Lime interactive docs at /{application}/api/v1/docs/ for available fields
  4. Set up your integration layer to sync data between Lime and Propstreet
  5. If using real-time sync, configure Lime Webhooks to send events to your middleware

You're responsible for building and maintaining the integration.

Frequently Asked Questions

How do I authenticate with Lime CRM?

Lime uses API keys passed via the x-api-key header. Each user can only have one API key, so create a dedicated API user for your integration.

What are Lime's rate limits?

For Lime CRM Cloud: 3000 requests per 5 minutes per IP. Plan your sync frequency accordingly.

How do I receive real-time updates from Lime?

Use the Lime Webhooks Add-on. Subscribe to events like person.new, person.update, company.delete, etc. via the subscription API at /api/v1/subscription/.

How do I validate Lime webhook signatures?

Lime signs webhook payloads using HMAC SHA-256. The signature is in the X-Lime-Signature header as sha256=[signature]. Verify it against the raw request body using your webhook secret.

What happens if my Lime data model differs from standard?

Lime allows custom limetypes and fields per application. Access your interactive docs at /{application}/api/v1/docs/ to see your exact schema, then adjust field mappings accordingly.

How often does data sync?

Sync frequency depends on how you configure your integration layer:

  • Real-time: Use Lime Webhooks + Propstreet Webhooks for immediate syncs
  • Scheduled: Poll both APIs on a schedule (e.g., every 15 minutes, hourly)
  • Manual: Trigger syncs on-demand

How should I handle duplicates?

Use stable cross-system IDs stored in Propstreet's externalRefs:

{
  "externalRefs": [{ "namespace": "lime", "id": "12345" }]
}

Search by externalRefs first, then fall back to email or organization number matching.

Projects & Prospects (v1.2.0)

Sync real estate deals between Lime CRM Deal/Business objects and Propstreet Projects. Track investor prospects through your pipeline with bidirectional classification sync.

Note: Lime CRM data models are customizable per application. The entity may be called deal or business depending on your installation. Check your interactive docs at /{application}/api/v1/docs/ for exact field names.

Deal to Project Mapping

Lime CRM Field Propstreet Project Notes
id externalRefs namespace: "lime"
name name Direct mapping
dealstatus Use for display; see status mapping below
value Deal value (not mapped directly)
company Linked company reference
_timestamp updatedUtc For delta sync

Note: Project status is read-only in Propstreet. It's auto-generated based on workflow state (whether teaser has been published, communicated, etc.). Use the mapping below for display purposes when syncing FROM Propstreet TO Lime.

Deal-Person Relations to Prospect Mapping

Lime Concept Propstreet Prospect Notes
Person linked to Deal contactId Via Contact external ref lookup
Company linked to Deal companyId Via Company external ref lookup
Status on deal-person link classification Map to Propstreet classification

Deal Status to Project State Mapping

Propstreet uses three separate fields for project state. Map Lime deal statuses to the appropriate combination:

Lime dealstatus (suggested) status classification teaser.stage Notes
contact / new open draft Project created, not yet marketed
requirement open active published Teaser published
tender / offer open active communicated Teaser sent to investors
won closed Deal completed
lost deleted Project archived/cancelled
  • status: Lifecycle state (open, closed, deleted) — read-only, set by system
  • classification: Work stage (draft, active, inactive) — settable via API
  • teaser.stage: Teaser progress (property_added, drafting, published, verified, communicated) — read-only, set by system

Deal-Person Status to Classification Mapping

Prospect classification is read-write and settable via API. Map Lime deal-person relation status to track investor engagement:

Lime Relation Status (typical) Propstreet Classification Notes
(not set) not_contacted Default state
contacted contacted Initial outreach made
interested interested Positive response
declined / inactive not_interested No longer engaged
bidding / agreement bidder Active in process

Note: Lime's pipeline stages and relation statuses are customizable per installation. Document the mapping per customer.

Sync Architecture

Lime → Propstreet (using Webhooks):

  1. Subscribe to deal.new, deal.update, deal.delete events (or business.* depending on your installation)
  2. Validate X-Lime-Signature header (HMAC SHA-256)
  3. Fetch full deal record via GET /limeobject/deal/{id}/
  4. Transform and push to Propstreet Projects API
// Handle Lime webhook
async function handleLimeWebhook(payload) {
  const dealId = payload.id;

  if (payload.event === "deal.new") {
    const deal = await lime.get(`/limeobject/deal/${dealId}/`);
    const project = await propstreet.post("/api/v1/projects", {
      name: deal.name,
      externalRefs: [{ namespace: "lime", id: String(dealId) }],
    });
  }
}

Propstreet → Lime (using Webhooks):

  1. Register webhooks for project.* and prospect.* events
  2. Look up Lime Deal ID from externalRefs
  3. Update Lime via REST API
// Handle Propstreet webhook
async function handlePropstreetWebhook(payload) {
  const limeId = payload.data.externalRefs?.find(
    (ref) => ref.namespace === "lime"
  )?.id;

  if (payload.event === "project.updated" && limeId) {
    await lime.put(`/limeobject/deal/${limeId}/`, {
      name: payload.data.name,
    });
  }
}

Webhook Events

Subscribe to these Propstreet events for deal sync:

Event Description Lime Action
project.created New project created Create Deal/Business
project.updated Project fields modified Update Deal
project.deleted Project soft-deleted Update dealstatus: lost
prospect.created Investor added to prospect list Add Deal-Person relation
prospect.updated Classification changed Update relation status
prospect.deleted Investor deleted from prospect list Remove Deal-Person relation

Example: Create Project with Lime Reference

curl -X POST "https://app.propstreet.com/api/v1/projects" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Stockholm Office Building",
    "externalRefs": [{ "namespace": "lime", "id": "98765" }]
  }'

Example: Lookup Project by Lime ID

curl "https://app.propstreet.com/api/v1/projects/external/lime/98765" \
  -H "Authorization: Bearer $TOKEN"

Lime-Specific Considerations

Schema Discovery Required:

  • Field names vary per installation (dealstatus vs status, deal vs business)
  • Always check /{application}/api/v1/docs/ before building
  • Consider making field mappings configurable per Lime tenant

Deal-Person Junction:

  • Lime may use a separate limetype (e.g., dealcontact, participant) for deal-person relationships
  • Or use direct relations on the deal/person limetypes
  • Query approach varies: check if there's a hasmany relation or junction table

Rate Limits:

  • Lime Cloud: 3000 requests per 5 minutes per IP
  • Plan initial sync carefully; use exponential backoff

API References