Ecommerce Platform
- Infra code:
infra/ecom/ - Component code:
components/shopify/,components/ecom_indexer/,components/ecom_settings_exporter/,components/ecom_metrics_consumer/,components/ecom_monitoring_service/
Product search for ecommerce platforms (primarily Shopify). Includes indexing pipeline, search proxy, and admin tools.
Architecture
graph TD
A["Shopify Store"]
subgraph proxy["Cloudflare Worker (search_proxy)"]
B["Marqo (via service binding)"]
C["KV (settings cache)"]
D["SQS (metrics)"]
end
A --> B
A --> C
A --> D
E["Shopify Admin"] --> F["API Gateway (Ecom API)"] --> G["Admin Lambda"] --> H["DDB tables"]
I["Shopify Webhooks"] --> G --> J["Webhook Worker Lambda"] --> K["Indexer Lambda"] --> L["SQS"] --> M["Marqo"]
N["DDB Stream (IndexSettingsTable)"] --> O["Settings Exporter Lambda"] --> P["Cloudflare KV"]
Q["EventBridge (10 min)"] --> R["Monitoring Service Lambda"] --> S["checks alarms exist"]
AWS Resources
| Resource | Name Pattern | How to Inspect |
|---|---|---|
| DynamoDB | {env}-EcomIndexSettingsTable |
DynamoDB |
| DynamoDB | {env}-EcomIndexerJobsTable |
DynamoDB |
| DynamoDB | {env}-EcomIndexQueryConfigsTable |
DynamoDB |
| DynamoDB | {env}-EcomCollectionsTable |
DynamoDB |
| DynamoDB | {env}-AgenticCachedQueriesTable |
DynamoDB |
| Lambda | {env}-EcomIndexerFunction |
Lambda |
| Lambda | {env}-EcomSettingsExporterLambda |
Lambda |
| Lambda | {env}-EcomMetricsWorker |
Lambda |
| Lambda | {env}-EcomMonitoringServiceLambda |
Lambda |
| Lambda | {env}-ShopifyAppAdminFunction |
Lambda |
| Lambda | {env}-ShopifyWebhookWorker |
Lambda |
| SQS | {env}-EcomMetricsQueue |
SQS |
| SQS | {env}-EcomMetricsQueueDLQ |
SQS |
| S3 | {env}-ecom-product-data-bucket |
S3 |
| S3 | {env}-shopify-app-assets |
S3 |
| API Gateway | {env}-EcomApi (HTTP v2) |
API Gateway |
DynamoDB Table Schemas
EcomIndexSettingsTable
- pk (S):
{system_account_id} - sk (S):
INDEX#{index_name} - GSI_IndexRootsByName: pk=
pk, sk=index_name - Stream: NEW_IMAGE (triggers settings exporter)
- Stores Marqo index configs: create_index settings, search settings, collection configs, aliases.
EcomIndexerJobsTable
- pk (S):
PLATFORM#{platform}#SHOP#{shop_id} - sk (S):
JOB#{created_at}#{job_id} - GSI_JobLookup: pk=
job_id, sk=created_at - GSI_JobsByStatus: pk=
shop_id, sk=status_created_at - TTL:
ttl(30-day auto-cleanup)
EcomIndexQueryConfigsTable
- pk (S):
{system_account_id} - sk (S):
INDEX#{index_name}#QUERY#{normalized_query}
AgenticCachedQueriesTable
- pk (S):
{account_id}#{index_name}#{normalized_query} - GSI (accountId-indexName-index): pk=
gsi_pk({account_id}#{index_name})
Data Flow: Settings Sync
graph TD
A["Admin writes settings"]
subgraph table["EcomIndexSettingsTable"]
B["DDB Stream (NEW_IMAGE)"]
C["Settings Exporter Lambda"]
D["Cloudflare KV (read by search_proxy worker)"]
end
A --> B
B --> C
C --> D
If KV data is stale, check:
- DDB stream status on the table
- Settings exporter Lambda logs
- Cloudflare KV namespace content
Typical Investigation Paths
Search returning wrong results:
- Check index settings in DDB: query
EcomIndexSettingsTablefor the account - Check KV cache:
npx wrangler kv key get --namespace-id {id} "{account_id}" - Check search proxy logs:
npx wrangler tail {env}-ecom-api
Indexing not working:
- Check indexer jobs: query
EcomIndexerJobsTableGSI_JobsByStatus for the shop - Check indexer Lambda logs:
aws logs tail /aws/lambda/{env}-EcomIndexerFunction - Check SQS queue for the shop (dynamically created)
Metrics missing:
- Check metrics queue depth: SQS
- Check DLQ for failed messages
- Check metrics worker Lambda logs
Accounts
| Env | Account | Ecom API Domain |
|---|---|---|
| Staging | 468036072962 | staging-ecom.dev-marqo.org |
| Preprod | 010928202142 | ecom.preprod-marqo.org |
| Prod | 023568249301 | ecom.marqo-ep.ai |