safeway-coupons
Automatic coupon clipper for Safeway's online "Safeway for U" coupons
safeway-coupons is a tool that will log in to an account on safeway.com, and attempt to select all of the "Safeway for U" electronic coupons on the site so they don't have to each be clicked manually.
Design notes
Safeway's sign in page is protected by a web application firewall (WAF). safeway-coupons performs authentication using Google Chrome. Authentication may fail based on your IP's reputation, either by presenting an interactive challenge or denying sign in attempts altogether.
safeway-coupons currently does not have support for prompting the user to solve interactive challenges.
Safeway's sign in page may also require an email verification code. Support for
email verification codes is being evaluated. To reduce the frequency of MFA
challenges, a persistent Google Chrome profile directory is created for each
account and reused for logins with the same account. These are stored within the
User state directory (see user_state_dir).
Once a signed in session is established, coupon clipping is performed using HTTP requests via requests.
Installation and usage
Prerequisites
- Google Chrome (for authentication performed via patchright).
- Optional:
sendmail(for email support)
Installation
Installation with uv or pipx is recommended:
uv tool install safeway-coupons
pipx install safeway-coupons
Installation with pip is also available:
pip install safeway-coupons
Usage
For best results, run this program once a day or so with a cron daemon.
For full usage options, run
safeway-coupons --help
Configuration
safeway-coupons can clip coupons for one or more Safeway accounts in a single run, depending on the configuration method used.
If a sender email address is configured, a summary email will be sent for each
Safeway account via sendmail. The email recipient defaults to the Safeway
account email address, but can be overridden for each account.
Accounts are searched via the following methods in the listed order. Only one account configuration method may be used at a time.
With environment variables
A single Safeway account can be configured with environment variables:
SAFEWAY_ACCOUNT_USERNAME: Account email address (required)SAFEWAY_ACCOUNT_PASSWORD: Account password (required)SAFEWAY_ACCOUNT_MAIL_FROM: Sender address for email summarySAFEWAY_ACCOUNT_MAIL_TO: Recipient address for email summary
With config file
Multiple Safeway accounts can be provided in an ini-style config file, with a section for each account. For example:
; optional
email_sender = sender@example.com
; required
[safeway.account@example.com]
; required
password = 12345
; optional
notify = your.email@example.com
Provide the path to your config file using the -c or --accounts-config
option:
safeway-coupons -c path/to/config/file
Installation and usage with Docker Compose
A Docker container is provided which runs safeway-coupons with cron. The cron schedule and your Safeway account details may be configured using environment variables, or with an accounts file.
Example compose.yaml with configuration via environment variables:
services:
safeway-coupons:
image: ghcr.io/smkent/safeway-coupons:latest
environment:
CRON_SCHEDULE: "0 2 * * *" # Run at 2:00 AM UTC each day
# TZ: Antarctica/McMurdo # Optional time zone to use instead of UTC
SMTPHOST: your.smtp.host
SAFEWAY_ACCOUNT_USERNAME: your.safeway.account.email@example.com
SAFEWAY_ACCOUNT_PASSWORD: very_secret
SAFEWAY_ACCOUNT_MAIL_FROM: your.email@example.com
SAFEWAY_ACCOUNT_MAIL_TO: your.email@example.com
# EXTRA_ARGS: --debug # Optional
restart: unless-stopped
volumes:
- state:/state:rw
volumes:
state:
Example compose.yaml with configuration via accounts file:
services:
safeway-coupons:
image: ghcr.io/smkent/safeway-coupons:latest
environment:
CRON_SCHEDULE: "0 2 * * *" # Run at 2:00 AM UTC each day
# TZ: Antarctica/McMurdo # Optional time zone to use instead of UTC
SMTPHOST: your.smtp.host
SAFEWAY_ACCOUNTS_FILE: /accounts_file
# EXTRA_ARGS: --debug # Optional
restart: unless-stopped
volumes:
- path/to/safeway_accounts_file:/accounts_file:ro
- state:/state:rw
volumes:
state:
Start the container by running:
docker compose up -d
Debugging information can be viewed in the container log:
docker compose logs -f
Development
Invocation with docker compose
safeway-coupons can be executed within a Docker container using
compose.dev.yaml.
To use, first create an accounts file in the same directory with your
safeway-coupons accounts configuration. Then, execute safeway-coupons within a
container using docker compose:
docker compose -f compose.dev.yaml up --build
The container will run safeway-coupons once, attempt to clip one coupon, and then stop.
To change the safeway-coupons arguments, modify the command value in
compose.dev.yaml.
When finished with development tasks, the docker compose state can be cleaned
up with:
docker compose -f compose.dev.yaml down
License
Copyright (C) 2012 Stephen Kent and contributors
Licensed under the GNU General Public License v3.0 or later
(GPL-3.0-or-later).
Project template
This project is based on and maintained with copier-project.
Metadata
Release files for safeway-coupons 0.4.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| safeway_coupons-0.4.0.tar.gz | 33.8 kB | With provenance | Details for safeway_coupons-0.4.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| safeway_coupons-0.4.0-py3-none-any.whl | Python 3 | none | any | Details for safeway_coupons-0.4.0-py3-none-any.whl |
Total release size: 64.9 kB
Release files / safeway_coupons-0.4.0.tar.gz
| Download URL | safeway_coupons-0.4.0.tar.gz |
|---|---|
| Size | 33.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
313620d49714dc163eb30a1c8913767271525a3dd9d944944d9aa4d596be3310
|
|
BLAKE2b-256 checksum How to use checksums |
51b6559708420a97ba02dc5c46082ca07053c665ad964712b4c2b127aa4edcf4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 11, 2026.
Transparency logRelease files / safeway_coupons-0.4.0-py3-none-any.whl
| Download URL | safeway_coupons-0.4.0-py3-none-any.whl |
|---|---|
| Size | 31.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2700022de662d8ee4f20f5bc6a5dcc6c1a4fbe09601dbc5b56c24b9c83a04ea8
|
|
BLAKE2b-256 checksum How to use checksums |
56db4c1227c2caac23af50aba80525a01f7b957ae20e7943aa9321f9fd862e1b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 11, 2026.
Transparency logSecurity for safeway-coupons 0.4.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for safeway_coupons-0.4.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 11, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.