Inizia qui: il quadro generale
MeterFlow risponde a una sola domanda per il tuo prodotto: “chi ha usato quanto, di cosa — e quanto gli costa?” Tutto ciò che vedi nella dashboard esiste per rispondere a questa domanda.
user-842 o un’email).Come si incastrano i pezzi
Perché alcuni pulsanti “Crea” sono disattivati?
Ogni finestra disattiva il pulsante di conferma finché tutti i campi obbligatori (contrassegnati con *) non sono compilati — es. “Create plan” resta disattivato finché il piano non ha un Nome. Se un pulsante sembra bloccato, controlla se c’è un campo obbligatorio vuoto più in alto.
Nuova organizzazione contenitore
Il contenitore più esterno — di solito la tua azienda. Tutto il resto (progetti, meter, piani…) vive dentro un’organizzazione. Ne hai ricevuta una automaticamente al momento della registrazione.
📍 Dashboard → il pulsante “New organization” (proposto anche al primo accesso, quando non ne hai ancora una)
- Name *
Il nome della tua azienda o del tuo team. È solo un’etichetta — puoi cambiarla in seguito.
- Billing email
Dove arriverebbero fatture e comunicazioni di fatturazione per il tuo account MeterFlow. Facoltativa; il formato viene validato, ma non viene inviato nulla per verificarla.
finance@acme.dev. I suoi due prodotti diventeranno due progetti al suo interno.Nuovo progetto contenitore
Un progetto = un prodotto o ambiente da misurare. Ogni meter, piano, chiave API, saldo cliente ed evento di utilizzo appartiene a un solo progetto — i progetti non vedono mai i dati l’uno dell’altro.
📍 Dashboard → il pulsante “New project” nell’intestazione della tabella Projects
- Organization *
A quale organizzazione appartiene il progetto. Pre-selezionata se ne hai già una attiva.
- Name *
Il nome del prodotto, es. “PixelForge AI”. Compare in tutta la dashboard e nel selettore di progetto.
- Description
Testo libero, per tuo riferimento.
Genera chiave API accesso
La credenziale che la tua applicazione usa per parlare con MeterFlow. Il tuo backend la passa all’SDK; ogni evento di utilizzo, operazione sui crediti e chiamata sugli abbonamenti viene autenticata — e limitata a un solo progetto — da questa chiave.
📍 Apri un progetto → API Keys → il pulsante nell’intestazione della tabella
- Key name *
Un’etichetta per ricordarti dove viene usata la chiave — “Backend di produzione”, “Staging”, “Test CI”. Nessun effetto tecnico.
- Environment
Le chiavi Live iniziano con
mf_live_, quelle Test conmf_test_— e accedono a due set di dati completamente separati nello stesso progetto. Abbonamenti, crediti e utilizzo creati con una chiave Test sono invisibili alle chiavi Live (e viceversa), mentre meter e piani sono condivisi: i test girano sempre sulla tua configurazione di fatturazione reale. Usa le chiavi Test per sviluppo, staging e CI; le Live solo per il traffico reale di produzione.
mf_live_a1b2… una sola volta e la metti nelle variabili d’ambiente del tuo server: new MeterFlow({ apiKey: process.env.METERFLOW_KEY }). L’elenco nella dashboard mostrerà per sempre solo il prefisso e le ultime 4 cifre.Le chiavi di test condividono i limiti del mio piano MeterFlow?
No, la modalità test ha i suoi. Gli eventi di test hanno un decimo della quota mensile del tuo piano MeterFlow — Drip 5 000 · Flow 20 000 · Stream 70 000 · Torrent 400 000 — e non contano mai su quella live; i pacchetti di eventi alzano solo la quota live. Oltre la quota (più lo stesso 10 % di tolleranza del live), le scritture di utilizzo di test vengono rifiutate con un 403. Le chiavi di test fanno fino a 60 richieste al minuto, quelle live 300. I dati di test scadono: gli eventi di utilizzo di test dopo 30 giorni, e un abbonamento di test senza utilizzo da 90 giorni, insieme al saldo e al registro di test di quel cliente. La pagina Billing e la finestra Usage della tua organizzazione mostrano gli eventi di test del mese rispetto a quella quota, accanto a quelli live.
Nuovo meter concetto chiave
Un meter è la definizione di un contatore con un nome: dichiara una cosa del tuo prodotto che vale la pena misurare, e come gli eventi grezzi vanno trasformati in un numero. Immaginalo come creare una nuova colonna in un report di utilizzo, prima ancora che esistano i dati.
📍 Apri un progetto → Meters → il pulsante nell’intestazione della tabella
- Name *
L’etichetta leggibile mostrata nella dashboard — “Immagini generate”, “Secondi di rendering video”. Serve solo agli occhi umani.
- Event name *
La chiave “per le macchine” — e sì, viene salvata nel database e confrontata alla lettera. Quando la tua applicazione segnala un utilizzo, invia un nome evento; MeterFlow cerca nel progetto il meter attivo il cui
event_namecorrisponde esattamente, maiuscole/minuscole comprese. Se non esiste, l’evento viene rifiutato con un errore 404 (“No active meter found for event …”) e non viene registrato nulla. Ogni nome evento è unico all’interno di un progetto. Convenzione: minuscolo con punti, es.image.generated. - Aggregation type
Come tanti eventi singoli vengono combinati in un unico numero nei riepiloghi di utilizzo. Vedi la tabella qui sotto — è il cuore del meter.
- Aggregation field
Obbligatorio per Sum, Max, Min e Unique count; rifiutato su Count, che non legge nessuna proprietà. Indica una proprietà dei tuoi eventi. Per Sum, Max e Min è da lì che arriva la quantità quando la tua app omette
value— un meter con camposecondsleggeproperties.seconds; unvalueinviato dalla tua app vince sempre, e un evento senza nessuno dei due conta 1. Per Unique count è la proprietà di cui si contano i valori distinti —model, per contare i modelli usati da un cliente. - Description
Testo libero per il tuo team.
I tipi di aggregazione, con un esempio
Supponiamo che il cliente user-842 generi 4 eventi questo mese con valori 3, 10, 2, 10. Per ogni meter viene riportato un solo numero — quale, dipende dal tipo di aggregazione:
| Tipo | A quale domanda risponde | Risultato per 3, 10, 2, 10 | Uso tipico |
|---|---|---|---|
| Count | Quante volte è successo? (valori ignorati) | 4 | Immagini generate, chiamate API, esportazioni |
| Sum | Quanto in totale? | 25 | Secondi di rendering, token consumati, GB trasferiti |
| Max | Qual è stato il valore più alto? | 10 | Picco di job simultanei, upload più grande |
| Min | Qual è stato il valore più basso? | 2 | Raramente per fatturare — più che altro diagnostica |
| Unique count | Quanti valori distinti del campo di aggregazione sono comparsi? | 3 (3, 10, 2) | Modelli distinti usati, documenti distinti toccati |
video.rendered · Aggregazione Sum · Aggregation field seconds.La tua app finisce il rendering di una clip di 42 secondi per
user-842 e segnala l’evento video.rendered con valore 42. Fallo qualche volta e la pagina di utilizzo del cliente mostrerà una riga: Video render seconds — 3 eventi — 117.Il nome evento deve corrispondere a quello che invia la mia app? E se c’è un refuso?
Sì — alla lettera, maiuscole comprese. Il nome evento del meter è salvato nel database e funziona come l’etichetta di indirizzo per gli eventi in arrivo. Se la tua app invia video.render ma il meter dice video.rendered, l’API risponde 404 “No active meter found for event 'video.render' in this project” e l’evento non viene salvato. È voluto: un refuso silenzioso farebbe perdere per sempre utilizzo non fatturato. Prima crea il meter, poi inizia a inviare eventi con lo stesso nome.
Posso cambiare il tipo di aggregazione in seguito?
No — dopo la creazione si possono modificare solo nome, descrizione e stato attivo. L’aggregazione definisce cosa significa lo storico già salvato, quindi cambiarla a posteriori riscriverebbe il passato. Se ti serve un calcolo diverso, crea un nuovo meter con un nuovo nome evento.
Quando è obbligatorio “Aggregation field”?
Dipende dal tipo. Il modulo lo mostra solo per Sum, Max, Min e Unique count, e il server rifiuta una creazione che lo lascia vuoto per questi tipi. Su un meter Count il modulo lo nasconde e il server lo rifiuta se viene inviato: un conteggio non legge nessuna proprietà, quindi il campo indicherebbe qualcosa che nessuno legge.
Nuovo piano concetto chiave
Un piano è una fascia di prezzo — “Free”, “Pro a 29 $/mese”… Abbina un prezzo ricorrente a un insieme di limiti sui meter che dicono quanto di ogni funzione misurata è incluso e cosa succede oltre. I clienti vengono collegati a un piano tramite un abbonamento.
📍 Apri un progetto → Plans → il pulsante nell’intestazione della tabella
- Name *
Il nome della fascia — “Free”, “Pro”, “Enterprise”. Obbligatorio; il pulsante di creazione resta disattivato finché non è compilato.
- Description
Testo libero, es. lo slogan della fascia per il marketing.
- Price / Currency / Billing period
Il canone ricorrente dell’abbonamento: Price è l’importo (0 va benissimo per una fascia gratuita), Currency un codice come
USD, e Billing period la cadenza — mensile, annuale, settimanale o una tantum. Fissi dopo la creazione — modificando il piano in seguito non si possono cambiare (crea piuttosto un nuovo piano, così le condizioni degli abbonati esistenti non cambiano di nascosto). - Trial days
Giorni gratuiti all’inizio di ogni nuovo abbonamento. Con
14, un nuovo abbonato passa 2 settimane in stato “trialing” prima che inizi il periodo a pagamento.0= nessuna prova. - Published
Se il piano esiste per i tuoi clienti. Lasciato spento è una bozza: puoi definirne prezzo, limiti e chiavi funzione con calma e le tue chiavi API non lo vedono mai — è assente dall’elenco piani dell’SDK, un id trapelato risponde
404e nessuno può esservi abbonato. I nuovi piani nascono pubblicati; spegnilo per prepararne uno in pace e riaccendilo quando va in vendita. Rispegnerlo in seguito chiude la porta ai nuovi abbonati senza toccare quelli già presenti. - Features
Le funzionalità on/off comprese nel piano — chiavi brevi che inventi tu, come
ssoopriority-support(lettere minuscole, cifre,-e_). La tua app chiede all’SDKentitlements.check(customerId, 'sso')e ottiene sì solo per i clienti abbonati a un piano che elenca quella chiave. Modificabili in qualsiasi momento, su piani nuovi ed esistenti; per le cose che conti usa invece un limite sui meter qui sotto.
Limiti sui meter — la sezione “+ Add limit”
Ogni riga di limite collega questo piano a un meter e risponde: quanto di quella cosa è incluso, e cosa succede oltre?
- Meter *
A quale grandezza misurata si applica il limite. Il menu elenca i meter che hai creato in questo progetto — niente di più, niente di meno. Non è un catalogo fisso: per ogni nuova funzionalità del prodotto basta creare prima un nuovo meter, e compare qui immediatamente.
- Included units
La quantità compresa nel prezzo del piano, per periodo di fatturazione. “Pro include 500 immagini al mese” →
500. Su una riga Hard o Soft la cifra è obbligatoria prima di creare il piano — una quantità vuota non limiterebbe nulla — a meno che tu non spunti Unlimited qui sotto per dire che è proprio ciò che intendevi. Su una riga Metered il vuoto è già una risposta: pay-as-you-go dalla prima unità. - Unlimited
Solo sulle righe Hard e Soft, ed è il modo esplicito di dire “nessun limite su questo meter”. Spuntandolo, Included units si disattiva e si svuota; lasciandolo spento, quella cifra resta obbligatoria. Le righe Metered non hanno l’interruttore, perché lì il vuoto significa già qualcosa.
- Overage rate
Il prezzo in crediti per unità quando il cliente supera le unità incluse —
0.5significa che ogni unità extra costa mezzo credito dal suo saldo. Appartiene solo al tipo Metered: il modulo lo chiede su una riga Metered e lo nasconde su Hard e Soft, e l’API rifiuta una tariffa su una riga Hard o Soft (422). Una riga Metered senza unità incluse né tariffa rifiuterebbe ogni unità, quindi l’API rifiuta anche quella riga (422). - Limit type
Cosa risponde
entitlements.check()dell’SDK una volta esaurite le unità incluse — la chiamata che la tua app fa prima di eseguire il lavoro. Hard (blocca) —check()risponde no (hard_limit_reached) e la tua app rifiuta l’azione; il cliente trova un muro fino al periodo successivo o a un upgrade. Soft (avvisa) —check()risponde comunque sì, segnalandosoft_limit_exceeded, così la tua app lascia passare e spinge il cliente verso l’upgrade. Metered (addebita) —check()risponde sì finché i crediti del cliente coprono le unità extra, e ogni unità extra viene addebitata dal suo saldo alla tariffa di eccedenza; quando il saldo non basta, la risposta è no (insufficient_credits). Metered è l’opzione “pay-as-you-go” ed è l’unica che muove denaro (crediti) da sola. Un limite Metered viene rifiutato su un meter Max o Min (422): un valore massimo o minimo non si può addebitare a unità. Su una riga Metered, un tetto di spesa sull’abbonamento del cliente può far rispondere no acheck()prima che il saldo finisca (spend_cap_reached). Hard e Soft fanno scattare il webhooklimit.reacheduna volta per periodo di fatturazione, la prima volta che la soglia viene superata. In ogni caso MeterFlow continua a registrare gli eventi che la tua app invia — il cancello ècheck(), nel tuo codice.
USD · Mensile · 14 giorni di prova · Published ✓Limite 1: meter Immagini generate, incluse 500, tipo Hard → dopo 500 immagini,
check() risponde no e la tua app smette di generare fino al mese successivo o a un upgrade.Limite 2: meter Secondi di rendering video, inclusi 1 000, eccedenza 0,02, tipo Metered → oltre i 1 000 secondi, ogni secondo extra costa in silenzio 0,02 crediti dal portafoglio del cliente.
Perché “+ Add limit” è disattivato?
Perché il progetto non ha ancora meter — un limite è sempre un tetto su un meter, quindi con zero meter non c’è nulla a cui agganciarlo. La finestra mostra il suggerimento “Create meters first to attach limits to this plan.” Vai su Meters → New meter, creane almeno uno, poi riapri questa finestra.
Perché il menu Meter mostra solo poche opzioni? E se il mio prodotto ha qualcosa di nuovo?
Il menu è semplicemente l’elenco dei tuoi meter nel progetto attualmente selezionato. Nei dati demo sono “Images generated”, “Video render seconds”, “Upscales processed”, “Peak GPU memory” e “Active prompters” — ma quella lista è tua e può crescere. Non limita ciò che i clienti possono fare: i clienti non scelgono mai i meter; sei tu a definirli per qualunque cosa faccia il tuo prodotto. Nuova funzionalità domani? Crea un meter apposta e comparirà qui.
Un cliente ha superato un limite Hard — perché i suoi eventi vengono comunque registrati?
Perché MeterFlow non decide mai al posto del tuo prodotto cosa può fare un utente — lo decide la tua app, chiamando entitlements.check() prima dell’azione. Un limite Hard fa rispondere no a quella chiamata; se la tua app salta la chiamata ed esegue comunque il lavoro, l’evento di utilizzo viene accettato e salvato lo stesso, così lo storico e gli eventuali addebiti metered restano onesti. Pensa al limite come alla regola e a check() come al buttafuori alla porta: MeterFlow scrive la regola, il tuo codice sta alla porta.
Cosa risponde check() quando MeterFlow non è raggiungibile?
Da meterflow 0.10.0 (npm) / 0.5.0 (PyPI) l’SDK continua a rispondere. Riusa ogni risposta per i 15 secondi concessi dall’API, e una registrazione di utilizzo, un accredito o una detrazione per un cliente rende superate le risposte di quel cliente. Se MeterFlow non è raggiungibile — un errore di rete, un timeout, o un 5xx o 429 dopo i nuovi tentativi — check() dà l’ultima risposta, segnata stale: true; se non ce n’è una, il valore predefinito che imposti per funzionalità in entitlementDefaults ('allow' o 'deny', '*' per il resto), con reason: 'offline_default'; senza nessuno dei due, lancia un errore. Il tuo hook onError viene avvisato per primo. Un 401, 403, 404 o 422 è una risposta vera e non viene mai nascosto.
Perché non posso modificare prezzo o limiti di un piano esistente?
È voluto: gli abbonati esistenti hanno sottoscritto quelle condizioni, quindi prezzo, valuta, periodo di fatturazione e limiti sui meter vengono congelati alla creazione. Modificando un piano puoi cambiare solo nome, descrizione, giorni di prova, stato di pubblicazione, stato attivo e chiavi delle funzionalità. Per cambiare i prezzi, crea un nuovo piano (es. “Pro 2026”) e indirizza lì i nuovi clienti.
Nuovo abbonamento collega cliente ⇄ piano
Un abbonamento collega un tuo cliente a un piano. Da quel momento il suo utilizzo viene valutato rispetto ai limiti sui meter di quel piano. In produzione di solito è il tuo backend a crearlo via SDK nell’istante in cui qualcuno sceglie una fascia al checkout — la finestra fa la stessa cosa a mano.
📍 Apri un progetto → Subscriptions → il pulsante nell’intestazione della tabella
- Customer ID *
Il tuo identificativo per il cliente finale — una stringa qualsiasi scelta da te: un ID utente del tuo database (
user-842), un’email, uno slug del tenant. MeterFlow non lo verifica contro nulla; ciò che invii è ciò a cui appartiene l’abbonamento. Usa lo stesso ID ovunque (abbonamenti, crediti, utilizzo), altrimenti i pezzi non si collegano. - Plan *
Su quale fascia di prezzo si trova — il menu elenca i piani di questo progetto. Se il piano ha giorni di prova, l’abbonamento parte in stato “trialing”; altrimenti “active”.
user-842 clicca “Passa a Pro” nella tua app → il tuo backend chiama subscriptions.create({ customer_external_id: 'user-842', plan_id: … }). Da questo momento ogni evento di utilizzo di user-842 viene confrontato con i limiti del piano Pro.E se un cliente non ha un abbonamento — i suoi eventi vanno persi?
No. Gli eventi vengono sempre salvati e compaiono sempre nei riepiloghi di utilizzo. Senza un abbonamento attivo o in prova non viene addebitato nulla, e entitlements.check() risponde no con no_subscription — quindi un’app che chiede prima non lascerà passare l’azione. La logica di fatturazione si accende nel momento in cui esiste un abbonamento.
Posso limitare quanto spende un cliente in un periodo?
Sì — imposta spend_cap, in crediti, sull’abbonamento tramite l’SDK o l’API; vuoto significa nessun tetto. Quando la spesa del periodo lo raggiunge, l’utilizzo registrato smette di consumare crediti, un credits.deduct() oltre il tetto viene rifiutato con un 409, entitlements.check() risponde no con spend_cap_reached prima che un’azione a consumo lo superi, e il webhook cap.reached scatta una volta nel periodo.
Un cliente ha disdetto — può tornare?
Sì, sullo stesso abbonamento. Riporta il suo stato a active — subscriptions.update(id, { status: 'active' }), oppure Reactivate sulla sua riga. Se il vecchio periodo è finito ne parte uno nuovo da subito, con i crediti del periodo del piano; una prova disdetta prima della fine riprende come prova. Un piano disattivato o non più pubblicato nel frattempo non riprende nessuno (409), e un abbonamento gestito dal connettore del tuo fornitore di pagamenti torna attraverso il fornitore, non qui.
Posso trovare l’abbonamento di un cliente in una lista lunga?
Sì. La pagina Subscriptions ha un filtro per cliente e dei chip di stato, e l’SDK accetta gli stessi due: subscriptions.list({ q, status }). q trova ogni ID cliente che lo contiene; status è uno tra active, trialing, past_due, paused, canceled o expired. Il server filtra prima di tagliare la pagina, quindi ogni pagina contiene solo risultati che corrispondono. Nell’SDK da meterflow 0.9.0 (npm) / 0.4.0 (PyPI). Da 0.12.0 / 0.7.0 accetta anche sort — created_at (predefinito), customer_external_id o status — e order, desc o asc; passa gli stessi due con ogni next_cursor.
La pagina del cliente un cliente, per intero
Ogni cliente per cui la tua app ha scritto qualcosa — un abbonamento, un saldo crediti o un evento di utilizzo — è una riga nella pagina Customers. Aprine uno e la sua pagina contiene tutta la storia: chi è, il piano in cui si trova e quattro schede.
📍 Apri un progetto → Customers → la riga del cliente
- Credits
Il saldo e ogni riga di registro che lo compone, con Grant e Deduct — le finestre spiegate più sotto.
- Usage
Cosa ha usato, meter per meter.
- Subscription
Il suo piano e lo stato, con Cancel o Reactivate.
- Entitlements
Cosa concede il suo piano, funzionalità per funzionalità: quanto resta di ogni allowance a consumo e il motivo per cui una funzionalità è rifiutata, esattamente come lo darebbe
entitlements.check().
Accredita / Detrai crediti il portafoglio
I crediti sono un saldo prepagato per ciascun cliente (per progetto) — pensa a un portafoglio o a una carta ricaricabile. Sei tu a decidere quanto vale un credito nel tuo listino. L’eccedenza “metered” attinge da questo portafoglio automaticamente; le due finestre muovono i crediti a mano.
📍 Apri un progetto → Customers → la riga del cliente → scheda Credits → “Grant” / “Deduct”
- Amount *
Quanti crediti aggiungere (Grant) o togliere (Deduct). Deve essere maggiore di zero — la direzione la decide il pulsante che ha aperto la finestra, non il segno meno.
- Description
Una nota facoltativa salvata sulla riga del registro — “Bonus di benvenuto”, “Rimborso per il disservizio”, “Cortesia del supporto”. Il te stesso del futuro ringrazierà.
user-842 riceve un accredito di 100 (“Bonus di benvenuto”). Poi renderizza 2 500 secondi di video su un piano con 1 000 inclusi ed eccedenza metered di 0,02 → 1 500 × 0,02 = 30 crediti detratti automaticamente. Saldo: 70.L’utilizzo di questo cliente consumerà il suo saldo?
Chiedilo al saldo: credits.balance() risponde con usage_draws_credits. true — il suo piano addebita l’utilizzo oltre l’allowance, quindi l’utilizzo registrato consuma crediti da solo. false — solo un credits.deduct() esplicito lo muove. null — non ha un abbonamento attivo o in prova.
La mia app può ricaricare un cliente in automatico?
MeterFlow dice alla tua app quando e quanto; la tua app addebita il cliente, poi concede i crediti. Dai a un endpoint webhook una soglia di saldo basso e riceverà balance.low quando il saldo di un cliente scende sotto la soglia — per una deduzione o per l’utilizzo a consumo — e balance.topped_up quando una concessione lo riporta sopra. Imposta topup_amount sull’abbonamento del cliente e balance.low lo riporta come suggested_topup. Imposta max_topups_per_window e una concessione oltre quel numero nello stesso periodo viene rifiutata con un 409, così un ciclo nel tuo codice non può continuare a ricaricare.
Posso tenere da parte dei crediti per un lavoro lungo?
Sì, da meterflow 0.11.0 (npm) / 0.6.0 (PyPI). credits.reserve() blocca una parte del saldo di un cliente per ttl_seconds — 5 minuti se non indichi altro, al massimo un giorno. Il saldo non si muove, ma nient’altro può spendere ciò che è bloccato: un credits.deduct(), l’utilizzo a consumo, un check() che addebiterebbe e un altro blocco vedono solo i crediti disponibili, cioè il saldo meno quanto è bloccato. Alla fine del lavoro, credits.confirmReservation(id, { amount }) prende tutto il blocco o una parte come una normale detrazione nel registro e libera il resto, e credits.releaseReservation(id) lo libera tutto; un blocco dimenticato si libera da solo quando scade. credits.balance() mostra reserved e available accanto al saldo, e i crediti bloccati contano anche sul tetto di spesa.
Mostra ai tuoi clienti il loro saldo
MeterFlow ospita una pagina che mostra a uno dei tuoi clienti i suoi crediti: il saldo, le ultime righe del registro che lo compongono, il piano su cui si trova con quanto resta di ogni allowance a consumo, e ciò che ha usato fuori dal piano. Non devi costruirla né ospitarla — il tuo server consegna al cliente un link.
link.url. Il link porta con sé un proprio token di breve durata, così la tua chiave API non lascia mai il tuo server. In Python è client.portal.create_session(…), con gli stessi campi. const link = await client.portal.createSession({
customer_external_id: 'user-842',
topup_url: 'https://acme.dev/billing',
return_url: 'https://acme.dev/app',
expires_in_minutes: 60,
}); 3. Buy more apre topup_url — la tua pagina di pagamento, esattamente come l’hai scritta, senza aggiunte. È facoltativo: senza topup_url, né sul link né nei valori predefiniti del progetto, la pagina non ha il pulsante Buy more. ← Back porta a return_url, facoltativo allo stesso modo. 4. MeterFlow non incassa mai il pagamento: quando il tuo checkout ne segnala uno, il tuo server chiama credits.grant() e la pagina mostra il nuovo saldo. - Il link
Dura 60 minuti, salvo che tu imposti
expires_in_minutes— al massimo 24 ore — e non può essere ritirato prima. Apre la pagina di un solo cliente, in sola lettura: non può modificare nulla né mostrare un altro cliente. Un link creato con una chiave di test (mf_test_…) mostra dati di test, sotto un badge Test data. - Il tuo aspetto
Apri un progetto → Portal: nome dell’azienda, logo, tema chiaro / scuro / automatico, colori e raggio degli angoli, e i valori predefiniti — URL di Buy more, URL di Back e durata — per i link che non li indicano. Una spunta applica l’aspetto a tutti i progetti dell’organizzazione.
- Un link a mano
Nella tabella Customers, l’azione di riga Create a portal link crea un link per quel cliente senza scrivere codice — come fa Portal link nella sua scheda Credits.
Registra evento di utilizzo concetto chiave
Un evento di utilizzo = “questo cliente ha appena fatto questa cosa, in questa quantità.” In produzione è la tua applicazione a inviarli via SDK automaticamente, migliaia di volte al giorno; la finestra esiste per inserirne uno a mano, per test e demo.
📍 Apri un progetto → Usage → cerca un cliente → “Record event”
- Event name *
Deve corrispondere esattamente al nome evento di un meter esistente e attivo in questo progetto (maiuscole/minuscole comprese). È grazie a questa corrispondenza che MeterFlow sa quale contatore alimenta l’evento. Nessun meter corrispondente → l’API rifiuta l’evento con un 404 e non viene salvato nulla. Controlla la pagina Meters per la grafia esatta.
- Customer ID *
Quale dei tuoi clienti l’ha fatto — la stessa stringa identificativa libera usata per abbonamenti e crediti. La coerenza è tutto:
user-842eUSER-842sono due clienti diversi. - Value
La quantità — facoltativa. Se la ometti, un meter Sum, Max o Min la legge dalla proprietà dell’evento indicata dal suo campo di aggregazione (la tua app la invia in
properties); altrimenti l’evento conta1. Il significato dipende dall’aggregazione del meter: per un meter Count il valore è ignorato (ogni evento conta come un’occorrenza); per Sum è la quantità da sommare (42 secondi, 1 300 token); per Max/Min è la misura confrontata; un meter Unique count conta i valori distinti del suo campo di aggregazione.
video.rendered → “Video render seconds”. 2. L’evento viene salvato in modo permanente (grezzo — l’aggregazione avviene dopo, al momento della lettura). 3. In background, MeterFlow controlla se il cliente ha un abbonamento attivo e se quel piano ha un limite su questo meter. 4. Se il limite è Metered, le unità oltre quelle incluse vengono addebitate alla tariffa di eccedenza dal saldo crediti del cliente e viene scritta una riga di registro — fino al tetto di spesa del periodo, se l’abbonamento ne ha uno; se è Hard o Soft e questo evento è il primo a superare le unità incluse nel periodo, il webhook limit.reached scatta una volta. L’evento qui non viene mai rifiutato — rifiutare è compito di check(), nella tua app. 5. Il riepilogo di utilizzo che vedi in questa pagina viene ricalcolato dagli eventi grezzi usando il tipo di aggregazione del meter.Ho registrato un evento e ho ricevuto un errore — perché?
Quasi sempre è il nome evento: non corrisponde esattamente a nessun meter attivo in questo progetto. L’errore lo dice testualmente — “No active meter found for event '…' in this project.” Copia il nome evento dalla pagina Meters invece di riscriverlo. Ricorda anche che i meter sono per progetto: un meter di un altro progetto non conta.
Se la mia app ritenta una richiesta, l’evento viene conteggiato due volte?
No, se usi l’SDK correttamente: ogni scrittura accetta una chiave di idempotenza — un’etichetta univoca per “questa specifica azione”. Se la stessa chiave arriva due volte (un nuovo tentativo dopo un intoppo di rete), MeterFlow la riconosce e restituisce il risultato originale invece di salvare un duplicato. La finestra manuale non la invia, quindi premere Record due volte a mano crea davvero due eventi.
Serve un evento per ogni chiamata API?
No — e di solito non conviene. Value è una quantità, e un meter Sum somma quelle quantità: un solo evento con valore 1 300 è un evento sul limite mensile del tuo piano e 1 300 unità sul meter. Un evento per chiamata API è ciò che consuma un piano: 1 000 utenti con 100 chiamate al giorno fanno circa 3 milioni di eventi al mese.
Aggrega dentro la tua applicazione su una finestra che potresti permetterti di perdere in caso di crash — una richiesta, un job, un minuto — e poi registra un unico evento con il totale. Inviarli in batch non è la stessa cosa: un batch da 100 risparmia richieste HTTP, ma ogni evento resta un record a sé e continua a contare.
Vale per i meter Sum. Un meter Count ignora il valore e conta le occorrenze, quindi lì ogni occorrenza ha bisogno del proprio evento. In ogni caso non cambia la fattura di nessuno: un limite Metered addebita per unità.
Posso registrare un utilizzo avvenuto tempo fa?
Solo entro cinque minuti. Il timestamp di un evento può essere al massimo 5 minuti nel passato e 60 secondi nel futuro; fuori da questa finestra l’API lo rifiuta con un 422 e non registra nulla. Se ometti timestamp, l’evento riceve l’ora del suo arrivo. Registra l’utilizzo mentre avviene: un utilizzo più vecchio non si può caricare dopo.
Nuovo webhook notifiche
Un webhook è un URL sul tuo server che MeterFlow chiama quando succede qualcosa nel tuo progetto — crediti concessi, un limite raggiunto, un saldo che si esaurisce. Ogni chiamata è firmata e ripetuta se il tuo server non risponde.
📍 Apri un progetto → Webhooks → il pulsante nell’intestazione della tabella
- Endpoint URL *
Dove MeterFlow invia gli eventi, es.
https://api.acme.dev/meterflow. - Events to deliver
Di quali eventi viene informato questo endpoint:
usage.recorded,credit.granted,credit.deducted(un addebito, o un utilizzo Metered addebitato — il suotransaction_typedice quale),subscription.created,.updated,.renewede.canceled,limit.reached,cap.reached,balance.exhausted, e i due qui sotto. - Low balance threshold
Un saldo, in crediti. Impostalo e l’endpoint riceve anche
balance.lowquando il saldo di un cliente scende sotto la soglia ebalance.topped_upquando risale sopra; cancellalo e smettono entrambi. I due eventi arrivano e se ne vanno con la soglia, perché senza una linea non si può avvisare un endpoint che è stata superata.
webhooks.list(), webhooks.deliveries(id) per le 100 più recenti, e webhooks.deliveryPage(id) (in Python delivery_page) per ogni tentativo, una pagina alla volta, dal più recente. Il registro consegne della dashboard si sfoglia allo stesso modo. Creare e modificare gli endpoint resta qui, nella dashboard.Collega il tuo fornitore di pagamenti la tua fatturazione
Se i tuoi clienti ti pagano tramite Paddle, Polar, Lemon Squeezy, Chargebee o Razorpay, un connettore lascia che quell’account guidi MeterFlow: il tuo fornitore chiama MeterFlow a ogni cambio di abbonamento e pagamento, e l’abbonamento o la concessione di crediti corrispondente compare qui — senza codice nella tua app.
📍 Apri un progetto → Connectors → il pulsante nell’intestazione della tabella
- Provider *
Quale dei cinque usano i tuoi clienti per pagare.
- Which of your accounts
Live — l’account di produzione del tuo fornitore, che scrive dati live; Test — la sua sandbox, che scrive dati di test. Un connettore per fornitore e account.
- Signing secret *
Il segreto con cui il tuo fornitore firma i webhook — per Chargebee, che non firma nulla, il nome utente e la password che invia al suo posto. Viene verificato a ogni chiamata e non viene mai mostrato di nuovo: la tabella ne mostra solo gli ultimi quattro caratteri.
Una volta creato
- L’URL del webhook
Mostrato appena il connettore è creato: incollalo nelle impostazioni webhook del tuo fornitore.
- Mappature prezzo → piano
Quale prezzo del tuo fornitore — un prodotto su Polar, una variante su Lemon Squeezy, un piano su Chargebee e Razorpay — mette un cliente su quale dei tuoi piani. Un evento per un prezzo senza mappatura viene registrato e non cambia nulla.
- Registro consegne
Ogni evento ricevuto dal connettore, con ciò che ha fatto in una frase: cosa è stato applicato, e perché il resto è stato ignorato.
Membri e inviti accesso del team
La pagina Members della tua organizzazione elenca chi ne fa parte — con il ruolo e chi l’ha invitato — e gli inviti ancora in attesa. Un owner o un admin invita via email; la persona non ha ancora bisogno di un account MeterFlow.
📍 Members nella barra laterale, accanto a Billing → “Invite member” (anche come azione di riga sulle organizzazioni della Dashboard)
- Email *
Dove arriva l’invito. MeterFlow invia un link che funziona una volta, per 7 giorni, solo per quell’indirizzo: la persona lo apre ed entra — dal proprio account, o creandone uno tramite il link.
- Role
Admin — impostazioni dell’organizzazione, inviti, chiavi API, webhook, connettori, progetti e fatturazione. Member — chi lavora ogni giorno: meter, piani e le pagine Subscriptions, Usage e cliente. Viewer — sola lettura. Di proposito non c’è l’opzione “owner”: la proprietà non si concede con un invito.
- Inviti in attesa
Elencati nella pagina Members finché non vengono accettati, revocati o scadono. Revoke blocca subito il link.
- Change role · Remove
Sulla riga di ogni membro, per owner e admin. L’appartenenza dell’owner e la tua non si possono cambiare lì. Rimuovere qualcuno gli toglie l’accesso; il suo account, e ciò che ha creato, restano.
dana@acme.dev come Viewer, così il team finance può osservare utilizzo e saldi senza poter cambiare i prezzi.