Connect Bubble to Evernote by completing the OAuth 1.0a flow once in Postman to obtain a long-lived access token, then storing it as a Private header in Bubble's API Connector. Because OAuth 1.0a signature computation is not possible natively in Bubble, the external-token approach is the only practical path. You gain a searchable notebook browser inside your Bubble app without exposing credentials to the browser.
| Fact | Value |
|---|---|
| Tool | Evernote |
| Category | Productivity |
| Method | Bubble API Connector |
| Difficulty | Advanced |
| Time required | 3–5 hours (plus 1–2 days for API key review) |
| Last updated | July 2026 |
Evernote + Bubble: Embedding a Personal Knowledge Base in Your App
Evernote is the most technically complex integration in the productivity category because it combines three unusual requirements that catch Bubble developers off-guard: OAuth 1.0a authentication (not 2.0), a dynamically fetched NoteStore URL that is unique to each Evernote account, and ENML content format (an XML dialect) instead of plain text or standard HTML.
The good news: Evernote intentionally issues long-lived access tokens that never auto-expire, so you only need to navigate the OAuth complexity once. After that, the token works exactly like any other Bearer credential in Bubble's API Connector, and Bubble's server-side proxy keeps it invisible to browser traffic.
The most compelling Bubble use case for Evernote is building a notebook browser that embeds inside a Bubble app — for example, a support portal where customer-facing agents can search a curated Evernote knowledge base, or a personal productivity dashboard where a founder surfaces recent notes alongside their Bubble CRM data. Because Evernote's API requires a paid developer key (with a short review process), plan for 1–2 business days of lead time before your app can make live API calls.
Key things to understand before starting: the Evernote API key application at dev.evernote.com is reviewed by Evernote staff. The sandbox environment (sandbox.evernote.com) is available immediately for testing and uses a separate OAuth token — ideal for building and testing before production access is approved.
Integration method
Bubble's API Connector proxies all calls server-side. The OAuth 1.0a access token is stored in a Private Bearer header — it is never sent to the browser. Because Bubble cannot compute the HMAC-SHA1 signature required by OAuth 1.0a natively, you obtain the token once externally (Postman or Evernote's developer sandbox) and treat it as a long-lived credential in Bubble.
Prerequisites
- An Evernote account (Personal free tier is sufficient for testing; Production use may require Professional or Teams depending on your use case)
- A Bubble app on any plan — note that paginating large notebooks requires API Workflows, which are a paid-plan feature
- An approved Evernote API key from dev.evernote.com (allow 1–2 business days for review; a sandbox key is available immediately for testing at sandbox.evernote.com)
- Postman (free desktop app) or another API client capable of executing the OAuth 1.0a authorization flow to obtain a long-lived access token
- Bubble's API Connector plugin installed in your app (Plugins tab → Add plugins → search 'API Connector' → Install)
Step-by-step guide
Apply for an Evernote API Key and Obtain Your Access Token
Before writing a single Bubble workflow, you need two things: an API key from Evernote's developer program and a long-lived OAuth 1.0a access token. The API key gives your application permission to call Evernote's servers at all. The access token is the credential you'll paste into Bubble. Go to dev.evernote.com and click 'Get an API key'. Fill in your application name, a short description, and your contact email. Choose 'Full Access' scope if you want both read and write capabilities. Submit the form — Evernote staff reviews applications and you'll receive an approval email within 1–5 business days. A sandbox key (for sandbox.evernote.com) is available immediately so you can start building immediately. Once you have your Consumer Key and Consumer Secret, open Postman and create a new request. Use Postman's built-in OAuth 1.0 authorization type: set Signature Method to HMAC-SHA1, enter your Consumer Key and Consumer Secret, and set the request URLs to Evernote's sandbox OAuth endpoints (https://sandbox.evernote.com/oauth). Follow the three-step OAuth 1.0a flow (request token → authorize → access token). Copy the final access token string — it is a long hex string that looks like `S=s1:U=123abc:E=...`. For production (non-sandbox), repeat the same process with the production OAuth URLs at evernote.com after your API key is approved. The production access token does not expire unless you manually revoke it in your Evernote account → Settings → Connected Apps.
1{2 "oauth_flow": {3 "step_1_request_token": "GET https://sandbox.evernote.com/oauth?oauth_consumer_key={YOUR_KEY}&oauth_signature_method=HMAC-SHA1&oauth_timestamp={ts}&oauth_nonce={nonce}&oauth_version=1.0&oauth_signature={sig}&oauth_callback=oob",4 "step_2_authorize": "https://sandbox.evernote.com/OAuth.action?oauth_token={request_token}",5 "step_3_access_token": "GET https://sandbox.evernote.com/oauth?oauth_token={auth_token}&oauth_verifier={verifier}&oauth_signature_method=HMAC-SHA1&oauth_consumer_key={YOUR_KEY}&oauth_signature={sig}"6 },7 "result": {8 "oauth_token": "S=s1:U=XXXXXX:E=XXXXXXXXXX:C=XXXXXXXXXX:P=1cd:A=en_oauth:H=XXXXXXXXXX",9 "note_about_expiry": "This token does not expire unless manually revoked"10 }11}Pro tip: Use Evernote's sandbox environment (sandbox.evernote.com) for all development and testing. The sandbox is completely separate from production — notes created there don't appear in your real Evernote account. Switch to production endpoints only after your Bubble app is tested and your production API key is approved.
Expected result: You have a long-lived Evernote access token string (starting with 'S=s') that you obtained through the OAuth 1.0a flow in Postman. Save this token in a secure password manager — you'll paste it into Bubble in the next step.
Configure the Bubble API Connector with Your Evernote Token
With your access token in hand, you can now configure Bubble's API Connector. The key principles are: the token goes into a Private header so it stays server-side, and the base URL points to evernote.com (not the sandbox, unless you're still testing) because all call paths are dynamic. In your Bubble app, go to the Plugins tab in the left sidebar. Click 'Add plugins', search for 'API Connector', and install the free Bubble-built plugin. Once installed, click 'API Connector' in the Plugins list to open its configuration panel. Click 'Add another API'. Name it 'Evernote'. Set the base URL to `https://www.evernote.com` (for sandbox testing: `https://sandbox.evernote.com`). Leave authentication type as 'None' — you'll handle auth manually via a custom header. Click 'Add a shared header'. In the key field, type `Authorization`. In the value field, type `Bearer ` followed by your access token (note the space after Bearer). Click the lock icon or check the 'Private' checkbox next to this header — this marks it as a server-side credential that Bubble will never send to the browser, even in error messages or network logs visible to your users. Also click 'Ignore empty parameters' — this keeps Evernote calls clean when optional parameters are not provided. Do NOT add a trailing slash to the base URL. Evernote's endpoint paths will be specified at the individual call level.
1{2 "connector_name": "Evernote",3 "base_url": "https://www.evernote.com",4 "shared_headers": [5 {6 "key": "Authorization",7 "value": "Bearer S=s1:U=XXXXXX:E=XXXXXXXXXX:...",8 "private": true9 }10 ],11 "settings": {12 "ignore_empty_parameters": true13 }14}Pro tip: After saving the connector, do NOT click 'Initialize call' yet — the first call you need to add and initialize is GET /edam/user, which will confirm your token works and return the NoteStore URL you'll need for all subsequent calls.
Expected result: The Evernote API Connector group is created in Bubble with a Private Bearer header containing your access token. The connector name appears in the Plugins → API Connector list.
Add the /edam/user Call and Store the NoteStore URL
This is the most Evernote-specific step in the entire integration. Unlike every other API where you can start calling data endpoints immediately, Evernote requires you to first fetch the user's NoteStore URL — a dynamic per-account path like `https://www.evernote.com/shard/s1/notestore` — before you can make any NoteStore calls. This URL is the base for all notebook and note operations. Inside the Evernote API Connector group you just created, click 'Add another call'. Name it 'Get User Info'. Set the method to GET and the path to `/edam/user`. Leave the parameters empty. Click 'Initialize call' — Bubble will send a real request with your token to Evernote's servers. You should see a JSON response containing fields like `id`, `username`, `name`, `noteStoreUrl`, and `webApiUrlPrefix`. Confirm the initialization by clicking 'Save'. Now you have the response schema mapped. Bubble detected `noteStoreUrl` as a text field in the response. Next, set up your Bubble page to fetch and store the NoteStore URL on page load. In the Workflow editor for your page, add a trigger 'When page is loaded'. Add the action 'Plugins → Evernote - Get User Info'. In the 'On success' section, add the action 'Set state' on a custom state you've created on the page (or a hidden text element): name it 'noteStoreUrl', type Text. Set its value to 'Result of step 1's noteStoreUrl'. This custom state is now available throughout your page's workflows. All subsequent NoteStore calls will reference it dynamically — you don't hardcode the NoteStore URL anywhere in Bubble.
1{2 "call_name": "Get User Info",3 "method": "GET",4 "path": "/edam/user",5 "params": [],6 "sample_response": {7 "id": 12345678,8 "username": "janefounder",9 "name": "Jane Founder",10 "noteStoreUrl": "https://www.evernote.com/shard/s1/notestore",11 "webApiUrlPrefix": "https://www.evernote.com/shard/s1/"12 },13 "bubble_page_load_workflow": {14 "trigger": "Page is loaded",15 "step_1": "Plugins → Evernote - Get User Info",16 "step_2": "Set state: page's noteStoreUrl = Result of step 1's noteStoreUrl"17 }18}Pro tip: If the Initialize call returns a 401 error with no body, your access token is invalid or you're calling a production endpoint with a sandbox token (or vice versa). Double-check that your base URL (evernote.com vs sandbox.evernote.com) matches the environment where you obtained the token.
Expected result: The 'Get User Info' call initializes successfully in Bubble. Your page workflow sets a custom state with the NoteStore URL on load. You can now use this state value as the base path for all NoteStore operations.
List Notebooks and Search Notes Using the Dynamic NoteStore URL
With the NoteStore URL stored in a custom state, you can now add the two key data calls: listing notebooks (for a filter dropdown) and searching notes (for the main content repeating group). Add a second call inside the Evernote connector. Name it 'List Notebooks'. Set the method to GET and the path to `<noteStoreUrl>/NoteStore/listNotebooks` — in Bubble API Connector, use a dynamic path parameter: put `<noteStoreUrl>` as a path variable named `noteStoreUrl` (Bubble treats path segments starting with `<` as dynamic parameters). This means the complete URL at runtime will be, for example, `https://www.evernote.com/shard/s1/notestore/NoteStore/listNotebooks`. For the Initialize call on List Notebooks, you must provide a real NoteStore URL as the test value for the path parameter. Type your actual NoteStore URL (from the /edam/user response in step 3) and click Initialize. Bubble will return a JSON array of notebook objects, each containing `guid`, `name`, `updateSequenceNum`, and other metadata. Next, add a third call: 'Find Notes'. Method: POST. Path: `<noteStoreUrl>/NoteStore/findNotesMetadata`. Set body type to JSON. Set Content-Type header to `application/json`. The body should contain a dynamic `filter` object and a `maxNotes` parameter: ```json { "filter": { "words": "<searchQuery>", "notebookGuid": "<notebookGuid>" }, "offset": 0, "maxNotes": 20, "resultSpec": { "includeTitle": true, "includeContentLength": true, "includeCreated": true, "includeSnippet": true } } ``` Make `searchQuery` and `notebookGuid` dynamic parameters (mark them as optional so either can be blank). Initialize with your real NoteStore URL and a sample notebook GUID from the listNotebooks response. Bubble will detect fields like `notes` (an array), `totalNotes` (integer), and within each note: `guid`, `title`, `created` (millisecond timestamp), `snippet`.
1{2 "call_list_notebooks": {3 "name": "List Notebooks",4 "method": "GET",5 "path": "<noteStoreUrl>/NoteStore/listNotebooks",6 "dynamic_params": [7 { "key": "noteStoreUrl", "type": "path", "example": "https://www.evernote.com/shard/s1/notestore" }8 ]9 },10 "call_find_notes": {11 "name": "Find Notes",12 "method": "POST",13 "path": "<noteStoreUrl>/NoteStore/findNotesMetadata",14 "headers": [15 { "key": "Content-Type", "value": "application/json" }16 ],17 "body": {18 "filter": {19 "words": "<searchQuery>",20 "notebookGuid": "<notebookGuid>"21 },22 "offset": 0,23 "maxNotes": 20,24 "resultSpec": {25 "includeTitle": true,26 "includeCreated": true,27 "includeSnippet": true28 }29 }30 }31}Pro tip: Evernote timestamps (the `created` field on notes) are in milliseconds since epoch — larger than typical Unix timestamps but compatible with Bubble's date handling. When displaying note creation dates in Bubble, use 'Date → Extract date from' with the millisecond value, or format the number using a formatted-as expression.
Expected result: Both calls initialize successfully. 'List Notebooks' returns your Evernote notebooks as a list Bubble can bind to a dropdown. 'Find Notes' returns a notes list with title, snippet, and creation date. You now have all the data you need to build the Bubble UI.
Build the Notebook Browser Repeating Group and Note Display
Now assemble the Bubble UI. The pattern is: a notebook dropdown drives the note search, and clicking a note title opens full content in a popup HTML element. On your Bubble page, add a Dropdown element and populate its options with data from 'Evernote - List Notebooks'. Set its option caption to 'notebook's name' and value to 'notebook's guid'. Add a workflow: When Dropdown's value is changed → run 'Evernote - Find Notes' with notebookGuid = Dropdown's value and noteStoreUrl = page's noteStoreUrl custom state. Store the result in a custom state 'notesList' (list of Evernote Find Notes result). Below the dropdown, add a Repeating Group. Set its type to 'Evernote Find Notes result notes' (the nested list Bubble detected from the `notes` array). Data source: page's notesList's notes. Inside the repeating group cell: add a Text element showing 'Current cell's note's title'. Add a smaller text showing 'Current cell's note's created' formatted as a date. Add a text for the snippet. Add a Popup element to your page. Inside the popup, add an HTML element (from Bubble's visual editor, it's in the 'HTML' category under UI elements). This HTML element will render ENML content. Add a workflow: When repeating group cell's title text is clicked → Show popup → set a custom state 'selectedNoteContent' to the clicked note's ENML content (you'll need to add a separate 'Get Note Content' API call for this, or use the snippet as a preview-only implementation). For ENML stripping in the HTML element, set the element's HTML value to a Bubble expression that removes XML tags using Bubble's text operators: use 'Extract with regex' or a series of 'removed' operators to strip content between `<` and `>` characters. If you need proper ENML rendering, use the raw HTML in the element and let the browser parse the XML-like tags.
1{2 "repeating_group": {3 "type": "Evernote Find Notes result notes",4 "data_source": "page's notesList's notes",5 "cell_elements": [6 { "element": "Text", "content": "Current cell's note's title" },7 { "element": "Text", "content": "Current cell's note's created formatted as MMM DD, YYYY" },8 { "element": "Text", "content": "Current cell's note's snippet" }9 ]10 },11 "html_element_for_enml": {12 "type": "HTML element",13 "html_value": "page's selectedNoteContent",14 "note": "ENML is XML-based; a Bubble HTML element renders it better than a standard text element. Strip or accept the XML tags depending on how structured the content is."15 }16}Pro tip: If you have large notebooks (hundreds of notes), add a 'Load more' button that triggers a second 'Find Notes' call with offset=20, 40, etc., and appends results to the notesList custom state using the 'Set state: merge with list' option. This requires Bubble's paid plan for API Workflows if you want automatic pagination.
Expected result: Your Bubble page shows a notebook dropdown. Selecting a notebook triggers the note search and populates the repeating group with note titles and snippets. Clicking a note opens the popup with the ENML content rendered in the HTML element.
Handle Pagination, ENML Display, and Rate Limit Errors
Polish the integration by handling three common production scenarios: note pagination for large notebooks, clean ENML content display, and Evernote's RATE_LIMIT_REACHED error response. For pagination: Evernote's findNotesMetadata default maxNotes is 20. To load more, make a second call with offset=20. In Bubble, use a 'Load more' button that: runs 'Find Notes' with the same filters but offset = (page's currentOffset custom state), appends the result to the notesList state (using Bubble's 'Set state: add list'), and increments currentOffset by 20. Stop showing the button when returned notes count < 20 (indicating you've reached the end). For ENML content: ENML looks like HTML but uses Evernote-specific tags (`<en-note>`, `<en-media>`). A Bubble HTML element will render most of it legibly since browsers parse XML tags as generic HTML. For a cleaner display, add a backend workflow (paid plan) that uses Bubble's 'remove all' text operator in a loop to strip known ENML tags. The simplest approach for a read-only portal: display the `snippet` field (plain text, automatically generated by Evernote) as the body summary, and link the note GUID to the Evernote web client for full reading. For rate limit errors: Evernote returns a JSON body `{"errorCode": "RATE_LIMIT_REACHED", "rateLimitDuration": 3600}` when rate limits are hit. In Bubble workflows, add an 'Only when' condition to your note-fetch buttons that checks if the page has been in use for less than 1 minute since the last fetch (using a timestamp custom state). Display a friendly message: 'Evernote rate limit reached — please wait a moment before searching again.' This prevents users from hammering the API. RapidDev's team has built Bubble knowledge-base portals with Evernote and other complex integrations — if you need help with the NoteStore URL pattern or OAuth token acquisition, a free scoping call is available at rapidevelopers.com/contact.
1{2 "pagination_workflow": {3 "trigger": "Load more button is clicked",4 "step_1": "Plugins → Evernote - Find Notes (noteStoreUrl=page's noteStoreUrl, notebookGuid=dropdown's value, offset=page's currentOffset)",5 "step_2": "Set state: notesList = notesList merged with Result of step 1's notes",6 "step_3": "Set state: currentOffset = currentOffset + 20"7 },8 "rate_limit_error_response": {9 "errorCode": "RATE_LIMIT_REACHED",10 "rateLimitDuration": 3600,11 "message": "You've reached Evernote's API rate limit. Duration is in seconds — show a countdown or a friendly wait message in Bubble."12 },13 "enml_display_strategy": {14 "option_a": "Display snippet field (plain text) as body preview",15 "option_b": "Place full ENML in Bubble HTML element (browser renders XML tags as generic HTML)",16 "option_c": "Strip ENML tags in backend workflow using Bubble's 'remove' text operator in a loop (paid plan)"17 }18}Pro tip: To link users to the full note in Evernote's web client, construct the URL as: `https://www.evernote.com/shard/{shardId}/view/notebook/{notebookGuid}?noteGuid={noteGuid}`. You can extract the shardId from the noteStoreUrl (the 's1' segment in 'shard/s1').
Expected result: Your Bubble app handles large notebooks with pagination, displays ENML content readably, and shows a user-friendly message when Evernote rate limits are hit — instead of a raw error state.
Common use cases
Internal Support Knowledge Portal
Build a Bubble app that lets your support team search Evernote notebooks from a single interface without requiring every agent to have an Evernote account. Use Bubble's search input to drive a findNotesMetadata query against a shared notebook, display matching note titles and snippets in a repeating group, and open full note content in a Bubble popup using an HTML element that renders the stripped ENML properly.
I need a Bubble page that shows a search input connected to Evernote's findNotesMetadata endpoint. When the user types a query, it should filter notes in a specific notebook and display the title, snippet, and creation date in a card-style repeating group. Clicking a card should open a popup showing the note content rendered in a Bubble HTML element.
Copy this prompt to try it in Bubble
Founder Dashboard with Recent Notes Widget
Add an Evernote recent-notes widget to an existing Bubble founder dashboard. On page load, fetch the last 10 notes from a designated 'Daily Notes' notebook and display them in a sidebar panel alongside other data (metrics, tasks, CRM updates). Use the NoteStore URL stored in a Bubble custom state to keep the dashboard fast — load it once and reuse it for all subsequent note calls on the same page.
I want to add an Evernote widget to my Bubble dashboard page. On page load it should call /edam/user to get the NoteStore URL, then call findNotesMetadata filtered to a specific notebook GUID, sorted by created descending, and display the 10 most recent note titles in a sidebar list. Each item should link to the Evernote web client using the note's GUID.
Copy this prompt to try it in Bubble
Meeting Notes Archive
Create a Bubble app where a team can browse and read notes from an Evernote 'Meeting Notes' notebook, organized by month. Use a Bubble date picker to filter notes by creation date range (passing startTime and endTime to the findNotesMetadata filter), display results in a timeline-style repeating group, and render each note's full ENML content in an HTML element inside a slide-out drawer.
Build a Bubble meeting-notes archive page. It should load all notebooks from Evernote when the page loads, let the user select one from a dropdown, then show notes filtered by a date-range picker. Clicking a note title should load the full note content in a slide panel using a Bubble HTML element. The page should handle empty states when no notes match the selected date range.
Copy this prompt to try it in Bubble
Troubleshooting
Initialize call returns a 401 error with no response body
Cause: The access token is invalid, revoked, or doesn't match the environment. Using a sandbox token with production endpoints (evernote.com) or a production token with sandbox endpoints (sandbox.evernote.com) causes silent 401s with no explanation body.
Solution: Verify which environment your token came from: sandbox tokens only work with sandbox.evernote.com; production tokens only work with evernote.com. Open Postman, re-run the OAuth 1.0a flow in the correct environment, copy the fresh access token, update the Private Bearer header in Bubble API Connector, and re-initialize the call.
All NoteStore calls return 'There was an issue setting up your call' or a 404 error
Cause: The NoteStore URL is wrong or the path concatenation is malformed. This happens when the custom state containing the NoteStore URL hasn't been set yet (page load workflow ran before the /edam/user call completed) or when there's a double slash in the dynamic path.
Solution: Add a 'do when condition is true' trigger: 'page's noteStoreUrl is not empty → enable NoteStore calls'. Ensure the dynamic path parameter for NoteStore calls is set to the full NoteStore URL (including the https:// prefix) and that your call path starts with `/NoteStore/...` not `//NoteStore/...`. Use Bubble's debugger (click the bug icon in preview) to inspect the custom state value and confirm it's populated before any NoteStore call runs.
Note content in the repeating group or popup shows raw XML tags like <en-note> and <en-media>
Cause: ENML is an XML dialect. Placing ENML content in a Bubble standard Text element renders the raw XML tags instead of formatted text because Bubble text elements escape HTML/XML.
Solution: Replace the Text element with a Bubble HTML element (found in the UI Elements category in the Bubble editor). Set the HTML element's value to the ENML content. Browsers will render Evernote's XML as generic HTML, hiding most tags. For a cleaner display, show the note's `snippet` field (automatically generated plain-text preview) as the visible content and link to the full note in Evernote's web client.
RATE_LIMIT_REACHED error appears after a short burst of note searches
Cause: Evernote's API enforces a per-token rate limit. The limit varies by API key tier. Rapid search input events (every keystroke) or automated page refreshes can exhaust the limit quickly.
Solution: Implement debouncing on your search input: use Bubble's 'Do with delay' action (500ms) before firing the API call, so rapid keystrokes don't each trigger a separate request. Add an 'Only when' condition on fetch buttons that checks a timestamp custom state — don't allow a new fetch if the last one happened less than 2 seconds ago. Display a friendly message when the RATE_LIMIT_REACHED errorCode appears in the API response.
1{2 "rate_limit_response": {3 "errorCode": "RATE_LIMIT_REACHED",4 "rateLimitDuration": 36005 },6 "bubble_display_message": "Evernote is temporarily rate-limiting this app. Please wait a moment and try again."7}API key approval is taking longer than expected, or the application was rejected
Cause: Evernote's developer key application is reviewed by Evernote staff. Applications for commercial use, production access, or ambiguous use cases may take up to 5 business days or require additional information.
Solution: Use the sandbox environment (sandbox.evernote.com) to build and test the full Bubble integration while waiting for production key approval. The sandbox provides an immediately-available key and a separate Evernote sandbox account. When you describe your use case in the API key application, be specific: 'Building a read-only notebook browser inside a Bubble app for internal support team use' is more likely to be approved quickly than a vague description.
Best practices
- Always fetch the NoteStore URL dynamically from /edam/user on page load — never hardcode it. If you reuse the integration for a different Evernote account or if the shard assignment changes, hardcoded URLs will silently break.
- Store your Evernote access token in Bubble API Connector's Private header only — never in a Bubble data type field, text element, or URL parameter. Private headers are server-side only and do not appear in browser network traffic.
- Use the sandbox environment (sandbox.evernote.com) for all development and testing. Only switch to production endpoints after your API key is approved and the integration is fully tested.
- Display ENML note content in a Bubble HTML element, not a Text element. Bubble's text elements escape XML characters, making ENML unreadable. HTML elements let the browser parse the XML-like structure into readable content.
- Implement a debounce on search inputs (500ms minimum) to avoid triggering findNotesMetadata on every keystroke. Evernote's rate limits can be exhausted quickly by rapid sequential searches, causing a poor user experience.
- Show the note `snippet` field (Evernote's auto-generated plain-text preview) as the primary visible content in your repeating group, and use the `guid` to link to the full note in Evernote's web client. This avoids needing to fetch full note content for every item in the list.
- If users need to see notes from multiple Evernote accounts, treat each account as a separate Bubble API Connector configuration — OAuth 1.0a tokens are per-user and cannot be shared across accounts.
- Flag the API key review requirement prominently in any team documentation. If a new developer joins and needs to regenerate the key, the 1–5 day review cycle will block all Evernote functionality in your Bubble app until the new key is approved.
Alternatives
Notion has a modern REST API with simple Bearer token auth (no OAuth 1.0a dance), flat JSON responses (no ENML), and a Bubble-specific setup that takes under 30 minutes. If your audience is flexible about which note tool to use, Notion is significantly easier to integrate with Bubble. Evernote is worth the complexity only if users already have an established Evernote library they can't migrate.
Confluence uses Basic Auth (email + Atlassian API token) that Bubble API Connector supports natively, CQL for powerful structured search, and standard JSON responses. If the goal is a team knowledge base embedded in Bubble, Confluence is easier to set up and better suited to team environments. Evernote excels for personal note collections where the user is an individual Evernote power user.
Google Docs uses OAuth 2.0 (more modern than Evernote's 1.0a) and returns document content as structured JSON with named elements. For document reading and browsing use cases in Bubble, Google Docs is more accessible to Bubble's typical audience because the Google API Console is more self-service than Evernote's reviewed API key process.
Frequently asked questions
Can I complete the OAuth 1.0a flow inside Bubble without using Postman?
Not natively. Bubble's API Connector does not support OAuth 1.0a signature computation (HMAC-SHA1). The only viable approach is to complete the three-step OAuth flow once outside Bubble (using Postman, a browser-based OAuth helper, or Evernote's sandbox UI), obtain the long-lived access token, and paste it as a Private Bearer header in Bubble. Since the token doesn't expire unless manually revoked, you only need to do this once per Evernote account.
Why does my NoteStore URL look different from examples I've seen online?
Evernote assigns each account to a shard (a server cluster identified by s1, s2, s3, etc.) based on when the account was created and where the user is located. Your NoteStore URL will contain your specific shard identifier (e.g., /shard/s1/notestore or /shard/s200/notestore). This is expected and correct — always fetch it dynamically from /edam/user rather than copying it from examples or documentation.
Do I need a paid Bubble plan to integrate with Evernote?
For basic read-only use cases (browsing notebooks, searching notes, displaying content), Bubble's free plan is sufficient since these are standard API Connector calls. However, if you need to paginate large notebooks with more than 20 notes using automatic looping or backend workflows, that requires Bubble's Starter plan or above (paid), since API Workflows are a paid feature.
What happens if my Evernote access token expires or is revoked?
Evernote long-lived access tokens don't have automatic expiry, but they can be manually revoked by the user in Evernote Settings → Connected Apps, or if Evernote detects suspicious activity. When a token is revoked, all Bubble API calls return 401 errors. To handle this gracefully: add an error state to your Bubble page that shows a message like 'Your Evernote connection needs to be refreshed' when an API call returns a 401 response. The fix requires generating a new token via the OAuth flow in Postman and updating the Bubble API Connector header.
Can Bubble create or edit Evernote notes, or only read them?
Evernote's API supports creating and updating notes (POST /NoteStore/createNote, POST /NoteStore/updateNote), but these require write scopes in your OAuth token and a more complex payload that includes ENML-formatted content. For simple use cases, you can configure Bubble API Connector calls for note creation with a form-encoded body — but constructing valid ENML programmatically from Bubble workflow inputs requires careful handling of the XML structure. If note creation is a requirement, consider asking your Bubble developer to test this in the sandbox before going to production.
Is there a Bubble marketplace plugin for Evernote?
No verified Evernote plugin exists in the Bubble marketplace as of this writing. The API Connector approach described in this tutorial is the correct and recommended method. Avoid installing unverified third-party plugins that claim Evernote connectivity — they may be outdated, unsupported, or store your credentials insecurely.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation