generated from will/eec-courses-template
Customize eec-courses-template for sunfloweracressoaps.com
Sync courses / sync (push) Successful in 5s
Sync courses / sync (push) Successful in 5s
Wire the sync workflow to eec-sunfloweracres, and add a real four-part welcome/nurture course that also grows the sunfloweracres-list mailing list via signup_list_name. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -13,8 +13,8 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
tar czf /tmp/courses.tar.gz courses
|
tar czf /tmp/courses.tar.gz courses
|
||||||
status=$(curl -s -o /tmp/sync-response.json -w '%{http_code}' \
|
status=$(curl -s -o /tmp/sync-response.json -w '%{http_code}' \
|
||||||
-X POST "http://eec-__CLIENT__:8080/admin/sync" \
|
-X POST "http://eec-sunfloweracres:8080/admin/sync" \
|
||||||
-H "Authorization: Bearer ${__CLIENT___EEC_SYNC_TOKEN}" \
|
-H "Authorization: Bearer ${SUNFLOWERACRES_EEC_SYNC_TOKEN}" \
|
||||||
--data-binary @/tmp/courses.tar.gz)
|
--data-binary @/tmp/courses.tar.gz)
|
||||||
cat /tmp/sync-response.json
|
cat /tmp/sync-response.json
|
||||||
echo
|
echo
|
||||||
@@ -23,4 +23,4 @@ jobs:
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
env:
|
env:
|
||||||
__CLIENT___EEC_SYNC_TOKEN: ${{ secrets.__CLIENT___EEC_SYNC_TOKEN }}
|
SUNFLOWERACRES_EEC_SYNC_TOKEN: ${{ secrets.SUNFLOWERACRES_EEC_SYNC_TOKEN }}
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
# __CLIENT__-eec-courses
|
# sunfloweracres-eec-courses
|
||||||
|
|
||||||
Course content for [eec](https://gitea.reground.org/will/eec), the self-paced
|
Course content for [eec](https://gitea.reground.org/will/eec), the self-paced
|
||||||
email course engine — this instance served at eec.__DOMAIN__. Push to
|
email course engine — this instance served at eec.sunfloweracressoaps.com.
|
||||||
`master` and CI syncs `courses/` straight to production — there's no staging
|
Push to `master` and CI syncs `courses/` straight to production — there's no
|
||||||
step, so treat a push here the same as a push to `eec` itself.
|
staging step, so treat a push here the same as a push to `eec` itself.
|
||||||
|
|
||||||
Full reference for course/step file format, `course.yml` fields, the
|
Full reference for course/step file format, `course.yml` fields, the
|
||||||
readiness step, drip-triggered courses, and sync guardrails lives in the
|
readiness step, drip-triggered courses, and sync guardrails lives in the
|
||||||
@@ -14,26 +14,32 @@ format is identical, only the target instance differs.
|
|||||||
|
|
||||||
```
|
```
|
||||||
courses/
|
courses/
|
||||||
<slug>/
|
welcome/
|
||||||
course.yml
|
course.yml
|
||||||
day-0.md
|
day-0.md
|
||||||
day-1.md
|
day-1.md
|
||||||
...
|
day-2.md
|
||||||
|
day-3.md
|
||||||
```
|
```
|
||||||
|
|
||||||
|
`welcome` is Sunflower Acres' welcome/nurture sequence, and doubles as the
|
||||||
|
site's mailing-list signup mechanism — the course's own public signup form
|
||||||
|
at eec.sunfloweracressoaps.com adds the subscriber to the
|
||||||
|
`sunfloweracres-list` Listmonk list immediately (`signup_list_name` in
|
||||||
|
`course.yml`, no click required), then sends four emails over the following
|
||||||
|
days: the current bar lineup, the cold-process/six-week-cure story, and a
|
||||||
|
soft close pointing back at the shop.
|
||||||
|
|
||||||
|
**Status: live, `active: true`.** All four steps have real content — no
|
||||||
|
placeholders. Update copy in place as the product lineup or stock status
|
||||||
|
changes; the emails currently reflect the lineup as of this course's launch,
|
||||||
|
so revisit them if bars are added, discontinued, or restocked in a way
|
||||||
|
that's stale here.
|
||||||
|
|
||||||
## Deploying
|
## Deploying
|
||||||
|
|
||||||
Push to `master` → `.gitea/workflows/sync.yml` tars up `courses/` and
|
Push to `master` → `.gitea/workflows/sync.yml` tars up `courses/` and
|
||||||
`POST`s it to this domain's `eec-__CLIENT__` container over the internal
|
`POST`s it to this domain's `eec-sunfloweracres` container over the internal
|
||||||
Docker network, authenticated with `__CLIENT___EEC_SYNC_TOKEN` (a Gitea
|
Docker network, authenticated with `SUNFLOWERACRES_EEC_SYNC_TOKEN` (a Gitea
|
||||||
Actions secret shared with the `eec-__CLIENT__` Ansible role's copy). No
|
Actions secret shared with the `eec-sunfloweracres` Ansible role's copy). No
|
||||||
separate deploy step, no staging — a push here goes live immediately.
|
separate deploy step, no staging — a push here goes live immediately.
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Generating a new client repo from this template:**
|
|
||||||
|
|
||||||
1. Gitea → "Generate Repo" from this template repo's page, named `<client>-eec-courses`.
|
|
||||||
2. Find/replace `__CLIENT__` → the client's slug (must match the `eec-<client>` container name) and `__DOMAIN__` → the client's domain, in this README and in `.gitea/workflows/sync.yml`.
|
|
||||||
3. Add the `<CLIENT>_EEC_SYNC_TOKEN` Actions secret to the new repo (Gitea does not carry secrets over from a template) — value must match the `eec-<client>` Ansible role's copy.
|
|
||||||
4. Delete this "Generating a new client repo" section from the new repo's README once done.
|
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
active: true
|
||||||
|
|
||||||
|
slug: welcome
|
||||||
|
name: "Welcome to Sunflower Acres"
|
||||||
|
from_email: hello@sunfloweracressoaps.com
|
||||||
|
ceiling_hours: 24
|
||||||
|
signup_list_name: "sunfloweracres-list"
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- file: day-0.md
|
||||||
|
- file: day-1.md
|
||||||
|
- file: day-2.md
|
||||||
|
- file: day-3.md
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
---
|
||||||
|
subject: "Welcome to Sunflower Acres"
|
||||||
|
---
|
||||||
|
|
||||||
|
Hi, and thanks for signing up.
|
||||||
|
|
||||||
|
We're Matthew and Marisol — we make small-batch soap by hand, and this list is how we keep in touch. No spam, no upsells, just what's new, what's running low, and occasionally how something gets made.
|
||||||
|
|
||||||
|
Over the next few days we'll walk you through what we make and how, so you know exactly what you're getting before you order anything. First up: the current lineup.
|
||||||
|
|
||||||
|
[See what's here now]({{.AdvanceLink}})
|
||||||
|
|
||||||
|
Talk soon,
|
||||||
|
Matthew & Marisol
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
---
|
||||||
|
subject: "Meet the four bars"
|
||||||
|
---
|
||||||
|
|
||||||
|
Here's what we're making right now:
|
||||||
|
|
||||||
|
- **Lavender Oatmeal Bar** — $8. Rolled oats and lavender essential oil. Gentle enough for every day.
|
||||||
|
- **Clay & Charcoal Mint Bar** — $9. French green clay and activated charcoal with peppermint essential oil. Running low right now.
|
||||||
|
- **Oat Milk & Honey Bar** — $8. Oat milk and local honey, unscented and mild.
|
||||||
|
- **Cedar & Sage Bar** — $9. Cedarwood and sage, cold-processed with shea butter. Out of stock while we cure the next batch.
|
||||||
|
|
||||||
|
That's the whole lineup — no seasonal drops, no seven-flavor rotation, just a small set of bars we know well and make often.
|
||||||
|
|
||||||
|
Next up: why "cold-processed" and "cured for six weeks" actually matter.
|
||||||
|
|
||||||
|
[Tell me more]({{.AdvanceLink}})
|
||||||
|
|
||||||
|
Matthew & Marisol
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
---
|
||||||
|
subject: "Why six weeks matters"
|
||||||
|
---
|
||||||
|
|
||||||
|
Every bar starts as oil and lye, mixed by hand into a batter, and poured into a mold. That part takes an afternoon. The soap that comes out of the mold isn't done yet, though — it's still soft, and still caustic enough that you wouldn't want it near your skin.
|
||||||
|
|
||||||
|
So it sits. Six weeks, minimum, while the saponification finishes and the water works its way out. What comes out the other side is a harder, milder bar that lasts longer in the shower and rinses clean instead of leaving a film.
|
||||||
|
|
||||||
|
It's the slow part of the process, and it's also the reason we sometimes run out of something before the next batch is ready. We'd rather you know that than wonder why a bar's been "out of stock" for a few weeks — it's not out for good, it's just curing.
|
||||||
|
|
||||||
|
That's also why the ingredient list stays short: oats, clay, charcoal, oat milk, honey, shea butter, essential oils. Nothing you'd need to look up.
|
||||||
|
|
||||||
|
Matthew & Marisol
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
---
|
||||||
|
subject: "Taking care of a bar"
|
||||||
|
redirect_url: "https://sunfloweracressoaps.com/shop/"
|
||||||
|
---
|
||||||
|
|
||||||
|
A few things that make a bar last:
|
||||||
|
|
||||||
|
- Keep it out of standing water between uses — a soap dish with drainage, or just tilted up on its edge, is enough.
|
||||||
|
- Let it dry fully between showers if you can. That's most of what makes a bar last or not.
|
||||||
|
- A little cracking on the surface as it dries out is normal, not a flaw — it's the same bar underneath.
|
||||||
|
|
||||||
|
That's the last of what we wanted to cover for now. From here you'll just hear from us when there's something worth saying: a new batch ready, something back in stock, or news worth sharing. If you ever want to see what's currently available, it's always at the shop.
|
||||||
|
|
||||||
|
[See what's in stock]({{.CTALink}})
|
||||||
|
|
||||||
|
Thanks for being here,
|
||||||
|
Matthew & Marisol
|
||||||
Reference in New Issue
Block a user