system-prompts-and-models-o.../dealix/api/routers/revenue_launch.py
Dealix Builder 84f1ad9620 feat(launch+revenue): Private Beta Launch Ops + Revenue Launch — 14 modules + 29 endpoints + 56 tests + scripts/landing/docs
Launch Ops (5 modules) — برج إطلاق الـ Private Beta
- private_beta: 499 SAR × 7-day offer + safety notes + 6-question Arabic FAQ
- demo_flow: 12-minute minute-by-minute Arabic demo + 5 discovery Qs + 6 objection responses + close script
- outreach_messages: 4 segments × 5 prospects = 20 + per-segment Arabic messages + 3-step follow-ups + 6 reply handlers
- go_no_go: 10-gate readiness + 3 critical gates (no_secrets/live_sends_disabled/staging_health) + verdict + next-actions
- launch_scorecard: 11 event types + daily/weekly aggregation + targets (20 outreach/5 replies/3 demos/1 pilot daily)

Revenue Launch (7 modules) — تحويل Dealix إلى دخل
- offer_builder: 4 offers (Private Beta, 499 Pilot, Growth OS Pilot 1.5-3K, Free Case Study) + segment-aware recommend
- pipeline_tracker: 8-stage deterministic pipeline + add/update/summarize + revenue tracking + win rate
- outreach_sequence: re-export single source of truth from launch_ops with revenue-tier wrappers
- demo_closer: re-export from launch_ops
- pilot_delivery: 12-field intake form + 5-phase 24h delivery plan + per-service templates (First 10 / List Intel / Free Diagnostic)
- proof_pack_template: 5-line Arabic client summary + ROI estimate (pipeline_x + closed_won_x) + next-step recommendation (upsell/iterate/extend)
- payment_manual_flow: Moyasar invoice step-by-step (halalas-correct) + Arabic payment-link message + confirmation checklist; NEVER charges via API

Service Tower extensions (2 modules)
- contract_templates: re-export targeting_os contracts + new SLA outline (legal_review_required, PDPL-aware)
- vertical_service_map: 6 verticals (B2B SaaS / agencies / training-consulting / real estate / healthcare-local / retail-ecommerce) with primary+supporting services + buyer roles + common pains + winning offer

Routers (2 new) — 29 endpoints
- /api/v1/launch/* — 11 endpoints (private-beta/offer, demo/flow, outreach/{first-20, message, followup}, go-no-go, readiness, scorecard/{event, daily, weekly, demo})
- /api/v1/revenue-launch/* — 18 endpoints (offers + offers/recommend, outreach/{first-20, followup}, demo-flow, pipeline/{schema, summarize}, pilot-delivery/{intake-form, 24h-plan, first-10, list-intelligence, free-diagnostic}, payment/{invoice-instructions, link-message, confirmation-checklist}, proof-pack/{template, client-summary, next-step})

Tests (2 new files, 56 tests)
- test_launch_ops.py: 25 tests (Private Beta offer essentials + Arabic FAQ; demo flow 12-min structure; first-20 segments × 5; outreach Arabic + drafts only; followup steps differ; reply handlers include unsubscribe; go/no-go critical gates block; scorecard aggregation + verdict)
- test_revenue_launch.py: 31 tests (offers correct prices, no_live_charge=True; segment-aware recommends; pipeline 8 stages + add/update/summarize + win rate; outreach v2 Arabic; intake fields; 24h plan 5 phases; invoice halalas correct; payment confirmation blocks premature delivery; proof pack 5 lines + 3 next-step paths)

Scripts (1 new)
- scripts/launch_readiness_check.py: runs 10 gates locally + optional --staging-url; pretty/JSON output; critical gates determine GO/NO-GO/FIX-THEN-GO verdict

Landing pages (2 new, RTL Arabic)
- list-intelligence.html — List Intelligence service detail (499–1,500 SAR)
- growth-os.html — Growth OS Monthly subscription page (2,999 SAR/month)

Docs (1 new + 1 updated)
- REVENUE_TODAY_PLAYBOOK.md (Arabic) — 12-section playbook: offers, segments, messages, demo, pipeline, 24h delivery, Moyasar manual flow, proof pack, daily targets, go/no-go, what-not-to-do, next-step
- DEALIX_100_PERCENT_LAUNCH_PLAN.md — added §40 Launch Ops + §41 Revenue Launch + §42 Service Tower extensions + §43 Scripts

Test results
- 56/56 new tests pass
- Full suite: 824 passed, 2 skipped (missing API keys, unrelated)
- 0 existing tests broken

Safety integration
- All offers: live_send_allowed=False, no_live_charge=True, approval_required=True
- 10-gate go/no-go BLOCKS launch if no_secrets/live_sends_disabled/staging_health fail
- Moyasar: invoice/payment-link manual only; NEVER calls live charge API
- Payment confirmation checklist blocks delivery before invoice paid status
- All outreach messages: drafts only, follow-ups capped at 3, opt-out honored immediately
- 6 verticals mapped to safe service stacks; LinkedIn always Lead Forms (never scraping)

Integration with previous layers
- Launch Ops uses platform_services tool_gateway, intelligence_layer command_feed, security_curator redaction
- Revenue Launch uses targeting_os contractability + service_tower offers + intelligence_layer simulator
- Pipeline tracker integrates with action_ledger for stage transitions
- Proof Pack template references intelligence_layer proof metrics + service_excellence ROI

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 17:28:08 +03:00

183 lines
6.8 KiB
Python

"""Revenue Launch router — paid offer + pipeline + delivery + payment + proof."""
from __future__ import annotations
from typing import Any
from fastapi import APIRouter, Body
from auto_client_acquisition.revenue_launch import (
build_24h_delivery_plan,
build_499_pilot_offer,
build_case_study_free_offer,
build_client_intake_form,
build_client_summary,
build_first_10_opportunities_delivery,
build_first_20_segments_v2,
build_followup_1,
build_followup_2,
build_growth_diagnostic_delivery,
build_growth_os_pilot_offer,
build_list_intelligence_delivery,
build_moyasar_invoice_instructions,
build_next_step_recommendation,
build_outreach_message_v2,
build_payment_confirmation_checklist,
build_payment_link_message,
build_pipeline_schema,
build_private_beta_offer,
build_private_beta_proof_pack,
build_reply_handlers_v2,
demo_12_min,
demo_close_script,
demo_discovery,
demo_objections,
recommend_offer_for_segment,
summarize_pipeline,
)
router = APIRouter(prefix="/api/v1/revenue-launch", tags=["revenue-launch"])
# ── Offers ───────────────────────────────────────────────────
@router.get("/offers")
async def offers() -> dict[str, Any]:
return {
"private_beta": build_private_beta_offer(),
"pilot_499": build_499_pilot_offer(),
"growth_os_pilot": build_growth_os_pilot_offer(),
"case_study_free": build_case_study_free_offer(),
}
@router.post("/offers/recommend")
async def offers_recommend(payload: dict[str, Any] = Body(...)) -> dict[str, Any]:
return recommend_offer_for_segment(payload.get("segment_id", ""))
# ── Outreach ─────────────────────────────────────────────────
@router.get("/outreach/first-20")
async def outreach_first_20() -> dict[str, Any]:
seg = build_first_20_segments_v2()
return {
**seg,
"messages": {
s["id"]: build_outreach_message_v2(s["id"])
for s in seg["segments"]
},
"reply_handlers": build_reply_handlers_v2(),
}
@router.post("/outreach/followup")
async def outreach_followup(payload: dict[str, Any] = Body(...)) -> dict[str, Any]:
step = int(payload.get("step", 1))
builder = build_followup_2 if step >= 2 else build_followup_1
return builder(
segment_id=payload.get("segment_id", ""),
name=payload.get("name", "[الاسم]"),
)
# ── Demo ─────────────────────────────────────────────────────
@router.get("/demo-flow")
async def demo_flow() -> dict[str, Any]:
return {
"flow": demo_12_min(),
"discovery_questions": demo_discovery(),
"objections": demo_objections(),
"close": demo_close_script(),
}
# ── Pipeline ─────────────────────────────────────────────────
@router.get("/pipeline/schema")
async def pipeline_schema() -> dict[str, Any]:
return build_pipeline_schema()
@router.post("/pipeline/summarize")
async def pipeline_summarize(
pipeline: list[dict[str, Any]] = Body(default_factory=list, embed=True),
) -> dict[str, Any]:
return summarize_pipeline(pipeline)
# ── Pilot delivery ───────────────────────────────────────────
@router.get("/pilot-delivery/intake-form")
async def pilot_intake_form() -> dict[str, Any]:
return build_client_intake_form()
@router.post("/pilot-delivery/24h-plan")
async def pilot_24h_plan(payload: dict[str, Any] = Body(...)) -> dict[str, Any]:
return build_24h_delivery_plan(payload.get("service_id", ""))
@router.post("/pilot-delivery/first-10")
async def pilot_first_10(intake: dict[str, Any] = Body(default_factory=dict)) -> dict[str, Any]:
return build_first_10_opportunities_delivery(intake)
@router.post("/pilot-delivery/list-intelligence")
async def pilot_list_intelligence(intake: dict[str, Any] = Body(default_factory=dict)) -> dict[str, Any]:
return build_list_intelligence_delivery(intake)
@router.post("/pilot-delivery/free-diagnostic")
async def pilot_free_diagnostic(intake: dict[str, Any] = Body(default_factory=dict)) -> dict[str, Any]:
return build_growth_diagnostic_delivery(intake)
# ── Payment manual flow ──────────────────────────────────────
@router.post("/payment/invoice-instructions")
async def payment_invoice_instructions(payload: dict[str, Any] = Body(default_factory=dict)) -> dict[str, Any]:
return build_moyasar_invoice_instructions(
amount_sar=int(payload.get("amount_sar", 499)),
customer_name=payload.get("customer_name", ""),
invoice_description=payload.get(
"invoice_description",
"Dealix Private Beta Pilot — 7 days",
),
)
@router.post("/payment/link-message")
async def payment_link_message(payload: dict[str, Any] = Body(...)) -> dict[str, Any]:
return build_payment_link_message(
customer_name=payload.get("customer_name", "[الاسم]"),
invoice_url=payload.get("invoice_url", "[INVOICE_URL]"),
amount_sar=int(payload.get("amount_sar", 499)),
)
@router.get("/payment/confirmation-checklist")
async def payment_confirmation_checklist() -> dict[str, Any]:
return build_payment_confirmation_checklist()
# ── Proof Pack ───────────────────────────────────────────────
@router.post("/proof-pack/template")
async def proof_pack_template(payload: dict[str, Any] = Body(default_factory=dict)) -> dict[str, Any]:
return build_private_beta_proof_pack(
company_name=payload.get("company_name", ""),
metrics=payload.get("metrics", {}),
)
@router.post("/proof-pack/client-summary")
async def proof_pack_client_summary(payload: dict[str, Any] = Body(default_factory=dict)) -> dict[str, Any]:
return build_client_summary(
company_name=payload.get("company_name", ""),
opportunities_count=int(payload.get("opportunities_count", 0)),
approved_drafts=int(payload.get("approved_drafts", 0)),
meetings=int(payload.get("meetings", 0)),
pipeline_sar=float(payload.get("pipeline_sar", 0)),
risks_blocked=int(payload.get("risks_blocked", 0)),
)
@router.post("/proof-pack/next-step")
async def proof_pack_next_step(payload: dict[str, Any] = Body(default_factory=dict)) -> dict[str, Any]:
return build_next_step_recommendation(pilot_metrics=payload)