Skip to main content
RapidDev - Software Development Agency
flutterflow-integrationsFlutterFlow API Call

Propertybase

Connecting FlutterFlow to Propertybase means connecting to Salesforce — Propertybase has no standalone API. You build a Firebase Cloud Function (or Supabase Edge Function) that handles the Salesforce OAuth 2.0 token exchange and runs SOQL queries against Propertybase custom objects (pb__Listing__c, pb__Transaction__c). FlutterFlow then calls that function via a standard API Call, receiving clean listing and commission JSON for your real-estate app.

What you'll learn

  • Why Propertybase has no standalone API and how to use the Salesforce REST API instead
  • How to create a Salesforce Connected App and obtain OAuth Consumer Key and Secret
  • How to write a Firebase Cloud Function that authenticates, caches the access token, and runs SOQL
  • How to verify Propertybase custom-object API names (pb__ prefix) in Salesforce Object Manager
  • How to wire FlutterFlow API Calls to your Cloud Function and bind listing data to app screens
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Advanced18 min read90 minutesCRM & SalesLast updated July 2026RapidDev Engineering Team
TL;DR

Connecting FlutterFlow to Propertybase means connecting to Salesforce — Propertybase has no standalone API. You build a Firebase Cloud Function (or Supabase Edge Function) that handles the Salesforce OAuth 2.0 token exchange and runs SOQL queries against Propertybase custom objects (pb__Listing__c, pb__Transaction__c). FlutterFlow then calls that function via a standard API Call, receiving clean listing and commission JSON for your real-estate app.

Quick facts about this guide
FactValue
ToolPropertybase
CategoryCRM & Sales
MethodFlutterFlow API Call
DifficultyAdvanced
Time required90 minutes
Last updatedJuly 2026

Propertybase and the Salesforce API Layer

Propertybase is not a standalone platform — it is a package of custom Salesforce objects (Listings, Transactions, Commissions, Contacts) installed inside a Salesforce org. When you search for a 'Propertybase API,' you are actually looking for the Salesforce REST API pointed at those custom objects. This means your FlutterFlow app needs full Salesforce authentication before it can read a single property listing.

The core challenge is OAuth 2.0. Salesforce uses a Connected App flow that involves a Consumer Key, Consumer Secret, and a token endpoint. Dart code compiled into a FlutterFlow app ships to users' devices, so those credentials cannot live client-side — a malicious actor could decompile the app binary and extract them, gaining full access to your Salesforce org. The correct pattern is a Firebase Cloud Function or Supabase Edge Function that stores the Connected App credentials securely, exchanges them for an access token (using the 'client_credentials' or 'username-password' OAuth flow for server-to-server calls), and then runs SOQL queries against `pb__Listing__c`, `pb__Transaction__c`, and related objects. Your FlutterFlow app calls the function and receives plain JSON it can bind to its UI.

Properybase licensing is enterprise-grade and bundled with Salesforce licensing — verify your org's edition with your Propertybase account manager before building, since the API call limits and available objects depend on which Salesforce edition underlies your Propertybase install. SOQL queries are capped at 2,000 records per query, so you will need LIMIT/OFFSET pagination for any large listing portfolio.

Integration method

FlutterFlow API Call

Because Propertybase runs on Salesforce, all data access goes through the Salesforce REST API using OAuth 2.0 tokens and SOQL queries. FlutterFlow cannot perform the OAuth token exchange safely on the client, so a Firebase Cloud Function (or Supabase Edge Function) handles authentication and executes SOQL, returning clean JSON. FlutterFlow's API Calls panel then talks to that function URL rather than Salesforce directly, keeping all OAuth credentials server-side.

Prerequisites

  • A Propertybase account with an active Salesforce org (any edition with API access enabled)
  • Admin access to Salesforce Setup to create a Connected App
  • A Firebase project with Cloud Functions enabled (Blaze/pay-as-you-go plan required) OR a Supabase project with Edge Functions
  • A FlutterFlow project (Free or paid plan works; paid plan needed for deployment)
  • Basic familiarity with JSON — you will be reading Salesforce REST responses

Step-by-step guide

1

Create a Salesforce Connected App and note your OAuth credentials

Open your Salesforce org and navigate to Setup (the gear icon in the top-right corner) → search 'App Manager' in Quick Find → click 'New Connected App' in the top-right. Fill in the Connected App Name (e.g. 'FlutterFlow Propertybase'), your contact email, and check 'Enable OAuth Settings.' Set the Callback URL to `https://login.salesforce.com/services/oauth2/success` (this is a placeholder for the server-to-server flow). Under 'Selected OAuth Scopes,' add 'Access and manage your data (api)' and 'Perform requests on your behalf at any time (refresh_token, offline_access).' Save, then wait 2–10 minutes for the Connected App to propagate. Go back to App Manager, find your new Connected App, click the dropdown arrow on the right, and select 'View.' Scroll down to the 'API (Enable OAuth Settings)' section and click 'Manage Consumer Details' — you'll be asked to re-verify your Salesforce identity via email or authenticator. Once verified, copy your Consumer Key and Consumer Secret. Store them somewhere secure (a password manager) — you will paste them into your Cloud Function environment variables, never directly into FlutterFlow. Also note your Salesforce org's My Domain URL: go to Setup → 'My Domain' → copy the domain string (e.g. `yourcompany.my.salesforce.com`). This forms the base URL for all Salesforce REST API calls.

Pro tip: If 'Manage Consumer Details' is greyed out, your Salesforce admin needs to enable 'Require Secret for Web Server Flow' and 'Require Secret for Refresh Token Flow' in the Connected App policies first.

Expected result: You have a Consumer Key, Consumer Secret, and your org's My Domain URL ready to paste into environment variables. The Connected App shows as 'Installed' in App Manager.

2

Verify Propertybase custom-object API names in Salesforce Object Manager

Before writing any SOQL, you need to confirm the exact API names of the Propertybase objects in your org. These names use a `pb__` prefix, but they vary depending on the Propertybase version installed and any customizations your admin has made. A wrong object name returns a `INVALID_TYPE: pb__Listing__c is not supported` error from Salesforce that looks like an auth problem but is actually a schema mismatch. In Salesforce Setup, type 'Object Manager' in Quick Find and open it. You'll see a list of all Salesforce and custom objects in your org. Use the search bar at the top of the Object Manager to search for 'pb' — this will surface all Propertybase custom objects. Common objects include: `pb__Listing__c` (property listings), `pb__Transaction__c` (sale/rental transactions), `pb__Commission__c` (commission records), and `pb__Listing_Agent_Role__c` (agent-listing relationships). Click each object to see its Field API Names — for example, the listing price field might be `pb__List_Price__c` not just `Price`. Make a quick reference list of the object API names and the field API names you plan to query. You'll use these directly in your SOQL strings inside the Cloud Function. If you don't see any pb__ objects, your org may have Propertybase installed under a different namespace — check with your Propertybase account manager.

test_soql.sql
1-- Example SOQL query to test in Salesforce Developer Console (Query Editor tab)
2SELECT Id, pb__Street_Address__c, pb__City__c, pb__List_Price__c,
3 pb__Status__c, pb__Days_On_Market__c, OwnerId
4FROM pb__Listing__c
5WHERE pb__Status__c = 'Active'
6ORDER BY pb__List_Price__c ASC
7LIMIT 10

Pro tip: Run your SOQL in the Salesforce Developer Console (Setup → Developer Console → Query Editor) to confirm it returns data before putting it in the Cloud Function. This saves significant debugging time.

Expected result: You have a verified list of Propertybase object and field API names, and your test SOQL query returns real listing records in the Salesforce Developer Console.

3

Build a Firebase Cloud Function that authenticates with Salesforce and runs SOQL

This is the most critical step: a server-side proxy that holds your OAuth credentials and acts as the only bridge between FlutterFlow and Salesforce. Never put the Consumer Key, Consumer Secret, or Salesforce passwords in FlutterFlow. In your Firebase project, go to the Firebase Console → Functions → Get Started (you need the Blaze plan). Open a browser-based Cloud Functions editor or use the Firebase console's inline editor if available. Create an HTTPS function called `querySalesforce`. The function performs these steps on each call: (1) POST to `https://login.salesforce.com/services/oauth2/token` with `grant_type=client_credentials`, your Consumer Key as `client_id`, and Consumer Secret as `client_secret` to obtain an access token. (2) Use that token to call the Salesforce REST query endpoint with the SOQL passed in the request body. (3) Return the Salesforce response as JSON to FlutterFlow. Store the Consumer Key and Consumer Secret using Firebase environment configuration (set them via the Firebase console Functions → Configuration, NOT hardcoded in the function). The complete function code is shown below — paste it into the inline editor, save, and deploy. The function URL will look like `https://us-central1-your-project.cloudfunctions.net/querySalesforce`. If you'd rather skip writing and maintaining the Cloud Function yourself, RapidDev's team builds FlutterFlow–Salesforce integrations every week — free scoping call at rapidevelopers.com/contact.

index.js
1const functions = require('firebase-functions');
2const axios = require('axios');
3
4// Store these in Firebase Functions Config, not hardcoded:
5// firebase functions:config:set sf.consumer_key="YOUR_KEY" sf.consumer_secret="YOUR_SECRET" sf.instance_url="https://yourorg.my.salesforce.com"
6const SF_CONSUMER_KEY = functions.config().sf.consumer_key;
7const SF_CONSUMER_SECRET = functions.config().sf.consumer_secret;
8const SF_INSTANCE_URL = functions.config().sf.instance_url;
9
10async function getSalesforceToken() {
11 const params = new URLSearchParams();
12 params.append('grant_type', 'client_credentials');
13 params.append('client_id', SF_CONSUMER_KEY);
14 params.append('client_secret', SF_CONSUMER_SECRET);
15
16 const res = await axios.post(
17 'https://login.salesforce.com/services/oauth2/token',
18 params
19 );
20 return res.data.access_token;
21}
22
23exports.querySalesforce = functions.https.onRequest(async (req, res) => {
24 // Allow CORS for web builds
25 res.set('Access-Control-Allow-Origin', '*');
26 if (req.method === 'OPTIONS') {
27 res.set('Access-Control-Allow-Methods', 'POST');
28 res.set('Access-Control-Allow-Headers', 'Content-Type');
29 return res.status(204).send('');
30 }
31
32 try {
33 const { soql } = req.body;
34 if (!soql) return res.status(400).json({ error: 'soql is required' });
35
36 const token = await getSalesforceToken();
37 const encodedSoql = encodeURIComponent(soql);
38 const sfRes = await axios.get(
39 `${SF_INSTANCE_URL}/services/data/v59.0/query?q=${encodedSoql}`,
40 { headers: { Authorization: `Bearer ${token}` } }
41 );
42
43 return res.json(sfRes.data);
44 } catch (err) {
45 console.error(err.response?.data || err.message);
46 return res.status(500).json({ error: 'Salesforce query failed' });
47 }
48});

Pro tip: The `client_credentials` OAuth flow requires your Connected App to have the 'Require Secret for Web Server Flow' policy enabled, and the user running the app must have API Enabled permission. If you get 'invalid_client_credentials', double-check these two settings in Salesforce Setup.

Expected result: The Cloud Function is deployed and you can test it by sending a POST request with body `{"soql": "SELECT Id, pb__List_Price__c FROM pb__Listing__c LIMIT 5"}` — it returns a JSON object with a `records` array.

4

Create a FlutterFlow API Group pointing to your Cloud Function

Now that the proxy is live, add it to FlutterFlow as an API Call so your app can query Salesforce listing data. Click 'API Calls' in the left navigation panel of the FlutterFlow editor. Click the '+' (plus) button and choose 'Create API Group.' Name it 'PropertybaseSF.' In the Base URL field, paste your Cloud Function URL (e.g. `https://us-central1-your-project.cloudfunctions.net`). Leave the Headers section empty — no API keys here, since security lives in the Cloud Function. With the API Group created, click '+' again and select 'Create API Call' inside the PropertybaseSF group. Name it 'QueryListings.' Set the Method to POST. Set the Path to `/querySalesforce`. Click the 'Body' tab and set the Content-Type to `application/json`. Click '+ Add Body Field' and add a variable named `soql` with type String. In the body JSON template, set the value to `{{ soql }}`. Now click the 'Response & Test' tab. In the 'Variables' section, fill in the `soql` field with your test SOQL string: `SELECT Id, pb__Street_Address__c, pb__City__c, pb__List_Price__c, pb__Status__c FROM pb__Listing__c WHERE pb__Status__c = 'Active' LIMIT 20`. Click 'Test API Call.' If the function is deployed correctly, you'll see a JSON response with a `records` array. Click 'Generate JSON Paths' — FlutterFlow will parse the response and create JSON path variables like `$.records[*].pb__Street_Address__c` and `$.records[*].pb__List_Price__c` that you can bind directly to widgets.

api_call_config.txt
1// API Call configuration reference (not a file — use this to match FlutterFlow UI settings)
2// Group Name: PropertybaseSF
3// Base URL: https://us-central1-YOUR_PROJECT.cloudfunctions.net
4//
5// Call Name: QueryListings
6// Method: POST
7// Path: /querySalesforce
8// Content-Type: application/json
9// Body: { "soql": "{{ soql }}" }
10//
11// JSON Paths after test:
12// Total records: $.totalSize
13// Records array: $.records
14// Address: $.records[*].pb__Street_Address__c
15// City: $.records[*].pb__City__c
16// List price: $.records[*].pb__List_Price__c
17// Status: $.records[*].pb__Status__c

Pro tip: If the test returns an empty `records` array, verify that your Salesforce org has Active listings and that your SOQL WHERE clause matches the exact picklist values in your org (e.g., 'Active' vs 'active' — Salesforce is case-sensitive in SOQL string comparisons).

Expected result: The 'QueryListings' API Call test succeeds, FlutterFlow shows a populated JSON response, and JSON Path variables for address, city, list price, and status are generated and available in the UI.

5

Bind listing data to a ListView and add LIMIT/OFFSET pagination

On your FlutterFlow listing-search screen, add a ListView widget from the widget panel. Select the ListView, open its 'Backend Query' settings in the right panel, choose 'API Call,' select the PropertybaseSF group and QueryListings call. In the 'Variables' section, bind the `soql` variable to a string that includes a LIMIT and an OFFSET driven by a Page State variable. Create two Page State variables: `pageOffset` (Integer, default 0) and `listings` (List of JSON, default empty). On the page's 'On Page Load' action, add an API Call action for QueryListings with `soql` = `SELECT Id, pb__Street_Address__c, pb__City__c, pb__List_Price__c, pb__Status__c FROM pb__Listing__c WHERE pb__Status__c = 'Active' ORDER BY CreatedDate DESC LIMIT 20 OFFSET 0`. Store the result in the `listings` Page State variable. Inside the ListView, add a Column widget for each card: a Text widget bound to `$.pb__Street_Address__c` from the current list item, another Text bound to `$.pb__City__c`, and a formatted Text for list price. Add a 'Load More' button below the ListView that increments `pageOffset` by 20 and fires another QueryListings call with the updated OFFSET, then appends results to the `listings` list. For the SOQL 2,000-record hard cap: Salesforce will simply stop returning records at 2,000 regardless of your OFFSET. If your listing portfolio exceeds that, filter by date range in the WHERE clause (`CreatedDate = LAST_N_DAYS:90`) or by status to keep each query well under the cap. Always add `LIMIT 20` or `LIMIT 50` to every query — an open-ended SOQL query will fetch all matching records in one call and hit the cap silently.

soql_paginated.sql
1-- Paginated SOQL with LIMIT/OFFSET
2SELECT Id, pb__Street_Address__c, pb__City__c,
3 pb__List_Price__c, pb__Status__c, pb__Days_On_Market__c
4FROM pb__Listing__c
5WHERE pb__Status__c = 'Active'
6 AND CreatedDate = LAST_N_DAYS:90
7ORDER BY pb__List_Price__c ASC
8LIMIT 20 OFFSET {{ pageOffset }}

Pro tip: SOQL OFFSET performance degrades on large record sets (above a few thousand). For very large catalogs, use keyset pagination: record the last Id from the current page and add `WHERE Id > '{{ lastId }}'` to the next query instead of OFFSET.

Expected result: The app screen shows a scrollable list of Propertybase listings with address, city, and price. The 'Load More' button fetches the next 20 records. The page state correctly tracks the offset between calls.

6

Handle relationship fields that may return null and add write-back for new contacts

Propertybase's object model connects Listings to Contacts and Accounts through relationship fields. When you include relationship fields in SOQL (e.g. `pb__Listing__r.OwnerId`), Salesforce returns them as nested JSON objects when present, but returns `null` when the relationship is empty. FlutterFlow's JSON Path bindings do not gracefully handle null nested objects by default — binding `$.records[*].pb__Listing_Agent_Role__r.Name` to a Text widget will render a blank or error if the relationship record doesn't exist. To guard against this, write your Cloud Function to reshape the Salesforce response before sending it to FlutterFlow: for each record, explicitly check for null relationship fields and substitute a safe default string. Alternatively, use SOQL's colon syntax to avoid nulls: `SELECT Id, (SELECT Contact.Name FROM pb__Listing_Agent_Roles__r) FROM pb__Listing__c` and flatten the sub-query in the Cloud Function before returning. For writing new contacts (e.g. open-house sign-ins), add a second API Call in FlutterFlow — also a POST to your Cloud Function, but with a different body field `operation: 'create_contact'`. In the Cloud Function, detect `operation` and call the Salesforce REST API POST `/services/data/v59.0/sobjects/Contact` with the provided first name, last name, email, and phone fields. Return the new Contact Id to FlutterFlow so you can show a success confirmation. Always validate required Salesforce fields (at minimum, `LastName`) before calling the API, since Salesforce returns a `REQUIRED_FIELD_MISSING` error that your app should surface clearly rather than silently swallowing.

index.js
1// Add to the Cloud Function to handle contact creation:
2// In req.body, check for operation === 'create_contact'
3
4if (req.body.operation === 'create_contact') {
5 const { firstName, lastName, email, phone } = req.body;
6 if (!lastName) {
7 return res.status(400).json({ error: 'LastName is required for Salesforce Contact creation' });
8 }
9 const token = await getSalesforceToken();
10 const contactRes = await axios.post(
11 `${SF_INSTANCE_URL}/services/data/v59.0/sobjects/Contact`,
12 { FirstName: firstName, LastName: lastName, Email: email, Phone: phone },
13 { headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' } }
14 );
15 return res.json({ id: contactRes.data.id, success: contactRes.data.success });
16}

Pro tip: Test contact creation in the Salesforce Developer Console with a SOQL query: `SELECT Id, FirstName, LastName, Email FROM Contact ORDER BY CreatedDate DESC LIMIT 5` — if your new contact appears within seconds, the write-back is working correctly.

Expected result: Relationship fields display safely even when null (showing blank text or a placeholder rather than crashing). The contact-creation form successfully creates a new Salesforce Contact and returns its Id to the FlutterFlow app, which navigates to a 'Thank you' screen.

Common use cases

Mobile listing-search app for real-estate agents

Agents open a FlutterFlow app on their phone, type a neighborhood or price range, and instantly see active pb__Listing__c records pulled from Propertybase. Each card shows address, list price, status, and days on market. Tapping a card navigates to a full-detail screen with commission fields and linked contacts.

FlutterFlow Prompt

Build a real-estate listing-search screen that queries our Propertybase (Salesforce) listings by status and price range, displays them as cards with address and price, and opens a detail view showing commission and transaction fields.

Copy this prompt to try it in FlutterFlow

Transaction-pipeline tracker for team leads

A team leader uses a FlutterFlow dashboard to see all open pb__Transaction__c records grouped by stage, with aggregate commission totals per agent. The app calls the Cloud Function with a SOQL query that uses GROUP BY and SUM across agent records, displaying a summary chart in a simple list widget.

FlutterFlow Prompt

Create a transaction-pipeline dashboard in FlutterFlow that shows open real-estate transactions grouped by stage (Under Contract, Pending, Closed), with a total projected commission per stage, pulling data from our Salesforce Propertybase org.

Copy this prompt to try it in FlutterFlow

New-contact capture form that writes to Salesforce

Open-house visitors fill in a FlutterFlow form (name, email, phone, property interest). Submitting the form calls a Cloud Function that creates a Salesforce Contact linked to the relevant Listing record, so the lead lands directly in Propertybase without manual data entry.

FlutterFlow Prompt

Build a simple open-house sign-in form in FlutterFlow that collects visitor name, email, phone, and property address, then calls our backend to create a Salesforce Contact and Activity linked to the corresponding Propertybase Listing.

Copy this prompt to try it in FlutterFlow

Troubleshooting

Cloud Function returns 'invalid_client_credentials' or 401 from Salesforce token endpoint

Cause: The Connected App Consumer Key or Consumer Secret is wrong, or the Connected App does not have the 'Require Secret for Web Server Flow' policy enabled, or your Salesforce org uses a sandbox URL (test.salesforce.com) instead of login.salesforce.com.

Solution: Double-check the Consumer Key and Secret by revisiting App Manager → your Connected App → Manage Consumer Details. If your org is a sandbox, change the token URL in the Cloud Function from `https://login.salesforce.com/services/oauth2/token` to `https://test.salesforce.com/services/oauth2/token`. Confirm 'Enable Client Credentials Flow' is checked in the Connected App's OAuth policies.

SOQL query returns 'INVALID_TYPE: pb__Listing__c is not supported in this organization'

Cause: The Propertybase package is either not installed in this Salesforce org, or the custom object uses a different namespace prefix than expected (Propertybase version-specific or a customized prefix).

Solution: Open Salesforce Setup → Object Manager → search 'pb' and look at all listed custom objects. If you see none with the pb__ prefix, Propertybase may be installed under a different namespace. Contact your Propertybase administrator to confirm the correct object API names for your specific org version. Paste a confirmed object name into the SOQL and retest in the Salesforce Developer Console before updating the Cloud Function.

SOQL query silently returns only the first 2,000 records with no error

Cause: Salesforce enforces a hard 2,000-record cap on SOQL queries. Queries without LIMIT that match more than 2,000 records are truncated without raising an error. The Salesforce response includes a `nextRecordsUrl` field when there are more records, but FlutterFlow's JSON path bindings do not follow it automatically.

Solution: Always add `LIMIT 20` (or your desired page size) and `OFFSET {{ pageOffset }}` to every SOQL query. Use date-range filters (`CreatedDate = LAST_N_DAYS:90`) to reduce the working set. For very large datasets, implement keyset pagination using `WHERE Id > '{{ lastId }}'` instead of OFFSET for better performance at high record counts.

FlutterFlow API Call test succeeds but relationship fields like pb__Listing_Agent_Role__r.Name show blank or cause a binding error on screen

Cause: Salesforce returns null for relationship fields when the related record doesn't exist, and FlutterFlow JSON path bindings do not handle null nested objects gracefully.

Solution: In the Cloud Function, reshape the Salesforce response before returning it: iterate over each record and replace null relationship objects with a safe default string such as 'Unassigned'. Alternatively, use SOQL COALESCE-equivalent patterns by filtering `WHERE pb__Listing_Agent_Role__c != null` in the query if unassigned listings are not needed in the app.

typescript
1// In the Cloud Function, flatten relationship fields:
2const records = sfRes.data.records.map(r => ({
3 ...r,
4 agentName: r.pb__Listing_Agent_Role__r?.Name ?? 'Unassigned'
5}));
6return res.json({ records });

Best practices

  • Never put the Salesforce Consumer Key, Consumer Secret, or access tokens in a FlutterFlow API Call header or variable — always store them in Cloud Function environment configuration.
  • Always specify LIMIT in every SOQL query to avoid hitting the 2,000-record silent cap and to keep Cloud Function response times fast.
  • Verify Propertybase custom-object API names (pb__ prefix) in Salesforce Object Manager for your specific org before writing SOQL — field names vary between Propertybase versions and org customizations.
  • Cache the Salesforce OAuth access token in Firebase Firestore or in-memory (tokens last around 1–2 hours) rather than calling the token endpoint on every API request, to reduce latency and avoid hitting Salesforce rate limits.
  • Test all SOQL queries in the Salesforce Developer Console (Query Editor) before deploying them in the Cloud Function — this immediately surfaces INVALID_TYPE and field-name errors before they affect your app.
  • Add a CORS handler to your Cloud Function for FlutterFlow web builds: respond to OPTIONS requests with the appropriate Access-Control-Allow headers so the browser does not block the request.
  • Use date-range literals in SOQL WHERE clauses (LAST_N_DAYS:30, THIS_QUARTER) to keep query result sets manageable and avoid slow, full-table scans on large Salesforce orgs.
  • Display user-friendly error messages in your FlutterFlow app for Salesforce-specific error codes: REQUIRED_FIELD_MISSING for form validation failures and QUERY_TIMEOUT for oversized queries.

Alternatives

Frequently asked questions

Does Propertybase have its own API separate from Salesforce?

No. Propertybase has no standalone API. It is a package of custom Salesforce objects installed inside a Salesforce org, so all API access goes through the Salesforce REST API using Salesforce OAuth 2.0 and SOQL. When you connect FlutterFlow to 'Propertybase,' you are connecting to Salesforce and querying pb__Listing__c and related objects.

Can I put the Salesforce access token in a FlutterFlow App Value or API Call variable?

No — this would be a serious security risk. FlutterFlow compiles to Dart code that runs on users' devices. Any value placed in an API Call header or App Value is embedded in the compiled binary and can be extracted by decompiling the app. The Salesforce Consumer Key and Consumer Secret must live exclusively in a Firebase Cloud Function or Supabase Edge Function, never in the client app.

Why does my SOQL query return only 2,000 records even though there are more?

Salesforce enforces a hard 2,000-record cap per SOQL query and truncates results silently (no error is raised). You must use LIMIT and OFFSET pagination in your query to retrieve records in batches. For very large record sets, use keyset pagination (WHERE Id > 'last_id') rather than OFFSET because OFFSET performance degrades on large datasets.

What Salesforce edition do I need to use the API?

API access requires Salesforce Enterprise Edition or higher (or a Developer Edition org for testing). Professional Edition does not include API access by default. Check with your Propertybase account manager which Salesforce edition your Propertybase contract includes, as this determines your available API call limits and which objects are accessible.

Why do I get INVALID_TYPE errors on pb__ objects when my SOQL looks correct?

Propertybase custom-object API names vary depending on the Propertybase version installed in your specific Salesforce org. The pb__ prefix is standard, but field names after it can differ. Always verify the exact API names in Salesforce Setup → Object Manager before writing SOQL — a quick search for 'pb' shows all installed Propertybase objects and their confirmed API names.

Can FlutterFlow web builds connect to Salesforce the same way as mobile builds?

Yes, but web builds enforce browser CORS rules. Your Cloud Function must respond to OPTIONS preflight requests with the appropriate Access-Control-Allow-Origin, Access-Control-Allow-Methods, and Access-Control-Allow-Headers response headers. Native iOS and Android builds do not enforce CORS, so you may encounter issues only when testing on FlutterFlow's web Run mode.

RapidDev

Talk to an Expert

Our team has built 600+ apps. Get personalized help with your project.

Book a free consultation

Integrations are where projects stall

We wire FlutterFlow integrations like this one every week — auth, webhooks, edge cases included. Fixed-price builds from $13K, delivered in 6–10 weeks.

Talk to an integration engineer

We put the rapid in RapidDev

Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We'll discuss your project and provide a custom quote at no cost.