Connect a database, Google or Stripe
Before you start
Connectors come with the Pro plan and up. How many you can add: 3 on Pro, 10 on Business, unlimited on Enterprise. Each table, report or sheet tab you add is a dataset, and each dataset uses one data connection, the same quota a Notion workspace uses.
Notion and CSV files need no connector: Connect a Notion database covers both.
How sync works
- ChartOmodo copies your data on a schedule. Charts and embeds read that copy, never your source.
- Pick how often each dataset syncs: as often as every 30 minutes on Pro, 10 on Business, 5 on Enterprise, or hourly, every 6 hours, daily, or manual only.
- A dataset holds up to 50,000 rows. A table or tab over 10 MB is refused; pick fewer columns or chart a summarized view.
- Stripe syncs once a day, on a schedule you cannot change, and reads up to 10,000 subscriptions.
- To sync at once, press Sync now next to the dataset. It runs once a minute per dataset at most.
PostgreSQL
Pick a table, view or materialized view. ChartOmodo copies up to 50,000 rows and 10 MB of it. A table over 50,000 rows is cut at that count, in no particular order, so for a big table chart a summarized view.
Connect as a read-only user. Run this on your database, with your own password:
CREATE ROLE chartomodo_ro LOGIN PASSWORD '<strong password>';
GRANT USAGE ON SCHEMA public TO chartomodo_ro;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO chartomodo_ro;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO chartomodo_ro;- Supabase: In your project, open Connect and use the Session pooler (port 5432) or the Transaction pooler (port 6543). Copy the host exactly (aws-N-<region>.pooler.supabase.com; don't guess N). The user is postgres.<project-ref>. The direct host db.<ref>.supabase.co is IPv6-only and also works. If verify-full fails, paste the CA certificate from your project's database settings, or choose require.
- Neon: Use the ep-… host from the dashboard. SSL is required; keep verify-full.
- Railway, Render, Aiven, Amazon RDS: Allow the IP addresses above. On Amazon RDS or Aiven, paste the provider's CA certificate if verify-full fails.
- Self-hosted: Open the port to the IP addresses above only, and connect as a read-only user.
MySQL and MariaDB
MySQL (Beta) works with MySQL 5.7.8 or later and MariaDB 10.3 or later. Pick a table or view in the database you connect to; the same row and size limits apply.
Create a read-only user:
CREATE USER 'chartomodo_ro'@'169.58.110.230' IDENTIFIED BY '<strong password>' REQUIRE SSL;
GRANT SELECT, SHOW VIEW ON `your_database`.* TO 'chartomodo_ro'@'169.58.110.230';An account with ALL PRIVILEGES on *.*, SUPER or SYSTEM_USER counts as a superuser and is refused. Accounts that can write are accepted with a warning; a dedicated read-only user is still the right choice.
- Self-hosted MySQL or MariaDB, or Remote MySQL in a hosting panel: Allow the IP addresses above (in cPanel: Remote MySQL). Without TLS on the server, remove REQUIRE SSL from the SQL above and choose SSL mode disable: data then travels unencrypted. If your server has only an IPv6 address, create the user for 2a02:c207:2348:659::1 instead.
Allow ChartOmodo’s address
If your database only accepts listed addresses, allow both of these:
169.58.110.230
2a02:c207:2348:659::1Google Sheets
Google Sheets by link (Beta): add a tab you publish to the web or share with anyone who has the link, no Google sign-in. ChartOmodo copies up to 50,000 rows of it on a schedule.
- Publish the tab: in Google Sheets choose File → Share → Publish to web, pick the tab and Comma-separated values (.csv), click Publish and copy the link.
- Or share the sheet: choose Share, set General access to Anyone with the link (Viewer), open the tab you want and copy the address from your browser.
Google Analytics and Search Console
Connect a Google account, then pick a Google Analytics 4 property or a Search Console site, a report and a range (last 28 days to last 16 months). Access is read-only; ChartOmodo copies the report on a schedule, up to 50,000 rows.
Stripe MRR
Stripe (Beta): paste a restricted key and ChartOmodo keeps one dataset, MRR by month and currency, synced once a day. Tick Create MRR dashboard to also get a ready-made Stripe MRR dashboard. The dashboard shows one currency, the one most of your active customers paid in this month; change its Currency filter in the builder to see another.
Create the key:
- In the Stripe Dashboard, open Developers → API keys and choose Create restricted key.
- Name it ChartOmodo. Set Customers, Subscriptions, Prices, Products and Coupons to Read, and leave everything else at None.
- Create the key, copy it and paste it here. It starts with rk_ (rkcs_ for a sandbox). A secret key (sk_) or publishable key (pk_) is refused: a secret key can refund and change data.
How MRR is counted
- MRR is what your subscriptions bill per month, before tax. A past month keeps its last sync in that month; months before you connected are estimated at the month's end. The current month shows the latest sync. On the 1st of a month the MRR and ARR tiles read 0 until the sync just after midnight UTC writes the new month.
- Counted: subscriptions that are active or past due. Not counted: trial, incomplete, unpaid, canceled and paused subscriptions, and subscriptions whose payment collection is paused. A subscription set to cancel at period end counts until it ends.
- Other billing periods become a month: a yearly price is divided by 12, a weekly one is multiplied by 52 and divided by 12, a daily one is multiplied by 365 and divided by 12.
- Usage-based (metered) prices and one-time charges are left out. Tiered prices follow their own tier rules.
- Coupons lower MRR while they apply. A coupon that applies once never does. A coupon limited to some products lowers only those products' items, and an amount off never takes more than those items cost. Discounts whose coupon was deleted in Stripe are not subtracted.
- New, Expansion, Contraction, Churn and Reactivation compare each customer's MRR with the month before. Reactivation is a customer who paid before, stopped, and pays again. Contraction and Churn are negative.
Estimated: ChartOmodo records MRR from the day you connect. Months before that are estimated from each subscription's start, trial end and end dates, using its current prices and quantities, so an upgrade made before you connected shows in every estimated month, not in the month it happened. The first recorded month is compared with an estimated one, so its New, Expansion, Contraction and Churn can reflect changes made before you connected.
Limits
- Each currency is its own row. Amounts are not converted, so there is no total across currencies.
- Taxes are not counted. Prices that include tax count as they are.
- Subscriptions with paused payment collection are left out while paused.
- An item whose multi-currency price has no option for the subscription's currency is not counted.
- Stripe's own Billing analytics converts every currency to your settlement currency, so its totals can differ from these.
Your key
- Deleting this connector does not revoke the key at Stripe. Delete the restricted key in your Stripe Dashboard (Developers → API keys) as well.
- Replace it only with a key from the same Stripe account. A key from another account mixes its numbers into this connector's history: for another account, add a new Stripe connector.
When a sync keeps failing
When a scheduled sync fails 3 times in a row, or needs a reconnect, the owner of the organization gets an email. There is at most one per connector every 24 hours.
Only the owner’s setting counts. If you own the organization and want to stop these emails, open Settings, go to Email notifications and turn off Connector sync failures.
Delete a connector
Deleting a connector deletes its credentials at once. What it synced stays as uploaded files with the last synced rows, so charts keep showing them until you delete them.
If it does not work
When a test or a sync fails, the message says why. Each one, and what to do:
- This host points to a private or reserved address. Use your database's public hostname.
- We couldn't find that host. Check the hostname.
- Couldn't reach the database. Allow 169.58.110.230 (and 2a02:c207:2348:659::1) in your firewall.
- The database took too long to answer.
- Secure connection failed. Paste your provider's CA certificate. If you trust the network path, SSL mode 'require' skips certificate checks.
- This database requires SSL. Switch SSL mode to 'verify-full' or 'require'.
- This database asks for the password in clear text. Switch SSL mode to 'require' or 'verify-full'.
- Username or password was rejected.
- That database doesn't exist, or this user can't open it.
- For your safety we don't accept superuser accounts. Create a read-only user (SQL above).
- This user can't read any tables. Grant SELECT on the tables you want to chart.
- The table no longer exists or this user lost access to it.
- This table or tab is larger than 10 MB. Pick fewer columns or chart a summarized view or tab.
- This database version or sign-in method isn't supported yet.
- Google access was revoked or has expired. Reconnect the Google account to resume syncing.
- Google didn't grant read access to this data. Reconnect and tick the permission box on Google's screen.
- Google's API quota is used up for now. We'll retry later.
- This Google account can no longer read that property or site.
- Google didn't answer. We'll retry on the next sync.
- Use a restricted key with read-only access. ChartOmodo refuses secret (sk_) and publishable (pk_) keys.
- Stripe rejected this key: it was deleted, rolled or has expired. Create a new restricted key and replace it under Edit.
- This key can't read everything ChartOmodo needs. Edit the restricted key and set Customers, Subscriptions, Prices, Products and Coupons to Read, then click Sync now.
- This Stripe account is too large for one sync: it has more than 10,000 subscriptions, or reading them took longer than 20 seconds.
- Too many attempts. Try again in a few minutes.
- Stripe didn't answer. We'll retry on the next sync.
- ChartOmodo can't read this sheet. In Google Sheets choose File → Share → Publish to web → Comma-separated values (.csv), or Share → General access → Anyone with the link (Viewer), then add the link again.
- This sheet or tab no longer exists, or its link changed. Add it again with the current link.
Questions
Do I need a connector for Notion?
No. Notion and CSV files connect from Add a source on every plan. Connectors are for other sources and come with the Pro plan and up.
Do charts query my source every time someone opens them?
No. ChartOmodo copies the data on a schedule, and charts and embeds read that copy, never your source.
What happens to my charts when I delete a connector?
Its credentials are deleted at once. What it synced stays as uploaded files with the last synced rows, so charts keep showing them until you delete them.
Can I send rows from my own script instead?
Yes. The Push API takes rows over HTTP, no connector needed.