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.
| Fact | Value |
|---|---|
| Tool | Propertybase |
| Category | CRM & Sales |
| Method | FlutterFlow API Call |
| Difficulty | Advanced |
| Time required | 90 minutes |
| Last updated | July 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
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
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.
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.
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, OwnerId4FROM pb__Listing__c5WHERE pb__Status__c = 'Active'6ORDER BY pb__List_Price__c ASC7LIMIT 10Pro 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.
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.
1const functions = require('firebase-functions');2const axios = require('axios');34// 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;910async 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);1516 const res = await axios.post(17 'https://login.salesforce.com/services/oauth2/token',18 params19 );20 return res.data.access_token;21}2223exports.querySalesforce = functions.https.onRequest(async (req, res) => {24 // Allow CORS for web builds25 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 }3132 try {33 const { soql } = req.body;34 if (!soql) return res.status(400).json({ error: 'soql is required' });3536 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 );4243 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.
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.
1// API Call configuration reference (not a file — use this to match FlutterFlow UI settings)2// Group Name: PropertybaseSF3// Base URL: https://us-central1-YOUR_PROJECT.cloudfunctions.net4//5// Call Name: QueryListings6// Method: POST7// Path: /querySalesforce8// Content-Type: application/json9// Body: { "soql": "{{ soql }}" }10//11// JSON Paths after test:12// Total records: $.totalSize13// Records array: $.records14// Address: $.records[*].pb__Street_Address__c15// City: $.records[*].pb__City__c16// List price: $.records[*].pb__List_Price__c17// Status: $.records[*].pb__Status__cPro 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.
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.
1-- Paginated SOQL with LIMIT/OFFSET2SELECT Id, pb__Street_Address__c, pb__City__c,3 pb__List_Price__c, pb__Status__c, pb__Days_On_Market__c4FROM pb__Listing__c5WHERE pb__Status__c = 'Active'6 AND CreatedDate = LAST_N_DAYS:907ORDER BY pb__List_Price__c ASC8LIMIT 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.
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.
1// Add to the Cloud Function to handle contact creation:2// In req.body, check for operation === 'create_contact'34if (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.
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.
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.
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.
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
If your org uses standard Salesforce objects without the Propertybase package, connect to Salesforce directly — same OAuth pattern but simpler standard SOQL without the pb__ namespace.
Zoho CRM offers a dedicated real-estate CRM module with a simpler OAuth 2.0 API that doesn't require the Salesforce Connected App setup, making it faster to integrate for smaller real-estate teams.
Pipedrive uses a single api_token query parameter with no OAuth dance — dramatically simpler than Propertybase/Salesforce OAuth 2.0, though it lacks real-estate-specific custom objects.
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.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation