Skip to main content
RapidDev - Software Development Agency
bubble-integrationsBubble API Connector

Weebly

Connecting Bubble to Weebly requires two separate API Connector groups: one for Square's API (orders, products, and customers — all e-commerce data moved to Square when it acquired Weebly in 2018) and one for Weebly's legacy REST API (site content, form submissions, pages). Square uses a long-lived Personal Access Token in a Private Authorization header; Weebly's legacy API uses an OAuth Bearer token that expires and must be refreshed. Most Bubble-Weebly integrations need Square, not Weebly's own API.

What you'll learn

  • Why Weebly e-commerce data is in Square's API and not Weebly's own API
  • How to get your Square Personal Access Token and your Weebly store's Square location ID
  • How to configure the Square API Connector group with a Private Bearer header and the correct Square-Version header
  • How to query orders using Square's POST /v2/orders/search endpoint (it is a POST, not a GET)
  • How to configure the Weebly legacy API Connector group for site content and form submissions
  • How to handle Weebly's Unix timestamp format in Bubble's date expressions
  • How to add caching to the Weebly legacy API calls to handle undocumented rate limits
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Intermediate20 min read4–7 hoursMedia & ContentLast updated July 2026RapidDev Engineering Team
TL;DR

Connecting Bubble to Weebly requires two separate API Connector groups: one for Square's API (orders, products, and customers — all e-commerce data moved to Square when it acquired Weebly in 2018) and one for Weebly's legacy REST API (site content, form submissions, pages). Square uses a long-lived Personal Access Token in a Private Authorization header; Weebly's legacy API uses an OAuth Bearer token that expires and must be refreshed. Most Bubble-Weebly integrations need Square, not Weebly's own API.

Quick facts about this guide
FactValue
ToolWeebly
CategoryMedia & Content
MethodBubble API Connector
DifficultyIntermediate
Time required4–7 hours
Last updatedJuly 2026

Weebly + Bubble: the Square/Weebly split architecture you need to understand first

Builders who approach the Weebly integration expecting a single Weebly API often spend hours looking for the 'orders' endpoint before discovering it does not exist in Weebly's own documentation. Since Square acquired Weebly in 2018, all transactional e-commerce data — orders, products, customers, inventory levels, payment records — has migrated to Square's infrastructure. To access this data from Bubble, you use Square's API, not Weebly's.

Weebly's own API (`api.weebly.com`) still exists and is maintained, but covers only site-level operations: reading blog posts and pages, accessing form submissions, listing site members. If you are building a Bubble companion app for a small business that has a Weebly storefront, there is a high probability that 90% of what you need is in Square's API (orders, customers) and only 10% is in Weebly's API (form submissions, blog content).

In Bubble, this means two separate API Connector groups:

**Group 1 — Square**: Base URL `https://connect.squareup.com`. Authentication: a Personal Access Token (long-lived, does not expire) from Square's Developer Dashboard, placed in an `Authorization: Bearer` header marked Private. Also requires a `Square-Version` header (use the current stable version). Orders are fetched via a POST to `/v2/orders/search` — not a GET, which surprises first-time Square API users. You also need your Weebly store's Square location ID, which you fetch once via `GET /v2/locations`.

**Group 2 — Weebly Legacy API**: Base URL `https://api.weebly.com`. Authentication: an OAuth 2.0 Bearer token that expires. For most read operations (form submissions, blog posts), you authenticate by building an OAuth flow or by generating a long-lived token manually in Weebly's developer console if available. This token goes in an `Authorization: Bearer` header marked Private, alongside a `Content-Type: application/vnd.weebly.v1+json` header that Weebly's API requires on all requests.

A Weebly-specific gotcha: form entry timestamps come back as Unix epoch in **seconds**, not milliseconds. Bubble's date operator expects milliseconds — dividing the epoch value by 1000 gives you seconds, but Bubble actually handles this correctly when you use the `:converted from timestamp` operator in seconds mode. Test date display carefully before showing timestamps to users.

For Bubble apps that only need order tracking and customer data, you can skip the Weebly legacy API entirely and just build the Square integration — the most common use case for a Weebly/Bubble companion app.

Integration method

Bubble API Connector

Two API Connector groups: Square API (Private Bearer token, long-lived PAT) for e-commerce data, and Weebly legacy API (Private OAuth Bearer token, expiring) for site content and form submissions.

Prerequisites

  • A Weebly site with at least one published page (required to get a site ID from Weebly's developer console)
  • A Square Developer account at developer.squareup.com (free — use the same email as your Square seller account)
  • Your Square Personal Access Token from the Square Developer Dashboard → Credentials section
  • Your Weebly store's Square location ID (fetched via GET /v2/locations once the Square group is configured)
  • A Weebly developer account at dev.weebly.com and an OAuth token for the Weebly legacy API (if you need blog/form data)
  • The API Connector plugin installed in your Bubble app (Plugins tab → Add plugins → search 'API Connector' by Bubble)
  • A Bubble paid plan if you need scheduled Backend Workflows for Weebly OAuth token refresh in production

Step-by-step guide

1

Get your Square Personal Access Token and Weebly site ID

**Square credentials (needed for all e-commerce data):** Go to **developer.squareup.com** and log in with your Square account (the same account used for your Weebly store — Weebly stores connect to a Square seller account). In the Square Developer Dashboard, click **My Applications** → select your application (or click **Create Your First Application** if none exists — name it 'Bubble Integration'). In the left sidebar, click **Credentials**. You see two sets of credentials: Sandbox (for testing) and Production. For real store data, copy the **Production** → **Personal Access Token**. This is a long string starting with `EAA`. Keep this secret — it grants full access to your Square account. Also note the **Application ID** (starts with `sq0idp-`) — some Square API endpoints require this too. **Find your Weebly store's Square location ID:** Every Weebly store corresponds to a Square 'location'. You need this location ID to filter orders to your specific store. You will fetch the location ID via the API in Step 3. For now, note that once you have the Square API Connector configured, a single call to `GET /v2/locations` will list all your Square locations — your Weebly store appears as one of them with a descriptive name. **Weebly legacy API token (needed for form submissions and blog content):** Go to **dev.weebly.com** and log in with your Weebly credentials. Create a developer app and follow the OAuth flow to generate an access token for your Weebly site. Copy the token and your **site ID** (a numeric string in your Weebly admin URL or the API response). Store all credentials securely — they will be entered into Bubble's API Connector in the next steps.

Pro tip: Use Square's Sandbox credentials (Sandbox Personal Access Token and Sandbox base URL: https://connect.squareupsandbox.com) during development and testing. Switch to Production credentials and the production base URL (https://connect.squareup.com) only when you are ready for live data. Never test with Production credentials against real order data during initial integration setup.

Expected result: You have your Square Production Personal Access Token, your Weebly OAuth token, and your Weebly site ID saved securely. You are ready to configure both API Connector groups in Bubble.

2

Configure the Square API Connector group

In your Bubble editor, go to **Plugins tab** → **Add plugins** → search **API Connector** → install the plugin by Bubble (free). Open the API Connector configuration panel. Click **Add another API** and name it `Square API`. Set **Authentication** to **No authentication** (you handle auth via headers). Under **Shared headers**, click **Add a shared header**: - **Name**: `Authorization` - **Value**: `Bearer YOUR_SQUARE_PERSONAL_ACCESS_TOKEN` - **Tick the Private checkbox** — this keeps your Square token server-side Add a second shared header: - **Name**: `Square-Version` - **Value**: `2024-01-18` (use the most current stable Square API version from developer.squareup.com/docs/api/latest) - **Leave Private unchecked** (this is a non-sensitive version string) ```json { "api_name": "Square API", "authentication": "none", "shared_headers": { "Authorization": "Bearer <private: SQUARE_PERSONAL_ACCESS_TOKEN>", "Square-Version": "2024-01-18" } } ``` **Add the Locations call first** (needed to find your store's location ID): - **Name**: `Get Locations` - **Use as**: **Data** - **Method**: GET - **URL**: `https://connect.squareup.com/v2/locations` Click **Initialize call**. Square returns a `locations` array. Set Data path to `locations`. Each location has an `id` (the location ID you need), `name`, `address`, and `status` fields. Find your Weebly store's location in the results and note its `id` — you will use this as a fixed value in the Orders Search call.

square-api-connector-config.json
1{
2 "api_name": "Square API",
3 "authentication": "none",
4 "shared_headers": {
5 "Authorization": "Bearer <private: SQUARE_PERSONAL_ACCESS_TOKEN>",
6 "Square-Version": "2024-01-18"
7 },
8 "locations_call": {
9 "method": "GET",
10 "url": "https://connect.squareup.com/v2/locations"
11 }
12}

Pro tip: Always call GET /v2/locations before building any other Square calls. Square APIs filter data by location_id — using the wrong location ID returns an empty array with no error message, which looks like 'no orders exist' when in reality you are just querying the wrong location.

Expected result: The Square API group exists with Private Authorization Bearer header and Square-Version header. The Get Locations call is initialized and returns your locations. You have identified your Weebly store's Square location ID.

3

Add the Square Orders Search call (POST, not GET)

Square's order retrieval uses a POST request to `/v2/orders/search` with a JSON body — not a GET request. This is the most common gotcha for Square API beginners in Bubble. In the Square API group, click **Add a call**: - **Name**: `Search Orders` - **Use as**: **Data** - **Method**: **POST** (important — must be POST) - **URL**: `https://connect.squareup.com/v2/orders/search` - **Body type**: **JSON** In the **Body** section, enter the search filter JSON. Use your actual location ID as the fixed value: ```json { "location_ids": ["YOUR_LOCATION_ID"], "query": { "filter": { "state_filter": { "states": ["OPEN", "COMPLETED"] }, "date_time_filter": { "created_at": { "start_at": "<dynamic:start_date>", "end_at": "<dynamic:end_date>" } } }, "sort": { "sort_field": "CREATED_AT", "sort_order": "DESC" } }, "limit": 20 } ``` For the Initialize call, use fixed dates in the start_at and end_at fields (ISO 8601 format, e.g., `2024-01-01T00:00:00Z` and `2024-12-31T23:59:59Z`) to ensure Square returns real order data. Click **Initialize call**. Square returns a response with an `orders` array. Set Data path to `orders`. Bubble detects order fields including `id`, `state`, `created_at`, `updated_at`, `total_money` (with `amount` and `currency` sub-fields), `line_items` (array), `customer_id`, `fulfillments`, and `net_amounts`. For customer name display, note that Square orders often contain a `customer_id` reference rather than inline customer data — a second call to `GET /v2/customers/{customer_id}` fetches the name, email, and phone for a specific customer.

square-orders-search-call.json
1{
2 "method": "POST",
3 "url": "https://connect.squareup.com/v2/orders/search",
4 "headers": {
5 "Authorization": "Bearer <private: SQUARE_PERSONAL_ACCESS_TOKEN>",
6 "Square-Version": "2024-01-18",
7 "Content-Type": "application/json"
8 },
9 "body": {
10 "location_ids": ["<YOUR_LOCATION_ID>"],
11 "query": {
12 "filter": {
13 "state_filter": {
14 "states": ["OPEN", "COMPLETED"]
15 },
16 "date_time_filter": {
17 "created_at": {
18 "start_at": "<dynamic:start_date_iso8601>",
19 "end_at": "<dynamic:end_date_iso8601>"
20 }
21 }
22 },
23 "sort": {
24 "sort_field": "CREATED_AT",
25 "sort_order": "DESC"
26 }
27 },
28 "limit": 20
29 }
30}

Pro tip: Square's total_money.amount is in the currency's smallest unit — cents for USD, pence for GBP. Display it in dollars by dividing by 100 in a Bubble text expression: '(Search Orders's total_money's amount / 100)' formatted as a number with 2 decimal places.

Expected result: The Search Orders POST call initializes successfully. Bubble detects order fields including id, state, created_at, total_money, and line_items. Data path is set to 'orders'. You can filter by date range and order state.

4

Configure the Weebly legacy API group for form submissions and blog content

For Weebly-specific data (form submissions, blog posts, site pages), add a second API Connector group. Click **Add another API** and name it `Weebly API`. Set **Authentication** to **No authentication**. Under **Shared headers**, add: - **Name**: `Authorization` - **Value**: `Bearer YOUR_WEEBLY_OAUTH_TOKEN` - **Tick Private checkbox** Add a second shared header: - **Name**: `Content-Type` - **Value**: `application/vnd.weebly.v1+json` - Leave Private unchecked (this is a non-sensitive content type specifier) ```json { "api_name": "Weebly API", "authentication": "none", "shared_headers": { "Authorization": "Bearer <private: WEEBLY_OAUTH_TOKEN>", "Content-Type": "application/vnd.weebly.v1+json" } } ``` **Add the form entries call:** - **Name**: `Get Form Entries` - **Use as**: **Data** - **Method**: GET - **URL**: `https://api.weebly.com/v1/user/sites/{site_id}/forms/{form_id}/entries.json` - Replace `{site_id}` with your actual Weebly site ID as a fixed value in the URL - Replace `{form_id}` with your actual form ID (find it in Weebly admin → Marketing → Forms → click a form, ID is in the URL) Add URL parameter: `page=1` (Weebly paginates using a page number parameter). Click **Initialize call**. Weebly returns a JSON array of form entries. Each entry has: `entry_id`, `created_date` (Unix timestamp in **seconds**), `updated_date`, and a `fields` object containing submitted values keyed by field label. **Caching recommendation**: set the Bubble API Connector's Cache duration for this call to 60 seconds. Weebly's legacy API has undocumented rate limits — repeated uncached calls can result in temporary 429 responses with no clear documentation on the limit. Caching protects against this. RapidDev's team often handles the dual Square + Weebly wiring for small business clients — if you're building more than a simple dashboard, a free scoping call at rapidevelopers.com/contact can save significant debugging time.

weebly-form-entries-call.json
1{
2 "method": "GET",
3 "url": "https://api.weebly.com/v1/user/sites/YOUR_SITE_ID/forms/YOUR_FORM_ID/entries.json",
4 "shared_headers": {
5 "Authorization": "Bearer <private: WEEBLY_OAUTH_TOKEN>",
6 "Content-Type": "application/vnd.weebly.v1+json"
7 },
8 "call_params": {
9 "page": "<dynamic:page_number>"
10 }
11}

Pro tip: The Weebly form entries endpoint path includes both the site_id and form_id in the URL — these are not URL parameters but URL path segments. Hardcode them as fixed values in the URL string for each specific form you want to access. If you need to support multiple forms, create a separate API call per form or make the form_id dynamic as a URL path segment bound to a Custom State.

Expected result: The Weebly API group exists with Private Authorization Bearer header and Content-Type header. The Get Form Entries call initializes successfully and detects entry fields including entry_id, created_date (Unix seconds), and the fields object with submitted values.

5

Handle Weebly timestamps and build the combined dashboard UI

Weebly's `created_date` and `updated_date` fields in form entries are Unix timestamps in **seconds** (e.g., `1710000000`). Bubble's date operators expect milliseconds by default. To convert correctly in Bubble: In a Text element showing the entry date, use the expression: `This entry's created_date * 1000 :converted from timestamp` Multiplying by 1000 converts seconds to milliseconds, and `:converted from timestamp` parses it as a proper Bubble date. Then apply `:formatted as date` with your preferred format (e.g., 'MMM D, YYYY h:mm A'). **Building the combined Weebly + Square dashboard:** **Orders section** (Square data): - Add a Repeating Group bound to `Square API - Search Orders` - Bind date range inputs to `start_at` and `end_at` parameters using Bubble's `:formatted as text` operator with ISO 8601 format: `YYYY-MM-DDTHH:mm:ssZ` - Show: order `id` (or a shortened version), `state`, `created_at` formatted as date, `total_money's amount / 100` formatted as currency, and a count of `line_items` **Form submissions section** (Weebly data): - Add a second Repeating Group bound to `Weebly API - Get Form Entries` - Show: `entry_id`, `created_date * 1000 :converted from timestamp :formatted as date`, and individual fields from the `fields` object (navigate to specific field names based on your form's field labels) **Privacy rules**: go to **Data tab → Privacy** and ensure any Bubble data type storing customer emails (from form entries or Square customer data) is restricted to logged-in admin users. Form submission data and customer emails are personally identifiable information that should not be accessible to all Bubble app users. **Weebly OAuth token refresh**: Weebly's OAuth tokens expire. On a Bubble paid plan, create a Backend Workflow that refreshes the Weebly token via the OAuth refresh endpoint and updates the stored token in Bubble's API Connector. On the Free plan, manually rotate the token by updating the Shared header value in the API Connector when calls start returning 401.

Pro tip: Test date range filtering for Square orders by building the ISO 8601 date string in Bubble correctly. Use a Date Picker element and convert its value to text with format 'YYYY-MM-DDTHH:mm:ss' + literal 'Z' (UTC timezone). Incorrect date format in Square's API body causes a 400 error with the message 'Invalid datetime format for field created_at.start_at'.

Expected result: The dashboard shows Square orders and Weebly form submissions in their respective sections. Weebly timestamps display as human-readable dates. Privacy rules protect customer data. The Square section correctly shows order totals in dollars (not cents).

6

Add Weebly blog posts call and configure API caching

If your Bubble app needs to display Weebly blog content (posts, titles, publish dates), add a blog posts call to the Weebly API group. Click **Add a call** in the Weebly API group: - **Name**: `Get Blog Posts` - **Use as**: **Data** - **Method**: GET - **URL**: `https://api.weebly.com/v1/user/sites/YOUR_SITE_ID/blog-posts.json` - Add URL parameter: `page=<dynamic>` for pagination ```json { "method": "GET", "url": "https://api.weebly.com/v1/user/sites/YOUR_SITE_ID/blog-posts.json", "headers": { "Authorization": "Bearer <private: WEEBLY_OAUTH_TOKEN>", "Content-Type": "application/vnd.weebly.v1+json" }, "call_params": { "page": "<dynamic:page_number>" } } ``` Click **Initialize call**. Weebly returns an array of blog post objects with fields: `post_id`, `title`, `post_body` (HTML), `created_date` (Unix seconds), `updated_date`, `author`, `post_url`. **Applying caching to Weebly calls:** In both the Get Form Entries and Get Blog Posts calls, look for the **Cache responses** setting (available in Bubble's API Connector call configuration). Enable caching with a duration of **60 seconds**. This prevents rapid sequential calls — such as a user switching between tabs quickly — from hitting Weebly's undocumented rate limits. **Displaying blog posts in a Repeating Group:** Add a Repeating Group bound to `Weebly API - Get Blog Posts`. Show the post title, formatted created_date (apply the multiply-by-1000 pattern from Step 5), author name, and a 'Read More' link using the `post_url` field. For the full post body (HTML content), use Bubble's HTML element and bind its value to `Current cell's post_body` — Bubble's HTML element renders HTML tags correctly.

weebly-blog-posts-call.json
1{
2 "method": "GET",
3 "url": "https://api.weebly.com/v1/user/sites/YOUR_SITE_ID/blog-posts.json",
4 "shared_headers": {
5 "Authorization": "Bearer <private: WEEBLY_OAUTH_TOKEN>",
6 "Content-Type": "application/vnd.weebly.v1+json"
7 },
8 "call_params": {
9 "page": "<dynamic:page_number>"
10 }
11}

Pro tip: Weebly's blog post HTML body includes inline styles and img tags referencing Weebly's CDN. These display correctly in Bubble's HTML element. However, if you plan to store post_body content in Bubble's database, be aware that HTML field values can be large — consider storing only the post_id and post_url as references, and fetching the full body on-demand.

Expected result: The Get Blog Posts call initializes and detects post fields including post_id, title, post_body (HTML), created_date, and post_url. Blog posts display correctly in a Repeating Group with formatted dates. API caching is enabled at 60 seconds on both Weebly calls.

Common use cases

Bubble order management dashboard for Weebly store owners

A small business owner with a Weebly store builds a Bubble admin app to manage orders without logging into Square's full dashboard. The Bubble app shows recent orders with customer name, items, status, and total; allows filtering by date range and order status; and shows a daily sales summary. Order data comes from Square's API via POST /v2/orders/search with the store's location ID. The business owner checks the Bubble app on their phone without needing Square POS training.

Bubble Prompt

Build a Bubble order dashboard for a Weebly store that uses Square's API to show orders. Include a list of recent orders with customer name, total, status (OPEN, COMPLETED, CANCELED), and order date. Add a date range filter and an order status filter. Show a summary card at the top with today's total sales and order count.

Copy this prompt to try it in Bubble

Weebly form submission CRM in Bubble

A service business with a Weebly site uses contact forms to collect leads. They build a Bubble CRM-like page that pulls form submissions from Weebly's legacy API, displays them with the submitter's name, email, and message, and allows adding internal notes and status tags (new, contacted, closed). The Bubble app replaces a manual email inbox for lead tracking, all without requiring Weebly admin access for the sales team.

Bubble Prompt

Create a Bubble lead tracker that fetches Weebly form submissions via the Weebly API for a given site ID and form ID. Display each submission with its submitted_at date, field values (name, email, message), and a status dropdown (New/Contacted/Closed). Let users add internal notes to each submission and save them to a Bubble database.

Copy this prompt to try it in Bubble

Combined Square + Weebly data dashboard

A retail business uses both Weebly's contact forms (to collect wholesale inquiries) and Weebly's e-commerce features (to process online orders). A Bubble dashboard combines data from both APIs: Square orders on the left panel, Weebly form submissions (wholesale leads) on the right panel. A summary section shows today's online order revenue alongside the count of new wholesale inquiries received today. The owner sees their full business picture in one Bubble page.

Bubble Prompt

Build a Bubble business overview page that shows two sections side by side: on the left, today's Square orders (from POST /v2/orders/search filtered by today's date and the store's location_id); on the right, today's Weebly form submissions (from the Weebly legacy API /v1/user/sites/{id}/forms/{id}/entries.json filtered by today's date). Include summary counts and totals at the top of each section.

Copy this prompt to try it in Bubble

Troubleshooting

Square orders search returns an empty array with no errors

Cause: The location_id in the request body is incorrect, missing, or refers to a different Square location than the Weebly store. Square filters orders strictly by location — an incorrect location ID returns zero results silently.

Solution: First, call GET /v2/locations to list all your Square locations and confirm which location ID matches your Weebly store (by name and address). Update the location_ids array in the Search Orders call body with the correct ID. Also verify the date range in start_at and end_at includes periods when actual orders were placed.

Square orders search returns 405 Method Not Allowed

Cause: The Search Orders call is configured as GET instead of POST. Square's /v2/orders/search endpoint only accepts POST requests — a GET to this URL returns 405.

Solution: Open the Search Orders call in the Bubble API Connector and change the Method from GET to POST. Also ensure the Body type is set to JSON and the body contains the required location_ids array. Click Initialize call again after changing the method.

Weebly API returns 401 Unauthorized

Cause: The Weebly OAuth token has expired. Unlike Square's long-lived Personal Access Token, Weebly OAuth tokens expire after a set period and must be refreshed using the OAuth refresh flow.

Solution: Generate a new Weebly OAuth token from dev.weebly.com and update the Shared header value in the Weebly API Connector group. For production apps on a paid Bubble plan, build a Backend Workflow that calls the Weebly OAuth refresh endpoint (/oauth2/token with grant_type=refresh_token) and updates the stored token. On Free plans, manual token rotation is required.

Bubble shows 'There was an issue setting up your call' on the Weebly form entries Initialize

Cause: The form entries endpoint returns no data (the form has no submissions yet), or the site_id or form_id in the URL is incorrect. Bubble's Initialize requires a real successful response to detect fields.

Solution: Submit a test entry to your Weebly form first so that the endpoint returns at least one record. Also verify your site_id and form_id by checking your Weebly admin URL (site_id appears in the URL when logged in as a number; form_id appears in Marketing → Forms → click a form). Test the URL directly: https://api.weebly.com/v1/user/sites/{YOUR_ID}/forms/{FORM_ID}/entries.json with your Bearer token in a REST client (e.g., Postman) to confirm the correct path.

Weebly form entry dates display as very large numbers instead of readable dates

Cause: Weebly's created_date and updated_date fields are Unix timestamps in seconds (e.g., 1710000000), not milliseconds. Bubble's :converted from timestamp operator expects milliseconds by default, and displaying the raw value without conversion shows the raw number.

Solution: In your Bubble Text element, wrap the date field in a multiplication: (Current cell's entry's created_date * 1000) :converted from timestamp :formatted as date 'MMM D, YYYY'. The multiply-by-1000 step converts seconds to milliseconds before the timestamp conversion.

Best practices

  • Always call GET /v2/locations first during Square setup to confirm your Weebly store's exact location ID before building order queries. An incorrect location ID silently returns zero orders — one of the most time-consuming debugging scenarios for Square API beginners.
  • Mark both the Square Personal Access Token and the Weebly OAuth token as Private in their respective Shared headers. These credentials grant access to real business financial data and customer information — never expose them in client-side requests.
  • Use Square's Sandbox environment (https://connect.squareupsandbox.com with a Sandbox token) during development. Sandbox provides test orders and customers without affecting real business data. Switch to Production credentials only when testing is complete.
  • Enable API response caching on Weebly legacy calls at 60-second intervals. Weebly's legacy API has undocumented rate limits — caching prevents limit violations from rapid page refreshes or multiple concurrent users hitting the same endpoint.
  • Set Bubble privacy rules on any data type storing Weebly form entries or Square customer data. Email addresses, phone numbers, and order details are personally identifiable — unrestricted Bubble privacy rules expose this data to all app users, which may violate GDPR and similar data protection regulations.
  • Handle Weebly's Unix timestamp format (seconds, not milliseconds) explicitly in every date display. Multiply by 1000 before using :converted from timestamp. Documenting this in a Bubble workflow comment saves future debugging time when the integration is maintained by someone unfamiliar with this quirk.
  • If you only need Square order data (not Weebly blog posts or form submissions), skip the Weebly legacy API entirely. Building only the Square API Connector group is simpler, avoids token expiry management, and covers the most common use case for a Weebly companion app.
  • Store your Square location ID as a Bubble App Setting (under Settings → General → App settings) rather than hardcoding it in the API call body. This makes it easy to switch between sandbox and production location IDs and allows maintenance without changing workflow logic.

Alternatives

Frequently asked questions

Why can't I find order data in Weebly's own API?

Since Square acquired Weebly in 2018, all e-commerce data — orders, products, customers, payments, inventory — migrated to Square's infrastructure. Weebly's own API (api.weebly.com) only covers site-level content: blog posts, form submissions, pages, and site settings. For order and customer data from a Weebly store, you must use Square's API (developer.squareup.com), not Weebly's.

Do I need both a Square and a Weebly developer account?

It depends on what data you need. If you only need orders, products, and customer data from a Weebly store, you need only Square's developer account and credentials. If you also need blog posts, form submissions, or site page data, you additionally need a Weebly developer account at dev.weebly.com. Most Bubble companion apps for Weebly-based businesses focus on Square data and skip the Weebly legacy API.

Will this integration work on Bubble's Free plan?

The Square API integration (orders, locations, customers) works on Bubble's Free plan — it requires no Backend Workflows for the basic data retrieval. The Weebly legacy API integration also works on Free for data reads. However, Weebly OAuth token refresh on a schedule requires Backend Workflows — a paid Bubble plan feature. On the Free plan, you must manually update the Weebly token in the API Connector when it expires.

Why does Square's order search use POST instead of GET?

Square designed the /v2/orders/search endpoint as a POST because order searches can include complex filter criteria (date ranges, states, customer IDs, location arrays) that exceed URL parameter limitations. POST with a JSON body supports nested filter objects and arrays that GET parameters cannot cleanly express. This is a Square API design choice — it catches many API beginners off guard because GET is the convention for data retrieval, but for Square orders you must use POST.

How do I display Weebly form submission field values in Bubble?

Weebly form entries return a 'fields' object keyed by the form field label. If your form has fields named 'Name', 'Email', and 'Message', the fields object looks like: {Name: 'John', Email: 'john@example.com', Message: 'Hello'}. In Bubble, after Initialize detects this structure, navigate the fields object in your Repeating Group: Current cell's entry's fields's Name (or whatever your label is). If field names contain spaces or special characters, Bubble's field picker may show them with underscores — test the Initialize call with a real submission to see exactly how Bubble detects the field names.

Weebly's legacy API seems to have rate limits but no documentation on what they are. What should I do?

Add 60-second response caching to all Weebly API calls in Bubble's API Connector (the Cache settings option on each call). This prevents repeated requests for the same data within a short window. If you are building features that require frequent Weebly API calls (e.g., real-time form submission notifications), consider a different architecture: use a webhook or polling Backend Workflow on a 2-5 minute interval rather than on-demand calls from the browser.

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 Bubble 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.