Skip to main content
RapidDev - Software Development Agency
flutterflow-integrationsFlutterFlow API Call

Klaviyo

Connect FlutterFlow to Klaviyo using two separate API keys: the public key for client-side event tracking (safe to use directly in FlutterFlow API Calls) and the private key for profiles and lists (must be proxied through Firebase Cloud Functions or Supabase Edge Functions). The Klaviyo API also requires a mandatory revision date header on every request or calls will be rejected.

What you'll learn

  • The difference between Klaviyo's public key and private key — and which FlutterFlow calls need which
  • How to add the mandatory revision date header to every Klaviyo API Call in FlutterFlow
  • How to fire in-app behavioral events (viewed product, started checkout) from FlutterFlow using the public key
  • How to set up a Firebase Cloud Function proxy for private-key list and profile operations
  • How to handle Klaviyo's cursor-based pagination when reading large lists into a FlutterFlow Data Type
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Intermediate19 min read45 minutesMarketingLast updated July 2026RapidDev Engineering Team
TL;DR

Connect FlutterFlow to Klaviyo using two separate API keys: the public key for client-side event tracking (safe to use directly in FlutterFlow API Calls) and the private key for profiles and lists (must be proxied through Firebase Cloud Functions or Supabase Edge Functions). The Klaviyo API also requires a mandatory revision date header on every request or calls will be rejected.

Quick facts about this guide
FactValue
ToolKlaviyo
CategoryMarketing
MethodFlutterFlow API Call
DifficultyIntermediate
Time required45 minutes
Last updatedJuly 2026

Why Klaviyo + FlutterFlow is Powerful for E-Commerce Apps

Klaviyo is the go-to email and SMS automation platform for e-commerce brands because it triggers flows based on what users actually do — not just what segment they're in. When you connect your FlutterFlow app to Klaviyo, you unlock automated welcome sequences when users sign up, abandoned-cart emails when a purchase isn't completed, post-purchase review requests, and VIP tier flows based on lifetime spend. For any FlutterFlow app that sells products or drives conversions, this is the marketing layer that turns one-time downloads into repeat customers.

What makes Klaviyo distinctive in the FlutterFlow context is its two-key model. The public key (also called the site ID) is designed to be exposed in client-side code — it's how Klaviyo's web analytics snippet works in browsers. You can safely use this key directly in a FlutterFlow API Call to fire Track events. The private API key (a Bearer token starting with `pk_`) is a different story: it grants full read/write access to your audience, flows, and campaign data, and it must never touch the Flutter bundle. Klaviyo also enforces a mandatory `revision` date header on all current API calls — missing it causes an immediate rejection, so it must be set in your API Group.

Klaviyo's free plan supports a limited number of contacts and monthly email sends (check current limits on their pricing page). Paid plans scale by active profile count. For read-heavy dashboard features inside your app, plan on caching campaign and flow metrics in Firestore or Supabase via a scheduled Cloud Function — hitting Klaviyo on every screen open across many users will eat through the 75 requests/second private-key rate limit quickly.

Integration method

FlutterFlow API Call

Klaviyo uses two API keys with different trust levels. The public key is safe for client-side event tracking and can be placed directly in FlutterFlow API Calls. The private key (Bearer token) is required for reading and writing profiles, lists, and campaign metrics — it must live in a Firebase Cloud Function or Supabase Edge Function proxy, never in the Flutter bundle. FlutterFlow calls your proxy, which forwards to `https://a.klaviyo.com/api` with the private key injected server-side.

Prerequisites

  • A Klaviyo account with at least one list created (free plan works for testing)
  • Your Klaviyo public key (site ID) and private API key from Account → Settings → API Keys
  • Note the required revision date for the Klaviyo API version you are targeting (found in Klaviyo's API changelog — e.g., '2024-02-15')
  • A Firebase project with Cloud Functions enabled, or a Supabase project with Edge Functions (for private-key calls)
  • A FlutterFlow project with at least one screen (sign-up or product detail) where events will be triggered

Step-by-step guide

1

Get your Klaviyo keys and note the required revision header

Log in to Klaviyo and navigate to Account (bottom-left avatar) → Settings → API Keys. You will see two types of keys. The Public API Key (also listed as your Site ID) is a short string like `AbCd12` — this is safe to use client-side and you can copy it directly. The Private API Key is a longer string starting with `pk_` — treat this like a password and never put it anywhere it could end up in your app bundle. Copy both to a temporary notes file. Next, check Klaviyo's API reference for the current required revision date. The Klaviyo API requires every request to include a `revision` header with a date string in the format `YYYY-MM-DD` (for example, `2024-02-15`). This date pins your app to a specific API version. You can find the latest supported revision in the Klaviyo API changelog at `developers.klaviyo.com`. Missing this header causes your requests to fail with a 400 error, so get this right before building anything else. Write both keys and the revision date in a text file — you will enter them into FlutterFlow and your proxy backend in the next steps.

Pro tip: Your public key and revision date can be stored in FlutterFlow's App Values (Settings → App Values) as constants, since neither is a secret. The private key must only go into your backend environment variables.

Expected result: You have your public key, private key, and the current revision date string written down and ready to use.

2

Deploy a proxy Cloud Function to hold your private API key

Because Klaviyo's private key grants full read/write access to your entire audience, it must never be placed inside a FlutterFlow API Call header — doing so bakes the key into the compiled Flutter app where anyone can extract it using a tool like jadx or apktool. Instead, deploy a thin backend proxy that FlutterFlow will call, and that proxy will forward the request to Klaviyo with the private key injected server-side. If you are using Firebase, open the Firebase Console, navigate to Functions, and either use the CLI locally or the inline editor to create a function. The function accepts POST requests from FlutterFlow with a JSON body specifying which Klaviyo endpoint to call (for example, `/api/profiles/` or `/api/lists/{id}/relationships/profiles/`) and any relevant data, then calls Klaviyo with your private key in the Authorization header and returns the response. If you are using Supabase, navigate to Edge Functions in your Supabase Dashboard, click New Function, and write a Deno function that does the same proxy work. Store your Klaviyo private key in the project's environment secrets (Settings → Edge Functions → Secrets) as `KLAVIYO_PRIVATE_KEY` — never hardcode it in the function source. The proxy only needs a few dozen lines of code. It receives your FlutterFlow request, adds the `Authorization: Klaviyo-API-Key YOUR_PRIVATE_KEY` header and the required `revision` header, forwards to `https://a.klaviyo.com/api`, and returns the result. Your FlutterFlow API Calls will point to your proxy URL, not to Klaviyo directly.

index.js
1// Firebase Cloud Function proxy for Klaviyo private-key calls
2// Deploy to Firebase Functions (Node.js 18+)
3const functions = require('firebase-functions');
4const fetch = require('node-fetch');
5
6exports.klaviyoProxy = functions.https.onRequest(async (req, res) => {
7 // Allow requests from your FlutterFlow app
8 res.set('Access-Control-Allow-Origin', '*');
9 res.set('Access-Control-Allow-Methods', 'GET, POST, PATCH, DELETE');
10 res.set('Access-Control-Allow-Headers', 'Content-Type');
11 if (req.method === 'OPTIONS') { res.status(204).send(''); return; }
12
13 const KLAVIYO_PRIVATE_KEY = process.env.KLAVIYO_PRIVATE_KEY;
14 const KLAVIYO_REVISION = '2024-02-15'; // Update to your target revision
15
16 const { endpoint, method = 'GET', body } = req.body;
17 if (!endpoint) { res.status(400).json({ error: 'endpoint required' }); return; }
18
19 try {
20 const klaviyoRes = await fetch(`https://a.klaviyo.com/api${endpoint}`, {
21 method,
22 headers: {
23 'Authorization': `Klaviyo-API-Key ${KLAVIYO_PRIVATE_KEY}`,
24 'revision': KLAVIYO_REVISION,
25 'Content-Type': 'application/json',
26 },
27 body: body ? JSON.stringify(body) : undefined,
28 });
29 const data = await klaviyoRes.json();
30 res.status(klaviyoRes.status).json(data);
31 } catch (err) {
32 res.status(500).json({ error: err.message });
33 }
34});

Pro tip: Set the KLAVIYO_PRIVATE_KEY environment variable using `firebase functions:config:set klaviyo.key=pk_xxx` or in the Firebase Console under Functions → Configuration. Never hardcode it in the source file.

Expected result: Your Cloud Function or Edge Function is deployed and accessible at a URL like `https://us-central1-your-project.cloudfunctions.net/klaviyoProxy`. You can test it with a tool like Postman by sending a POST request with the body `{ "endpoint": "/profiles/", "method": "GET" }` and seeing a valid Klaviyo response.

3

Create a FlutterFlow API Group for Klaviyo event tracking (public key, client-side)

Public-key event tracking to Klaviyo's Track endpoint is safe to call directly from FlutterFlow without a proxy because the public key is designed to be exposed. This is how you fire behavioral events like 'Viewed Product', 'Started Checkout', and 'Placed Order' that feed Klaviyo's automation flows. In FlutterFlow, click API Calls in the left navigation panel. Click + Add and select Create API Group. Name it 'Klaviyo Track Events' and set the Base URL to `https://a.klaviyo.com`. Click Save. Now click + Add again and select Create API Call. Set the Name to 'Track Event', the Method to POST, and the Endpoint to `/client/events/`. In the Variables tab, click + Add Variable and create one called `event_name` (String) and another called `event_properties` (JSON or String). In the Headers tab, click + Add Header and add: `revision` with the value `2024-02-15` (or your target revision). Also add `Content-Type: application/json`. In the Request Body tab, set the body format to JSON and enter the Klaviyo Track event structure. The public key is used as a URL parameter or in the body depending on the endpoint version — check the Klaviyo Client API documentation for the correct format for your revision. Click Test, enter a test event name and properties, and click Run Test. If you see a `200 OK` or `202 Accepted` response, the connection is working. This API Call will be triggered from widget Actions when users interact with your app — for example, when they tap a product card, open the checkout screen, or complete a purchase.

typescript
1{
2 "method": "POST",
3 "endpoint": "/client/events/",
4 "base_url": "https://a.klaviyo.com",
5 "headers": {
6 "revision": "2024-02-15",
7 "Content-Type": "application/json"
8 },
9 "query_params": {
10 "company_id": "{{ public_key }}"
11 },
12 "body": {
13 "data": {
14 "type": "event",
15 "attributes": {
16 "metric": {
17 "data": {
18 "type": "metric",
19 "attributes": {
20 "name": "{{ event_name }}"
21 }
22 }
23 },
24 "properties": "{{ event_properties }}",
25 "profile": {
26 "data": {
27 "type": "profile",
28 "attributes": {
29 "email": "{{ user_email }}"
30 }
31 }
32 }
33 }
34 }
35 }
36}

Pro tip: Store your public key as an App Value constant (Settings → App Values → + Add App Value, type String). Reference it in the API Call as a Variable populated from the App Value so you don't hardcode it in multiple places.

Expected result: The Klaviyo Track API Call shows a green checkmark in Test mode and returns a 200 or 202 response. You can see the event appear in your Klaviyo account under Analytics → Event Metrics after running the test.

4

Create a FlutterFlow API Group pointing to your proxy for private-key calls

For list management, profile reads, and campaign metrics — anything requiring the private key — you need a second API Group that talks to your proxy, not directly to Klaviyo. The proxy adds the private key and revision header server-side, so FlutterFlow only needs to know your proxy URL. In FlutterFlow, click API Calls in the left navigation. Click + Add and select Create API Group. Name it 'Klaviyo Proxy' and set the Base URL to your deployed proxy URL (e.g., `https://us-central1-your-project.cloudfunctions.net`). Add a Header: `Content-Type: application/json`. Create an API Call inside this group named 'Get List Members'. Set the Method to POST and the Endpoint to `/klaviyoProxy` (or your actual function path). In the Variables tab, add: `endpoint` (String, default value `/lists/{list_id}/relationships/profiles/`) and `list_id` (String). Set the Request Body to JSON: `{ "endpoint": "/lists/{{ list_id }}/relationships/profiles/", "method": "GET" }`. In the Response & Test tab, paste a sample Klaviyo list members response (you can copy one from the Klaviyo API docs). Click Generate JSON Paths. FlutterFlow will automatically generate JSON Path expressions for each field in the response. The main one you need is `$.data[*].id` for profile IDs and `$.links.next` for the pagination cursor. Click + Add Data Type to create a 'KlaviyoProfile' type with fields `id` (String), `email` (String), and any custom properties you care about. Map the JSON paths to this Data Type. Pagination is cursor-based in Klaviyo — the response includes a `links.next` URL when more pages exist. Build a loop in your Action Flow (use a Loop or While variable) that calls this API Call, stores the cursor from `$.links.next`, and repeats until `next` is null. For large lists with thousands of profiles, this prevents the silent truncation you would get from a single un-paginated call.

Pro tip: For large list reads, consider having your proxy handle pagination server-side and return a full flat array to FlutterFlow. This avoids complex loop logic in the Action Flow Editor and reduces round trips.

Expected result: The 'Get List Members' API Call in your Klaviyo Proxy group returns a paginated list of profile IDs from Klaviyo when tested. JSON Paths are generated and mapped to your KlaviyoProfile Data Type.

5

Wire event tracking to app interactions in the Action Flow Editor

With your Track Events API Call set up, connect it to actual user interactions in your FlutterFlow app so Klaviyo receives real behavioral data. The Action Flow Editor is where FlutterFlow actions are sequenced — you can chain multiple actions, pass data between them, and conditionally fire events. Navigate to the screen where you want to track an event — for example, a product detail screen. Click on the widget that the user interacts with, such as a 'View Details' button or the screen itself (use the On Page Load trigger). In the right panel, click the Actions tab and then + Add Action. Scroll to the Backend/API section and select 'Backend Call'. Choose the Klaviyo Track Events group and the Track Event call. In the 'Set Variables' section, set `event_name` to a string like `Viewed Product` (or create an App Value for it). Set `event_properties` to a JSON object containing relevant fields — you can build this dynamically from page variables using Set Variable in a custom action, or pass a static JSON string for simple cases. Set `user_email` to the current user's email from your authentication system (if you use Supabase or Firebase Auth, this is accessible via the Auth User Email variable in FlutterFlow). Repeat this for other key conversion points: add a 'Started Checkout' event on the checkout screen's On Page Load trigger, and a 'Placed Order' event on the success screen. In Klaviyo, create corresponding flows that trigger on these metric names to send follow-up emails. Note that FlutterFlow fires these calls asynchronously — the user does not wait for the Klaviyo response before seeing the next screen. This is correct behavior for analytics events. Do NOT wait for the API response or show a loading indicator for tracking calls.

Pro tip: Use a common naming convention for Klaviyo event names — 'Title Case With Spaces' like 'Viewed Product' rather than snake_case. This makes Klaviyo's event list easier to read and matches how most Klaviyo flows are documented.

Expected result: When you run the app in FlutterFlow's Run Mode (or on a device), interacting with the wired screen fires events to Klaviyo. You can verify by going to Klaviyo → Analytics → Metrics and seeing your custom event names appear within a few minutes.

6

Set up scheduled metric caching to stay within rate limits

If your app displays Klaviyo campaign stats, flow performance, or audience metrics to admins or users, polling Klaviyo's API directly on every screen open will quickly exhaust the 75 requests/second private-key rate limit — especially if multiple users open the analytics screen simultaneously. The solution is to cache metrics in your database (Firestore collection or Supabase table) and refresh the cache on a scheduled Cloud Function. In Firebase: create a scheduled function using `functions.pubsub.schedule('every 60 minutes')` that calls your Klaviyo proxy for campaign stats, parses the response, and writes the results to a Firestore collection named `klaviyo_cache` with documents like `campaigns_summary` and `flow_metrics`. In Supabase: use a pg_cron job or a scheduled Edge Function invocation to do the same, writing to a `klaviyo_cache` Supabase table. Back in FlutterFlow, create a new API Group called 'Klaviyo Cache' pointing to your Firestore or Supabase. The API Calls in this group read from the cache table/collection, not from Klaviyo directly. Add a 'Refresh' button on your analytics screen that calls a special proxy endpoint to trigger an on-demand cache refresh — but rate-limit this button on the client side (disable it for 60 seconds after tapping) to prevent spam. This architecture means your analytics data is at most one hour stale, your app loads instantly without waiting on Klaviyo API calls, and you will never hit rate limit errors regardless of how many users are in the app simultaneously. If you need fresher data, reduce the schedule to every 15 minutes — still well within Klaviyo's limits for a single scheduled job calling a handful of endpoints. If you are struggling with the backend setup for caching or the proxy architecture, RapidDev's team builds FlutterFlow integrations like this every week and offers a free scoping call at rapidevelopers.com/contact.

index.js
1// Scheduled Firebase function: refresh Klaviyo metrics cache every hour
2const functions = require('firebase-functions');
3const admin = require('firebase-admin');
4const fetch = require('node-fetch');
5admin.initializeApp();
6
7exports.refreshKlaviyoCache = functions.pubsub
8 .schedule('every 60 minutes')
9 .onRun(async () => {
10 const KLAVIYO_PRIVATE_KEY = process.env.KLAVIYO_PRIVATE_KEY;
11 const REVISION = '2024-02-15';
12
13 const response = await fetch('https://a.klaviyo.com/api/campaigns/?filter=equals(messages.channel,\'email\')', {
14 headers: {
15 'Authorization': `Klaviyo-API-Key ${KLAVIYO_PRIVATE_KEY}`,
16 'revision': REVISION,
17 }
18 });
19 const data = await response.json();
20
21 await admin.firestore()
22 .collection('klaviyo_cache')
23 .doc('campaigns_summary')
24 .set({ data: data.data, updated_at: Date.now() });
25
26 console.log('Klaviyo cache refreshed:', data.data?.length, 'campaigns');
27 });

Pro tip: Add an `updated_at` timestamp field to your cache document. In FlutterFlow, display it on the analytics screen so users know when the data was last refreshed — this sets appropriate expectations and reduces 'refresh' button spam.

Expected result: Your scheduled function runs every hour, writes fresh Klaviyo campaign data to Firestore or Supabase, and your FlutterFlow analytics screen loads the cached data instantly without ever calling Klaviyo's API directly at screen open.

Common use cases

E-commerce app that tracks product views and abandoned carts

A FlutterFlow shopping app fires a Klaviyo Track event every time a user views a product or adds something to their cart without completing checkout. These events feed Klaviyo's automated flow engine, which sends a recovery email or SMS an hour later. No backend required for the event-firing step — the public key handles it directly from the app.

FlutterFlow Prompt

When the user opens a product detail screen, fire a Klaviyo 'Viewed Product' event with the product name, ID, and price. When they tap 'Add to Cart' but don't complete the order, fire an 'Added to Cart' event with the same fields.

Copy this prompt to try it in FlutterFlow

Membership app that syncs subscriber tiers to Klaviyo lists

A FlutterFlow subscription app automatically adds users to different Klaviyo lists based on their plan tier — free, basic, or premium. When a user upgrades, a Cloud Function proxy updates their Klaviyo profile and moves them to the correct list, triggering the onboarding flow for that tier. This keeps email segmentation perfectly in sync with in-app state.

FlutterFlow Prompt

Build a screen that lets admins view which Klaviyo list each user belongs to. When a user upgrades their plan, automatically call the proxy to update their Klaviyo profile's custom property 'plan_tier' and subscribe them to the correct list.

Copy this prompt to try it in FlutterFlow

Marketing dashboard showing campaign performance metrics

A FlutterFlow admin app pulls Klaviyo campaign open rates, click rates, and revenue attributed from a scheduled Cloud Function that caches the data in Supabase. The dashboard shows a list of recent campaigns with their key metrics, refreshed every hour — well within rate limits and fast to load without waiting on live Klaviyo API calls.

FlutterFlow Prompt

Create a dashboard screen that shows a scrollable list of recent Klaviyo campaigns with their names, send dates, open rate percentages, and click rates. Add a refresh button that calls the backend to update the cached metrics.

Copy this prompt to try it in FlutterFlow

Troubleshooting

API Call returns 400 Bad Request with a message about missing revision

Cause: The required `revision` header is missing from your API Call or API Group headers. Klaviyo's current API rejects requests that do not include this header specifying the API version date.

Solution: In FlutterFlow, open the API Call or API Group (whichever level you want to set it at), go to the Headers tab, and add a header named exactly `revision` with the value of your target revision date (e.g., `2024-02-15`). Setting it at the API Group level means all calls in that group inherit it automatically. Confirm the date is a supported revision from Klaviyo's API changelog.

Track events fire from the app but no data appears in Klaviyo's Analytics → Metrics

Cause: The public key in the Track API Call is incorrect, or the event body structure does not match the current Klaviyo Client API schema for your revision. A wrong company_id or malformed JSON body is silently accepted with a 200 but nothing is recorded.

Solution: Double-check the public key (Site ID) from Klaviyo → Account → Settings → API Keys. Use the Klaviyo API docs for your revision to confirm the exact JSON body structure required for `/client/events/` — the structure changed between API versions. Test with a hardcoded minimal payload first before adding dynamic variables. Also confirm the user email field is populated — events without a profile identifier may not appear in Metrics.

List or profile queries return only a partial result — fewer profiles than expected

Cause: Klaviyo's private API uses cursor-based pagination. A single API call returns a limited number of results (typically 20 per page by default) and includes a `links.next` field with the cursor for the next page. If you are not paginating, you only see the first page.

Solution: In your proxy or Cloud Function, implement a pagination loop: check if `response.links.next` exists, extract the `page[cursor]` value from the URL, and repeat the request with that cursor in the query parameters until `links.next` is null. Return the full concatenated array to FlutterFlow. Alternatively, use the `page[size]` parameter (up to 100) to reduce the number of pages needed for moderate-sized lists.

Private-key API Call returns 401 Unauthorized

Cause: The Klaviyo private key has been placed directly in a FlutterFlow API Call header (which is insecure and should be changed), or the proxy is not forwarding the Authorization header correctly, or the key has been revoked in Klaviyo.

Solution: First, ensure you are using the private key only in your proxy backend, never in a FlutterFlow API Call header. In your Cloud Function or Edge Function, confirm the Authorization header format is exactly `Klaviyo-API-Key pk_yourprivatekeyhere` (note: NOT `Bearer` — Klaviyo uses its own prefix). Go to Klaviyo → Account → Settings → API Keys and verify the key is still active and has not been revoked.

Best practices

  • Always use your Klaviyo public key for client-side event tracking and the private key only in your backend proxy — never swap them or use the private key in FlutterFlow API Calls.
  • Set the revision header at the API Group level in FlutterFlow so every call in the group inherits it automatically — prevents missing-revision 400 errors across multiple endpoints.
  • Implement cursor pagination for all list and profile reads — Klaviyo silently truncates results at the first page if you do not paginate, leading to incomplete data without any error.
  • Cache campaign metrics and flow stats in Firestore or Supabase via a scheduled Cloud Function rather than querying Klaviyo on every screen open — protects the 75 req/s rate limit across concurrent users.
  • Use Klaviyo's standard event naming convention (Title Case with spaces, like 'Viewed Product') to match Klaviyo's default flow triggers and make your analytics easier to read.
  • Scope your Klaviyo API keys to the minimum necessary permissions — if a key only needs to read campaigns, do not grant it write access to profiles.
  • Test event tracking in Klaviyo's Activity Feed (Audience → Profiles → find your test email) rather than in FlutterFlow's Run Mode console — this confirms events are actually received and attributed correctly.
  • For iOS apps, implement App Tracking Transparency (ATT) consent before firing any behavioral events — without ATT approval on iOS 14.5+, event attribution will be incomplete and some flows may not trigger correctly.

Alternatives

Frequently asked questions

Can I use the Klaviyo public key directly in a FlutterFlow API Call, or does it need a proxy?

The public key (Site ID) can be used directly in FlutterFlow API Calls for event tracking via the `/client/events/` endpoint — it is designed to be exposed in client-side code. Only the private API key (which grants access to profiles, lists, and campaigns) requires a backend proxy. Never use the private key in a FlutterFlow API Call header.

Why does every Klaviyo API call fail with a 400 error even though my key is correct?

The most common cause is a missing `revision` header. Klaviyo's current API requires every request to include a `revision` header with a date string like `2024-02-15` specifying the API version. Add this header to your FlutterFlow API Group so all calls inherit it. Also confirm the date you are using is a valid supported revision from Klaviyo's API changelog.

Does Klaviyo work with FlutterFlow's web preview mode?

The API Calls (event tracking and proxy calls) work in web preview since they are standard REST calls over HTTPS. However, if you add any native SDK integration via a Custom Action, that will not run in FlutterFlow's web Test Mode or preview canvas — you will need to test on a real device or in an APK build.

How do I connect a Klaviyo event to an automated email flow?

In Klaviyo, go to Flows → Create Flow → Build Your Own, and set the trigger to 'Metric'. Choose your custom event name (e.g., 'Viewed Product'). Add email or SMS actions with the desired delay. Once the flow is live, every time your FlutterFlow app fires that event via the Track API Call, Klaviyo will automatically enroll the user in the flow and send the configured messages.

Is the 75 requests/second rate limit per app or per user?

The 75 requests/second limit applies to your entire private API key — it is shared across all users of your app and all backend processes using that key simultaneously. This is why caching campaign metrics and flow data in your own database is essential for any app with significant user traffic, rather than querying Klaviyo on every screen load.

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