# Manageri și procese

# Raportul de comenzi pentru managerii de vânzări — automatizare n8n

> Managerii de vânzări au nevoie de comenzile cursurilor mari într-un tabel separat, actualizat în timp real. Articolul descrie tot lanțul: de la plata înregistrată în GetCourse, prin webhook și procesul n8n, până la rândul scris în Google Sheet.

---

## 1. Ce rezolvă automatizarea

Fără automatizare, comenzile ar trebui exportate manual din GetCourse și lipite în tabel după fiecare plată. Automatizarea face asta singură: la fiecare plată, procesul din GetCourse anunță n8n, iar n8n scrie sau actualizează rândul omului în pagina cursului respectiv.

Un element important: dacă omul plătește în rate, **nu se creează un rând nou la fiecare rată**. Rândul existent se actualizează, iar suma încasată se adună.

---

## 2. Vedere de ansamblu

```
   GetCourse (plată înregistrată)
            │
            │  proces intern → apel webhook cu datele comenzii
            ▼
   n8n — Payments Automation Scalable v2
            │
            ├── citește pagina „Produs" (catalogul)
            ├── identifică cursul după product_id
            ├── calculează Suma Total
            ├── caută omul după email în pagina cursului
            │
            ├── nu există  ──▶  adaugă rând nou
            └── există     ──▶  actualizează rândul, adună suma
            ▼
   Google Sheet — pagina cursului
            ▼
   Managerii de vânzări

```

---

## 3. Google Sheet-ul

**Link:** [Tabelul comenzilor](https://docs.google.com/spreadsheets/d/1_VtCnWGDsLzUz2XlJl6tc_Nnxf4W9fSd4oV0kNHjvMA/edit?gid=1078609382#gid=1078609382)

### Pagina „Produs" — catalogul (se completează manual)

**Link:** [Pagina Produs](https://docs.google.com/spreadsheets/d/1_VtCnWGDsLzUz2XlJl6tc_Nnxf4W9fSd4oV0kNHjvMA/edit?gid=0#gid=0)

Este singura pagină completată de mână și **creierul întregii automatizări**: ea spune procesului unde să scrie și cum să calculeze.

<table id="bkmrk-coloan%C4%83-rol-product-"><thead><tr><th>Coloană</th><th>Rol</th></tr></thead><tbody><tr><td>`Product ID`</td><td>Identificatorul cursului, exact cel trimis în webhook (ex. `academia-manifest`)</td></tr><tr><td>`Sheet`</td><td>Numele paginii în care se scriu comenzile acelui curs</td></tr><tr><td>`Nr Rate`</td><td>Numărul de rate al tarifului — se folosește la calculul sumei totale</td></tr></tbody></table>

[![Screenshot 2026-08-26 at 12.01.46.png](https://wiki.getcourse.md/uploads/images/gallery/2026-08/scaled-1680-/screenshot-2026-08-26-at-12-01-46.png)](https://wiki.getcourse.md/uploads/images/gallery/2026-08/screenshot-2026-08-26-at-12-01-46.png)

> ⚠️ Dacă `product_id` trimis din GetCourse nu se găsește în această pagină, procesul se oprește cu eroare și **plata nu ajunge în tabel**. Verificarea se face din start, la adăugarea unui curs nou.

### Paginile pe curs și flux

Câte o pagină pentru fiecare curs și flux, cu aceleași coloane:

<table id="bkmrk-coloan%C4%83-ce-con%C8%9Bine-l"><thead><tr><th>Coloană</th><th>Ce conține</th></tr></thead><tbody><tr><td>`Link Comanda`</td><td>Linkul spre comanda din GetCourse</td></tr><tr><td>`Email`</td><td>Emailul cumpărătorului — **cheia după care se caută omul**</td></tr><tr><td>`Tarif`</td><td>Denumirea ofertei/tarifului cumpărat</td></tr><tr><td>`Suma Total`</td><td>Valoarea totală a tarifului (calculată)</td></tr><tr><td>`Suma Încasatǎ`</td><td>Cât s-a încasat efectiv până acum — se adună la fiecare rată</td></tr><tr><td>`Data primei plǎți`</td><td>Data primei plăți</td></tr><tr><td>`Suma primei plǎți`</td><td>Suma primei plăți</td></tr><tr><td>`Data ultimii plați`</td><td>Data ultimei plăți primite</td></tr><tr><td>`Manager Coamnda`</td><td>Managerul care a lucrat comanda</td></tr></tbody></table>

> ⚠️ Denumirile coloanelor trebuie păstrate **exact** așa cum sunt, inclusiv spațiile de la final și greșeala de scriere din `Manager Coamnda`. Procesul le caută după denumirea exactă — o corectură „cosmetică" în tabel oprește scrierea în coloana respectivă.

---

## 4. Apelul din GetCourse

Procesele interne din GetCourse apelează webhookul n8n la momentul plății.

**Exemplu de proces:** [Proces 2477525 — Manifestare](https://manifestare.md/pl/tasks/mission/update?id=2477525)

Forma apelului:

```
https://n8n.getcourse.md/webhook/payments-webhook-v2
  ?link_comanda=https://manifestare.md/sales/control/deal/update/id/{object.id}
  &user_email={object.user.email}
  &order_name={object.positions}
  &paid_amount={object.payed_money}
  &payment_date={object.payed_at}
  &product_id=academia-manifest
  &manager={object.manager}

```

<table id="bkmrk-parametru-de-unde-vi"><thead><tr><th>Parametru</th><th>De unde vine</th><th>Pentru ce se folosește</th></tr></thead><tbody><tr><td>`link_comanda`</td><td>ID-ul comenzii</td><td>Se scrie în coloana Link Comanda</td></tr><tr><td>`user_email`</td><td>Emailul utilizatorului</td><td>Cheia după care se caută rândul</td></tr><tr><td>`order_name`</td><td>Pozițiile comenzii</td><td>Denumirea tarifului **și** sursa pentru detectarea numărului de rate</td></tr><tr><td>`paid_amount`</td><td>Suma plătită acum</td><td>Se adună la Suma Încasatǎ</td></tr><tr><td>`payment_date`</td><td>Data plății</td><td>Data primei / ultimei plăți</td></tr><tr><td>`product_id`</td><td>**Scris manual în URL**</td><td>Identifică cursul în pagina Produs</td></tr><tr><td>`manager`</td><td>Managerul comenzii</td><td>Se scrie în coloana Manager</td></tr></tbody></table>

> ℹ️ Singurul parametru care nu vine automat din GetCourse este `product_id` — el se scrie de mână în URL, diferit pentru fiecare curs. Acesta este locul unde se greșește cel mai ușor la configurarea unui curs nou.

---

## 5. Procesul n8n, pas cu pas

**Link:** [Payments Automation Scalable v2](https://n8n.getcourse.md/workflow/JoOGm3Fdyhtp0xYO)

[![Screenshot 2026-08-26 at 12.02.49.png](https://wiki.getcourse.md/uploads/images/gallery/2026-08/scaled-1680-/screenshot-2026-08-26-at-12-02-49.png)](https://wiki.getcourse.md/uploads/images/gallery/2026-08/screenshot-2026-08-26-at-12-02-49.png)

<table id="bkmrk-%23-nod-ce-face-1-webh"><thead><tr><th>\#</th><th>Nod</th><th>Ce face</th></tr></thead><tbody><tr><td>1</td><td>`Webhook1`</td><td>Primește apelul de la GetCourse, cu toți parametrii din URL</td></tr><tr><td>2</td><td>`Code in JavaScript1` + `Wait`</td><td>Generează o pauză aleatorie de 0–120 secunde și așteaptă</td></tr><tr><td>3</td><td>`Citire Produs`</td><td>Citește pagina „Produs" — catalogul cursurilor</td></tr><tr><td>4</td><td>`Process Data`</td><td>Găsește cursul după `product_id`, calculează Suma Total și pregătește datele</td></tr><tr><td>5</td><td>`Cauta Utilizator`</td><td>Caută emailul în pagina cursului (numele paginii vine din catalog)</td></tr><tr><td>6</td><td>`If Exists1`</td><td>Verifică dacă omul are deja rând în pagină</td></tr><tr><td>7a</td><td>`Code in JavaScript3` + `Wait2` → `Update Calc1` → `Scriere utilizator1`</td><td>**Dacă există:** adună suma nouă la cea existentă și actualizează rândul</td></tr><tr><td>7b</td><td>`Code in JavaScript2` + `Wait1` → `Code in JavaScript` → `Scriere utilizator`</td><td>**Dacă nu există:** adaugă un rând nou și completează și „prima plată"</td></tr></tbody></table>

### De ce sunt pauzele aleatorii

Cele trei noduri care generează un număr aleatoriu între 0 și 120 de secunde nu sunt o întârziere decorativă. Ele **desincronizează** apelurile care sosesc în același moment.

Când mai mulți oameni plătesc simultan, mai multe execuții ar citi și ar scrie în același timp în aceeași pagină din Google Sheets. Rezultatul ar fi rânduri duplicate sau suprascrise, plus depășirea limitelor API-ului Google. Pauza aleatorie le împrăștie în timp.

> ℹ️ Consecința practică: **datele nu apar instant în tabel.** O întârziere de până la câteva minute între plată și apariția rândului este comportament normal, nu defecțiune.

---

## 6. Cum se calculează „Suma Total"

Suma încasată este cea reală, primită de la GetCourse. Suma totală se deduce, în ordinea aceasta:

1. Dacă în denumirea ofertei apare un număr urmat de „rate" (ex. „3 rate"), totalul = suma încasată × numărul de rate.
2. Dacă nu, dar cursul are `Nr Rate` completat în catalog, totalul = suma încasată × acea valoare.
3. Dacă în denumire apare „integral", totalul = suma încasată.
4. Dacă niciuna nu se potrivește, totalul rămâne 0.

> ⚠️ Un total de 0 în tabel înseamnă aproape sigur că denumirea ofertei nu conține nici „N rate", nici „integral", iar cursul nu are `Nr Rate` în catalog. Se rezolvă din denumirea ofertei sau din pagina Produs, nu din tabel.

---

## 7. Adăugarea unui curs nou în raport

- \[ \] Creează pagina nouă în Google Sheet, cu exact aceleași coloane ca la un curs existent
- \[ \] Adaugă un rând în pagina „Produs": `Product ID`, `Sheet` (numele paginii noi), `Nr Rate`
- \[ \] În procesul din GetCourse, adaugă apelul webhookului cu `product_id` identic cu cel din catalog
- \[ \] Fă o plată de test și verifică apariția rândului (ține cont de întârzierea de până la 2 minute)
- \[ \] Verifică o a doua plată pe același email — trebuie să actualizeze rândul, nu să creeze unul nou

---

## 8. Depanare

<table id="bkmrk-simptom-cauz%C4%83-probab"><thead><tr><th>Simptom</th><th>Cauză probabilă</th></tr></thead><tbody><tr><td>Plata nu apare deloc</td><td>`product_id` lipsește din pagina „Produs" sau e scris diferit în URL</td></tr><tr><td>Rândul apare, dar o coloană rămâne goală</td><td>Denumirea coloanei a fost modificată în tabel (spații, diacritice, greșeala din `Manager Coamnda`)</td></tr><tr><td>`Suma Total` = 0</td><td>Denumirea ofertei nu conține „N rate" / „integral" și lipsește `Nr Rate` în catalog</td></tr><tr><td>Rând dublat pentru același om</td><td>Emailul diferă între cele două comenzi, sau două plăți au fost procesate în același moment</td></tr><tr><td>Datele apar cu întârziere</td><td>Comportament normal — pauza aleatorie de 0–120 secunde</td></tr></tbody></table>