Personalized Wedding Video Invitation: One Render Per Guest
Render a 30-second vertical wedding invitation that names each guest, straight from the guest list. Eleven fields, one changing per row, half a credit a guest.

A personalized wedding video invitation puts each guest's own name on screen, so the couple sends one video per guest instead of one for everyone. Map the guest list onto eleven template fields, POST one render per guest, and each 30-second vertical video costs half a credit. Ten of the fields are set once per wedding.
The finished video
This guide renders Wedding Invitation - Named For One Guest - a 30-second 9:16 invitation in six scenes: a setup line, the guest's name alone inside a hairline card, the couple, the date and place, three dry lines about the day, and a keepsake card built to be screenshotted.
Eleven fields drive 41 overlays. The palette, the type, the timing and the music are identical in every render.
What you need
- A Renderly API key. Create one in the dashboard under Settings → API keys.
- A guest list with one name per row. A CSV or a spreadsheet is enough.
- Two photos of the couple and the venue, at URLs that serve the file directly.
Step 1 - Decide whether every guest gets their own video
Search this query and the results are makers. Canva and FlexClip hand the couple an editor and produce one video that every guest then receives. That is a different product, and for a single shared video it is the right one.
A template render earns its place when the name is the point. The second scene shows the guest's name alone at 380px, and the last scene repeats it on a card made to be screenshotted. Sarah's video and Tom's video differ in one field, so nobody edits 120 copies and nobody sends a group chat the wrong name. If every guest should get the same video, use a maker.
Step 2 - Map the guest list onto eleven fields
| Field | Scenes | Set |
|---|---|---|
guest_name | 2, 6 | Per guest |
couple_names | 3, 6 | Once per wedding |
wedding_weekday, wedding_date | 4 | Once per wedding |
wedding_date_full | 6 | Once per wedding |
venue_name, venue_location | 4 | Once per wedding |
venue_line | 6 | Once per wedding |
rsvp_link | 6 | Once per wedding |
couple_photo, venue_photo | 3, 4 | Once per wedding |
guest_name appears in two scenes and one value drives both, so the payoff and
the keepsake can never disagree. The date and the venue are each written more
than one way, because one variable cannot be split across differently styled
overlays. Send every field: an omitted one keeps the sample wedding's value, so a
missing venue_name posts "Casa Mira" to your guests.
Step 3 - Check each guest's name against the name slot
The name is set at a fixed 380px and never shrinks. A name that is too wide wraps
onto a line the box hides, and the render still reports success. The variables
endpoint reports the limit for this template: maxCharacters is 5 for
guest_name. In our measurement "Sarah" fits and "Amara" does not, because width
depends on the letters.
Your options for a longer name:
- Use a cut with a bigger slot. The photo-led cut reports 8, and the 16:9 cut for email and websites reports 10.
- Use a first name or a short form.
- Send the whole composition as
inputPropswith a smaller font size for that guest.
Preview before you render the list. It takes the same body, costs nothing and
returns a previewUrl and a warnings array:
curl -X POST https://renderly.video/api/v1/previews \
-H "Authorization: Bearer $RENDERLY_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "templateId": "wedding-invitation-named", "replacements": { "guest_name": "Rebecca" } }'TEXT_MAY_CLIP is an estimate from average character width, so treat it as a
pointer and open the previewUrl for every name it flags.
Step 4 - Send one render per guest
The template's API id is wedding-invitation-named, which is not the same string
as its gallery URL.
curl -X POST https://renderly.video/api/v1/renders \
-H "Authorization: Bearer $RENDERLY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"templateId": "wedding-invitation-named",
"replacements": {
"guest_name": "Sarah",
"couple_names": "Amara & Yusuf",
"wedding_weekday": "SATURDAY",
"wedding_date": "12 September\n2026",
"wedding_date_full": "Saturday 12 September 2026",
"venue_name": "Casa Mira",
"venue_location": "Alentejo, Portugal",
"venue_line": "Casa Mira · Alentejo, Portugal",
"rsvp_link": "amarayusuf.wedding/rsvp",
"couple_photo": "https://cdn.example.com/wedding/couple.jpg",
"venue_photo": "https://cdn.example.com/wedding/venue.jpg"
}
}'Loop this over the guest list with the pattern in the
CSV guide, changing only guest_name on
each pass. The response returns a jobId and creditsUsed: 0.5 immediately.
Step 5 - Hand each guest their own MP4
The render request has no label field, and an unknown key is read as a
replacement variable, so you cannot tag a job with a guest. Keep your own map
from guest to jobId as each POST returns.
Register one persistent webhook with POST /api/v1/webhooks for
render.completed. It arrives with data.jobId and data.outputUrl, and
persistent webhooks retry and are HMAC-signed, which the one-off webhookUrl
callback is not. The webhooks guide
covers verifying it. Look the guest up by jobId, then hand that guest the URL.
What this costs at scale
Renderly bills 1 credit per minute of 1080p output, rounded up to the nearest half credit. At 30 seconds this invitation is exactly half a minute, so it is half a credit a guest, about seven cents on Creator and five on Business. A 1080x1920 vertical has the same pixel count as 1080p, so it bills at the base rate.
| Guests | Credits | Plan | Cost |
|---|---|---|---|
| 100 | 50 | Creator, $29/mo | included |
| 400 | 200 | Creator, $29/mo | included |
| 1,000 | 500 | Business, $99/mo | included |
| 5,000 | 2,500 | Business + 1,500 extra at $0.12 | $279/mo |
Choose the cut before you price the list. The 36-second Long Version rounds up to a full credit a guest, twice the price of the 30-second cut.
Where to go next
The template page has the preview and the full field list. The reason a name should live in a variable, and not in the design, is set out in dynamic video templates. If the guest list lives in a sheet, the Google Sheets guide fires a render per row.
Frequently asked
Can one template name every guest without editing 120 copies?
What happens when a guest's name is too long?
Can the couple choose between two designs?
Can I change the colours, fonts or music?
Does Renderly send the video to each guest?
Related guides
Bulk Video from CSV: Generate One Video per Row
Turn a CSV export into finished videos. Map headers to template variables, send one render request per row from a resumable script, and collect every result.
Google Sheets to Video: Automate Video Creation from a Sheet
Turn spreadsheet rows into finished videos. Connect a Google Sheet to the Renderly API with Apps Script, map columns to variables, and render every row.