For Plaid integration, your Sure instance needs to be accessible from the internet behind a domain with working SSL. See additional context in maybe-finance/maybe#2419.
Prerequisites
Before setting up Plaid:- Your Sure instance must be publicly accessible via HTTPS
- You need a valid domain with working SSL certificate
- You must be comfortable with technical configuration
- You should review Plaid’s terms of service for personal use
Creating a Plaid account
- Go to dashboard.plaid.com and register for a new account
- Complete the registration process
- Request production access based on your bank type (see below)
Requesting production access
The process differs depending on whether your bank requires OAuth authentication.For banks without OAuth
- On the Home page, find “Learn how to build with Plaid” and click Unlock real data
- Enter your real name and phone number
- In the description box, write:
This is for personal use only on a self-hosted version of the Sure Finance software. I am only using it to manage my finances, sync my bank accounts, track my spending, and create a budget.
- Leave “Additional products” unchecked
- Click Request Access
- Wait for approval (may take more than 24 hours)
For banks with OAuth
Per Plaid Support as of July 2025, certain banks have extended OAuth approval timelines:
- Chase Bank: 3-4 months
- Schwab: Up to 2 months
- In the left sidebar, click Get production access
- Enter your real address
- For business profile, write:
This is for personal use only on a self-hosted version of the Sure Finance software. I am only using it to manage my finances, sync my bank accounts, track my spending, and create a budget.
- Leave company website blank
- Enter your real name, phone number, email, and date of birth
- Click Next
- Indicate:
- 0 employees
- Your country of data access
- You do not sell data
- No security breach in past 12 months
- Click Next
- Select industry: Budgeting and financial management tools
- Click Next
- Enter any name for your application
- Upload a logo (1024x1024px, under 4MB)
- Leave brand color as #22CCEE
- Set Website URL to:
https://github.com/we-promise/sure - In “Reason for data access”, enter:
This is for personal use only on a self-hosted version of the Sure Finance software. I am only using it to manage my finances, sync my bank accounts, track my spending, and create a budget.
- Enter your real email as support email
- Click Next
- Enter your country for “Where do you want to launch?”
- For products:
- Payments: Check only Auth and Balance
- Credit Underwriting: Leave all unchecked
- Fraud & Compliance: Leave all unchecked
- Financial Management: Check all products
- Click Next
- For use cases:
- Payments: Select Consumer bill pay
- Financial Management: Select Personal budgeting and financial advice for all products
- Click Next
- Select Pay As You Go plan
- Click Next
- Enter billing details and check agreement boxes
- Click Next
- Click Start Security Practices Questionnaire
- For each question:
- Select Other - please see comments
- Write in notes:
This is for personal use only on a self-hosted version of the Sure Finance software. I am only using it to manage my finances, sync my bank accounts, track my spending, and create a budget.
- Continue through all sections, repeating step 28
- Click Submit
- Wait for approval (may take more than 24 hours)
Configuring Sure
After your Plaid account is approved:- Go to dashboard.plaid.com/developers/api or click Developers > API
- Click Configure next to Allowed redirect URIs
- Click Add new URI
- Enter your domain with
/accountsappended (e.g.,https://budget.yourdomain.com/accounts) - Click Save changes
- Go to dashboard.plaid.com/developers/keys or click Developers > Keys
- Copy your
client_idand Productionsecretkey
Complete Plaid Link customization
After production access is approved, finish the Plaid Link configuration before testing bank connections:- In the Plaid Dashboard, go to Link > Link Customization
- Add Track and manage your finances as a use case
- Publish the changes
Docker Compose configuration
In yourdocker-compose.yml file, add these environment variables:
Environment variables
In your.env file, add:
Restart Sure
After updating your configuration, restart your Sure instance. You should now see the Link account option in the Sure UI.Managing accounts
Adding accounts to an existing connection
If you have an existing US Plaid connection and want to add more accounts from the same institution, you do not need to create a new connection.- Go to Settings > Providers and find your Plaid connection
- Click Add accounts next to the connection
- The Plaid Link flow opens with account selection enabled
- Select the additional accounts you want to add
- Complete the flow — Sure will sync the new accounts automatically
Linking an unlinked Plaid account to an existing Sure account
If you have a Plaid account that is not yet linked to any Sure account, you can connect it to an existing account rather than creating a new one.- Go to Settings > Providers and find the account you want to link
- Open the account menu and choose the option to link to a Plaid account
- A dialog lists all unlinked Plaid accounts available in your family
- Select the Plaid account and click Link account
How Sure selects Plaid products
When you initiate a Plaid Link flow, Sure requests a specific set of Plaid products based on the type of account you are linking. Plaid filters out any institution that does not support every product in the requested set, so the product selection directly controls which institutions appear in the Link UI.
Because
liabilities is only requested when linking a liability account (credit card or loan), investment-only institutions such as E*TRADE that do not offer Plaid’s liabilities product are now visible when you link an investment account. Previously, requesting liabilities for every account type caused those institutions to be silently hidden in the Link flow.
Features
- US bank coverage: Comprehensive support for US financial institutions
- Real-time data: Access to account balances and transactions
- OAuth support: Secure authentication for supported banks
- Multiple accounts: Connect accounts from different institutions
- Investment-only institutions: Brokerages that do not offer liabilities (such as E*TRADE) can be linked as investment accounts
Pricing
Plaid uses a pay-as-you-go pricing model. Check plaid.com/pricing for current rates.Limitations
- US-focused: Primarily supports US institutions, not available for European users
- Complex setup: Requires significant technical configuration
- TOS concerns: Personal use may violate Plaid’s terms of service
- Public accessibility: Requires publicly accessible HTTPS endpoint
- Long approval times: OAuth-enabled banks can take months to approve
- Technical expertise: Not recommended for non-technical users
Alternatives
Consider these alternatives to Plaid:- SimpleFIN: Simpler setup, more affordable, US-focused
- Enable Banking: Free, EU-focused, easier setup
- Lunch Flow: Global coverage, paid service
Transaction refresh behavior
Sure requests a fresh transaction pull from Plaid before reading new data in several situations, not only during manual syncs. The refresh is asynchronous: Sure sends a refresh request to Plaid, then polls for an updated transaction cursor, then triggers a follow-up sync once the cursor advances.When automatic refreshes run
A transaction refresh is requested automatically in the following cases:- Scheduled sync — the nightly background job that syncs all families
- Provider-wide sync — triggered when you sync all accounts from Settings or the accounts page
- Login sync — when auto-sync on login is enabled and Sure detects a family has not synced today
Manual sync behavior
Manual syncs also request a transaction refresh before fetching data. After sending the refresh request, Sure polls Plaid for the updated cursor and syncs once new data arrives. If no new transactions appear within the polling window (roughly 3 minutes), Sure falls back to a normal sync with whatever data Plaid currently has.Coalescing and the cache store requirement
To prevent duplicate refresh requests, Sure uses a shared cache to coalesce calls: if a refresh has already been requested for a given Plaid item within the last 5 minutes, subsequent requests are dropped and the in-progress refresh continues normally. The coalescing logic requires a shared cache store. Sure skips the Plaid refresh request (and logs a warning) if the cache store is the default file-based or in-memory store. To enable refresh on a self-hosted instance, configure one of the following:- Redis — set
CACHE_URLto a Redis connection string - Memcache — configure
MEMCACHE_SERVERS - SolidCache — enabled by default in the Docker Compose setup
Reconnect status
When Plaid requires you to re-authenticate (for example, after a password change), Sure marks the connection with a “requires update” warning. Clicking the Update button in Settings > Providers opens the Plaid Link re-authentication flow. After you complete re-authentication, the warning is not cleared immediately. Sure clears the “requires update” status only after the next full import succeeds. This means the warning may persist briefly after you reconnect — it disappears once the subsequent sync completes without a login error. If the login issue is still present, the status remains until authentication succeeds and a full import runs cleanly.Troubleshooting
If you run into Plaid errors that are not visible in Sure, check the Plaid Dashboard logs under Developers > Logs. These logs can show whether the issue is coming from Plaid Link configuration, product approval, institution support, or another Plaid-side validation error.Link popup closes after selecting a bank
If the Plaid popup closes immediately after you select a bank, and Sure shows no useful app logs, the problem may be on Plaid’s side rather than in your Sure configuration. Things to verify first:- Your instance is publicly reachable over HTTPS
- Your allowed redirect URI is set correctly in Plaid, for example
https://budget.yourdomain.com/accounts PLAID_ENV=productionwhen using Limited or Full Production access- Your
PLAID_CLIENT_IDandPLAID_SECRETare the Production credentials, not Sandbox keys
- Your Plaid environment and access tier (for example, Limited Production)
- The institution you are trying to connect (especially if it is Chase or another OAuth-heavy institution)
- Confirmation that /link/token/create succeeds (can be verified in the Activity section of your Plaid Dashboard)
- Confirmation that your redirect URI is configured correctly
- A note that the Link popup closes without completing the connection
- A request for them to verify or reprocess your client registration / onboarding