JST --:--:--
arrow_back My Work
02 YouTuber Website

Setsuna Films

A full-stack creator website and merch store for Setsuna Films, a Japanese travel YouTube channel. The site serves as a home base for the channel and includes a built-in store where fans can purchase limited-edition keychains in JPY or USD. Orders are processed through Stripe, stored in PostgreSQL via Supabase, and product images are hosted on AWS S3. Customers receive automated emails for order confirmation, shipping, and cancellations via ZeptoMail. The entire site is bilingual, with full English and Japanese content throughout.

Live at setsunafilms.com.
Setsuna Filmsのフルスタッククリエイターサイトとグッズショップです。Setsuna Filmsは日本旅行をテーマにしたYouTubeチャンネルで、サイトはチャンネルのホームであると同時に、ファンが限定キーホルダーを円またはドルで購入できるショップを内蔵しています。Stripe決済・Supabase上のPostgreSQL・AWS S3での商品画像管理に対応。注文確認・発送・キャンセルの自動メールはZeptoMailで送信されます。サイト全体が英語と日本語に対応しています。

公開中のサイト:setsunafilms.com

Visit Live Site arrow_outward
Setsuna Films keychain

Stack

Backend
Python 3 Flask Flask-SQLAlchemy Flask-Login Flask-Limiter Gunicorn
Frontend
JavaScript Jinja2 HTML5 CSS3
Database & Payments
PostgreSQL Supabase Stripe
Storage
AWS S3
Email
ZeptoMail
Infrastructure
Nginx SSL / HTTPS ProxyFix

Architecture

payments

Stripe × PostgreSQL Order Flow

Customers are redirected to a Stripe Checkout Session with a pre-configured shipping rate. On payment confirmation, Stripe fires a webhook that writes the order along with line items, shipping address, and payment intent directly into PostgreSQL hosted on Supabase. The database stays in sync with every transaction automatically.

mail

Lifecycle Emails via ZeptoMail

Three automated emails cover the full order lifecycle: confirmation on payment, a shipping notification with tracking number, and a cancellation notice if the order is cancelled. All are sent through ZeptoMail's REST API with SPF/DKIM-verified domains, keeping delivery times in milliseconds and inboxes clean.

cloud_upload

AWS S3 Image Storage with Framing Controls

Product images are uploaded directly to AWS S3 via the admin dashboard. Each image stores its own zoom scale and X/Y offset so admins can frame exactly which part of a photo is visible in the card view without cropping the original. The framing values are persisted per-image in PostgreSQL and applied client-side at render time.

analytics

Visitor Analytics with Country Tracking

Every non-bot GET request is logged asynchronously in a background thread. The visitor's IP is resolved to a country via ip-api.com without blocking the page load. Bots are filtered by user-agent and duplicate visits are deduplicated per session per day. The admin dashboard surfaces visit counts, country breakdowns, and daily trends in real time.

Highlights

credit_card

Stripe Checkout

Stripe Checkout Sessions handle payment with pre-configured JPY and USD shipping rates. Webhooks confirm payment server-side before any order is written to the database.

storage

PostgreSQL on Supabase

All products, images, orders, and visit logs are stored in PostgreSQL hosted on Supabase. IPv4 resolution is handled at startup for reliable connectivity on any server environment.

mark_email_read

Full Order Email Lifecycle

Automated emails for confirmation, shipping, and cancellation are sent through ZeptoMail's REST API. SPF and DKIM verified, landing instantly in the inbox.

translate

Bilingual EN / JA

Every piece of product content title, description, shipping info, and returns policy is stored in both English and Japanese, allowing the store to serve both local and international customers.

admin_panel_settings

Admin Dashboard

A full back-office panel for managing products, uploading images to S3, adjusting per-image framing, managing live orders (accept, ship, cancel), adding tracking numbers, and viewing visitor analytics.

currency_exchange

Multi-Currency Support

Products are priced in JPY by default with optional USD pricing. Stripe shipping rates are configured per currency so checkout always charges in the correct denomination.