Skip to main content
Internal Service β€” This is not an HTTP endpoint. It’s called by the store-email-in-notion route.

Purpose

Transforms the email submission into the format required by Notion’s API.

Function Signature

def build_notion_properties(submission: EmailSubmission) -> dict

Parameters

ParameterTypeDescription
submissionEmailSubmissionPydantic model with email, websiteUrl, referral, utm_campaign

Returns

{
    "Email": {"title": [{"text": {"content": "[email protected]"}}]},
    "Website URL": {"url": "https://example.com"},
    "Referral": {"rich_text": [{"text": {"content": "google"}}]},
    "UTM Campaign": {"rich_text": [{"text": {"content": "launch2024"}}]},
    "Submitted At": {"date": {"start": "2024-01-15T10:30:00+00:00"}},
    "Status": {"status": {"name": "Waitlist"}}
}

Notion Property Types

PropertyNotion TypeNotes
EmailtitleRequired, primary identifier
Website URLurlCan be null
Referralrich_textEmpty string if not provided
UTM Campaignrich_textEmpty string if not provided
Submitted AtdateISO format with timezone
StatusstatusAlways β€œWaitlist”

Code

def build_notion_properties(submission: EmailSubmission) -> dict:
    return {
        "Email": {"title": [{"text": {"content": submission.email}}]},
        "Website URL": {"url": submission.websiteUrl or None},
        "Referral": {"rich_text": [{"text": {"content": submission.referral or ""}}]},
        "UTM Campaign": {"rich_text": [{"text": {"content": submission.utm_campaign or ""}}]},
        "Submitted At": {"date": {"start": datetime.now(timezone.utc).isoformat()}},
        "Status": {"status": {"name": "Waitlist"}},
    }

Code Location

src/website/waitlist/routes.py
# Lines 26-35: build_notion_properties()