Agency Flow · Prezentare de flux
Platform · % of spend — singurul hibrid din sistem
Media platform (Google Ads) cu rebate + fee. Excepția asumată de la regula labor-XOR-supplier: financiar de furnizor plus tasks și pontaje. Profitul se descompune în două bucket-uri cu destin diferit: rebate-ul (profit direct, intangibil) și fee-ul clientului (labour-recovery — din el se plătește echipa).
O singură dată · la vânzarea serviciului
Setup: două procente per serviciu
Account managerplatform_pct (10%) — rebate-ul pe care platforma îl acordă agenției; client_pct (3%) — fee-ul facturat clientului peste spend. Ambele sunt per serviciu, nu globale — alt client, alt procent negociat.
Lunar · după închiderea platformei
Specialistul introduce spend-ul — cascada pornește
SpecialistUn singur input: amount_spend (10.000). Din el, strategia derivă tot: rebate 1.000, cost net către platformă 9.000, fee client 300, factură 10.300. Important: spend-ul nu e un cost (§1.12.1) — e cifra-antet pass-through; costul real e spend − rebate.
clientInvoice: 10.300, supplierCost: 9.000, // spend − rebate
directProfit: 1.000, // rebate — spread, nu cash
labourRecovery: 300, labourCost: ctx.labour // hibridul
}
Pe parcursul lunii · în paralel
Partea de labor: echipa care ține platforma
Echipa task & time_entry — pasul următor
Aici Platform își arată natura dublă: serviciul are tasks, iar orele echipei
se adună în labour_cost (ca la A1) — 250 RON în august. DB-ul calculează
singur întrebarea de management: a acoperit fee-ul de 3% munca echipei?
recovery_net) — exact §1.12.3 din spec.
1 septembrie + factura Google Ads
Facturile: clientul vede 10.000 + 3%, atât
Finance modulul Billing — urmeazăAR (Accounts Receivable): factura clientului arată spend-ul ca o singură cifră (niciodată split-ul 9.000 + 1.000) plus linia de fee 3%. AP (Accounts Payable): Google Ads facturează netul de 9.000, legat de linia de cost. La Issue, perioada devine invoiced și labour-ul îngheață.
| linie | amount | TVA 21% | total |
|---|---|---|---|
| Media spend — Google Ads · aug | 10.000,00 | 2.100,00 | 12.100,00 |
| Management fee 3% | 300,00 | 63,00 | 363,00 |
| total factură | 12.463,00 | ||
service_billing_period — ce se scrie și ce se actualizează
Platform se naște cost_entry; la introducerea spend-ului derivă cascada (rebate / net / recovery), apoi — hibrid — labour-ul se mai actualizează din pontaje până la invoiced.
cost_entry — doar așteaptă spend-ul de la specialist; nimic derivat încă.platform_spend cu supplier_cost_amount = NETUL (9.000), NU spend-ul; rebate-ul nu e mișcare de cash.invoiced_at IS NULLdirect_profit) rămâne neatins de ore.cost_entry, cascada se recalculează la reconfirmare.invoiced_at hibridul se închide: labour-ul nu se mai actualizează din pontaje.service_cost_line — linia materializată de engine
La Platform, engine-ul materializează linia la introducerea spend-ului. Cheia: supplier_cost_amount = NETUL (spend − rebate), nu spend-ul — platforma facturează netul; rebate-ul NU e mișcare de cash.
supplier_cost_amount = qty × unit_cost = 1 × 9.000; client_amount = cost + fee = 9.000 + 1.300.supplier_cost_amount = NETUL (9.000), NU spend-ul (10.000) — platforma îți facturează netul;
rebate-ul (1.000) NU e linie de cash, e spread. Pe linie, fee_amount (1.300) e markup-ul total;
în snapshot-uri el se descompune în direct_profit (rebate 1.000) + labour_recovery (300).
Editarea spend-ului înainte de facturare → UPDATE cu reset (starea liniei revine cost_entry).
Simulare · cascada hibridă, pas cu pas
interactiv · doar vizual
Singurul tip care combină financiarul de furnizor cu orele echipei. Fixezi cele două
procente la setup, apoi introduci spend-ul lunar și labour_cost-ul din pontaje.
Profitul se rupe în două bucket-uri: rebate (direct_profit, intangibil) și
fee client (labour_recovery, din care se plătește echipa). recovery_net
spune dacă fee-ul a acoperit orele — fără să atingă rebate-ul. Nimic nu se salvează — e o schiță.
direct_profit;
client_pct = fee-ul facturat clientului peste spend → labour_recovery.
spend − rebate.
Labour-ul se actualizează până la invoiced (hibridul).
| line_type | qty | supplier_cost | client_amount | state |
|---|---|---|---|---|
platform_spend |
1 | 9.000 | 10.300 | cost_entry |
client_pct (300) ca o singură cifră — niciodată split-ul 9.000 + 1.000.
Un recovery_net negativ = client_pct subdimensionat față de orele echipei;
rebate-ul (direct_profit) rămâne neatins de ore.
Platform, pe scurt: toate mecanismele deodată
Ultimul flux le folosește pe toate — de asta e și testul suprem al schemei:
Din familia supplier
- supplier obligatoriu pe serviciu (Google Ads)
- input lunar (
input_amount_spend) - linie de cost materializată → ancora AP (9.000)
Din familia labor
- tasks + time entries →
labour_costreal - labour îngheață abia la
invoiced_at - singura excepție de la labor-XOR-supplier
Doar aici
- bucket-uri separate:
direct_profitvslabour_recovery recovery_net— generat de DB, KPI de renegociere- rebate = spread, nu cash — fără entitate de receivable