AmazinSaver.
From scattered data to something useful.

Bring promotional information into one categorized experience, with search and clear distinctions between new offers and offers nearing their expiration.
The interface depended on useful, organized records. Browser collection fed CSV files into a spreadsheet workflow for enrichment and review. The front end then used the prepared content for browsing, categories, countdowns, and code copying.
An independent web project connecting interface design with a practical data workflow. The original service is offline. The preserved archive uses fictional sample records, local illustrations, and no live offers or affiliate destinations.
Collect. Enrich.
Review. Publish.
The collection tool and Apps Script connect the information behind the interface. Human review remains part of the workflow.
- 01
Collect
Scroll the former promo page, extract records, and deduplicate promo codes.
- 02
Export
Write CSV files for a structured intake into Google Sheets.
- 03
Enrich
Resolve product identifiers and images; record status and errors.
- 04
Review
Check completeness, dates, and exceptions before publication.
- 05
Publish
Move eligible records to READY for the website’s published CSV feed.
Ready means something specific.
The Apps Script checks for Active status, a title, image URL, FOUND image status, ASIN, and an affiliate link before moving a record to READY. The historical affiliate field belongs to the original workflow; the preserved demonstration does not send visitors to affiliate destinations.
Exceptions have a path.
Upcoming and expired records have separate destinations. Missing-product and image failures receive explicit statuses. Failed-row scans have a preview mode, and safe promotion-link reviews flag suspected ended offers for manual confirmation rather than silently removing them.
Read the actual readiness rule +
const ready =
String(rowData[col.promo_status] || "").trim() === "Active" &&
rowData[col.product_title] &&
rowData[col.image_url] &&
String(rowData[col.image_status] || "").trim() === "FOUND" &&
rowData[col.asin] &&
rowData[col.affiliate_link];Source excerpt from moveReadyRows() in the supplied Google Apps Script. Configured batch limits describe settings, not measured throughput.
Fictional sample catalog · Original service offline · No live offers