How to Track Restaurant Sales From Facebook and Instagram Ads: Connect the Ad to the Check
Track Facebook and Instagram ads to settled restaurant checks with a campaign ID, guest match, POS procedure, and honest reporting.
To track restaurant sales from Facebook and Instagram ads, give each campaign one ID and carry it through a trackable response, an identified guest, a recorded completed visit, and the final settled POS check. An impression, click, offer claim, or reservation stops short of a sale; even a directly matched check is gross sales, not profit or proof that the ad caused an incremental purchase.
Use total campaign cost per directly matched completed visit as the first operating number. You will miss some sales, so preserve an inspectable chain, report unmatched cases separately, and never turn an estimate into a check.
“Yelp, Google, Meta, everyone wants to sell me ads and will make up ROI, but it's all guesswork.”
Restaurant owner
The way out of that frustration is not another dashboard. It is keeping the same campaign identity attached as the guest moves from the ad to your restaurant.
Start with one campaign ID that survives every handoff
Before the ad runs, write one short campaign ID in a measurement record and decide where that ID must appear next. That record is the key that will connect the response, guest, visit, and check.
At minimum, write down:
- campaign ID and restaurant location
- ad destination and response path
- offer or reservation terms
- guest identifier the response will collect
- arrival status your team will record
- checkout code, dedicated menu item, or campaign record staff will use
- POS check reference and settled amount
- report where the final match should appear
Use a new campaign ID when the offer, location, or response path changes enough that you need to judge it separately. Do not reuse one label across unrelated ads and then expect the sales report to tell you which one worked.
You are done with this step when somebody who did not build the campaign can point to the exact field that will carry its identity into the next record.
Choose one response you can carry to an identified guest
Send the ad to a response that can save the campaign ID with a guest-provided identifier. A campaign-specific offer page, message flow, reservation path, or supported wallet pass can work; a restaurant homepage with no retained response record cannot complete the chain. Customized landing pages are one documented way teams separate campaign sources.
The response record should contain its own ID, the campaign ID, the contact detail the guest supplied, the time of the response, and the permission your follow-up channel requires. Keep the contact detail inside the approved guest system and use the response ID in working reports.
If that response starts a message flow, keep one state per unique intended recipient:
- Attempted or sent: the provider accepted an attempt. Use unique attempted eligible recipients for delivery-status rates.
- Delivered: the provider reported delivery, not a read.
- Failed: failed unique recipients divided by attempted unique recipients.
- Opted out: use unique eligible delivered recipients whose full fixed opt-out window elapsed and whose outcome was reconciled and known. The numerator is that population's subset who opted out inside the window. Hold early opt-outs until maturity; report open, immature, ineligible, and unresolved records separately, with suppressions and failed sends outside the rate.
- Suppressed: your rules excluded the recipient before an attempt; keep that count separate.
- Pending or unknown: the provider has not returned a final outcome; keep it separate.
Never add these states together as if they were all responses. They describe delivery and permission; the response record still needs its own action, guest, and campaign ID.
A reservation is useful, but it is a promise to arrive, not a completed visit. If reservations are your chosen response, track each one from the ad all the way to the check, then bring its saved guest and campaign IDs into the arrival procedure.
Do not launch until a test response lands under the correct campaign ID and can be found from the guest record without searching messages by hand.
Keep the campaign attached until the guest actually arrives
At arrival, your team needs to find the same guest record and change the outcome to completed only after the person is physically there. A claim that expires, a canceled booking, and a no-show remain separate outcomes; none belongs in the completed-visit denominator.
This is where identity can break. The guest may use a different phone number, arrive under a companion's reservation, pay cash, or let a friend pay. A POS partner described the simplest blind spot: the marketed guest comes in, but somebody else pays, so the payment identity does not match the person who received the message.
If the identifier changes, merge it only after the guest confirms the new detail. If a companion will pay, attach the campaign response to the table or check while the identified guest is present. If neither step happens, keep the visit unmatched rather than guessing later.
“They don't click on that link. But they just come in the next day because they thought about it. I wouldn't get the attributed revenue towards them.”
Former restaurant owner and agency operator
That visit may still contribute to a lift in covers, but it is not a direct match. Keep it under observed lift, never directly matched sales.
Make the settled check the restaurant's finish line
The staff procedure should connect the completed visit to one check and then wait for that check to settle. A consistent discount code, dedicated menu item, or campaign record can preserve the link; when the team bypasses it, attribution breaks.
Give the host, server, or cashier a short written instruction:
- Find the response or redemption record.
- Confirm the guest has arrived.
- Apply the approved campaign code, item, or record once.
- Attach the response ID to the correct check if the system allows it.
- Record the check reference after payment.
- Count sales only after voids, refunds, and adjustments have settled.
If your approved systems do not connect automatically, a retained redemption record, time, transaction reference, and card last four can support manual reconciliation. Keep payment details inside the approved payment or POS system, never a public campaign sheet, and never record a full card number.
The step is complete when the response ID and one settled check reference can be opened from the same campaign record. If you can show only a reservation, claim, or arrival, you have not reached sales.
Give every missing match a reason instead of filling the gap with revenue
An unmatched response is an operating exception, not a zero-dollar guest and not permission to estimate a check. Use a small exception list so the team fixes repeatable breaks without inventing sales.
| Break | What happened | What to do |
|---|---|---|
| Cash payment | Payment identity is unavailable | Link the response to the settled check through the approved redemption record while the guest is present; otherwise leave it unmatched |
| Friend pays | Marketed guest and payer differ | Attach the guest's response ID to the table or check at arrival; never merge people after the fact without confirmation |
| Contact changed | Response and POS identifiers differ | Confirm the new contact detail before merging the records |
| Code reused | One code points to several checks | Use one response ID per claim and mark redemption once; review duplicates separately |
| Split checks | One visit produces several payments | Write the counting rule before launch, connect eligible settled checks once, and prevent the same sale from appearing twice |
| Staff workaround | The campaign code or item was skipped | Reconcile only from retained arrival and check evidence; otherwise mark the match missing and retrain the step |
| Refund or void | The original amount did not remain settled | Remove or update the sale after the POS record changes |
| Missing POS or delivery data | No check reference returns to your system | Report the response or claim at its actual stage; do not promote it to a visit or sale |
Ads that send guests into a third-party delivery path can stop returning the identifier needed to connect the order. Treat that as a known coverage limit, not as evidence that the order happened or did not happen.
Review the exception list by break type. Fixing the most common broken handoff improves the next campaign; adding a blanket percentage to unmatched responses only hides it.
Run one complete test before spending on the campaign
The prelaunch test must begin with the exact response path the ad will use and end with one settled test check in the intended report. Testing the landing page and POS separately can miss the handoff between them.
Run this sequence:
- Submit one controlled response through the campaign's live destination.
- Confirm the response carries the right campaign ID and creates one guest record.
- Follow the same consent and message steps a guest will see. Confirm the eligible test recipient enters attempted or sent once, then observe the provider-reported delivered state without labeling it a read.
- Use the provider's approved test method to confirm a failed attempt stays failed, an opt-out prevents a later attempt, a suppressed recipient never enters the attempted count, and a pending or unknown outcome remains separate until resolved.
- Mark the test guest arrived only after the in-store handoff.
- Use the staff's actual campaign code, item, or record on a training check.
- Pay and settle the check, then confirm the non-voided final amount appears once under the correct campaign.
- Void or refund that training check and confirm the settled-sales report removes or updates the amount.
- Test one expected exception, such as a split check or different payer, and confirm it follows the written rule.
The test passes when message states reconcile and campaign, response, guest, completed visit, and settled amount agree, with no duplicate sale. If it fails, stop at the first missing link, repair that handoff, and rerun the whole sequence. A screenshot of an isolated click or check is not an end-to-end pass.
Keep four different answers in four different report rows
Your report should separate what the ad platform attributes, what your records match directly, what changed in the restaurant, and what a planning model estimates. They answer different questions.
| Reporting category | What belongs here | What it can support | What it cannot prove |
|---|---|---|---|
| **Meta-reported or platform-attributed** | Results shown by the ad platform under the reporting definition displayed with them | How the platform credits activity to the campaign | A named in-store guest and settled check unless that exact link also exists |
| **Directly matched** | One campaign response, identified guest, completed visit, and settled POS check joined by retained IDs | Gross sales connected through the recorded path | Profit, untracked sales, or the claim that the ad caused every matched purchase |
| **Observed lift** | Covers, sales, or identified visits compared with a relevant baseline | Whether the restaurant moved during the campaign | Which individual guest came because of the ad or whether the ad alone caused the change |
| **Modeled opportunity** | Assumptions about response, visits, check size, margin, and spend | A plan or sensitivity test | An observed guest, completed visit, check, or earned result |
This ladder moves from platform activity through responses, claims or reservations, completed visits, matched settled checks, observed comparisons, modeled incrementality, and finally contribution or profit. Each step supports a different claim.
Observed lift needs equal comparison windows plus notes for holidays and recorded events that affected service. Cover counts can move differently from sales when spend per guest changes, so keep both when they affect the decision.
This is also where the visitor who saw the ad but never responded belongs: possibly inside observed lift, never inside direct matches. No report should quietly move that anonymous person into campaign sales.
Do the restaurant math before increasing spend
Before launch, set response eligibility and fixed visit and check-reconciliation windows. The denominator is unique eligible campaign responders whose full windows elapsed and whose visit and match outcomes were reconciled and known. The numerator is that population's subset with a directly matched initial completed visit and linked paid, non-voided settled check; hold early successes until maturity and report open, immature, ineligible, and unresolved visit or match records separately.
Then write one cost ledger for the same campaign and window:
- media spend
- creative production, influencer compensation, and content rights when applicable
- the actual incremental cost of an offer or reward
- food and beverage, packaging, payment processing, delivery or other fulfillment, and incremental labor for the included checks
- software, platform, agency, or management cost allocated to this campaign
- any other campaign-specific variable cost named before launch
Choose the allocation rule before launch—for example, by campaign days, locations, or a consistent share of use—and apply each bundled or shared charge once. If a reward's food or fulfillment cost is already in the check-level variable costs, do not enter it again as offer cost. If you use discount face value as a planning convention, do not also subtract that face value when settled sales are already net of the discount, and do not count the same underlying reward cost again.
Calculate the economics from the narrowest defensible counts:
- Total campaign cost per directly matched completed visit = the complete cost ledger above divided by directly matched completed-visit events with a paid, non-voided settled check.
- Match coverage = the subset of eligible verified completed-visit events with a linked paid, non-voided settled check divided by those same eligible completed-visit events whose full fixed check-reconciliation window elapsed and whose match outcome was reconciled and known as matched or unmatched. Hold early matches until the cohort matures; report open, immature, ineligible, and unresolved match records separately.
- Directly matched gross sales = the sum of paid, non-voided settled checks linked through the complete chain.
- Estimated incremental contribution after campaign costs = conservative incremental gross sales minus food and beverage, packaging, processing, delivery or fulfillment, incremental labor, offer or reward fulfillment, media, creative, influencer compensation, rights, allocated software or management costs, and other named campaign-specific variable costs not already deducted elsewhere.
Match coverage tells you how much of the recorded visit set the direct-sales number can see. Directly matched gross sales should not be renamed incremental sales. Use a credible baseline and equal windows; with a weak baseline, show a range rather than one certain number. Keep a line-by-line ledger so the contribution formula counts each cost once.
Your break-even point also depends on the offer and available capacity. Do not borrow a universal budget, ROAS target, or campaign length. Increase spend only after the end-to-end test still passes and the conservative contribution estimate supports the decision.
Once those records exist, use the sibling diagnostic to decide whether your restaurant ads are working without confusing a broken match with weak campaign performance.
Feast can keep the campaign, guest, and check connected
The manual process makes the software job clear: preserve the campaign identity, capture the guest, match a supported POS purchase, and report sales by campaign. As captured on September 1, 2026, Feast's public pages document a campaign page that captures a phone number, SMS follow-up, supported-POS matching when the same phone identity appears on payment, and POS-linked campaign sales.
That connection does not make every restaurant sale trackable. Cash, a friend paying, changed identity, missing delivery data, and staff workarounds can still break the match. Feast's POS-linked sales remain attributed gross sales, not profit or causal incrementality.
Feast's audit can build your restaurant's retention curve and help you decide whether acquisition or retention needs attention first. For a limited time, it is a one-time $27 purchase; regular access is presented as $47 per month. Get the restaurant marketing audit.