22 — Integration & Processing Orchestration (Blueprint §7)
Cursor-ready end-to-end execution plan connecting webhooks, request scheduling, submission intake, media processing, moderation, publication, and storefront delivery.
22 — Integration & Processing Orchestration (Blueprint §7)
Section titled “22 — Integration & Processing Orchestration (Blueprint §7)”Source: 02-Implementation-Blueprint.md — §7) Integration and Processing Plan (steps 1–10).
Product alignment: 01-Post-Purchase-Video-Testimonial-Collector-Plan.md — full operational workflow from order event to published storefront social proof.
This document is a build spec only. No code changes are implied until a task references this file.
Related plans: 06, 07, 10, 11, 13, 14, 20, 21.
0) Goal (one sentence)
Section titled “0) Goal (one sentence)”Define one reliable end-to-end orchestration contract so every subsystem (webhooks, workers, APIs, moderation, storefront rendering) updates data in the right order with idempotency and observable state transitions.
1) Blueprint step mapping (authoritative)
Section titled “1) Blueprint step mapping (authoritative)”This section maps each blueprint step to a concrete app responsibility.
| Blueprint §7 step | App responsibility |
|---|---|
| 1. Order webhook -> evaluate active campaigns | webhooks.orders.* route + eligibility service |
| 2. Expand delivered line items | request planner creates one TestimonialRequest per eligible item |
| 3. Create and schedule request rows | write TestimonialRequest with token and scheduledFor |
| 4. Scheduler sends due requests | cron/worker dispatch email/SMS and write events |
| 5. Public page validates token and captures submission | /t/:token loader + submit API |
| 6. Upload media via signed URL | api.testimonial-upload-url + storage provider |
| 7. Worker updates processing status/metadata | media callback/worker updates TestimonialMediaAsset |
| 8. Submission appears in moderation queue | status=pending row visible in Screen 5 |
| 9. On approve, bind to PDP product | submission shopifyProductId retained/updated |
| 10. Approved submissions rendered by widget API | public read API filters published + placement |
Treat this table as the sequence-of-truth for implementation and debugging.
2) System components and boundaries
Section titled “2) System components and boundaries”2.1 Ingestion layer
Section titled “2.1 Ingestion layer”- Shopify webhooks (
orders/paid,orders/fulfilled) - Validates HMAC and tenant
- Emits request planning operations
2.2 Scheduling/delivery layer
Section titled “2.2 Scheduling/delivery layer”- Due-request worker (cron-driven)
- Template renderer + provider adapters
- Request event writer (
queued/sent/failed/...)
2.3 Public capture layer
Section titled “2.3 Public capture layer”- Tokenized page (
/t/:token) - Upload URL API
- Submission API
2.4 Media processing layer
Section titled “2.4 Media processing layer”- Transcode/thumbnail/metadata worker
- Asset status updates (
uploaded -> processing -> ready|failed)
2.5 Moderation/publication layer
Section titled “2.5 Moderation/publication layer”- Inbox/detail actions update status/publish flags
- Moderation log append-only writes
2.6 Storefront delivery layer
Section titled “2.6 Storefront delivery layer”- Read API returns only eligible published rows
- Theme widget blocks render home/PDP sections
3) State machines (must be explicit)
Section titled “3) State machines (must be explicit)”3.1 TestimonialRequest.status
Section titled “3.1 TestimonialRequest.status”Recommended states:
scheduledqueuedsentclickedsubmittedexpiredfailed
Transition rules:
scheduled -> queued -> sentsent -> clicked -> submittedsent -> failed(provider or retry exhaustion)scheduled|sent -> expired(token or policy expiry)
No backward transitions without explicit repair action.
3.2 TestimonialMediaAsset.processingStatus
Section titled “3.2 TestimonialMediaAsset.processingStatus”uploadedprocessingreadyfailed
Only ready assets should be storefront-playable.
3.3 TestimonialSubmission.status
Section titled “3.3 TestimonialSubmission.status”pendingapprovedrejectedarchived
Publication is orthogonal (published boolean + publishedAt).
4) Orchestration contracts between modules
Section titled “4) Orchestration contracts between modules”4.1 Webhook -> Request planner
Section titled “4.1 Webhook -> Request planner”Input:
- shop domain
- order payload
- trigger type
Output:
- deterministic list of planned request rows
Idempotency key:
(shopId, campaignId, shopifyOrderId, shopifyProductId, variant?)
4.2 Request planner -> Sender worker
Section titled “4.2 Request planner -> Sender worker”Sender worker expects:
- valid
submissionToken scheduledFor <= now- channel + template resolvable
- contact destination available
4.3 Public submit -> Moderation queue
Section titled “4.3 Public submit -> Moderation queue”Submit API guarantees:
- request status becomes
submitted - submission row exists with product binding
- media asset row linked
Moderation queue consumes status=pending plus media readiness metadata.
4.4 Moderation -> Storefront API
Section titled “4.4 Moderation -> Storefront API”Storefront API should only include rows where:
status=approvedpublished=true- asset status
ready - placement visibility rules pass
5) Failure handling and retries
Section titled “5) Failure handling and retries”5.1 Webhook retries
Section titled “5.1 Webhook retries”- Must be idempotent and safe for duplicate deliveries.
- Always return 2xx for already-processed payloads.
5.2 Sender retries
Section titled “5.2 Sender retries”- Failed sends should retry with bounded attempts.
- Keep
lastErrorand emitfailedevent entries. - Move terminal failures to visible requests log (
13).
5.3 Media processing failures
Section titled “5.3 Media processing failures”- Set asset to
failedwithprocessingError. - Keep submission in moderation with explicit error badge.
- Allow merchant to request reprocess (future).
5.4 Submission duplicates
Section titled “5.4 Submission duplicates”- Token submit must be idempotent:
- second submit returns 409 or “already submitted” response.
6) Observability requirements
Section titled “6) Observability requirements”6.1 Structured logs
Section titled “6.1 Structured logs”Log with correlated IDs:
shopIdcampaignIdrequestIdsubmissionIdassetId
Do not log full token values.
6.2 Metrics counters
Section titled “6.2 Metrics counters”Minimum counters:
- webhook received/processed/duplicate
- requests created
- sends attempted/sent/failed
- submissions created
- media ready/failed
- approvals/published
These counters feed analytics and operational alerting.
7) Scheduling and timing semantics
Section titled “7) Scheduling and timing semantics”- All persisted timestamps in UTC.
delayDaysinterpreted as UTC-day offsets from trigger event time.- Reminder windows use UTC and are based on initial
sentAt.
Document this in code comments to avoid timezone ambiguity.
8) Security checkpoints in flow
Section titled “8) Security checkpoints in flow”At each step:
- Webhook: verify HMAC.
- Public routes: validate token + expiry + rate limits.
- Upload URLs: short-lived signed URLs only.
- Storefront API: return only published/public-safe fields.
- Compliance hooks: redact/delete tenant and customer-linked data.
Reference 08-security-compliance-and-privacy.md for details.
9) Sequence diagram (textual)
Section titled “9) Sequence diagram (textual)”- Shopify sends order webhook.
- App validates webhook and loads active campaigns.
- App creates per-product
TestimonialRequestrows. - Cron worker picks due requests and sends email/SMS.
- Customer opens
submissionUrl, token validated. - Customer uploads media via signed URL.
- Customer submits form; app creates submission + asset + updates request.
- Worker processes media and marks asset ready.
- Merchant moderates and publishes.
- Storefront widget API returns published rows for home/PDP.
10) Integration acceptance checklist
Section titled “10) Integration acceptance checklist”- Full happy-path from webhook to storefront render works for one product.
- One order with 3 eligible products creates 3 request rows.
- Duplicate webhook does not create duplicate requests.
- Sent -> clicked -> submitted timeline appears in requests log.
- Media processing transitions are visible in submission detail.
- Published content appears in correct widget placement only.
- Unpublish immediately removes from storefront API output.
11) Implementation order (for Cursor)
Section titled “11) Implementation order (for Cursor)”- Finalize schema (
20) and route map (21). - Implement webhook + request creation (
07). - Implement public capture + upload (
06). - Implement media processing callback/worker.
- Implement moderation + publish screens (
09,10,11,12). - Wire storefront read API + widgets (
05). - Add observability and analytics (
13,14,15,19).
12) References
Section titled “12) References”02-Implementation-Blueprint.md— Section 707-email-sms-request-delivery-pipeline.md06-public-submission-page-screen-13.md11-published-content-screen-7.md05-storefront-widgets-and-read-api.md08-security-compliance-and-privacy.md20-database-design-and-migrations-blueprint-section-5.md21-route-and-file-map-blueprint-section-6.md
13) Note on numbering
Section titled “13) Note on numbering”This folder already includes 05 through 21 plans. This file is 22-....