HOCO B2B
SRS

Deployment and operations

Environments, the delivery pipeline, infrastructure sizing, domains, secrets, backups and restore, monitoring and alerts, the initial data import, training, the go-live checklist, the pilot, the maintenance and support model, and the runbook index.

Cahier §13 asks for three environments (développement, préproduction / recette client, production, §13.1), a deployment that covers « serveur, base de données, stockage et sauvegardes », « domaines, certificats et services externes » and the « import initial des produits, revendeurs et comptes utilisateurs » (§13.2), training (§13.3) and a maintenance model with « délais de prise en charge et niveaux de priorité » (§13.4). The requirements are OPS-01 to OPS-06; the work is planned in OPS-01, OPS-02, SRV-28, MOB-14 and the launch tasks LCH-01 to LCH-05. Dates are on the timeline.

Timing within the three-month frame. V1 — design, development and deployment, the reseller web included — fits in three months from the cadrage. Production goes live at the start of January (milestone Production go-live), the two-week pilot starts right after (Pilot starts), and generalisation and V2 come after the three months. The consequences for operations:

3-month frame: design → development → deployment — deadline 17 Jan 2027.

DateMilestoneTargetReached when these tasks end
18 Oct 2026Cadrage validated — validation sheet signed—PRJ-03
18 Oct 2026API contract v1 published (OpenAPI + mock server)—SRV-03
19 Oct 2026Server V1 feature-complete—SRV-26, SRV-40
21 Oct 2026Design system v1 ready (tokens + components)—DES-04
22 Oct 2026Screen inventory frozen—DES-05
29 Oct 2026Reseller app designs ready for client review—DES-10
05 Nov 2026Delegate app designs ready for client review—DES-14
08 Nov 2026Mobile foundations ready—MOB-11
12 Nov 2026Back-office designs ready for client review—DES-19
16 Nov 2026Design handoff complete—DES-21
03 Dec 2026Back-office and reseller web V1 feature-complete—DSH-12, WEB-05, WEB-06
15 Dec 2026Mobile apps V1 feature-complete—MDA-12
22 Dec 2026Staging integration complete—MOB-14, SRV-28
28 Dec 2026Acceptance report (PV de recette) signed—QA-02
29 Dec 2026Production go-liveon time — 17 Jan 2027LCH-01
30 Dec 2026Pilot startson time — 17 Jan 2027LCH-02
14 Jan 2027Pilot go / no-go—LCH-03, LCH-03B
21 Jan 2027Generalisation complete—LCH-05
22 Feb 2027V2 delivered—SRV-38, DSH-21, MDA-20, WEB-20, DQA-12
  1. Acceptance falls around the year end. The functional campaign (QA-03), the end-to-end tests (QA-01) and the client acceptance (QA-02) run back to back over the last working days of December and the first of January. HOCO's testers, the PV signatory and the import data owners are booked at the cadrage, with named back-ups, so that year-end absences do not stop the recette.
  2. Production is prepared before the recette, not after it. The acceptance report is signed one working day before go-live, so everything that does not depend on the accepted build — infrastructure, domains, backups, monitoring, the SMS sender ID, the Play Console listing, the privacy policy, the import rehearsal — is done during the build phase (go-live checklist).
  3. No slack on the critical lane. Anis's lane fills the three months; an operational task that slips (sender-ID approval, store review, data delivery) is escalated the same week and handled with the levers of the timeline and D-38.

Environments

hoco.dz is a placeholder until D-12; the admin, app and cdn names are proposals.

LocalStagingPre-production (recette)Production
PurposeDevelopmentIntegration of dev; the team's daily testing; the functional campaign (QA-03)Client acceptance of a release candidate (QA-02); import rehearsal; trainingReal use (pilot, then everyone)
APIhttp://localhost:3100/v1https://api-staging.hoco.dz/v1https://api-preprod.hoco.dz/v1https://api.hoco.dz/v1
Back-officehttp://localhost:3101https://admin-staging.hoco.dzhttps://admin-preprod.hoco.dzhttps://admin.hoco.dz
Reseller web and invitation linkshttp://localhost:3102https://app-staging.hoco.dzhttps://app-preprod.hoco.dzhttps://app.hoco.dz
Public filesMinIO :9100https://cdn-staging.hoco.dzhttps://cdn-preprod.hoco.dzhttps://cdn.hoco.dz
Deployed fromWorking copyEvery merge to dev, automaticallyA release-candidate tag vX.Y.Z-rc.N from release/X.Y.Z, on Anis's approvalA tag vX.Y.Z on master, on Anis's approval
Mobile buildsdev flavor on emulatorsstaging flavor, Firebase App Distribution to the teamstaging flavor built with the pre-production API URL, Firebase App Distribution to HOCO's testersprod flavor, Play internal → closed → production tracks
Who has accessThe teamThe team; HOCO on requestHOCO's key users and the teamEveryone, per role

Assumption — the pre-production apps are the staging flavor with API_BASE_URL set at build time (--dart-define), so no fourth flavor is needed; Imad confirms in the mobile guide.

Data policy per environment

LocalStagingPre-productionProduction
Personal dataSynthetic seed onlySynthetic seed and the recette seedRecette seed; HOCO's real catalog (not personal); real reseller data only with HOCO's written agreement and production-grade access controlReal
SMSSimulator (printed in the server log viewer)Simulator; real SMS only to the team's allow-listed numbersReal gateway, allow-listed tester numbers onlyReal
PushFirebase hoco-devFirebase hoco-stagingFirebase hoco-stagingFirebase hoco-prod
EmailMailpit (:8125)Sandbox or allow-listed domainReal provider, allow-listed recipientsReal
Maps and other keysDevelopment keysStaging keysStaging keysProduction keys, restricted
BackupsNoneNightly, 7 daysNightly, 14 daysFull policy (backups)
Session cookieshoco-dev prefixhoco-stg prefixhoco-pp prefixhoco prefix — distinct names so sessions never cross environments under the shared .hoco.dz cookie domain

Delivery pipeline

Server, back-office and reseller web

StageTriggerWhat runsResult
Pull requestEvery PR to devBiome, type-check, unit and integration tests (PostgreSQL and Redis services), OpenAPI diff, migration drift check, gitleaks, dependency audit, docs check-mdx, Docker builds without push (quality gates)Mergeable when green and reviewed
IntegrationMerge to devBuild and push images ghcr.io/anisbetehi/hoco-server, -dashboard, -web tagged with the commit SHA; call the Dokploy deploy hooks of staging; run prisma migrate deploy as a one-off job before the new api and worker start; smoke test (health, sign-in, catalog read)Staging updated within about 10 minutes
Release candidateTag vX.Y.Z-rc.N on release/X.Y.ZSame build, images tagged X.Y.Z-rc.N; GitHub environment preprod requires Anis's approval; deploy to pre-production; smoke testRecette build
ProductionTag vX.Y.Z on masterNo rebuild: the release-candidate images are re-tagged X.Y.Z (same digest); pre-deploy database dump; migrations; deploy with approval (environment production); smoke test; Sentry release createdProduction updated
DocumentationMerge to master (or dev) touching apps/docsnext build, deployed with the other apps (later)Docs on the VPS, restricted access

Rules:

  1. One image, two processes. api (HTTP) and worker (BullMQ workers and the scheduler) run from the same image with different commands; api runs two replicas in production, worker one.
  2. Migrations are expand-then-contract. A release only adds columns, tables and indexes, or relaxes constraints; removals ship one release later, so the previous image can always run against the new schema — that is what makes a rollback safe.
  3. Rollback = redeploy the previous image tag in Dokploy (runbook); a database rollback is a restore, never a down-migration.
  4. Feature flags (settings) hide unfinished V1 features rather than long-lived branches.

Mobile apps

Imad's repository hoco-mobile, GitHub Actions (MOB-01, MOB-14):

StageTriggerWhat runsResult
Pull requestEvery PRdart format check, flutter analyze, unit, widget and golden tests, APK buildMergeable when green
IntegrationMerge to devdev and staging APKs of both apps, Dart symbols uploaded to SentryFirebase App Distribution: group Team (dev, staging) and HOCO testers (staging)
ReleaseTag reseller-vX.Y.Z or delegate-vX.Y.Zprod AAB signed with the upload key; release notes from the changelogPlay internal track (team smoke test) → closed track (pilot users) → production with staged rollout 10 % → 50 % → 100 %

versionName follows semantic versioning; versionCode is the CI build number. The minimum and latest versions per app and platform are set on BO-66 (AppVersionPolicy); raising the minimum forces an update (426 UPGRADE_REQUIRED). A new server release that mobile depends on is deployed before the app release that uses it.

Infrastructure sizing

Proposal for the volumes of the sizing table (Assumption; provider and data location are D-15).

ComponentProductionStaging + pre-production
ServerOne VPS: 8 vCPU, 16 GB RAM, 240 GB NVMe, Ubuntu 24.04 LTS, Dokploy (Docker + Traefik)One VPS: 4 vCPU, 8 GB RAM, 160 GB NVMe; two Dokploy projects, separate databases, Redis databases and buckets
API2 replicas, about 1 GB RAM each1 replica per environment
Worker1 replica, about 1 GB1 per environment
Back-office · reseller web1 replica each, about 512 MB each1 each per environment
PostgreSQL 17Self-hosted on the VPS (4 GB shared_buffers), WAL archiving for point-in-time recovery — or a managed PostgreSQL 17 with point-in-time recovery if the provider offers itSelf-hosted, nightly dumps
Redis 7AOF persistence (everysec), 1 GB maxmemory, maxmemory-policy noeviction (required by BullMQ queues)Same, smaller
Object storageS3-compatible, three buckets (storage)Same layout, per environment
Backup targetAnother provider or account, encrypted copiesSame target, separate prefix
Uptime monitoringOutside the production VPS (a small separate host or a hosted monitor)Same monitor

Headroom: the production VPS runs the generalisation volume at about a third of its capacity; the next steps are a larger VPS, then a separate database server, then more API replicas (NFR-03).

Domains and TLS

RecordPoints toNotes
api, admin, app (and -staging, -preprod)The VPS of the environmentA/AAAA; TLS by Traefik with Let's Encrypt, renewed automatically
cdn (and variants)The public bucket or its CDNCustom domain on the storage provider
mail (sending subdomain)Email providerSPF, DKIM, DMARC and bounce records (email)
CAA on the apex0 issue "letsencrypt.org"Only the chosen certificate authority may issue
app.hoco.dz/.well-known/assetlinks.jsonServed by the reseller web appAndroid App Links for invitation links: the package names and the SHA-256 fingerprints of the Play app-signing and upload certificates; apple-app-site-association too if iOS

Invitation links work from the first production day. The reseller web is part of V1 (WEB-01 to WEB-05) and goes live with production (LCH-01); it serves the /i/{code} landing (open the app, else the Play Store with the referrer, else the web sign-up) and /.well-known/assetlinks.json, so the invitations delegates share during the pilot resolve correctly. The fingerprints in assetlinks.json are those of the production Play app-signing key, known once the app exists in the Play Console (MOB-14).

HSTS is enabled per host first, then with includeSubDomains once every subdomain serves HTTPS (SEC-03).

Secrets

SecretUsed byStored inRotation
DATABASE_URL (application role), migration role URLapi, worker · migration jobDokploy environment of each appOn leak; on team departure
REDIS_URLapi, workerDokployOn leak
BETTER_AUTH_SECRETapiDokployYearly or on leak (rotating it ends cookie signatures: plan a re-sign-in)
S3_* and BACKUP_S3_*api, worker · backup jobDokploy (separate credentials)Yearly or on leak
FCM_SERVICE_ACCOUNT_JSONworkerDokployYearly or on leak (new key in Google Cloud, old one deleted)
SMS_API_KEY, SMTP_PASSWORD, GOOGLE_MAPS_SERVER_KEYworker, apiDokployOn leak; provider policy
SENTRY_DSNall appsEnvironment (not secret, but per environment)—
Backup encryption private keyRestores onlyOffline, held by Anis and a person designated by HOCOYearly
GitHub Actions secrets: registry token, Dokploy deploy hooksCIRepository environments with approval rulesYearly or on leak
Mobile: upload keystore and passwords, Play service account, google-services.jsonhoco-mobile CIRepository secrets of hoco-mobile; the upload key escrowed with HOCOUpload key reset through Play support if lost

The env package validates every variable at boot; a missing or malformed secret stops the process with a clear message. Secrets never appear in the repositories (gitleaks) or in logs (SEC-0.7).

Backups

WhatHowWhenKept
PostgreSQLContinuous WAL archiving and a weekly base backup (point-in-time recovery), plus a nightly logical dump (pg_dump -Fc), both encrypted before uploadWAL continuous · base backup Sunday 01:30 · dump daily 02:00 Africa/Algiers7 daily, 4 weekly, 12 monthly
Private bucketVersioning, plus a nightly copy to the backup target03:00Non-current versions 30 days; copies per the same rule
Public bucketRe-creatable from the private originals and imports; nightly copy03:007 days
RedisNot backed up (queues are transient; undispatched outbox rows are re-dispatched after a restore)——
Dokploy configuration and environmentExport to the password vault after every changeOn changeCurrent and previous
RepositoriesGitHub, plus a mirror for HOCO at the end of the warranty (D-25)——

A verification job at 04:00 checks that last night's dump exists, is larger than 50 % of the previous one and can be listed by pg_restore; otherwise it alerts. A full restore is tested every month (and in SRV-28 before go-live).

Restore runbook

  1. Declare the incident (P1), name the person in charge, inform HOCO's referent.
  2. Stop writes: switch maintenance mode on (BO-66 or the settings switch; the API answers 503 MAINTENANCE); stop the worker. The delegate app keeps working offline and queues its actions.
  3. Choose the recovery point: the latest consistent point (point-in-time recovery) or the last good dump; write it down.
  4. Provision a fresh database (new instance or container); never restore over the damaged one, keep it for analysis.
  5. Fetch and decrypt the base backup and WAL (or the dump) from the backup target with the offline key.
  6. Restore: point-in-time recovery to the chosen time, or pg_restore --no-owner --clean --if-exists into the fresh database.
  7. Check integrity: prisma migrate status clean; row counts of key tables against the last metrics; the last CMD-, FAC-, PAY- and RET- numbers against NumberSequence; outbox rows not yet dispatched listed.
  8. Switch DATABASE_URL of api and worker to the restored database; start the worker (it re-dispatches pending outbox events).
  9. Smoke test: sign-in, catalog, the orders-to-confirm queue, a test order on a test reseller, a delegate sync.
  10. Reopen: maintenance off; delegates' queued actions replay; announce the end of the incident.
  11. Report within two working days: cause, data lost (between the recovery point and the incident), duration against the 4-hour objective, actions.

Restore drill

The drill proves step 4 to 9 of the runbook on a fresh database without touching the live one. The smoke check is docker/restore-smoke.sql (row counts of the key tables, pending outbox rows, stock totals and the NumberSequence values): run it on the source and on the restored database and compare.

# 1. dump (inside the PostgreSQL container; on the VPS: fetch and decrypt last night's dump instead)
docker exec postgres pg_dump -U postgres -Fc -f /tmp/hoco-drill.dump hoco
# 2. restore into a fresh database
docker exec postgres createdb -U postgres hoco_restore
docker exec postgres pg_restore -U postgres -d hoco_restore --no-owner --exit-on-error /tmp/hoco-drill.dump
# 3. smoke: identical counts and sequences, then the API against it
docker cp docker/restore-smoke.sql postgres:/tmp/restore-smoke.sql
docker exec postgres psql -U postgres -d hoco -At -f /tmp/restore-smoke.sql > source.txt
docker exec postgres psql -U postgres -d hoco_restore -At -f /tmp/restore-smoke.sql > restored.txt
diff source.txt restored.txt
DATABASE_URL=…/hoco_restore  # an api process on it: GET /ready, sign-in, catalog, admin.orders.list
# 4. clean up
docker exec postgres dropdb -U postgres hoco_restore
DrillDateDatabaseDumpRestoreSmokeResult
Local (SRV-28, development machine, demo seed)19 Oct 202631 MB, dump file 1.3 MB0.8 s1.7 scounts and sequences identical; /ready 200, sign-in, catalog and admin.orders.list 200Passed — the procedure works; times are not representative of production
VPS (staging, production-sized copy)at deployment (OPS-02)————To do: restore last night's encrypted dump (and a point-in-time recovery), time steps 4 to 9 against the 4-hour objective, record RPO (age of the recovery point) and RTO here

Monitoring

SignalToolNotes
UptimeExternal monitor, 1-minute checks of /health on api, admin and app hosts; a synthetic sign-in and catalog read every 5 minutesHosted outside the production VPS
ErrorsSentry for server, back-office, reseller web and both Flutter apps; releases, source maps, Dart symbolsPersonal data scrubbed (NFR-8.2)
LogsContainer logs (JSON) collected per app; searchable 30 daysRedaction enforced in the server
MetricsRequest rate, latency and errors per operation; BullMQ queue depth, oldest job, failed jobs; PostgreSQL connections and slow queries; disk, memory, CPU; SSE connections; SMS delivery rate; push failure rateDashboard per environment
Business healthOrders waiting for confirmation and their age, sync errors per delegate, pending payment declarations, open after-sales claimsBack-office dashboards and the daily digest

Alert thresholds

Proposed thresholds; alerts go by email and to the team's chat channel; during the pilot P1 alerts also call the on-call phone.

AlertConditionPriority
API down2 consecutive failed uptime checks (2 minutes)P1
Error rateHTTP 5xx above 2 % of requests over 5 minutesP1
Latencyp95 above 1 s over 10 minutes on catalog or checkout operationsP2
Queue backlognotify.* or outbox queue with more than 500 waiting jobs or an oldest job older than 10 minutesP2
Failed jobsMore than 20 failed jobs in an hour on any queueP2
BackupNo successful dump by 04:00, or WAL archiving lagging more than 15 minutesP2
DiskAbove 80 % on any volumeP2 (P1 above 90 %)
CertificatesExpiry in under 14 daysP3
SMSDelivery rate below 90 % over an hour, or 5 consecutive send failuresP1 (OTP path)
PushFCM failure rate above 10 % over an hour (invalid tokens excluded)P3
SSERedis unavailable, or active SSE connections dropping by more than 50 % in 5 minutesP2
Orders waitingAn order unconfirmed for more than 8 working hoursP3 (business alert to the commercial admins)
Crash rateCrash-free sessions below 99 % for a mobile release over 24 hoursP2

Initial data import

Cahier §13.2 « Import initial des produits, revendeurs et comptes utilisateurs »; ADM-06, CAT-06; built in SRV-27 (import jobs with dry-run report, idempotent apply and error rows), run in LCH-01; sources and format are D-31.

Data setTemplate (XLSX) — key columnsOwner at HOCOOrder
Brands, categories and sub-categoriesbrand, category path (Chargeurs > Chargeurs muraux)Stock manager1
Attribute definitions per categorycategory, attribute key, label, type, unit, allowed values (CAT-13)Stock manager with Akram2
Products and variantsbrand, reference (SKU), name, category path, description, barcode (EAN-13), warranty months, VAT rate, purchase price HT, price super-gros, demi-gros and détail (HT or TTC as agreed in D-01), recommended price, min, step and max quantity, attribute values, image file namesStock manager, commercial direction for prices3
Product imagesZIP of images named by SKU (N32-1.jpg) or URLsMarketing3
Warehouses and stock levelswarehouse, SKU, physical quantity, alert thresholdStock manager4 (at the freeze)
Users (staff and delegates)first and last name, phone, email (staff), roles, zones (delegates)Super admin5
Zoneszone name, wilayas, communes, delegateCommercial direction5
Support regionsregion, wilayas, WhatsApp number, hours, default region (D-36)Commercial direction5
Resellersstore name, owner name, main phone, WhatsApp, email, wilaya code, commune, address, latitude, longitude, business type, potential, customer type, assigned delegate (phone), credit limit, statusCommercial direction, finance for limits6
Opening balances (optional)reseller number or phone, open invoice references and balancesFinance7 (at the freeze)

Cleansing rules applied by the dry-run and reported row by row: phones normalised to E.164, duplicates by normalised phone listed for HOCO to merge before import (CRM-03); communes matched to the official reference with suggestions for near spellings (Bir el Djir → Bir El Djir); brands limited to HOCO, ACEFAST and BOROFONE; EAN-13 checksums verified; prices positive and in the order super-gros ≤ demi-gros ≤ détail (warning otherwise); VAT 19 % when empty; missing GPS accepted (captured at the first visit); a reseller without a customer type is rejected.

Steps

  1. Templates and samples — HOCO receives the templates and returns 20 sample rows per data set as early as possible, so the templates are tuned before SRV-27 ends.
  2. Full extract — HOCO's data owners fill the templates; Anis runs the first dry-run on pre-production and shares the report.
  3. Cleansing rounds — HOCO corrects; dry-run again until zero errors (warnings reviewed).
  4. Rehearsal — full import on pre-production; HOCO checks 20 random products (prices of the three types, attributes, images) and 20 random resellers (customer type, delegate, wilaya) and signs the check.
  5. Freeze — from the agreed freeze moment, changes are made by hand in the new back-office; stock and opening balances are taken at the freeze.
  6. Production import during the go-live window in the order of the table; each apply is idempotent and can be re-run.
  7. Reconciliation — counts per data set, total stock per warehouse and total credit limits compared with HOCO's figures; signed by HOCO.

Cut-over. During the pilot, non-pilot resellers keep ordering by phone and WhatsApp as today; orders of pilot resellers received by phone are entered by staff on BO-40 so every pilot order is in the platform and goes through the « Commandes à confirmer » queue. From go-live the platform is the stock reference for every order it handles (D-34).

Training

Cahier §13.3: administrators and managers, delegates on a full tour scenario, a quick guide for resellers, administration documentation and support procedures (OPS-03). Materials by Akram with Anis (DQA-06); sessions in LCH-02 on pre-production with the recette data, repeated for each generalisation wave (LCH-05).

AudienceDurationContent (scenarios)MaterialTrainer
Super admins2 hUsers and roles, permissions matrix, settings, reference lists, support regions, app versions and maintenance mode, imports, activity log, session revocationAdmin reference, runbook extractsAnis
Commercial admins3 hThe orders-to-confirm queue as a daily routine (controls, confirm, refuse, modify, on hold), assisted orders, account validation and customer types, CRM and follow-ups, tour planning and the live map, promotions and banners, announcements, reportsQuick reference card per roleAnis
Stock manager1.5 hProducts, three prices and attributes, stock levels, receipts and adjustments, inventories, alerts, return reception with automatic restockQuick reference cardAnis
Finance manager1.5 hInvoices, payment declarations and verification, credit limits and overrides, credit notes, exportsQuick reference cardAnis
Delivery manager1 hDelivery board, picking list, carriers and tracking, proof of delivery, delivery failuresQuick reference cardAnis
Support agents1 hTickets, after-sales claims from diagnosis to resolution (replacement, return, credit note, repair, rejection), regional WhatsApp numbersQuick reference cardAnis
Direction45 minDashboards, reports, exportsQuick reference cardAnis
Pilot delegatesHalf a day (3.5 h)A full tour scenario on test phones: consent, sign-in, start the tour, navigate, check in, visit (checklist, photos, report), not-done reason, new prospect, invitation by QR and WhatsApp, first-order assistance, offline visit and the sync centre, closing; then one real tour accompanied by Akram during the pilot (DQA-08)Delegate field guide, QR flyer (DQA-07)Anis, Akram, Imad
ResellersSelf-serviceIllustrated quick guide (PDF and a one-page leaflet given by delegates): browse as a guest, sign up with the customer type, wait for validation, order, follow the live status, claim after-sales, request a return, WhatsApp supportReseller quick guideDelegates

Train-the-trainer: HOCO names one champion per function who trains later arrivals with the same materials. The administration documentation and support procedures (L1 playbook) are handed over at generalisation.

Go-live checklist

Keyed to the milestones of the plan, because acceptance ends one working day before go-live. Owner in brackets.

During the build — before Staging integration complete

  1. Production infrastructure provisioned and hardened (SEC-0.10), DNS and TLS live, HSTS per host — done with OPS-02 (Anis).
  2. Backups running and one full restore tested in SRV-28 (Anis).
  3. Monitoring and alerts live; a test alert fired and received (Anis).
  4. SMS sender ID approved; a real OTP received on a Mobilis, a Djezzy and an Ooredoo number — the registration is started at the cadrage because approval takes time (HOCO, Anis).
  5. Firebase hoco-prod, production Maps keys restricted, email SPF/DKIM/DMARC passing (Anis, Imad).
  6. Play Console: apps created, closed track with the pilot users' emails, data safety form, foreground-service declaration, privacy policy URL, reviewer demo accounts — MOB-14, leaving the store review time before go-live (Imad).
  7. Privacy policy and account-deletion page published (HOCO, Anis).
  8. HOCO's testers, PV signatory and data owners booked for the year-end recette, with back-ups (HOCO, Anis).

During the recette — before Acceptance report (PV de recette) signed

  1. Business settings validated by HOCO on pre-production: minimum order, payment methods, credit policy, reservation status, GPS tolerance, assisted-order delay, return window, quiet hours (HOCO, Anis).
  2. Full import rehearsed on pre-production with zero errors; reference lists, attribute definitions and support regions with their WhatsApp numbers ready (HOCO, Anis).
  3. Staff accounts listed; training sessions and the pilot delegates' half-day scheduled; champions named (Anis, Akram).
  4. Pilot delegates' phones checked (Google Play services, battery optimisation exclusion); tours of the first pilot week drafted (Akram, HOCO).
  5. Go/no-go meeting at the end of the recette: open defects against the exit criteria, risks, rollback plan (all).

Go-live day — Production go-live

  1. Freeze; production import in order; reconciliation signed (Anis, HOCO).
  2. Production release deployed (API, back-office, reseller web with the invitation landing and assetlinks.json); smoke test on production with test accounts (Anis).
  3. Apps promoted to the closed track; pilot users invited (Imad).
  4. Support channels staffed (regional WhatsApp numbers, phone), escalation contacts shared (HOCO).

Next working day — Pilot starts

  1. Training of administrators, managers and pilot delegates (LCH-02) (Anis, Akram).
  2. Morning check: errors, queues, orders to confirm, sync errors, SMS delivery (Anis, Imad); first daily pilot triage (LCH-03, LCH-03B).

Pilot and generalisation

The pilot runs two weeks right after go-live, with a limited group of delegates and resellers using the two apps and the reseller web (OPS-06; group and length in D-32). It ends before Ramadan, so field activity is representative. Daily triage at the end of the field day; hotfixes on the closed track. Proposed go/no-go criteria for the Pilot go / no-go milestone:

CriterionThreshold
Open P1 or P2 incidents0
Pilot orders placed through the apps (rather than by phone)≥ 70 %
Orders confirmed by the back-officeMedian under 4 working hours
Offline sync≥ 99 % of queued actions applied without manual help
Crash-free sessions≥ 99.5 % on both apps
Check-ins accepted within tolerance≥ 90 % of attempts (otherwise review D-06)
Delegates and HOCO managersPositive feedback in the retrospective; improvement list prioritised (LCH-04, MOB-18)

Generalisation comes after the three months and opens zone by zone (LCH-05): train the zone's delegates, import or validate its resellers, promote the apps to the public Play track and announce the reseller web to the zone; one wave per week as long as the support load stays within the targets below. The iOS build, if HOCO decides it (D-10), ships in this phase (MOB-16).

Maintenance and support

Cahier §13.4: « Période de garantie corrective à préciser », « Maintenance corrective, préventive et évolutive selon contrat », « Support, délais de prise en charge et niveaux de priorité », « Suivi des performances, sauvegardes et mises à jour de sécurité » (OPS-04). Everything below is proposed and becomes binding through the contract.

Warranty. Two months of corrective warranty from production go-live (covering the pilot and generalisation): defects in the delivered and accepted scope are fixed at no cost.

TypeScopeHow
CorrectiveDefects against the specification and the accepted scenariosTickets prioritised P1–P4; fixes in hotfix or scheduled releases
PreventiveMonthly: dependency and security updates, PostgreSQL and Redis minor upgrades, certificate and backup checks, restore test; quarterly: capacity review, permission and access reviewMonthly maintenance report
EvolutiveNew features and changes (V2 included)Change request → estimate → planning (change requests)

Support levels and channels

LevelWhoHandlesChannel
L1HOCO's support agents and championsHow-to questions, account and password help, order and claim follow-up, reseller calls and regional WhatsAppReseller tickets, WhatsApp, phone
L2Anis (server, back-office, web), Imad (mobile)Defects, data corrections, configuration, incidentsSupport email and a shared tracker; phone for P1
L3Providers (hosting, SMS gateway, Firebase, email)Provider incidentsProvider support, opened by L2

Priorities and targets (business hours Sunday–Thursday 08:30–17:30 Africa/Algiers; during the pilot, P1 is covered every day 08:00–20:00)

PriorityDefinitionExampleFirst responseWorkaround or restoreFix
P1 — CriticalProduction down, or a core flow blocked for all users, or a security or data-integrity breachAPI down; no order can be submitted or confirmed; delegates cannot sync; OTP not delivered; another reseller's data visible1 hour4 hours1 working day
P2 — HighA major function degraded for many users, no workaroundLive status not updating; notifications not sent; payment verification failing; returns cannot be received4 business hours1 working day3 working days
P3 — MediumA function impaired with a workaround, or few users affectedExport failing for one report; a filter count wrong; one device model misbehaving1 working day—Next scheduled release (≤ 10 working days)
P4 — LowCosmetic issue, question, small improvementLabel, alignment, wording2 working days—Planned in the backlog

Recette severities map to these priorities: Blocker ≈ P1, Critical ≈ P2, Major ≈ P3, Minor ≈ P4 (acceptance procedure).

Releases after go-live: hotfixes any day for P1 and P2; a minor release every two weeks during pilot and generalisation, then monthly. Reporting: a monthly report to HOCO with tickets by priority and targets met, availability, incidents, backups and restore tests, security updates and the next month's plan.

Runbooks

Each runbook lives in the operations repository folder and is rehearsed on pre-production before go-live.

RunbookWhenOwnerTime
DeployEvery releaseAnis (web), Imad (mobile)15 min
Roll backRelease causing a P1 or P2Anis10 min
Restore the databaseData loss or corruptionAnis≤ 4 h (restore runbook)
Rotate secretsLeak, departure, yearlyAnis30–60 min
Revoke sessionsCompromised account or device, departureSuper admin, Anis5 min
Disable an app versionVulnerable or broken app releaseAnis, Imad5 min
Maintenance modePlanned maintenance, restoreAnis2 min
SMS outageDelivery alert, user reportsAnis30 min
Push outageFCM failuresImad, Anis30 min
Real-time outageSSE or Redis alertAnis30 min

On this page