How-to

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.

Personalized Wedding Video Invitation: One Render Per 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.

The invitation rendered from the payload in step 4.

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

FieldScenesSet
guest_name2, 6Per guest
couple_names3, 6Once per wedding
wedding_weekday, wedding_date4Once per wedding
wedding_date_full6Once per wedding
venue_name, venue_location4Once per wedding
venue_line6Once per wedding
rsvp_link6Once per wedding
couple_photo, venue_photo3, 4Once 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 inputProps with 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.

GuestsCreditsPlanCost
10050Creator, $29/moincluded
400200Creator, $29/moincluded
1,000500Business, $99/moincluded
5,0002,500Business + 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?
Yes. guest_name is the only per-guest field, and it fills both the payoff scene and the keepsake card from one value. The other ten fields are set once per wedding. You send one request per row of the guest list, so 120 guests is 120 requests and no manual edits.
What happens when a guest's name is too long?
The render succeeds and the name is cut off. The 30-second cut reports a ceiling of five characters, and a name like Rebecca loses its tail with no error. Preview the row first, shorten the name, or use a cut with a bigger slot. The 16:9 cut reports ten.
Can the couple choose between two designs?
Yes, for the first two cuts. The 30-second cut and the 36-second Long Version share the same eleven field names, so one payload renders both when you change templateId. The Long Version costs a full credit per guest, twice the price, because 36 seconds rounds up.
Can I change the colours, fonts or music?
Not through replacements. The fields carry text and two photos. The ink and chalk palette, the pine accent, the Geist type and the background music are part of the template. For full control, send the whole composition as inputProps instead of templateId, or clone the template into a project.
Does Renderly send the video to each guest?
No. Renderly returns an MP4 URL on the render.completed webhook and stops there. Sending is your tool's job: an email service, a WhatsApp flow or an RSVP page. The file is 1080x1920, so a phone plays it full-screen without re-encoding.