Build a Bubble.io App from Google Sheets
Connect SheetsAPI to Bubble.io and build a searchable no-code web app over your Google Sheet data - no backend required.
Bubble.io is a no-code platform that lets you build fully functional web apps with a visual editor. Its API Connector plugin supports any REST API, which means you can connect SheetsAPI to Bubble in minutes and turn a Google Sheet into the data layer for your entire app.
Prerequisites
- A Bubble.io account (free tier works)
- A Google Sheet with a header row
- A SheetsAPI account and a
YOUR_USER_KEYkey from the dashboard
1. Install the API Connector plugin
- In Bubble, open your app and go to Plugins → Add plugins.
- Search for API Connector (by Bubble) and install it.
2. Configure the SheetsAPI connection
- Go to Plugins → API Connector.
- Click Add another API, name it
SheetsAPI. - Set Authentication to
Private key in header. - Key name:
Authorization, Key value:Bearer sk_your_api_key_here. - Leave the base URL blank - you'll put the full URL in each call.
For public sheets (no API key needed), skip steps 3–4 and leave authentication as None.
3. Add a List Products call
- Click Add another call inside the SheetsAPI connector.
- Name the call
List Products. - Use as: Data (returns a list).
- Method: GET.
- URL:
https://sheetsapi.gkit.mreshank.com/api/spreadsheets/YOUR_USER_KEY/Products - Add URL parameters:
limit→20(mark as dynamic)offset→0(mark as dynamic)sort→name(mark as dynamic)search→ `` (blank, mark as dynamic)
- Click Initialize call - Bubble fetches one response and detects the schema.
- Expand the
datakey and mark it as a list.
4. Build the repeating group
- Add a Repeating Group element to your page.
- Set Type of content:
List Products→data. - Set Data source: Get data from an external API → SheetsAPI - List Products.
- Set
limit→20,offset→0,sort→name.
- Set
- Inside a cell, add a Text element bound to
Current cell's List Products data's name. - Add more Text elements for
price,category, etc.
5. Add a search input
- Add an Input element, type
Text, placeholderSearch products…. - In your Repeating Group's data source, set
searchto:- Dynamic value →
"name:" & Input SearchBox's value - Leave blank when the input is empty:
When Input SearchBox's value is empty → ""(Bubble's conditional logic)
- Dynamic value →
- Set the Repeating Group to refresh on
Input SearchBox's value changes.
6. Pagination
- Add two Button elements:
PreviousandNext. - Create a Custom State on your page:
page_index(number, default0). - Next button workflow:
- Only when:
page_index * 20 < List Products's meta total - Action: Set state
page_index=page_index + 1
- Only when:
- Previous button workflow:
- Only when:
page_index > 0 - Action: Set state
page_index=page_index - 1
- Only when:
- In the Repeating Group's data source, set
offsettopage_index * 20.
7. Show total count
Add a Text element bound to:
"Showing " & Repeating Group List's count & " of " & List Products's meta total & " products"
8. Tips for production
Store the API key safely
In Bubble, go to Settings → API and add SHEETS_API_KEY as a server-side environment
variable. Reference it in API Connector calls as [SHEETS_API_KEY] - Bubble never exposes
server-side keys to the browser.
Enable caching
In the API Connector call settings, enable Cache this call with a TTL of 60 seconds. Bubble stores the response in its CDN, so repeated searches for the same query are served instantly.
Use a POST call to add rows
- Add a new call:
Add Product. - Method: POST.
- Body type: JSON.
- Body:
{"name": "<name>", "price": "<price>", "category": "<category>"}with each value marked dynamic. - Trigger this call from a Form element's submit workflow.
What you built
| Feature | Bubble element |
|---|---|
| Data list | Repeating Group + API Connector |
| Search | Input → search URL param |
| Pagination | Custom State + offset param |
| Total count | Text bound to meta total |
| Add rows | Form + POST workflow |
The complete setup takes under 20 minutes with zero backend code - SheetsAPI handles authentication, pagination, search, and sorting.